diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-01-21 13:45:32 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-01-21 13:45:36 +0100 |
commit | c3f3c2256325532eb9ee8a44f1f43c31de79eb2f (patch) | |
tree | ba393550cb042440ca0b55962e11d4bcb981d16f /libavformat/rtpdec_mpeg4.c | |
parent | a85311ef841b87ddaacf7c198f422db5c1ac2d60 (diff) | |
parent | a717f9904227d7979473bad40c50eb40af41d01d (diff) | |
download | ffmpeg-c3f3c2256325532eb9ee8a44f1f43c31de79eb2f.tar.gz |
Merge commit 'a717f9904227d7979473bad40c50eb40af41d01d'
* commit 'a717f9904227d7979473bad40c50eb40af41d01d':
mpegts: Share the cleanup code between the demuxer and lavf-internal parser functions
rtpdec_mpeg4: Return one AAC AU per AVPacket
ppc: Include string.h for memset
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/rtpdec_mpeg4.c')
-rw-r--r-- | libavformat/rtpdec_mpeg4.c | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c index 1f0a0b051a..2736316742 100644 --- a/libavformat/rtpdec_mpeg4.c +++ b/libavformat/rtpdec_mpeg4.c @@ -57,6 +57,9 @@ struct PayloadContext { int nb_au_headers; int au_headers_length_bytes; int cur_au_index; + + uint8_t buf[RTP_MAX_PACKET_LENGTH]; + int buf_pos, buf_size; }; typedef struct { @@ -149,18 +152,11 @@ static int rtp_parse_mp4_au(PayloadContext *data, const uint8_t *buf, int len) data->au_headers_allocated = data->nb_au_headers; } - /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving) - In my test, the FAAD decoder does not behave correctly when sending each AU one by one - but does when sending the whole as one big packet... */ - data->au_headers[0].size = 0; - data->au_headers[0].index = 0; for (i = 0; i < data->nb_au_headers; ++i) { - data->au_headers[0].size += get_bits_long(&getbitcontext, data->sizelength); - data->au_headers[0].index = get_bits_long(&getbitcontext, data->indexlength); + data->au_headers[i].size = get_bits_long(&getbitcontext, data->sizelength); + data->au_headers[i].index = get_bits_long(&getbitcontext, data->indexlength); } - data->nb_au_headers = 1; - return 0; } @@ -172,21 +168,44 @@ static int aac_parse_packet(AVFormatContext *ctx, PayloadContext *data, int flags) { int ret; + + if (!buf) { + if (data->cur_au_index > data->nb_au_headers) + return AVERROR_INVALIDDATA; + if (data->buf_size - data->buf_pos < data->au_headers[data->cur_au_index].size) + return AVERROR_INVALIDDATA; + if ((ret = av_new_packet(pkt, data->au_headers[data->cur_au_index].size)) < 0) + return ret; + memcpy(pkt->data, &data->buf[data->buf_pos], data->au_headers[data->cur_au_index].size); + data->buf_pos += data->au_headers[data->cur_au_index].size; + pkt->stream_index = st->index; + data->cur_au_index++; + return data->cur_au_index < data->nb_au_headers; + } + if (rtp_parse_mp4_au(data, buf, len)) return -1; buf += data->au_headers_length_bytes + 2; len -= data->au_headers_length_bytes + 2; - /* XXX: Fixme we only handle the case where rtp_parse_mp4_au define - one au_header */ if (len < data->au_headers[0].size) return AVERROR_INVALIDDATA; if ((ret = av_new_packet(pkt, data->au_headers[0].size)) < 0) return ret; memcpy(pkt->data, buf, data->au_headers[0].size); - + len -= data->au_headers[0].size; + buf += data->au_headers[0].size; pkt->stream_index = st->index; + + if (len > 0 && data->nb_au_headers > 1) { + data->buf_size = FFMIN(len, sizeof(data->buf)); + memcpy(data->buf, buf, data->buf_size); + data->cur_au_index = 1; + data->buf_pos = 0; + return 1; + } + return 0; } |