[vlc-commits] [Git][videolan/vlc][master] 2 commits: contrib: mad: remove unused patch

Steve Lhomme (@robUx4) gitlab at videolan.org
Tue Oct 13 13:30:54 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
e2f9fe5f by Steve Lhomme at 2026-10-13T12:03:35+00:00
contrib: mad: remove unused patch

- - - - -
22cfdef6 by Steve Lhomme at 2026-10-13T12:03:35+00:00
contrib: mad: update the 0.16.5

- - - - -


4 changed files:

- + contrib/src/mad/0001-CMake-case-of-AND-test.patch
- contrib/src/mad/SHA512SUMS
- − contrib/src/mad/check-bitstream-length.patch
- contrib/src/mad/rules.mak


Changes:

=====================================
contrib/src/mad/0001-CMake-case-of-AND-test.patch
=====================================
@@ -0,0 +1,32 @@
+From 9dd96b40c5caf76fd1c6ef9dcc80ba330eb57a79 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at ycbcr.xyz>
+Date: Mon, 12 Oct 2026 12:50:15 +0200
+Subject: [PATCH] CMake: case of AND test
+
+Older cmake (3.17) reports an error:
+
+```
+CMake Error at CMakeLists.txt:86 (if):
+  if given arguments:
+    "ASO" "and" "FALSE"
+```
+---
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 3c4bf9f..4655feb 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -83,7 +83,7 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x|i[3456])86")
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ".*(arm|ARM).*")
+   message(STATUS "Using ARM fixed point math")
+   option (FPM_ARM "ARM fixed point math" ON)
+-  if(ASO and FALSE)
++  if(ASO AND FALSE)
+     enable_language(ASM)
+     list(APPEND MAD_CONFIG_DEFS ASO_INTERLEAVE1 ASO_IMDCT)
+     if (BUILD_SHARED_LIBS)
+-- 
+2.52.0.windows.1
+


=====================================
contrib/src/mad/SHA512SUMS
=====================================
@@ -1 +1 @@
-e56b84e112e3a95cd4fde7be1ce94c4a277275da3cc69ca051113162a84158ac9a1fe9c3f2de186202de5eca5c112aacb87533206288a084cf5ba048e6d95c22  libmad-0.16.4.tar.gz
+4ea1e65970e73d3bcccf3f2a57d89ac583815b4a4a2348c60018c766b4b2a7201a45df182332c0f5b7117baa033830943624afec0b5d1f051452d2c279b6be1a  libmad-0.16.5.tar.gz


=====================================
contrib/src/mad/check-bitstream-length.patch deleted
=====================================
@@ -1,1173 +0,0 @@
-From 6ee4d5bac6ce98a6533f18298bfa74c2cf999eed Mon Sep 17 00:00:00 2001
-From: Shlomi Fish <shlomif at shlomifish.org>
-Date: Sun, 26 Jun 2016 21:56:48 +0200
-Subject: [PATCH 2/2] fix libmad sound issue
-
----
- bit.c     | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- frame.c   |  66 +++++++++++----------
- layer12.c |  66 ++++++++++-----------
- layer3.c  | 119 +++++++++++++++++++-------------------
- mad.h.in  |  31 ++++++++++
- stream.c  |  23 +++++---
- 6 files changed, 345 insertions(+), 130 deletions(-)
-
-diff --git a/bit.c b/bit.c
-index 72a094c..5db9be4 100644
---- a/bit.c
-+++ b/bit.c
-@@ -77,6 +77,176 @@ unsigned short const crc_table[256] = {
- 
- # define CRC_POLY  0x8005
- 
-+/*
-+ * NAME:	bit->init()
-+ * DESCRIPTION:	initialize bit pointer struct
-+ */
-+void mad_bit_w_len_init(struct mad_bit_w_lenptr *bitptr, unsigned char const *byte, unsigned int length)
-+{
-+  bitptr->byte  = byte;
-+  bitptr->cache = 0;
-+  bitptr->left  = CHAR_BIT;
-+  bitptr->length = length;
-+}
-+
-+/*
-+ * NAME:	bit->length()
-+ * DESCRIPTION:	return number of bits between start and end points
-+ */
-+unsigned int mad_bit_w_len_length(struct mad_bit_w_lenptr const *begin,
-+			    struct mad_bit_w_lenptr const *end)
-+{
-+  return begin->left +
-+    CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left);
-+}
-+
-+/*
-+ * NAME:	bit->nextbyte()
-+ * DESCRIPTION:	return pointer to next unprocessed byte
-+ */
-+unsigned char const *mad_bit_w_len_nextbyte(struct mad_bit_w_lenptr const *bitptr)
-+{
-+    if (bitptr->left == CHAR_BIT)
-+        return bitptr->byte;
-+    if (bitptr->length == 0)
-+        return 0;
-+    return bitptr->byte + 1;
-+}
-+
-+/*
-+ * NAME:	bit->skip()
-+ * DESCRIPTION:	advance bit pointer
-+ */
-+void mad_bit_w_len_skip(struct mad_bit_w_lenptr *bitptr, unsigned int len)
-+{
-+  if (bitptr->length < len / CHAR_BIT)
-+    return;
-+  bitptr->byte += len / CHAR_BIT;
-+  bitptr->left -= len % CHAR_BIT;
-+  bitptr->length -= len / CHAR_BIT;
-+
-+  if (bitptr->left > CHAR_BIT) {
-+    if (bitptr->length == 0)
-+      return;
-+    bitptr->byte++;
-+    bitptr->length--;
-+    bitptr->left += CHAR_BIT;
-+  }
-+
-+  if (bitptr->left < CHAR_BIT)
-+    bitptr->cache = *bitptr->byte;
-+}
-+
-+/*
-+ * NAME:	bit->read()
-+ * DESCRIPTION:	read an arbitrary number of bits and return their UIMSBF value
-+ */
-+unsigned long mad_bit_w_len_read(struct mad_bit_w_lenptr *bitptr, unsigned int len)
-+{
-+  register unsigned long value;
-+
-+  if (bitptr->left == CHAR_BIT)
-+    bitptr->cache = *bitptr->byte;
-+
-+  if (len < bitptr->left) {
-+    value = (bitptr->cache & ((1 << bitptr->left) - 1)) >>
-+      (bitptr->left - len);
-+    bitptr->left -= len;
-+
-+    return value;
-+  }
-+
-+  /* remaining bits in current byte */
-+
-+  value = bitptr->cache & ((1 << bitptr->left) - 1);
-+  len  -= bitptr->left;
-+
-+  if (bitptr->length == 0)
-+    return value;
-+  bitptr->byte++;
-+  bitptr->length--;
-+  bitptr->left = CHAR_BIT;
-+
-+  /* more bytes */
-+
-+  while (len >= CHAR_BIT && bitptr->length > 0) {
-+    value = (value << CHAR_BIT) | *bitptr->byte++;
-+    bitptr->length--;
-+    len  -= CHAR_BIT;
-+  }
-+
-+  if (len > 0 && bitptr->length > 0) {
-+    bitptr->cache = *bitptr->byte;
-+
-+    value = (value << len) | (bitptr->cache >> (CHAR_BIT - len));
-+    bitptr->left -= len;
-+  }
-+
-+  return value;
-+}
-+
-+# if 0
-+/*
-+ * NAME:	bit->write()
-+ * DESCRIPTION:	write an arbitrary number of bits
-+ */
-+void mad_bit_w_len_write(struct mad_bit_w_lenptr *bitptr, unsigned int len,
-+		   unsigned long value)
-+{
-+  unsigned char *ptr;
-+
-+  ptr = (unsigned char *) bitptr->byte;
-+
-+  /* ... */
-+}
-+# endif
-+
-+/*
-+ * NAME:	bit->crc()
-+ * DESCRIPTION:	compute CRC-check word
-+ */
-+unsigned short mad_bit_w_len_crc(struct mad_bit_w_lenptr bitptr, unsigned int len,
-+			   unsigned short init)
-+{
-+  register unsigned int crc;
-+
-+  for (crc = init; len >= 32; len -= 32) {
-+    register unsigned long data;
-+
-+    data = mad_bit_w_len_read(&bitptr, 32);
-+
-+    crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff];
-+    crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff];
-+    crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >>  8)) & 0xff];
-+    crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >>  0)) & 0xff];
-+  }
-+
-+  switch (len / 8) {
-+  case 3: crc = (crc << 8) ^
-+	    crc_table[((crc >> 8) ^ mad_bit_w_len_read(&bitptr, 8)) & 0xff];
-+  case 2: crc = (crc << 8) ^
-+	    crc_table[((crc >> 8) ^ mad_bit_w_len_read(&bitptr, 8)) & 0xff];
-+  case 1: crc = (crc << 8) ^
-+	    crc_table[((crc >> 8) ^ mad_bit_w_len_read(&bitptr, 8)) & 0xff];
-+
-+  len %= 8;
-+
-+  case 0: break;
-+  }
-+
-+  while (len--) {
-+    register unsigned int msb;
-+
-+    msb = mad_bit_w_len_read(&bitptr, 1) ^ (crc >> 15);
-+
-+    crc <<= 1;
-+    if (msb & 1)
-+      crc ^= CRC_POLY;
-+  }
-+
-+  return crc & 0xffff;
-+}
-+
- /*
-  * NAME:	bit->init()
-  * DESCRIPTION:	initialize bit pointer struct
-diff --git a/frame.c b/frame.c
-index 03c94bf..7bf127b 100644
---- a/frame.c
-+++ b/frame.c
-@@ -113,28 +113,28 @@ static
- int decode_header(struct mad_header *header, struct mad_stream *stream)
- {
-   unsigned int index;
--  struct mad_bitptr bufend_ptr;
-+  struct mad_bit_w_lenptr bufend_ptr;
- 
-   header->flags        = 0;
-   header->private_bits = 0;
- 
--  mad_bit_init(&bufend_ptr, stream->bufend);
-+  mad_bit_w_len_init(&bufend_ptr, stream->next_frame, stream->bufend - stream->next_frame);
- 
-   /* header() */
--  if (mad_bit_length(&stream->ptr, &bufend_ptr) < 32) {
-+  if (mad_bit_w_len_length(stream->l_ptr, &bufend_ptr) < 32) {
-     stream->error = MAD_ERROR_BUFLEN;
-     return -1;
-   }
- 
-   /* syncword */
--  mad_bit_skip(&stream->ptr, 11);
-+  mad_bit_w_len_skip(stream->l_ptr, 11);
- 
-   /* MPEG 2.5 indicator (really part of syncword) */
--  if (mad_bit_read(&stream->ptr, 1) == 0)
-+  if (mad_bit_w_len_read(stream->l_ptr, 1) == 0)
-     header->flags |= MAD_FLAG_MPEG_2_5_EXT;
- 
-   /* ID */
--  if (mad_bit_read(&stream->ptr, 1) == 0)
-+  if (mad_bit_w_len_read(stream->l_ptr, 1) == 0)
-     header->flags |= MAD_FLAG_LSF_EXT;
-   else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) {
-     stream->error = MAD_ERROR_LOSTSYNC;
-@@ -142,7 +142,7 @@ int decode_header(struct mad_header *header, struct mad_stream *stream)
-   }
- 
-   /* layer */
--  header->layer = 4 - mad_bit_read(&stream->ptr, 2);
-+  header->layer = 4 - mad_bit_w_len_read(stream->l_ptr, 2);
- 
-   if (header->layer == 4) {
-     stream->error = MAD_ERROR_BADLAYER;
-@@ -150,13 +150,13 @@ int decode_header(struct mad_header *header, struct mad_stream *stream)
-   }
- 
-   /* protection_bit */
--  if (mad_bit_read(&stream->ptr, 1) == 0) {
-+  if (mad_bit_w_len_read(stream->l_ptr, 1) == 0) {
-     header->flags    |= MAD_FLAG_PROTECTION;
-     header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff);
-   }
- 
-   /* bitrate_index */
--  index = mad_bit_read(&stream->ptr, 4);
-+  index = mad_bit_w_len_read(stream->l_ptr, 4);
- 
-   if (index == 15) {
-     stream->error = MAD_ERROR_BADBITRATE;
-@@ -169,7 +169,7 @@ int decode_header(struct mad_header *header, struct mad_stream *stream)
-     header->bitrate = bitrate_table[header->layer - 1][index];
- 
-   /* sampling_frequency */
--  index = mad_bit_read(&stream->ptr, 2);
-+  index = mad_bit_w_len_read(stream->l_ptr, 2);
- 
-   if (index == 3) {
-     stream->error = MAD_ERROR_BADSAMPLERATE;
-@@ -186,29 +186,29 @@ int decode_header(struct mad_header *header, struct mad_stream *stream)
-   }
- 
-   /* padding_bit */
--  if (mad_bit_read(&stream->ptr, 1))
-+  if (mad_bit_w_len_read(stream->l_ptr, 1))
-     header->flags |= MAD_FLAG_PADDING;
- 
-   /* private_bit */
--  if (mad_bit_read(&stream->ptr, 1))
-+  if (mad_bit_w_len_read(stream->l_ptr, 1))
-     header->private_bits |= MAD_PRIVATE_HEADER;
- 
-   /* mode */
--  header->mode = 3 - mad_bit_read(&stream->ptr, 2);
-+  header->mode = 3 - mad_bit_w_len_read(stream->l_ptr, 2);
- 
-   /* mode_extension */
--  header->mode_extension = mad_bit_read(&stream->ptr, 2);
-+  header->mode_extension = mad_bit_w_len_read(stream->l_ptr, 2);
- 
-   /* copyright */
--  if (mad_bit_read(&stream->ptr, 1))
-+  if (mad_bit_w_len_read(stream->l_ptr, 1))
-     header->flags |= MAD_FLAG_COPYRIGHT;
- 
-   /* original/copy */
--  if (mad_bit_read(&stream->ptr, 1))
-+  if (mad_bit_w_len_read(stream->l_ptr, 1))
-     header->flags |= MAD_FLAG_ORIGINAL;
- 
-   /* emphasis */
--  header->emphasis = mad_bit_read(&stream->ptr, 2);
-+  header->emphasis = mad_bit_w_len_read(stream->l_ptr, 2);
- 
- # if defined(OPT_STRICT)
-   /*
-@@ -226,11 +226,11 @@ int decode_header(struct mad_header *header, struct mad_stream *stream)
- 
-   /* crc_check */
-   if (header->flags & MAD_FLAG_PROTECTION) {
--    if (mad_bit_length(&stream->ptr, &bufend_ptr) < 16) {
-+    if (mad_bit_w_len_length(stream->l_ptr, &bufend_ptr) < 16) {
-       stream->error = MAD_ERROR_BUFLEN;
-       return -1;
-     }
--    header->crc_target = mad_bit_read(&stream->ptr, 16);
-+    header->crc_target = mad_bit_w_len_read(stream->l_ptr, 16);
-   }
- 
-   return 0;
-@@ -243,12 +243,12 @@ int decode_header(struct mad_header *header, struct mad_stream *stream)
- static
- int free_bitrate(struct mad_stream *stream, struct mad_header const *header)
- {
--  struct mad_bitptr keep_ptr;
-+  struct mad_bit_w_lenptr keep_ptr;
-   unsigned long rate = 0;
-   unsigned int pad_slot, slots_per_frame;
-   unsigned char const *ptr = 0;
- 
--  keep_ptr = stream->ptr;
-+  keep_ptr = *stream->l_ptr;
- 
-   pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0;
-   slots_per_frame = (header->layer == MAD_LAYER_III &&
-@@ -266,7 +266,7 @@ int free_bitrate(struct mad_stream *stream, struct mad_header const *header)
- 	peek_header.samplerate == header->samplerate) {
-       unsigned int N;
- 
--      ptr = mad_bit_nextbyte(&stream->ptr);
-+      ptr = mad_bit_w_len_nextbyte(stream->l_ptr);
- 
-       N = ptr - stream->this_frame;
- 
-@@ -283,10 +283,10 @@ int free_bitrate(struct mad_stream *stream, struct mad_header const *header)
- 	break;
-     }
- 
--    mad_bit_skip(&stream->ptr, 8);
-+    mad_bit_w_len_skip(stream->l_ptr, 8);
-   }
- 
--  stream->ptr = keep_ptr;
-+  *stream->l_ptr = keep_ptr;
- 
-   if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) {
-     stream->error = MAD_ERROR_LOSTSYNC;
-@@ -353,7 +353,7 @@ int mad_header_decode(struct mad_header *header, struct mad_stream *stream)
-     }
-   }
-   else {
--    mad_bit_init(&stream->ptr, ptr);
-+    mad_bit_w_len_init(stream->l_ptr, ptr, stream->bufend - ptr);
- 
-     if (mad_stream_sync(stream) == -1) {
-       if (end - stream->next_frame >= MAD_BUFFER_GUARD)
-@@ -363,7 +363,7 @@ int mad_header_decode(struct mad_header *header, struct mad_stream *stream)
-       goto fail;
-     }
- 
--    ptr = mad_bit_nextbyte(&stream->ptr);
-+    ptr = mad_bit_w_len_nextbyte(stream->l_ptr);
-   }
- 
-   stream->error = MAD_ERROR_NONE;
-@@ -372,7 +372,7 @@ int mad_header_decode(struct mad_header *header, struct mad_stream *stream)
-   stream->this_frame = ptr;
-   stream->next_frame = ptr + 1;  /* possibly bogus sync word */
- 
--  mad_bit_init(&stream->ptr, stream->this_frame);
-+  mad_bit_w_len_init(stream->l_ptr, stream->this_frame, stream->bufend - stream->this_frame);
- 
-   if (decode_header(header, stream) == -1)
-     goto fail;
-@@ -467,14 +467,16 @@ int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream)
-   /* ancillary_data() */
- 
-   if (frame->header.layer != MAD_LAYER_III) {
--    struct mad_bitptr next_frame;
-+    struct mad_bit_w_lenptr next_frame;
- 
--    mad_bit_init(&next_frame, stream->next_frame);
-+    mad_bit_w_len_init(&next_frame, stream->next_frame, stream->bufend - stream->next_frame);
- 
--    stream->anc_ptr    = stream->ptr;
--    stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame);
-+    if (stream->l_ptr != stream->l_anc_ptr)
-+      free(stream->l_anc_ptr);
-+    stream->l_anc_ptr    = stream->l_ptr;
-+    stream->anc_bitlen = mad_bit_w_len_length(stream->l_ptr, &next_frame);
- 
--    mad_bit_finish(&next_frame);
-+    mad_bit_w_len_finish(&next_frame);
-   }
- 
-   return 0;
-diff --git a/layer12.c b/layer12.c
-index a334a27..99c4f71 100644
---- a/layer12.c
-+++ b/layer12.c
-@@ -65,19 +65,19 @@ mad_fixed_t const linear_table[14] = {
-  * DESCRIPTION:	decode one requantized Layer I sample from a bitstream
-  */
- static
--mad_fixed_t I_sample(struct mad_bitptr *ptr, unsigned int nb, struct mad_stream *stream)
-+mad_fixed_t I_sample(struct mad_bit_w_lenptr *ptr, unsigned int nb, struct mad_stream *stream)
- {
-   mad_fixed_t sample;
--  struct mad_bitptr frameend_ptr;
-+  struct mad_bit_w_lenptr frameend_ptr;
- 
--  mad_bit_init(&frameend_ptr, stream->next_frame);
-+  mad_bit_w_len_init(&frameend_ptr, stream->next_frame, stream->bufend - stream->next_frame);
- 
--  if (mad_bit_length(ptr, &frameend_ptr) < nb) {
-+  if (mad_bit_w_len_length(ptr, &frameend_ptr) < nb) {
-     stream->error = MAD_ERROR_LOSTSYNC;
-     stream->sync = 0;
-     return 0;
-   }
--  sample = mad_bit_read(ptr, nb);
-+  sample = mad_bit_w_len_read(ptr, nb);
- 
-   /* invert most significant bit, extend sign, then scale to fixed format */
- 
-@@ -210,7 +210,7 @@ int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame)
-       for (ch = 0; ch < nch; ++ch) {
- 	nb = allocation[ch][sb];
- 	frame->sbsample[ch][s][sb] = nb ?
--	  mad_f_mul(I_sample(&stream->ptr, nb, stream),
-+	  mad_f_mul(I_sample(stream->l_ptr, nb, stream),
- 		    sf_table[scalefactor[ch][sb]]) : 0;
- 	if (stream->error != 0)
- 	  return -1;
-@@ -226,7 +226,7 @@ int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame)
- 	  stream->sync = 0;
-           return -1;
- 	}
--	sample = I_sample(&stream->ptr, nb, stream);
-+	sample = I_sample(stream->l_ptr, nb, stream);
-         if (stream->error != 0)
- 	  return -1;
- 
-@@ -312,25 +312,25 @@ struct quantclass {
-  * DESCRIPTION:	decode three requantized Layer II samples from a bitstream
-  */
- static
--void II_samples(struct mad_bitptr *ptr,
-+void II_samples(struct mad_bit_w_lenptr *ptr,
- 		struct quantclass const *quantclass,
- 		mad_fixed_t output[3], struct mad_stream *stream)
- {
-   unsigned int nb, s, sample[3];
--  struct mad_bitptr frameend_ptr;
-+  struct mad_bit_w_lenptr frameend_ptr;
- 
--  mad_bit_init(&frameend_ptr, stream->next_frame);
-+  mad_bit_w_len_init(&frameend_ptr, stream->next_frame, stream->bufend - stream->next_frame);
- 
-   if ((nb = quantclass->group)) {
-     unsigned int c, nlevels;
- 
--    if (mad_bit_length(ptr, &frameend_ptr) < quantclass->bits) {
-+    if (mad_bit_w_len_length(ptr, &frameend_ptr) < quantclass->bits) {
-       stream->error = MAD_ERROR_LOSTSYNC;
-       stream->sync = 0;
-       return;
-     }
-     /* degrouping */
--    c = mad_bit_read(ptr, quantclass->bits);
-+    c = mad_bit_w_len_read(ptr, quantclass->bits);
-     nlevels = quantclass->nlevels;
- 
-     for (s = 0; s < 3; ++s) {
-@@ -342,12 +342,12 @@ void II_samples(struct mad_bitptr *ptr,
-     nb = quantclass->bits;
- 
-     for (s = 0; s < 3; ++s) {
--      if (mad_bit_length(ptr, &frameend_ptr) < nb) {
-+      if (mad_bit_w_len_length(ptr, &frameend_ptr) < nb) {
- 	stream->error = MAD_ERROR_LOSTSYNC;
- 	stream->sync = 0;
- 	return;
-       }
--      sample[s] = mad_bit_read(ptr, nb);
-+      sample[s] = mad_bit_w_len_read(ptr, nb);
-     }
-   }
- 
-@@ -379,14 +379,14 @@ void II_samples(struct mad_bitptr *ptr,
- int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
- {
-   struct mad_header *header = &frame->header;
--  struct mad_bitptr start;
-+  struct mad_bit_w_lenptr start;
-   unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb;
-   unsigned char const *offsets;
-   unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3];
-   mad_fixed_t samples[3];
--  struct mad_bitptr frameend_ptr;
-+  struct mad_bit_w_lenptr frameend_ptr;
- 
--  mad_bit_init(&frameend_ptr, stream->next_frame);
-+  mad_bit_w_len_init(&frameend_ptr, stream->next_frame, stream->bufend - stream->next_frame);
- 
-   nch = MAD_NCHANNELS(header);
- 
-@@ -446,7 +446,7 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
-   if (bound > sblimit)
-     bound = sblimit;
- 
--  start = stream->ptr;
-+  start = *stream->l_ptr;
- 
-   /* decode bit allocations */
- 
-@@ -454,25 +454,25 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
-     nbal = bitalloc_table[offsets[sb]].nbal;
- 
-     for (ch = 0; ch < nch; ++ch) {
--      if (mad_bit_length(&stream->ptr, &frameend_ptr) < nbal) {
-+      if (mad_bit_w_len_length(stream->l_ptr, &frameend_ptr) < nbal) {
- 	stream->error = MAD_ERROR_LOSTSYNC;
- 	stream->sync = 0;
- 	return -1;
-       }
--      allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal);
-+      allocation[ch][sb] = mad_bit_w_len_read(stream->l_ptr, nbal);
-     }
-   }
- 
-   for (sb = bound; sb < sblimit; ++sb) {
-     nbal = bitalloc_table[offsets[sb]].nbal;
- 
--    if (mad_bit_length(&stream->ptr, &frameend_ptr) < nbal) {
-+    if (mad_bit_w_len_length(stream->l_ptr, &frameend_ptr) < nbal) {
-       stream->error = MAD_ERROR_LOSTSYNC;
-       stream->sync = 0;
-       return -1;
-     }
-     allocation[0][sb] =
--    allocation[1][sb] = mad_bit_read(&stream->ptr, nbal);
-+    allocation[1][sb] = mad_bit_w_len_read(stream->l_ptr, nbal);
-   }
- 
-   /* decode scalefactor selection info */
-@@ -480,12 +480,12 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
-   for (sb = 0; sb < sblimit; ++sb) {
-     for (ch = 0; ch < nch; ++ch) {
-       if (allocation[ch][sb]) {
--	if (mad_bit_length(&stream->ptr, &frameend_ptr) < 2) {
-+	if (mad_bit_w_len_length(stream->l_ptr, &frameend_ptr) < 2) {
- 	  stream->error = MAD_ERROR_LOSTSYNC;
- 	  stream->sync = 0;
- 	  return -1;
- 	}
--	scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2);
-+	scfsi[ch][sb] = mad_bit_w_len_read(stream->l_ptr, 2);
-       }
-     }
-   }
-@@ -494,7 +494,7 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
- 
-   if (header->flags & MAD_FLAG_PROTECTION) {
-     header->crc_check =
--      mad_bit_crc(start, mad_bit_length(&start, &stream->ptr),
-+      mad_bit_w_len_crc(start, mad_bit_w_len_length(&start, stream->l_ptr),
- 		  header->crc_check);
- 
-     if (header->crc_check != header->crc_target &&
-@@ -509,12 +509,12 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
-   for (sb = 0; sb < sblimit; ++sb) {
-     for (ch = 0; ch < nch; ++ch) {
-       if (allocation[ch][sb]) {
--	if (mad_bit_length(&stream->ptr, &frameend_ptr) < 6) {
-+	if (mad_bit_w_len_length(stream->l_ptr, &frameend_ptr) < 6) {
- 	  stream->error = MAD_ERROR_LOSTSYNC;
- 	  stream->sync = 0;
- 	  return -1;
- 	}
--	scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6);
-+	scalefactor[ch][sb][0] = mad_bit_w_len_read(stream->l_ptr, 6);
- 
- 	switch (scfsi[ch][sb]) {
- 	case 2:
-@@ -524,22 +524,22 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
- 	  break;
- 
- 	case 0:
--	  if (mad_bit_length(&stream->ptr, &frameend_ptr) < 6) {
-+	  if (mad_bit_w_len_length(stream->l_ptr, &frameend_ptr) < 6) {
- 	    stream->error = MAD_ERROR_LOSTSYNC;
- 	    stream->sync = 0;
- 	    return -1;
- 	  }
--	  scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6);
-+	  scalefactor[ch][sb][1] = mad_bit_w_len_read(stream->l_ptr, 6);
- 	  /* fall through */
- 
- 	case 1:
- 	case 3:
--	  if (mad_bit_length(&stream->ptr, &frameend_ptr) < 6) {
-+	  if (mad_bit_w_len_length(stream->l_ptr, &frameend_ptr) < 6) {
- 	    stream->error = MAD_ERROR_LOSTSYNC;
- 	    stream->sync = 0;
- 	    return -1;
- 	  }
--	  scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6);
-+	  scalefactor[ch][sb][2] = mad_bit_w_len_read(stream->l_ptr, 6);
- 	}
- 
- 	if (scfsi[ch][sb] & 1)
-@@ -570,7 +570,7 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
- 	if ((index = allocation[ch][sb])) {
- 	  index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1];
- 
--	  II_samples(&stream->ptr, &qc_table[index], samples, stream);
-+	  II_samples(stream->l_ptr, &qc_table[index], samples, stream);
- 	  if (stream->error != 0)
-             return -1;
- 
-@@ -590,7 +590,7 @@ int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
-       if ((index = allocation[0][sb])) {
- 	index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1];
- 
--	II_samples(&stream->ptr, &qc_table[index], samples, stream);
-+	II_samples(stream->l_ptr, &qc_table[index], samples, stream);
- 	if (stream->error != 0)
-           return -1;
- 
-diff --git a/layer3.c b/layer3.c
-index 7f18fd7..85d4e23 100644
---- a/layer3.c
-+++ b/layer3.c
-@@ -498,7 +498,7 @@ mad_fixed_t const is_lsf_table[2][15] = {
-  * DESCRIPTION:	decode frame side information from a bitstream
-  */
- static
--enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
-+enum mad_error III_sideinfo(struct mad_bit_w_lenptr *ptr, unsigned int nch,
- 			    int lsf, struct sideinfo *si,
- 			    unsigned int *data_bitlen,
- 			    unsigned int *priv_bitlen)
-@@ -509,15 +509,15 @@ enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
-   *data_bitlen = 0;
-   *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
- 
--  si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
--  si->private_bits    = mad_bit_read(ptr, *priv_bitlen);
-+  si->main_data_begin = mad_bit_w_len_read(ptr, lsf ? 8 : 9);
-+  si->private_bits    = mad_bit_w_len_read(ptr, *priv_bitlen);
- 
-   ngr = 1;
-   if (!lsf) {
-     ngr = 2;
- 
-     for (ch = 0; ch < nch; ++ch)
--      si->scfsi[ch] = mad_bit_read(ptr, 4);
-+      si->scfsi[ch] = mad_bit_w_len_read(ptr, 4);
-   }
- 
-   for (gr = 0; gr < ngr; ++gr) {
-@@ -526,10 +526,10 @@ enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
-     for (ch = 0; ch < nch; ++ch) {
-       struct channel *channel = &granule->ch[ch];
- 
--      channel->part2_3_length    = mad_bit_read(ptr, 12);
--      channel->big_values        = mad_bit_read(ptr, 9);
--      channel->global_gain       = mad_bit_read(ptr, 8);
--      channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
-+      channel->part2_3_length    = mad_bit_w_len_read(ptr, 12);
-+      channel->big_values        = mad_bit_w_len_read(ptr, 9);
-+      channel->global_gain       = mad_bit_w_len_read(ptr, 8);
-+      channel->scalefac_compress = mad_bit_w_len_read(ptr, lsf ? 9 : 4);
- 
-       *data_bitlen += channel->part2_3_length;
- 
-@@ -539,8 +539,8 @@ enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
-       channel->flags = 0;
- 
-       /* window_switching_flag */
--      if (mad_bit_read(ptr, 1)) {
--	channel->block_type = mad_bit_read(ptr, 2);
-+      if (mad_bit_w_len_read(ptr, 1)) {
-+	channel->block_type = mad_bit_w_len_read(ptr, 2);
- 
- 	if (channel->block_type == 0 && result == 0)
- 	  result = MAD_ERROR_BADBLOCKTYPE;
-@@ -551,33 +551,33 @@ enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
- 	channel->region0_count = 7;
- 	channel->region1_count = 36;
- 
--	if (mad_bit_read(ptr, 1))
-+	if (mad_bit_w_len_read(ptr, 1))
- 	  channel->flags |= mixed_block_flag;
- 	else if (channel->block_type == 2)
- 	  channel->region0_count = 8;
- 
- 	for (i = 0; i < 2; ++i)
--	  channel->table_select[i] = mad_bit_read(ptr, 5);
-+	  channel->table_select[i] = mad_bit_w_len_read(ptr, 5);
- 
- # if defined(DEBUG)
- 	channel->table_select[2] = 4;  /* not used */
- # endif
- 
- 	for (i = 0; i < 3; ++i)
--	  channel->subblock_gain[i] = mad_bit_read(ptr, 3);
-+	  channel->subblock_gain[i] = mad_bit_w_len_read(ptr, 3);
-       }
-       else {
- 	channel->block_type = 0;
- 
- 	for (i = 0; i < 3; ++i)
--	  channel->table_select[i] = mad_bit_read(ptr, 5);
-+	  channel->table_select[i] = mad_bit_w_len_read(ptr, 5);
- 
--	channel->region0_count = mad_bit_read(ptr, 4);
--	channel->region1_count = mad_bit_read(ptr, 3);
-+	channel->region0_count = mad_bit_w_len_read(ptr, 4);
-+	channel->region1_count = mad_bit_w_len_read(ptr, 3);
-       }
- 
-       /* [preflag,] scalefac_scale, count1table_select */
--      channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
-+      channel->flags |= mad_bit_w_len_read(ptr, lsf ? 2 : 3);
-     }
-   }
- 
-@@ -589,12 +589,12 @@ enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
-  * DESCRIPTION:	decode channel scalefactors for LSF from a bitstream
-  */
- static
--unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
-+unsigned int III_scalefactors_lsf(struct mad_bit_w_lenptr *ptr,
- 				  struct channel *channel,
- 				  struct channel *gr1ch, int mode_extension,
- 				  unsigned int bits_left, unsigned int *part2_length)
- {
--  struct mad_bitptr start;
-+  struct mad_bit_w_lenptr start;
-   unsigned int scalefac_compress, index, slen[4], part, n, i;
-   unsigned char const *nsfb;
- 
-@@ -641,7 +641,7 @@ unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
-       for (i = 0; i < nsfb[part]; ++i) {
- 	if (bits_left < slen[part])
- 	  return MAD_ERROR_BADSCFSI;
--	channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
-+	channel->scalefac[n++] = mad_bit_w_len_read(ptr, slen[part]);
- 	bits_left -= slen[part];
-       }
-     }
-@@ -690,7 +690,7 @@ unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
-       for (i = 0; i < nsfb[part]; ++i) {
- 	if (bits_left < slen[part])
- 	  return MAD_ERROR_BADSCFSI;
--	is_pos = mad_bit_read(ptr, slen[part]);
-+	is_pos = mad_bit_w_len_read(ptr, slen[part]);
- 	bits_left -= slen[part];
- 
- 	channel->scalefac[n] = is_pos;
-@@ -704,7 +704,7 @@ unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
-     }
-   }
- 
--  *part2_length = mad_bit_length(&start, ptr);
-+  *part2_length = mad_bit_w_len_length(&start, ptr);
-   return MAD_ERROR_NONE;
- }
- 
-@@ -713,11 +713,11 @@ unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
-  * DESCRIPTION:	decode channel scalefactors of one granule from a bitstream
-  */
- static
--unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-+unsigned int III_scalefactors(struct mad_bit_w_lenptr *ptr, struct channel *channel,
- 			      struct channel const *gr0ch, unsigned int scfsi,
- 			      unsigned int bits_left, unsigned int *part2_length)
- {
--  struct mad_bitptr start;
-+  struct mad_bit_w_lenptr start;
-   unsigned int slen1, slen2, sfbi;
- 
-   start = *ptr;
-@@ -734,7 +734,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-     while (nsfb--) {
-       if (bits_left < slen1)
- 	return MAD_ERROR_BADSCFSI;
--      channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
-+      channel->scalefac[sfbi++] = mad_bit_w_len_read(ptr, slen1);
-       bits_left -= slen1;
-     }
- 
-@@ -742,7 +742,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-     while (nsfb--) {
-       if (bits_left < slen2)
- 	return MAD_ERROR_BADSCFSI;
--      channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
-+      channel->scalefac[sfbi++] = mad_bit_w_len_read(ptr, slen2);
-       bits_left -= slen2;
-     }
- 
-@@ -759,7 +759,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-       for (sfbi = 0; sfbi < 6; ++sfbi) {
- 	if (bits_left < slen1)
- 	  return MAD_ERROR_BADSCFSI;
--	channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
-+	channel->scalefac[sfbi] = mad_bit_w_len_read(ptr, slen1);
- 	bits_left -= slen1;
-       }
-     }
-@@ -772,7 +772,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-       for (sfbi = 6; sfbi < 11; ++sfbi) {
- 	if (bits_left < slen1)
- 	  return MAD_ERROR_BADSCFSI;
--	channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
-+	channel->scalefac[sfbi] = mad_bit_w_len_read(ptr, slen1);
- 	bits_left -= slen1;
-       }
-     }
-@@ -785,7 +785,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-       for (sfbi = 11; sfbi < 16; ++sfbi) {
- 	if (bits_left < slen2)
- 	  return MAD_ERROR_BADSCFSI;
--	channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
-+	channel->scalefac[sfbi] = mad_bit_w_len_read(ptr, slen2);
- 	bits_left -= slen2;
-       }
-     }
-@@ -798,7 +798,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-       for (sfbi = 16; sfbi < 21; ++sfbi) {
- 	if (bits_left < slen2)
- 	  return MAD_ERROR_BADSCFSI;
--	channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
-+	channel->scalefac[sfbi] = mad_bit_w_len_read(ptr, slen2);
- 	bits_left -= slen2;
-       }
-     }
-@@ -806,7 +806,7 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
-     channel->scalefac[21] = 0;
-   }
- 
--  *part2_length = mad_bit_length(&start, ptr);
-+  *part2_length = mad_bit_w_len_length(&start, ptr);
-   return MAD_ERROR_NONE;
- }
- 
-@@ -958,14 +958,14 @@ mad_fixed_t III_requantize(unsigned int value, signed int exp)
-  * DESCRIPTION:	decode Huffman code words of one channel of one granule
-  */
- static
--enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
-+enum mad_error III_huffdecode(struct mad_bit_w_lenptr *ptr, mad_fixed_t xr[576],
- 			      struct channel *channel,
- 			      unsigned char const *sfbwidth,
- 			      signed int part3_length)
- {
-   signed int exponents[39], exp;
-   signed int const *expptr;
--  struct mad_bitptr peek;
-+  struct mad_bit_w_lenptr peek;
-   signed int bits_left, cachesz, fakebits;
-   register mad_fixed_t *xrptr;
-   mad_fixed_t const *sfbound;
-@@ -976,16 +976,16 @@ enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
-   III_exponents(channel, sfbwidth, exponents);
- 
-   peek = *ptr;
--  mad_bit_skip(ptr, bits_left);
-+  mad_bit_w_len_skip(ptr, bits_left);
- 
-   /* align bit reads to byte boundaries */
--  cachesz  = mad_bit_bitsleft(&peek);
-+  cachesz  = mad_bit_w_len_bitsleft(&peek);
-   cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
- 
-   if (bits_left < cachesz) {
-     cachesz = bits_left;
-   }
--  bitcache   = mad_bit_read(&peek, cachesz);
-+  bitcache   = mad_bit_w_len_read(&peek, cachesz);
-   bits_left -= cachesz;
-   fakebits = 0;
- 
-@@ -1056,7 +1056,7 @@ enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
- 	if (bits_left < bits) {
- 	  bits = bits_left;
- 	}
--	bitcache   = (bitcache << bits) | mad_bit_read(&peek, bits);
-+	bitcache   = (bitcache << bits) | mad_bit_w_len_read(&peek, bits);
- 	cachesz   += bits;
- 	bits_left -= bits;
-       }
-@@ -1098,7 +1098,7 @@ enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
- 	    unsigned int bits = 16;
- 	    if (bits_left < 16)
- 	      bits = bits_left;
--	    bitcache   = (bitcache << bits) | mad_bit_read(&peek, bits);
-+	    bitcache   = (bitcache << bits) | mad_bit_w_len_read(&peek, bits);
- 	    cachesz   += bits;
- 	    bits_left -= bits;
- 	  }
-@@ -1140,7 +1140,7 @@ enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
- 	    unsigned int bits = 16;
- 	    if (bits_left < 16)
- 	      bits = bits_left;
--	    bitcache   = (bitcache << bits) | mad_bit_read(&peek, bits);
-+	    bitcache   = (bitcache << bits) | mad_bit_w_len_read(&peek, bits);
- 	    cachesz   += bits;
- 	    bits_left -= bits;
- 	  }
-@@ -1232,7 +1232,7 @@ enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
- 	unsigned int bits = 16;
- 	if (bits_left < 16)
- 	  bits = bits_left;
--	bitcache   = (bitcache << bits) | mad_bit_read(&peek, bits);
-+	bitcache   = (bitcache << bits) | mad_bit_w_len_read(&peek, bits);
- 	cachesz   += bits;
- 	bits_left -= bits;
-       }
-@@ -2403,7 +2403,7 @@ void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
-  * DESCRIPTION:	decode frame main_data
-  */
- static
--enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
-+enum mad_error III_decode(struct mad_bit_w_lenptr *ptr, struct mad_frame *frame,
- 			  struct sideinfo *si, unsigned int nch, unsigned int md_len)
- {
-   struct mad_header *header = &frame->header;
-@@ -2589,12 +2589,12 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
-   unsigned int nch, priv_bitlen, next_md_begin = 0;
-   unsigned int si_len, data_bitlen, md_len;
-   unsigned int frame_space, frame_used, frame_free;
--  struct mad_bitptr ptr, bufend_ptr;
-+  struct mad_bit_w_lenptr ptr, bufend_ptr;
-   struct sideinfo si;
-   enum mad_error error;
-   int result = 0;
- 
--  mad_bit_init(&bufend_ptr, stream->bufend);
-+  mad_bit_w_len_init(&bufend_ptr, stream->this_frame, stream->bufend - stream->this_frame);
- 
-   /* allocate Layer III dynamic structures */
- 
-@@ -2620,7 +2620,7 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
- 
-   /* check frame sanity */
- 
--  if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
-+  if (stream->next_frame - mad_bit_w_len_nextbyte(stream->l_ptr) <
-       (signed int) si_len) {
-     stream->error = MAD_ERROR_BADFRAMELEN;
-     stream->md_len = 0;
-@@ -2631,7 +2631,7 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
- 
-   if (header->flags & MAD_FLAG_PROTECTION) {
-     header->crc_check =
--      mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
-+      mad_bit_w_len_crc(*stream->l_ptr, si_len * CHAR_BIT, header->crc_check);
- 
-     if (header->crc_check != header->crc_target &&
- 	!(frame->options & MAD_OPTION_IGNORECRC)) {
-@@ -2642,7 +2642,7 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
- 
-   /* decode frame side information */
- 
--  error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
-+  error = III_sideinfo(stream->l_ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
- 		       &si, &data_bitlen, &priv_bitlen);
-   if (error && result == 0) {
-     stream->error = error;
-@@ -2655,27 +2655,27 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
-   /* find main_data of next frame */
- 
-   {
--    struct mad_bitptr peek;
-+    struct mad_bit_w_lenptr peek;
-     unsigned long header;
- 
--    mad_bit_init(&peek, stream->next_frame);
--    if (mad_bit_length(&peek, &bufend_ptr) >= 57) {
--      header = mad_bit_read(&peek, 32);
-+    mad_bit_w_len_init(&peek, stream->next_frame, stream->bufend - stream->next_frame);
-+    if (mad_bit_w_len_length(&peek, &bufend_ptr) >= 57) {
-+      header = mad_bit_w_len_read(&peek, 32);
-       if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) {
-         if (!(header & 0x00010000L))  /* protection_bit */
--	  mad_bit_skip(&peek, 16);  /* crc_check */
-+	  mad_bit_w_len_skip(&peek, 16);  /* crc_check */
- 
-         next_md_begin =
--	  mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
-+	  mad_bit_w_len_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
-       }
-     }
- 
--    mad_bit_finish(&peek);
-+    mad_bit_w_len_finish(&peek);
-   }
- 
-   /* find main_data of this frame */
- 
--  frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
-+  frame_space = stream->next_frame - mad_bit_w_len_nextbyte(stream->l_ptr);
- 
-   if (next_md_begin > si.main_data_begin + frame_space)
-     next_md_begin = 0;
-@@ -2690,7 +2690,7 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
-   frame_used = 0;
- 
-   if (si.main_data_begin == 0) {
--    ptr = stream->ptr;
-+    ptr = *stream->l_ptr;
-     stream->md_len = 0;
- 
-     frame_used = md_len;
-@@ -2707,14 +2707,15 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
- 	*stream->main_data + stream->md_len - si.main_data_begin,
- 	si.main_data_begin);
-       stream->md_len = si.main_data_begin;
--      mad_bit_init(&ptr, *stream->main_data);
-+      unsigned char * start = *stream->main_data + stream->md_len - si.main_data_begin;
-+      mad_bit_w_len_init(&ptr, start, stream->bufend - start);
- 
-       if (md_len > si.main_data_begin) {
- 	assert(stream->md_len + md_len -
- 	       si.main_data_begin <= MAD_BUFFER_MDLEN);
- 
- 	memcpy(*stream->main_data + stream->md_len,
--	       mad_bit_nextbyte(&stream->ptr),
-+	       mad_bit_w_len_nextbyte(stream->l_ptr),
- 	       frame_used = md_len - si.main_data_begin);
- 	stream->md_len += frame_used;
-       }
-@@ -2734,7 +2735,9 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
- 
-     /* designate ancillary bits */
- 
--    stream->anc_ptr    = ptr;
-+    if (stream->l_ptr != stream->l_anc_ptr)
-+      free(stream->l_anc_ptr);
-+    stream->l_anc_ptr    = stream->l_ptr;
-     stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
-   }
- 
-diff --git a/mad.h.in b/mad.h.in
-index 0e790d3..32333cf 100644
---- a/mad.h.in
-+++ b/mad.h.in
-@@ -540,6 +540,29 @@ mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t);
- # ifndef LIBMAD_BIT_H
- # define LIBMAD_BIT_H
- 
-+struct mad_bit_w_lenptr {
-+  unsigned char const *byte;
-+  unsigned short cache;
-+  unsigned short left;
-+  unsigned int length;
-+};
-+
-+void mad_bit_w_len_init(struct mad_bit_w_lenptr *, unsigned char const *, unsigned int length);
-+
-+# define mad_bit_w_len_finish(bitptr)		/* nothing */
-+
-+unsigned int mad_bit_w_len_length(struct mad_bit_w_lenptr const *,
-+			    struct mad_bit_w_lenptr const *);
-+
-+# define mad_bit_w_len_bitsleft(bitptr)  ((bitptr)->left)
-+unsigned char const *mad_bit_w_len_nextbyte(struct mad_bit_w_lenptr const *);
-+
-+void mad_bit_w_len_skip(struct mad_bit_w_lenptr *, unsigned int);
-+unsigned long mad_bit_w_len_read(struct mad_bit_w_lenptr *, unsigned int);
-+void mad_bit_w_len_write(struct mad_bit_w_lenptr *, unsigned int, unsigned long);
-+
-+unsigned short mad_bit_w_len_crc(struct mad_bit_w_lenptr, unsigned int, unsigned short);
-+
- struct mad_bitptr {
-   unsigned char const *byte;
-   unsigned short cache;
-@@ -696,9 +719,17 @@ struct mad_stream {
- 
-   unsigned char const *this_frame;	/* start of current frame */
-   unsigned char const *next_frame;	/* start of next frame */
-+  union
-+  {
-   struct mad_bitptr ptr;		/* current processing bit pointer */
-+  struct mad_bit_w_lenptr * l_ptr;
-+  };
- 
-+  union
-+  {
-   struct mad_bitptr anc_ptr;		/* ancillary bits pointer */
-+  struct mad_bit_w_lenptr * l_anc_ptr;		/* ancillary bits pointer */
-+  };
-   unsigned int anc_bitlen;		/* number of ancillary bits */
- 
-   unsigned char (*main_data)[MAD_BUFFER_MDLEN];
-diff --git a/stream.c b/stream.c
-index 18ce95a..f3b6f1a 100644
---- a/stream.c
-+++ b/stream.c
-@@ -40,9 +40,11 @@ void mad_stream_init(struct mad_stream *stream)
- 
-   stream->this_frame = 0;
-   stream->next_frame = 0;
--  mad_bit_init(&stream->ptr, 0);
-+  stream->l_ptr = malloc(sizeof(*(stream->l_ptr)));
-+  stream->l_anc_ptr = malloc(sizeof(*(stream->l_anc_ptr)));
-+  mad_bit_w_len_init(stream->l_ptr, 0, 0);
- 
--  mad_bit_init(&stream->anc_ptr, 0);
-+  mad_bit_w_len_init(stream->l_anc_ptr, 0, 0);
-   stream->anc_bitlen = 0;
- 
-   stream->main_data  = 0;
-@@ -63,8 +65,15 @@ void mad_stream_finish(struct mad_stream *stream)
-     stream->main_data = 0;
-   }
- 
--  mad_bit_finish(&stream->anc_ptr);
--  mad_bit_finish(&stream->ptr);
-+  mad_bit_w_len_finish(stream->l_anc_ptr);
-+  mad_bit_w_len_finish(stream->l_ptr);
-+  free(stream->l_ptr);
-+  
-+  if (stream->l_ptr != stream->l_anc_ptr)
-+    free(stream->l_anc_ptr);
-+  
-+  stream->l_anc_ptr = NULL;
-+  stream->l_ptr = NULL;
- }
- 
- /*
-@@ -82,7 +91,7 @@ void mad_stream_buffer(struct mad_stream *stream,
- 
-   stream->sync = 1;
- 
--  mad_bit_init(&stream->ptr, buffer);
-+  mad_bit_w_len_init(stream->l_ptr, buffer, length);
- }
- 
- /*
-@@ -102,7 +111,7 @@ int mad_stream_sync(struct mad_stream *stream)
- {
-   register unsigned char const *ptr, *end;
- 
--  ptr = mad_bit_nextbyte(&stream->ptr);
-+  ptr = mad_bit_w_len_nextbyte(stream->l_ptr);
-   end = stream->bufend;
- 
-   while (ptr < end - 1 &&
-@@ -112,7 +121,7 @@ int mad_stream_sync(struct mad_stream *stream)
-   if (end - ptr < MAD_BUFFER_GUARD)
-     return -1;
- 
--  mad_bit_init(&stream->ptr, ptr);
-+  mad_bit_w_len_init(stream->l_ptr, ptr, stream->bufend - stream->buffer);
- 
-   return 0;
- }
--- 
-2.52.0.windows.1
-


=====================================
contrib/src/mad/rules.mak
=====================================
@@ -1,6 +1,6 @@
 # mad
 
-MAD_VERSION := 0.16.4
+MAD_VERSION := 0.16.5
 MAD_URL := https://codeberg.org/tenacityteam/libmad/archive/$(MAD_VERSION).tar.gz
 
 ifdef GPL
@@ -10,7 +10,7 @@ ifeq ($(call need_pkg,"mad"),)
 PKGS_FOUND += mad
 endif
 
-MAD_CONF := -DEXAMPLE=OFF -DCMAKE_POLICY_VERSION_MINIMUM=3.5
+MAD_CONF := -DEXAMPLE=OFF
 ifdef HAVE_WIN32
 ifeq ($(ARCH),arm)
 MAD_CONF += -DASO:BOOL=OFF
@@ -25,11 +25,10 @@ $(TARBALLS)/libmad-$(MAD_VERSION).tar.gz:
 libmad: UNPACK_DIR=libmad
 libmad: libmad-$(MAD_VERSION).tar.gz .sum-mad
 	$(UNPACK)
+	$(APPLY) $(SRC)/mad/0001-CMake-case-of-AND-test.patch
 ifdef HAVE_IOS
 	$(APPLY) $(SRC)/mad/mad-ios-asm.patch
 endif
-	# old patch seem to solve buffer overflow a different way
-	# $(APPLY) $(SRC)/mad/check-bitstream-length.patch
 	# get a tarball with a folder name $(MOVE)
 	touch $@
 



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1176b56bdef7b96c9d6518b62be37ec8c32d92ed...22cfdef68347bb162d3c20d10d4b502b12290455

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1176b56bdef7b96c9d6518b62be37ec8c32d92ed...22cfdef68347bb162d3c20d10d4b502b12290455
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help




More information about the vlc-commits mailing list