mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
31162eb949
commit
72db6a4f5f
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue