Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
parsers: improve AAC parser (multiple DTS packets)
  • Loading branch information
perexg committed Oct 20, 2015
1 parent 2e3dfb6 commit d35db94
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions src/parsers/parsers.c
Expand Up @@ -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;

Expand Down Expand Up @@ -222,19 +222,21 @@ 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;
/* Startcode check */
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) {
Expand All @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit d35db94

Please sign in to comment.