|
|
|
@@ -1572,7 +1572,7 @@ static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly) |
|
|
|
static void output_frame_end(AC3EncodeContext *s) |
|
|
|
{ |
|
|
|
const AVCRC *crc_ctx = av_crc_get_table(AV_CRC_16_ANSI); |
|
|
|
int frame_size_58, pad_bytes, crc1, crc2, crc_inv; |
|
|
|
int frame_size_58, pad_bytes, crc1, crc2_partial, crc2, crc_inv; |
|
|
|
uint8_t *frame; |
|
|
|
|
|
|
|
frame_size_58 = ((s->frame_size >> 2) + (s->frame_size >> 4)) << 1; |
|
|
|
@@ -1594,9 +1594,15 @@ static void output_frame_end(AC3EncodeContext *s) |
|
|
|
AV_WB16(frame + 2, crc1); |
|
|
|
|
|
|
|
/* compute crc2 */ |
|
|
|
crc2 = av_bswap16(av_crc(crc_ctx, 0, |
|
|
|
frame + frame_size_58, |
|
|
|
s->frame_size - frame_size_58 - 2)); |
|
|
|
crc2_partial = av_crc(crc_ctx, 0, frame + frame_size_58, |
|
|
|
s->frame_size - frame_size_58 - 3); |
|
|
|
crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1); |
|
|
|
/* ensure crc2 does not match sync word by flipping crcrsv bit if needed */ |
|
|
|
if (crc2 == 0x770B) { |
|
|
|
frame[s->frame_size - 3] ^= 0x1; |
|
|
|
crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1); |
|
|
|
} |
|
|
|
crc2 = av_bswap16(crc2); |
|
|
|
AV_WB16(frame + s->frame_size - 2, crc2); |
|
|
|
} |
|
|
|
|
|
|
|
|