diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-01-16 01:22:30 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-01-16 01:22:30 +0000 |
commit | 71e685b0183b17e43da3959e620fe22afbe8a64c (patch) | |
tree | 8a609f0305a20326da31fce24c3730455450f976 | |
parent | c844520e7377b07dec426a4c41261c919287b350 (diff) | |
download | ffmpeg-71e685b0183b17e43da3959e620fe22afbe8a64c.tar.gz |
use ff_avc_parse_nal_units_buf because output size might differ from input size
Originally committed as revision 16626 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/flvenc.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index b65c1b19a7..3b63ecaa12 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -309,6 +309,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) FLVContext *flv = s->priv_data; unsigned ts; int size= pkt->size; + uint8_t *data= NULL; int flags, flags_size; // av_log(s, AV_LOG_DEBUG, "type:%d pts: %"PRId64" size:%d\n", enc->codec_type, timestamp, size); @@ -341,6 +342,11 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) } if (enc->codec_id == CODEC_ID_H264) { + /* check if extradata looks like mp4 formated */ + if (enc->extradata_size > 0 && *(uint8_t*)enc->extradata != 1) { + if (ff_avc_parse_nal_units_buf(pkt->data, &data, &size) < 0) + return -1; + } if (!flv->delay && pkt->dts < 0) flv->delay = -pkt->dts; } @@ -361,17 +367,16 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) put_byte(pb,1); // AVC NALU put_be24(pb,pkt->pts - pkt->dts); } - if (enc->codec_id == CODEC_ID_H264 && - /* check if extradata looks like mp4 formated */ - enc->extradata_size > 0 && *(uint8_t*)enc->extradata != 1) { - ff_avc_parse_nal_units(pb, pkt->data, pkt->size); - } else { - put_buffer(pb, pkt->data, size); - } + + put_buffer(pb, data ? data : pkt->data, size); + put_be32(pb,size+flags_size+11); // previous tag size flv->duration = FFMAX(flv->duration, pkt->pts + flv->delay + pkt->duration); put_flush_packet(pb); + + av_free(data); + return 0; } |