Merge commit '067713f15989dd0b8c0888a3b43fd193819a1058' into release/0.10
* commit '067713f15989dd0b8c0888a3b43fd193819a1058': rtmp: rename data_size to size lavc: set the default rc_initial_buffer_occupancy 4xm: Reject not a multiple of 16 dimension Conflicts: avconv.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
39d76907c9
2
ffmpeg.c
2
ffmpeg.c
@ -4057,8 +4057,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
|
||||
if (p) p++;
|
||||
}
|
||||
video_enc->rc_override_count = i;
|
||||
if (!video_enc->rc_initial_buffer_occupancy)
|
||||
video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
|
||||
video_enc->intra_dc_precision = intra_dc_precision - 8;
|
||||
|
||||
if (do_psnr)
|
||||
|
@ -778,6 +778,12 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
if (buf_size < 20)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
if (avctx->width % 16 || avctx->height % 16) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Dimensions non-multiple of 16 are invalid.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (buf_size < AV_RL32(buf + 4) + 8) {
|
||||
av_log(f->avctx, AV_LOG_ERROR,
|
||||
"size mismatch %d %d\n", buf_size, AV_RL32(buf + 4));
|
||||
|
@ -895,6 +895,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
|
||||
} else if (avctx->channel_layout) {
|
||||
avctx->channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
|
||||
}
|
||||
|
||||
if (!avctx->rc_initial_buffer_occupancy)
|
||||
avctx->rc_initial_buffer_occupancy = avctx->rc_buffer_size * 3 / 4;
|
||||
}
|
||||
|
||||
avctx->pts_correction_num_faulty_pts =
|
||||
|
@ -75,26 +75,26 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
|
||||
int chunk_size, RTMPPacket *prev_pkt)
|
||||
{
|
||||
uint8_t hdr, t, buf[16];
|
||||
int channel_id, timestamp, data_size, offset = 0;
|
||||
int channel_id, timestamp, size, offset = 0;
|
||||
uint32_t extra = 0;
|
||||
enum RTMPPacketType type;
|
||||
int size = 0;
|
||||
int written = 0;
|
||||
|
||||
if (ffurl_read(h, &hdr, 1) != 1)
|
||||
return AVERROR(EIO);
|
||||
size++;
|
||||
written++;
|
||||
channel_id = hdr & 0x3F;
|
||||
|
||||
if (channel_id < 2) { //special case for channel number >= 64
|
||||
buf[1] = 0;
|
||||
if (ffurl_read_complete(h, buf, channel_id + 1) != channel_id + 1)
|
||||
return AVERROR(EIO);
|
||||
size += channel_id + 1;
|
||||
written += channel_id + 1;
|
||||
channel_id = AV_RL16(buf) + 64;
|
||||
}
|
||||
data_size = prev_pkt[channel_id].data_size;
|
||||
type = prev_pkt[channel_id].type;
|
||||
extra = prev_pkt[channel_id].extra;
|
||||
size = prev_pkt[channel_id].size;
|
||||
type = prev_pkt[channel_id].type;
|
||||
extra = prev_pkt[channel_id].extra;
|
||||
|
||||
hdr >>= 6;
|
||||
if (hdr == RTMP_PS_ONEBYTE) {
|
||||
@ -102,21 +102,21 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
|
||||
} else {
|
||||
if (ffurl_read_complete(h, buf, 3) != 3)
|
||||
return AVERROR(EIO);
|
||||
size += 3;
|
||||
written += 3;
|
||||
timestamp = AV_RB24(buf);
|
||||
if (hdr != RTMP_PS_FOURBYTES) {
|
||||
if (ffurl_read_complete(h, buf, 3) != 3)
|
||||
return AVERROR(EIO);
|
||||
size += 3;
|
||||
data_size = AV_RB24(buf);
|
||||
written += 3;
|
||||
size = AV_RB24(buf);
|
||||
if (ffurl_read_complete(h, buf, 1) != 1)
|
||||
return AVERROR(EIO);
|
||||
size++;
|
||||
written++;
|
||||
type = buf[0];
|
||||
if (hdr == RTMP_PS_TWELVEBYTES) {
|
||||
if (ffurl_read_complete(h, buf, 4) != 4)
|
||||
return AVERROR(EIO);
|
||||
size += 4;
|
||||
written += 4;
|
||||
extra = AV_RL32(buf);
|
||||
}
|
||||
}
|
||||
@ -129,33 +129,33 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
|
||||
if (hdr != RTMP_PS_TWELVEBYTES)
|
||||
timestamp += prev_pkt[channel_id].timestamp;
|
||||
|
||||
if (ff_rtmp_packet_create(p, channel_id, type, timestamp, data_size))
|
||||
if (ff_rtmp_packet_create(p, channel_id, type, timestamp, size))
|
||||
return -1;
|
||||
p->extra = extra;
|
||||
// save history
|
||||
prev_pkt[channel_id].channel_id = channel_id;
|
||||
prev_pkt[channel_id].type = type;
|
||||
prev_pkt[channel_id].data_size = data_size;
|
||||
prev_pkt[channel_id].size = size;
|
||||
prev_pkt[channel_id].ts_delta = timestamp - prev_pkt[channel_id].timestamp;
|
||||
prev_pkt[channel_id].timestamp = timestamp;
|
||||
prev_pkt[channel_id].extra = extra;
|
||||
while (data_size > 0) {
|
||||
int toread = FFMIN(data_size, chunk_size);
|
||||
while (size > 0) {
|
||||
int toread = FFMIN(size, chunk_size);
|
||||
if (ffurl_read_complete(h, p->data + offset, toread) != toread) {
|
||||
ff_rtmp_packet_destroy(p);
|
||||
return AVERROR(EIO);
|
||||
}
|
||||
data_size -= chunk_size;
|
||||
offset += chunk_size;
|
||||
size += chunk_size;
|
||||
if (data_size > 0) {
|
||||
size -= chunk_size;
|
||||
offset += chunk_size;
|
||||
written += chunk_size;
|
||||
if (size > 0) {
|
||||
ffurl_read_complete(h, &t, 1); //marker
|
||||
size++;
|
||||
written++;
|
||||
if (t != (0xC0 + channel_id))
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return size;
|
||||
return written;
|
||||
}
|
||||
|
||||
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
|
||||
@ -164,7 +164,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
|
||||
uint8_t pkt_hdr[16], *p = pkt_hdr;
|
||||
int mode = RTMP_PS_TWELVEBYTES;
|
||||
int off = 0;
|
||||
int size = 0;
|
||||
int written = 0;
|
||||
|
||||
pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp;
|
||||
|
||||
@ -172,7 +172,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
|
||||
if (prev_pkt[pkt->channel_id].channel_id &&
|
||||
pkt->extra == prev_pkt[pkt->channel_id].extra) {
|
||||
if (pkt->type == prev_pkt[pkt->channel_id].type &&
|
||||
pkt->data_size == prev_pkt[pkt->channel_id].data_size) {
|
||||
pkt->size == prev_pkt[pkt->channel_id].size) {
|
||||
mode = RTMP_PS_FOURBYTES;
|
||||
if (pkt->ts_delta == prev_pkt[pkt->channel_id].ts_delta)
|
||||
mode = RTMP_PS_ONEBYTE;
|
||||
@ -196,7 +196,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
|
||||
timestamp = pkt->ts_delta;
|
||||
bytestream_put_be24(&p, timestamp >= 0xFFFFFF ? 0xFFFFFF : timestamp);
|
||||
if (mode != RTMP_PS_FOURBYTES) {
|
||||
bytestream_put_be24(&p, pkt->data_size);
|
||||
bytestream_put_be24(&p, pkt->size);
|
||||
bytestream_put_byte(&p, pkt->type);
|
||||
if (mode == RTMP_PS_TWELVEBYTES)
|
||||
bytestream_put_le32(&p, pkt->extra);
|
||||
@ -207,7 +207,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
|
||||
// save history
|
||||
prev_pkt[pkt->channel_id].channel_id = pkt->channel_id;
|
||||
prev_pkt[pkt->channel_id].type = pkt->type;
|
||||
prev_pkt[pkt->channel_id].data_size = pkt->data_size;
|
||||
prev_pkt[pkt->channel_id].size = pkt->size;
|
||||
prev_pkt[pkt->channel_id].timestamp = pkt->timestamp;
|
||||
if (mode != RTMP_PS_TWELVEBYTES) {
|
||||
prev_pkt[pkt->channel_id].ts_delta = pkt->ts_delta;
|
||||
@ -217,18 +217,18 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
|
||||
prev_pkt[pkt->channel_id].extra = pkt->extra;
|
||||
|
||||
ffurl_write(h, pkt_hdr, p-pkt_hdr);
|
||||
size = p - pkt_hdr + pkt->data_size;
|
||||
while (off < pkt->data_size) {
|
||||
int towrite = FFMIN(chunk_size, pkt->data_size - off);
|
||||
written = p - pkt_hdr + pkt->size;
|
||||
while (off < pkt->size) {
|
||||
int towrite = FFMIN(chunk_size, pkt->size - off);
|
||||
ffurl_write(h, pkt->data + off, towrite);
|
||||
off += towrite;
|
||||
if (off < pkt->data_size) {
|
||||
if (off < pkt->size) {
|
||||
uint8_t marker = 0xC0 | pkt->channel_id;
|
||||
ffurl_write(h, &marker, 1);
|
||||
size++;
|
||||
written++;
|
||||
}
|
||||
}
|
||||
return size;
|
||||
return written;
|
||||
}
|
||||
|
||||
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,
|
||||
@ -239,7 +239,7 @@ int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,
|
||||
if (!pkt->data)
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
pkt->data_size = size;
|
||||
pkt->size = size;
|
||||
pkt->channel_id = channel_id;
|
||||
pkt->type = type;
|
||||
pkt->timestamp = timestamp;
|
||||
@ -254,7 +254,7 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt)
|
||||
if (!pkt)
|
||||
return;
|
||||
av_freep(&pkt->data);
|
||||
pkt->data_size = 0;
|
||||
pkt->size = 0;
|
||||
}
|
||||
|
||||
int ff_amf_tag_size(const uint8_t *data, const uint8_t *data_end)
|
||||
@ -425,9 +425,9 @@ static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *d
|
||||
void ff_rtmp_packet_dump(void *ctx, RTMPPacket *p)
|
||||
{
|
||||
av_log(ctx, AV_LOG_DEBUG, "RTMP packet type '%s'(%d) for channel %d, timestamp %d, extra field %d size %d\n",
|
||||
rtmp_packet_type(p->type), p->type, p->channel_id, p->timestamp, p->extra, p->data_size);
|
||||
rtmp_packet_type(p->type), p->type, p->channel_id, p->timestamp, p->extra, p->size);
|
||||
if (p->type == RTMP_PT_INVOKE || p->type == RTMP_PT_NOTIFY) {
|
||||
uint8_t *src = p->data, *src_end = p->data + p->data_size;
|
||||
uint8_t *src = p->data, *src_end = p->data + p->size;
|
||||
while (src < src_end) {
|
||||
int sz;
|
||||
ff_amf_tag_contents(ctx, src, src_end);
|
||||
@ -442,7 +442,7 @@ void ff_rtmp_packet_dump(void *ctx, RTMPPacket *p)
|
||||
av_log(ctx, AV_LOG_DEBUG, "Client BW = %d\n", AV_RB32(p->data));
|
||||
} else if (p->type != RTMP_PT_AUDIO && p->type != RTMP_PT_VIDEO && p->type != RTMP_PT_METADATA) {
|
||||
int i;
|
||||
for (i = 0; i < p->data_size; i++)
|
||||
for (i = 0; i < p->size; i++)
|
||||
av_log(ctx, AV_LOG_DEBUG, " %02X", p->data[i]);
|
||||
av_log(ctx, AV_LOG_DEBUG, "\n");
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ typedef struct RTMPPacket {
|
||||
uint32_t ts_delta; ///< timestamp increment to the previous one in milliseconds (latter only for media packets)
|
||||
uint32_t extra; ///< probably an additional channel ID used during streaming data
|
||||
uint8_t *data; ///< packet payload
|
||||
int data_size; ///< packet payload size
|
||||
int size; ///< packet payload size
|
||||
} RTMPPacket;
|
||||
|
||||
/**
|
||||
|
@ -147,7 +147,7 @@ static void gen_connect(URLContext *s, RTMPContext *rt, const char *proto,
|
||||
}
|
||||
ff_amf_write_object_end(&p);
|
||||
|
||||
pkt.data_size = p - pkt.data;
|
||||
pkt.size = p - pkt.data;
|
||||
|
||||
ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
|
||||
ff_rtmp_packet_destroy(&pkt);
|
||||
@ -549,7 +549,7 @@ static int rtmp_handshake(URLContext *s, RTMPContext *rt)
|
||||
static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
|
||||
{
|
||||
int i, t;
|
||||
const uint8_t *data_end = pkt->data + pkt->data_size;
|
||||
const uint8_t *data_end = pkt->data + pkt->size;
|
||||
|
||||
#ifdef DEBUG
|
||||
ff_rtmp_packet_dump(s, pkt);
|
||||
@ -557,9 +557,9 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
|
||||
|
||||
switch (pkt->type) {
|
||||
case RTMP_PT_CHUNK_SIZE:
|
||||
if (pkt->data_size != 4) {
|
||||
if (pkt->size != 4) {
|
||||
av_log(s, AV_LOG_ERROR,
|
||||
"Chunk size change packet is not 4 bytes long (%d)\n", pkt->data_size);
|
||||
"Chunk size change packet is not 4 bytes long (%d)\n", pkt->size);
|
||||
return -1;
|
||||
}
|
||||
if (!rt->is_input)
|
||||
@ -577,10 +577,10 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
|
||||
gen_pong(s, rt, pkt);
|
||||
break;
|
||||
case RTMP_PT_CLIENT_BW:
|
||||
if (pkt->data_size < 4) {
|
||||
if (pkt->size < 4) {
|
||||
av_log(s, AV_LOG_ERROR,
|
||||
"Client bandwidth report packet is less than 4 bytes long (%d)\n",
|
||||
pkt->data_size);
|
||||
pkt->size);
|
||||
return -1;
|
||||
}
|
||||
av_log(s, AV_LOG_DEBUG, "Client bandwidth = %d\n", AV_RB32(pkt->data));
|
||||
@ -683,7 +683,7 @@ static int get_packet(URLContext *s, int for_header)
|
||||
int ret;
|
||||
uint8_t *p;
|
||||
const uint8_t *next;
|
||||
uint32_t data_size;
|
||||
uint32_t size;
|
||||
uint32_t ts, cts, pts=0;
|
||||
|
||||
if (rt->state == STATE_STOPPED)
|
||||
@ -719,7 +719,7 @@ static int get_packet(URLContext *s, int for_header)
|
||||
ff_rtmp_packet_destroy(&rpkt);
|
||||
return 0;
|
||||
}
|
||||
if (!rpkt.data_size || !rt->is_input) {
|
||||
if (!rpkt.size || !rt->is_input) {
|
||||
ff_rtmp_packet_destroy(&rpkt);
|
||||
continue;
|
||||
}
|
||||
@ -729,28 +729,28 @@ static int get_packet(URLContext *s, int for_header)
|
||||
|
||||
// generate packet header and put data into buffer for FLV demuxer
|
||||
rt->flv_off = 0;
|
||||
rt->flv_size = rpkt.data_size + 15;
|
||||
rt->flv_size = rpkt.size + 15;
|
||||
rt->flv_data = p = av_realloc(rt->flv_data, rt->flv_size);
|
||||
bytestream_put_byte(&p, rpkt.type);
|
||||
bytestream_put_be24(&p, rpkt.data_size);
|
||||
bytestream_put_be24(&p, rpkt.size);
|
||||
bytestream_put_be24(&p, ts);
|
||||
bytestream_put_byte(&p, ts >> 24);
|
||||
bytestream_put_be24(&p, 0);
|
||||
bytestream_put_buffer(&p, rpkt.data, rpkt.data_size);
|
||||
bytestream_put_buffer(&p, rpkt.data, rpkt.size);
|
||||
bytestream_put_be32(&p, 0);
|
||||
ff_rtmp_packet_destroy(&rpkt);
|
||||
return 0;
|
||||
} else if (rpkt.type == RTMP_PT_METADATA) {
|
||||
// we got raw FLV data, make it available for FLV demuxer
|
||||
rt->flv_off = 0;
|
||||
rt->flv_size = rpkt.data_size;
|
||||
rt->flv_size = rpkt.size;
|
||||
rt->flv_data = av_realloc(rt->flv_data, rt->flv_size);
|
||||
/* rewrite timestamps */
|
||||
next = rpkt.data;
|
||||
ts = rpkt.timestamp;
|
||||
while (next - rpkt.data < rpkt.data_size - 11) {
|
||||
while (next - rpkt.data < rpkt.size - 11) {
|
||||
next++;
|
||||
data_size = bytestream_get_be24(&next);
|
||||
size = bytestream_get_be24(&next);
|
||||
p=next;
|
||||
cts = bytestream_get_be24(&next);
|
||||
cts |= bytestream_get_byte(&next) << 24;
|
||||
@ -760,9 +760,9 @@ static int get_packet(URLContext *s, int for_header)
|
||||
pts = cts;
|
||||
bytestream_put_be24(&p, ts);
|
||||
bytestream_put_byte(&p, ts >> 24);
|
||||
next += data_size + 3 + 4;
|
||||
next += size + 3 + 4;
|
||||
}
|
||||
memcpy(rt->flv_data, rpkt.data, rpkt.data_size);
|
||||
memcpy(rt->flv_data, rpkt.data, rpkt.size);
|
||||
ff_rtmp_packet_destroy(&rpkt);
|
||||
return 0;
|
||||
}
|
||||
@ -776,7 +776,7 @@ static int rtmp_close(URLContext *h)
|
||||
|
||||
if (!rt->is_input) {
|
||||
rt->flv_data = NULL;
|
||||
if (rt->out_pkt.data_size)
|
||||
if (rt->out_pkt.size)
|
||||
ff_rtmp_packet_destroy(&rt->out_pkt);
|
||||
if (rt->state > STATE_FCPUBLISH)
|
||||
gen_fcunpublish_stream(h, rt);
|
||||
|
Loading…
x
Reference in New Issue
Block a user