diff options
author | Baptiste Coudurier | 2009-01-15 01:22:31 +0000 |
---|---|---|
committer | Baptiste Coudurier | 2009-01-15 01:22:31 +0000 |
commit | a57fb91ce509b3350203366cde844bc30191db36 (patch) | |
tree | 08d6a5acc022dc520620369a56ee5359cfba5fb9 /libavformat/mpegtsenc.c | |
parent | e0e4be590ce1f8aac1d7b9f930049dfb67e0d15c (diff) |
add aud nal unit if not present in h264 bitstream
Originally committed as revision 16613 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mpegtsenc.c')
-rw-r--r-- | libavformat/mpegtsenc.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index aa6334633c..1b190fd2ff 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -691,6 +691,7 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) AVStream *st = s->streams[pkt->stream_index]; int size= pkt->size; uint8_t *buf= pkt->data; + uint8_t *data= NULL; MpegTSWriteStream *ts_st = st->priv_data; int len, max_payload_size; const uint8_t *access_unit_index = NULL; @@ -720,6 +721,23 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) break; } } + } if (st->codec->codec_id == CODEC_ID_H264) { + if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) { + av_log(s, AV_LOG_ERROR, "h264 bitstream malformated\n"); + return -1; + } + if (pkt->data[4] != 0x09) { // AUD NAL + data = av_malloc(pkt->size+6); + if (!data) + return -1; + memcpy(data+6, pkt->data, pkt->size); + AV_WB32(data, 0x00000001); + data[4] = 0x09; + data[5] = 0xe0; // any slice type + buf = data; + size = pkt->size+6; + } + access_unit_index = buf; } else { access_unit_index = pkt->data; } @@ -752,6 +770,9 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) access_unit_index = NULL; // unset access unit to avoid setting pts/dts again } } + + av_free(data); + return 0; } |