Message ID | 20221022210226.2200-1-jamrial@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,1/5,v2] avcodec/ac3dec: split off code discarding garbage at the beginning of a packet | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On 10/22/2022 6:02 PM, James Almer wrote: > Signed-off-by: James Almer <jamrial@gmail.com> > --- > No changes since v1. > > libavcodec/ac3_parser.c | 19 +++++++++++++++++++ > libavcodec/ac3_parser_internal.h | 2 ++ > libavcodec/ac3dec.c | 15 ++------------- > 3 files changed, 23 insertions(+), 13 deletions(-) > > diff --git a/libavcodec/ac3_parser.c b/libavcodec/ac3_parser.c > index 4f154bb7c4..425e1b4742 100644 > --- a/libavcodec/ac3_parser.c > +++ b/libavcodec/ac3_parser.c > @@ -53,6 +53,25 @@ static const uint8_t center_levels[4] = { 4, 5, 6, 5 }; > */ > static const uint8_t surround_levels[4] = { 4, 6, 7, 6 }; > > +int ff_ac3_find_syncword(const uint8_t *buf, int buf_size) > +{ > + int i; > + > + for (i = 1; i < buf_size; i += 2) { > + if (buf[i] == 0x77 || buf[i] == 0x0B) { > + if ((buf[i] ^ buf[i-1]) == (0x77 ^ 0x0B)) { > + i--; > + break; > + } else if ((buf[i] ^ buf[i+1]) == (0x77 ^ 0x0B)) { > + break; > + } > + } > + } > + if (i >= buf_size) > + return AVERROR_INVALIDDATA; > + > + return i; > +} > > int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) > { > diff --git a/libavcodec/ac3_parser_internal.h b/libavcodec/ac3_parser_internal.h > index bd4e1bbffb..2ac0e67ec2 100644 > --- a/libavcodec/ac3_parser_internal.h > +++ b/libavcodec/ac3_parser_internal.h > @@ -79,4 +79,6 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr); > int avpriv_ac3_parse_header(AC3HeaderInfo **hdr, const uint8_t *buf, > size_t size); > > +int ff_ac3_find_syncword(const uint8_t *buf, int buf_size); > + > #endif /* AVCODEC_AC3_PARSER_INTERNAL_H */ > diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c > index 340f6e1e37..8e40587ff1 100644 > --- a/libavcodec/ac3dec.c > +++ b/libavcodec/ac3dec.c > @@ -1508,19 +1508,8 @@ static int ac3_decode_frame(AVCodecContext *avctx, AVFrame *frame, > s->superframe_size = 0; > > buf_size = full_buf_size; > - for (i = 1; i < buf_size; i += 2) { > - if (buf[i] == 0x77 || buf[i] == 0x0B) { > - if ((buf[i] ^ buf[i-1]) == (0x77 ^ 0x0B)) { > - i--; > - break; > - } else if ((buf[i] ^ buf[i+1]) == (0x77 ^ 0x0B)) { > - break; > - } > - } > - } > - if (i >= buf_size) > - return AVERROR_INVALIDDATA; > - if (i > 10) > + i = ff_ac3_find_syncword(buf, buf_size); > + if (i < 0 || i > 10) > return i; > buf += i; > buf_size -= i; Will apply set.
diff --git a/libavcodec/ac3_parser.c b/libavcodec/ac3_parser.c index 4f154bb7c4..425e1b4742 100644 --- a/libavcodec/ac3_parser.c +++ b/libavcodec/ac3_parser.c @@ -53,6 +53,25 @@ static const uint8_t center_levels[4] = { 4, 5, 6, 5 }; */ static const uint8_t surround_levels[4] = { 4, 6, 7, 6 }; +int ff_ac3_find_syncword(const uint8_t *buf, int buf_size) +{ + int i; + + for (i = 1; i < buf_size; i += 2) { + if (buf[i] == 0x77 || buf[i] == 0x0B) { + if ((buf[i] ^ buf[i-1]) == (0x77 ^ 0x0B)) { + i--; + break; + } else if ((buf[i] ^ buf[i+1]) == (0x77 ^ 0x0B)) { + break; + } + } + } + if (i >= buf_size) + return AVERROR_INVALIDDATA; + + return i; +} int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) { diff --git a/libavcodec/ac3_parser_internal.h b/libavcodec/ac3_parser_internal.h index bd4e1bbffb..2ac0e67ec2 100644 --- a/libavcodec/ac3_parser_internal.h +++ b/libavcodec/ac3_parser_internal.h @@ -79,4 +79,6 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr); int avpriv_ac3_parse_header(AC3HeaderInfo **hdr, const uint8_t *buf, size_t size); +int ff_ac3_find_syncword(const uint8_t *buf, int buf_size); + #endif /* AVCODEC_AC3_PARSER_INTERNAL_H */ diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 340f6e1e37..8e40587ff1 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -1508,19 +1508,8 @@ static int ac3_decode_frame(AVCodecContext *avctx, AVFrame *frame, s->superframe_size = 0; buf_size = full_buf_size; - for (i = 1; i < buf_size; i += 2) { - if (buf[i] == 0x77 || buf[i] == 0x0B) { - if ((buf[i] ^ buf[i-1]) == (0x77 ^ 0x0B)) { - i--; - break; - } else if ((buf[i] ^ buf[i+1]) == (0x77 ^ 0x0B)) { - break; - } - } - } - if (i >= buf_size) - return AVERROR_INVALIDDATA; - if (i > 10) + i = ff_ac3_find_syncword(buf, buf_size); + if (i < 0 || i > 10) return i; buf += i; buf_size -= i;
Signed-off-by: James Almer <jamrial@gmail.com> --- No changes since v1. libavcodec/ac3_parser.c | 19 +++++++++++++++++++ libavcodec/ac3_parser_internal.h | 2 ++ libavcodec/ac3dec.c | 15 ++------------- 3 files changed, 23 insertions(+), 13 deletions(-)