[FFmpeg-cvslog] r26083 - trunk/libavcodec/ac3enc.c

jbr subversion
Thu Dec 23 19:01:27 CET 2010


Author: jbr
Date: Thu Dec 23 19:01:26 2010
New Revision: 26083

Log:
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.

Modified:
   trunk/libavcodec/ac3enc.c

Modified: trunk/libavcodec/ac3enc.c
==============================================================================
--- trunk/libavcodec/ac3enc.c	Thu Dec 23 19:01:23 2010	(r26082)
+++ trunk/libavcodec/ac3enc.c	Thu Dec 23 19:01:26 2010	(r26083)
@@ -1572,7 +1572,7 @@ static unsigned int pow_poly(unsigned in
 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(AC3EncodeCo
     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);
 }
 



More information about the ffmpeg-cvslog mailing list