Commit c3f3c225 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'a717f990'

* commit 'a717f990':
  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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents a85311ef a717f990
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <string.h>
#include "config.h" #include "config.h"
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/cpu.h" #include "libavutil/cpu.h"
......
...@@ -2144,16 +2144,20 @@ static int mpegts_read_packet(AVFormatContext *s, ...@@ -2144,16 +2144,20 @@ static int mpegts_read_packet(AVFormatContext *s,
return ret; return ret;
} }
static int mpegts_read_close(AVFormatContext *s) static void mpegts_free(MpegTSContext *ts)
{ {
MpegTSContext *ts = s->priv_data;
int i; int i;
clear_programs(ts); clear_programs(ts);
for(i=0;i<NB_PID_MAX;i++) for(i=0;i<NB_PID_MAX;i++)
if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[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; return 0;
} }
...@@ -2267,10 +2271,7 @@ int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, ...@@ -2267,10 +2271,7 @@ int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
void ff_mpegts_parse_close(MpegTSContext *ts) void ff_mpegts_parse_close(MpegTSContext *ts)
{ {
int i; mpegts_free(ts);
for(i=0;i<NB_PID_MAX;i++)
av_free(ts->pids[i]);
av_free(ts); av_free(ts);
} }
......
...@@ -57,6 +57,9 @@ struct PayloadContext { ...@@ -57,6 +57,9 @@ struct PayloadContext {
int nb_au_headers; int nb_au_headers;
int au_headers_length_bytes; int au_headers_length_bytes;
int cur_au_index; int cur_au_index;
uint8_t buf[RTP_MAX_PACKET_LENGTH];
int buf_pos, buf_size;
}; };
typedef struct { typedef struct {
...@@ -149,18 +152,11 @@ static int rtp_parse_mp4_au(PayloadContext *data, const uint8_t *buf, int len) ...@@ -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; 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) { for (i = 0; i < data->nb_au_headers; ++i) {
data->au_headers[0].size += get_bits_long(&getbitcontext, data->sizelength); data->au_headers[i].size = get_bits_long(&getbitcontext, data->sizelength);
data->au_headers[0].index = get_bits_long(&getbitcontext, data->indexlength); data->au_headers[i].index = get_bits_long(&getbitcontext, data->indexlength);
} }
data->nb_au_headers = 1;
return 0; return 0;
} }
...@@ -172,21 +168,44 @@ static int aac_parse_packet(AVFormatContext *ctx, PayloadContext *data, ...@@ -172,21 +168,44 @@ static int aac_parse_packet(AVFormatContext *ctx, PayloadContext *data,
int flags) int flags)
{ {
int ret; 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)) if (rtp_parse_mp4_au(data, buf, len))
return -1; return -1;
buf += data->au_headers_length_bytes + 2; buf += data->au_headers_length_bytes + 2;
len -= 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) if (len < data->au_headers[0].size)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
if ((ret = av_new_packet(pkt, data->au_headers[0].size)) < 0) if ((ret = av_new_packet(pkt, data->au_headers[0].size)) < 0)
return ret; return ret;
memcpy(pkt->data, buf, data->au_headers[0].size); 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; 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; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment