From d160a2fb4caa6c4e931b13c87663d8e81dc04882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sun, 20 Jan 2013 16:30:09 +0200 Subject: [PATCH 1/3] ppc: Include string.h for memset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes build failures on ppc machines with a compiler that supports -Werror=implicit-function-declaration. Signed-off-by: Martin Storsjö --- libavcodec/ppc/vp3dsp_altivec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavcodec/ppc/vp3dsp_altivec.c b/libavcodec/ppc/vp3dsp_altivec.c index 6adf9aefac..24ad09f03b 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 + #include "config.h" #include "libavutil/attributes.h" #include "libavutil/cpu.h" From 21f5c24b80caae36fb23c7743081bd8dd807cf0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 15 Jan 2013 16:58:48 +0200 Subject: [PATCH 2/3] rtpdec_mpeg4: Return one AAC AU per AVPacket MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the returned data valid to stream copy into other containers as well, not only for decoding straight away. Signed-off-by: Martin Storsjö --- libavformat/rtpdec_mpeg4.c | 43 +++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c index 13601a732d..0172b5b6b5 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; } From a717f9904227d7979473bad40c50eb40af41d01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sun, 20 Jan 2013 01:59:08 +0200 Subject: [PATCH 3/3] mpegts: Share the cleanup code between the demuxer and lavf-internal parser functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The lavf-internal parser functions are used when receiving mpegts over RTP. This fixes memory leaks in this setup. The normal mpegts demuxer close function was updated in ec7d0d2e in 2004 to fix leaks, but the parsing function used for RTP wasn't updated and has been leaking ever since. Signed-off-by: Martin Storsjö --- libavformat/mpegts.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 7c4d447ddc..399b0743ce 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2029,16 +2029,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;ipids[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; } @@ -2150,10 +2154,7 @@ int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, void ff_mpegts_parse_close(MpegTSContext *ts) { - int i; - - for(i=0;ipids[i]); + mpegts_free(ts); av_free(ts); }