diff options
author | James Almer <jamrial@gmail.com> | 2019-07-20 10:13:08 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2019-07-21 01:06:20 -0300 |
commit | 1fbe0286e4091dd4cdc0694965d92c42b98cacf1 (patch) | |
tree | 21d8ad550cc6a1bc1b10a8437b10c18db9a2e95f /libavformat/aacdec.c | |
parent | 1b6bcee9fe6f59a2d8c11c18711d65d744b0b5aa (diff) | |
download | ffmpeg-1fbe0286e4091dd4cdc0694965d92c42b98cacf1.tar.gz |
avformat/aacdec: factorize the adts frame resync code
Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit a38eab8b7501440f872ff1af8a0c5482b7b3e532)
Diffstat (limited to 'libavformat/aacdec.c')
-rw-r--r-- | libavformat/aacdec.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c index e23abd0abf..66fa49ac26 100644 --- a/libavformat/aacdec.c +++ b/libavformat/aacdec.c @@ -80,10 +80,31 @@ static int adts_aac_probe(AVProbeData *p) return 0; } +static int adts_aac_resync(AVFormatContext *s) +{ + uint16_t state; + + // skip data until an ADTS frame is found + state = avio_r8(s->pb); + while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) { + state = (state << 8) | avio_r8(s->pb); + if ((state >> 4) != 0xFFF) + continue; + avio_seek(s->pb, -2, SEEK_CUR); + break; + } + if (s->pb->eof_reached) + return AVERROR_EOF; + if ((state >> 4) != 0xFFF) + return AVERROR_INVALIDDATA; + + return 0; +} + static int adts_aac_read_header(AVFormatContext *s) { AVStream *st; - uint16_t state; + int ret; st = avformat_new_stream(s, NULL); if (!st) @@ -101,17 +122,9 @@ static int adts_aac_read_header(AVFormatContext *s) avio_seek(s->pb, cur, SEEK_SET); } - // skip data until the first ADTS frame is found - state = avio_r8(s->pb); - while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) { - state = (state << 8) | avio_r8(s->pb); - if ((state >> 4) != 0xFFF) - continue; - avio_seek(s->pb, -2, SEEK_CUR); - break; - } - if ((state >> 4) != 0xFFF) - return AVERROR_INVALIDDATA; + ret = adts_aac_resync(s); + if (ret < 0) + return ret; // LCM of all possible ADTS sample rates avpriv_set_pts_info(st, 64, 1, 28224000); |