avcodec/ac3dec: split off code discarding garbage at the beginning of a packet

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2022-10-20 23:54:14 -03:00
parent 31162eb949
commit 72db6a4f5f
3 changed files with 23 additions and 13 deletions

View File

@ -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)
{

View File

@ -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 */

View File

@ -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;