Blame src/libmpg123/getbits.h

Packit c32a2d
/*
Packit c32a2d
	getbits
Packit c32a2d
Packit c32a2d
	copyright ?-2009 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp
Packit c32a2d
Packit c32a2d
	All code is in the header to suggest/force inlining of these small often-used functions.
Packit c32a2d
	This indeed has some impact on performance.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifndef _MPG123_GETBITS_H_
Packit c32a2d
#define _MPG123_GETBITS_H_
Packit c32a2d
Packit c32a2d
#include "mpg123lib_intern.h"
Packit c32a2d
Packit c32a2d
#define backbits(fr,nob) ((void)( \
Packit c32a2d
  fr->bitindex    -= nob, \
Packit c32a2d
  fr->wordpointer += (fr->bitindex>>3), \
Packit c32a2d
  fr->bitindex    &= 0x7 ))
Packit c32a2d
Packit c32a2d
#define getbitoffset(fr) ((-fr->bitindex)&0x7)
Packit c32a2d
#define getbyte(fr)      (*fr->wordpointer++)
Packit c32a2d
Packit c32a2d
/* There is something wrong with that macro... the function below works also for the layer1 test case. */
Packit c32a2d
#define macro_getbits(fr, nob) ( \
Packit c32a2d
  fr->ultmp = fr->wordpointer[0],\
Packit c32a2d
  fr->ultmp <<= 8, \
Packit c32a2d
  fr->ultmp |= fr->wordpointer[1], \
Packit c32a2d
  fr->ultmp <<= 8, \
Packit c32a2d
  fr->ultmp |= fr->wordpointer[2], \
Packit c32a2d
  fr->ultmp <<= fr->bitindex, \
Packit c32a2d
  fr->ultmp &= 0xffffff, \
Packit c32a2d
  fr->bitindex += nob, \
Packit c32a2d
  fr->ultmp >>= (24-nob), \
Packit c32a2d
  fr->wordpointer += (fr->bitindex>>3), \
Packit c32a2d
  fr->bitindex &= 7, \
Packit c32a2d
  fr->ultmp)
Packit c32a2d
Packit c32a2d
static unsigned int getbits(mpg123_handle *fr, int number_of_bits)
Packit c32a2d
{
Packit c32a2d
  unsigned long rval;
Packit c32a2d
Packit c32a2d
#ifdef DEBUG_GETBITS
Packit c32a2d
fprintf(stderr,"g%d",number_of_bits);
Packit c32a2d
#endif
Packit c32a2d
  /* Safety catch until we got the nasty code fully figured out. */
Packit c32a2d
  /* No, that catch stays here, even if we think we got it figured out! */
Packit c32a2d
  if( (long)(fr->wordpointer-fr->bsbuf)*8
Packit c32a2d
      + fr->bitindex+number_of_bits > (long)fr->framesize*8 )
Packit c32a2d
    return 0;
Packit c32a2d
/*  This is actually slow: if(!number_of_bits)
Packit c32a2d
    return 0; */
Packit c32a2d
Packit c32a2d
#if 0
Packit c32a2d
   check_buffer_range(number_of_bits+fr->bitindex);
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
  {
Packit c32a2d
    rval = fr->wordpointer[0];
Packit c32a2d
    rval <<= 8;
Packit c32a2d
    rval |= fr->wordpointer[1];
Packit c32a2d
    rval <<= 8;
Packit c32a2d
    rval |= fr->wordpointer[2];
Packit c32a2d
Packit c32a2d
    rval <<= fr->bitindex;
Packit c32a2d
    rval &= 0xffffff;
Packit c32a2d
Packit c32a2d
    fr->bitindex += number_of_bits;
Packit c32a2d
Packit c32a2d
    rval >>= (24-number_of_bits);
Packit c32a2d
Packit c32a2d
    fr->wordpointer += (fr->bitindex>>3);
Packit c32a2d
    fr->bitindex &= 7;
Packit c32a2d
  }
Packit c32a2d
Packit c32a2d
#ifdef DEBUG_GETBITS
Packit c32a2d
fprintf(stderr,":%lx\n",rval);
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
  return rval;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
#define skipbits(fr, nob) fr->ultmp = ( \
Packit c32a2d
  fr->ultmp = fr->wordpointer[0], fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[1], \
Packit c32a2d
  fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[2], fr->ultmp <<= fr->bitindex, \
Packit c32a2d
  fr->ultmp &= 0xffffff, fr->bitindex += nob, \
Packit c32a2d
  fr->ultmp >>= (24-nob), fr->wordpointer += (fr->bitindex>>3), \
Packit c32a2d
  fr->bitindex &= 7 )
Packit c32a2d
Packit c32a2d
#define getbits_fast(fr, nob) ( \
Packit c32a2d
  fr->ultmp = (unsigned char) (fr->wordpointer[0] << fr->bitindex), \
Packit c32a2d
  fr->ultmp |= ((unsigned long) fr->wordpointer[1]<<fr->bitindex)>>8, \
Packit c32a2d
  fr->ultmp <<= nob, fr->ultmp >>= 8, \
Packit c32a2d
  fr->bitindex += nob, fr->wordpointer += (fr->bitindex>>3), \
Packit c32a2d
  fr->bitindex &= 7, fr->ultmp )
Packit c32a2d
Packit c32a2d
#define get1bit(fr) ( \
Packit c32a2d
  fr->uctmp = *fr->wordpointer << fr->bitindex, fr->bitindex++, \
Packit c32a2d
  fr->wordpointer += (fr->bitindex>>3), fr->bitindex &= 7, fr->uctmp>>7 )
Packit c32a2d
Packit c32a2d
Packit c32a2d
#endif