[FFmpeg-devel] [PATCH 02/10] crc: add av_crc_bits() to compute CRC on block with bit boundary

Aurelien Jacobs aurel at gnuage.org
Wed Dec 20 21:58:06 EET 2017


---
 libavutil/crc.c | 20 ++++++++++++++++++++
 libavutil/crc.h | 12 ++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/libavutil/crc.c b/libavutil/crc.c
index 8e44a76ec8..cb26a09a20 100644
--- a/libavutil/crc.c
+++ b/libavutil/crc.c
@@ -413,3 +413,23 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
 
     return crc;
 }
+
+uint32_t av_crc_bits(const AVCRC *ctx, uint32_t crc,
+                     const uint8_t *buffer, size_t length)
+{
+    size_t byte_length = length >> 3;
+    int bit_length = length & 7;
+
+    crc = av_crc(ctx, crc, buffer, byte_length);
+
+    if (bit_length) {
+        uint8_t bits = buffer[byte_length];
+        while (bit_length--) {
+            int8_t mask = (bits ^ crc);
+            crc = (crc << 1) ^ (ctx[1] & (mask >> 7));
+            bits <<= 1;
+        }
+    }
+
+    return crc;
+}
diff --git a/libavutil/crc.h b/libavutil/crc.h
index e57a1af903..bde31f858a 100644
--- a/libavutil/crc.h
+++ b/libavutil/crc.h
@@ -86,6 +86,7 @@ const AVCRC *av_crc_get_table(AVCRCId crc_id);
 /**
  * Calculate the CRC of a block.
  * @param crc CRC of previous blocks if any or initial value for CRC
+ * @param length number of bytes in the given block
  * @return CRC updated with the data from the given block
  *
  * @see av_crc_init() "le" parameter
@@ -93,6 +94,17 @@ const AVCRC *av_crc_get_table(AVCRCId crc_id);
 uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
                 const uint8_t *buffer, size_t length) av_pure;
 
+/**
+ * Calculate the CRC of a block with bits boundary.
+ * @param crc CRC of previous blocks if any or initial value for CRC
+ * @param length number of bits in the given block
+ * @return CRC updated with the data from the given block
+ *
+ * @see av_crc_init() "le" parameter
+ */
+uint32_t av_crc_bits(const AVCRC *ctx, uint32_t crc,
+                     const uint8_t *buffer, size_t length) av_pure;
+
 /**
  * @}
  */
-- 
2.15.1



More information about the ffmpeg-devel mailing list