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 | |
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>
-rw-r--r-- | libavcodec/ppc/vp3dsp_altivec.c | 2 | ||||
-rw-r--r-- | libavformat/mpegts.c | 13 | ||||
-rw-r--r-- | libavformat/rtpdec_mpeg4.c | 43 |
3 files changed, 40 insertions, 18 deletions
diff --git a/libavcodec/ppc/vp3dsp_altivec.c b/libavcodec/ppc/vp3dsp_altivec.c index b3581ab708..6271dea560 100644 --- a/libavcodec/ppc/vp3dsp_altivec.c +++ b/libavcodec/ppc/vp3dsp_altivec.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include <string.h> + #include "config.h" #include "libavutil/attributes.h" #include "libavutil/cpu.h" diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index a6e07fae9c..9251f7af32 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2144,16 +2144,20 @@ static int mpegts_read_packet(AVFormatContext *s, return ret; } -static int mpegts_read_close(AVFormatContext *s) +static void mpegts_free(MpegTSContext *ts) { - MpegTSContext *ts = s->priv_data; int i; clear_programs(ts); for(i=0;i<NB_PID_MAX;i++) if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]); +} +static int mpegts_read_close(AVFormatContext *s) +{ + MpegTSContext *ts = s->priv_data; + mpegts_free(ts); return 0; } @@ -2267,10 +2271,7 @@ int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, void ff_mpegts_parse_close(MpegTSContext *ts) { - int i; - - for(i=0;i<NB_PID_MAX;i++) - av_free(ts->pids[i]); + mpegts_free(ts); av_free(ts); } 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; } |