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 @@
* 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"
......
......@@ -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);
}
......
......@@ -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;
}
......
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