Mercurial > libavformat.hg
changeset 4228:deddee77e4bc libavformat
use ff_avc_parse_nal_units_buf because output size might differ from input size
author | bcoudurier |
---|---|
date | Fri, 16 Jan 2009 01:22:30 +0000 |
parents | bb5b5d966035 |
children | 765fe37ec45b |
files | flvenc.c |
diffstat | 1 files changed, 12 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/flvenc.c Fri Jan 16 01:20:31 2009 +0000 +++ b/flvenc.c Fri Jan 16 01:22:30 2009 +0000 @@ -309,6 +309,7 @@ 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 @@ } 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 @@ 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; }