From d35db94cad1b2f8bd64d1faa61467acb37cea90c Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 20 Oct 2015 10:58:03 +0200 Subject: [PATCH] parsers: improve AAC parser (multiple DTS packets) --- src/parsers/parsers.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index aa5c60498..7f50a8d1a 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -177,7 +177,7 @@ static void parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data, int len, int start) { - int l, muxlen, p; + int l, muxlen, p, latm; th_pkt_t *pkt; int64_t olddts = PTS_UNSET, oldpts = PTS_UNSET; @@ -222,6 +222,7 @@ parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data, sbuf_append(&st->es_buf, data, len); p = 0; + latm = -1; while((l = st->es_buf.sb_ptr - p) > 3) { const uint8_t *d = st->es_buf.sb_data + p; @@ -229,12 +230,13 @@ parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data, if(d[0] == 0 || d[1] == 0 || d[2] == 1) { p += 4; /* LATM */ - } else if(d[0] == 0x56 && (d[1] & 0xe0) == 0xe0) { + } else if(latm != 0 && d[0] == 0x56 && (d[1] & 0xe0) == 0xe0) { muxlen = (d[1] & 0x1f) << 8 | d[2]; if(l < muxlen + 3) break; + latm = 1; pkt = parse_latm_audio_mux_element(t, st, d + 3, muxlen); if(pkt != NULL) { @@ -245,7 +247,7 @@ parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data, p += muxlen + 3; /* ADTS */ - } else if(p == 0 && d[0] == 0xff && (d[1] & 0xf0) == 0xf0) { + } else if(latm <= 0 && d[0] == 0xff && (d[1] & 0xf0) == 0xf0) { if (l < 7) break; @@ -254,6 +256,7 @@ parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data, if (l < muxlen) break; + latm = 0; sbuf_reset(&st->es_buf_a, 4000); sbuf_append(&st->es_buf_a, d, muxlen); parse_mp4a_data(t, st, 1); -- 2.47.3