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