Mercurial > libavformat.hg
changeset 4219:3bfd8604f480 libavformat
add aud nal unit if not present in h264 bitstream
author | bcoudurier |
---|---|
date | Thu, 15 Jan 2009 01:22:31 +0000 |
parents | 4162b8362ed6 |
children | 443927a154f1 |
files | mpegtsenc.c |
diffstat | 1 files changed, 21 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mpegtsenc.c Thu Jan 15 00:42:57 2009 +0000 +++ b/mpegtsenc.c Thu Jan 15 01:22:31 2009 +0000 @@ -691,6 +691,7 @@ 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 @@ 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 @@ access_unit_index = NULL; // unset access unit to avoid setting pts/dts again } } + + av_free(data); + return 0; }