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

2017-12-23 Thread Aurelien Jacobs
On Thu, Dec 21, 2017 at 11:39:02AM +, Rostislav Pehlivanov wrote:
> On 20 December 2017 at 19:58, Aurelien Jacobs  wrote:
> 
> > ---
> >  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;
> > +
> >  /**
> >   * @}
> >   */
> >
> > ___
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> 
> Sorry, I didn't see that sbc does fucked up crc on 7 bits.

Well, it is not on 7 bits. That actual data length is a multiple of
4 bits.

> In that case could you submit a new version of just the sbc patch which
> adds this back in the decoder?

I moved the function back to sbc, but I keept its usage of av_crc() for
the whole buffer except for the last bits that don't form a full byte.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


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

2017-12-21 Thread Rostislav Pehlivanov
On 20 December 2017 at 19:58, Aurelien Jacobs  wrote:

> ---
>  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
>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

Sorry, I didn't see that sbc does fucked up crc on 7 bits.
In that case could you submit a new version of just the sbc patch which
adds this back in the decoder?
If you can point out another CRC, even a non-multimedia one, which does
calculations on a non-byte aligned (but continuous, without skipping bits)
buffer I'd accept this patch though.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


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

2017-12-20 Thread Aurelien Jacobs
---
 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

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel