From d1387282208ec7d401111b1144cf37223cb05657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Sun, 5 Sep 2010 10:18:13 +0000 Subject: [PATCH] Fix parsing of PS MPEG audio. Ticket #260 --- src/parsers.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/parsers.c b/src/parsers.c index 124941f2..61cd12df 100644 --- a/src/parsers.c +++ b/src/parsers.c @@ -105,6 +105,8 @@ static void parse_subtitles(th_transport_t *t, th_stream_t *st, static int parse_mpa(th_transport_t *t, th_stream_t *st, size_t len, uint32_t next_startcode, int sc_offset); +static int parse_mpa2(th_transport_t *t, th_stream_t *st); + static int parse_ac3(th_transport_t *t, th_stream_t *st, size_t len, uint32_t next_startcode, int sc_offset); @@ -166,7 +168,7 @@ parse_mpeg_ps(th_transport_t *t, th_stream_t *st, uint8_t *data, int len) int hlen; hlen = parse_pes_header(t, st, data, len); -#if 0 +#if 0 int i; for(i = 0; i < 16; i++) printf("%02x.", data[i]); @@ -180,7 +182,8 @@ parse_mpeg_ps(th_transport_t *t, th_stream_t *st, uint8_t *data, int len) switch(st->st_type) { case SCT_MPEG2AUDIO: - parse_sc(t, st, data, len, parse_mpa); + sbuf_append(&st->st_buf_a, data, len); + parse_mpa2(t, st); break; case SCT_MPEG2VIDEO: @@ -300,6 +303,7 @@ parse_sc(th_transport_t *t, th_stream_t *st, const uint8_t *data, int len, if((sc & 0xffffff00) != 0x00000100) continue; + if(sc == 0x100 && (len-i)>3) { uint32_t tempsc = data[i+1]<< 16 | data [i+2] << 8 | data [i+3]; @@ -431,16 +435,15 @@ mpa_valid_frame(const uint8_t *buf) } -static int -parse_mpa(th_transport_t *t, th_stream_t *st, size_t ilen, - uint32_t next_startcode, int sc_offset) +/** + * + */ +static int +parse_mpa2(th_transport_t *t, th_stream_t *st) { int i, len; const uint8_t *buf; - if((i = depacketize(t, st, ilen, next_startcode, sc_offset)) != 0) - return i; - again: buf = st->st_buf_a.sb_data; len = st->st_buf_a.sb_ptr; @@ -474,6 +477,20 @@ parse_mpa(th_transport_t *t, th_stream_t *st, size_t ilen, return 1; } +/** + * + */ +static int +parse_mpa(th_transport_t *t, th_stream_t *st, size_t ilen, + uint32_t next_startcode, int sc_offset) +{ + int r; + + if((r = depacketize(t, st, ilen, next_startcode, sc_offset)) != 0) + return r; + return parse_mpa2(t, st); +} + /** * AC3 audio parser