# HG changeset patch # User bcoudurier # Date 1232068950 0 # Node ID deddee77e4bca160f0654c82148ddebe966e48c9 # Parent bb5b5d9660357599dec2f8b9e1030add8d881052 use ff_avc_parse_nal_units_buf because output size might differ from input size diff -r bb5b5d966035 -r deddee77e4bc flvenc.c --- 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; }