Index: apps/codecs/libmad/bit.c =================================================================== --- apps/codecs/libmad/bit.c (revision 26801) +++ apps/codecs/libmad/bit.c (working copy) @@ -132,18 +132,32 @@ * NAME: bit->read() * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value */ + +static uint32_t* last_addr IBSS_ATTR = 0; +static uint32_t last_value IBSS_ATTR = 0; uint32_t mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) ICODE_ATTR; uint32_t mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) { uint32_t *curr = &bitptr->ptr[bitptr->readbit>>5]; + + /* Do we need to load a new value? */ + if (curr != last_addr) + { + last_addr = curr; + last_value = betoh32(curr[0]); + } if(len) { - uint32_t r = betoh32(curr[0]) << (bitptr->readbit & 31); + uint32_t r = last_value << (bitptr->readbit & 31); if((bitptr->readbit & 31) + len > 32) - r += betoh32(curr[1]) >> (-bitptr->readbit & 31); + { + last_addr = &curr[1]; + last_value = betoh32(curr[1]); + r += last_value >> (-bitptr->readbit & 31); + } bitptr->readbit += len; return r >> (32 - len);