1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Make sure that the 2nd CRC value does not match the AC-3 sync word.

This is optional for encoders, but it's a good idea and has minimal impact
on performance.
This will change the output for some files, but it happens not to affect the
regression tests.

Originally committed as revision 26083 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Justin Ruggles 2010-12-23 18:01:26 +00:00
parent a897423baa
commit e96dc767e4

View File

@ -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) static void output_frame_end(AC3EncodeContext *s)
{ {
const AVCRC *crc_ctx = av_crc_get_table(AV_CRC_16_ANSI); 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; uint8_t *frame;
frame_size_58 = ((s->frame_size >> 2) + (s->frame_size >> 4)) << 1; 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); AV_WB16(frame + 2, crc1);
/* compute crc2 */ /* compute crc2 */
crc2 = av_bswap16(av_crc(crc_ctx, 0, crc2_partial = av_crc(crc_ctx, 0, frame + frame_size_58,
frame + frame_size_58, s->frame_size - frame_size_58 - 3);
s->frame_size - frame_size_58 - 2)); 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); AV_WB16(frame + s->frame_size - 2, crc2);
} }