diff options
author | James Almer <jamrial@gmail.com> | 2019-07-20 10:13:08 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2019-07-23 00:46:11 -0300 |
commit | 47bb804f781370da35a443c5acda912bebb41984 (patch) | |
tree | 1fc6e8ee999726dc6485909baec9fa1a0f50df4e /libavformat | |
parent | 5ace41951948c6507926f13a924ff557bf7c2093 (diff) | |
download | ffmpeg-47bb804f781370da35a443c5acda912bebb41984.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')
-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); |