summaryrefslogtreecommitdiff
path: root/libavformat/flvenc.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-01-16 01:22:30 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-01-16 01:22:30 +0000
commit71e685b0183b17e43da3959e620fe22afbe8a64c (patch)
tree8a609f0305a20326da31fce24c3730455450f976 /libavformat/flvenc.c
parentc844520e7377b07dec426a4c41261c919287b350 (diff)
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
Diffstat (limited to 'libavformat/flvenc.c')
-rw-r--r--libavformat/flvenc.c19
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;
}