Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.         getbits
  3.  
  4.         copyright ?-2009 by the mpg123 project - free software under the terms of the LGPL 2.1
  5.         see COPYING and AUTHORS files in distribution or http://mpg123.org
  6.         initially written by Michael Hipp
  7.  
  8.         All code is in the header to suggest/force inlining of these small often-used functions.
  9.         This indeed has some impact on performance.
  10. */
  11.  
  12. #ifndef _MPG123_GETBITS_H_
  13. #define _MPG123_GETBITS_H_
  14.  
  15. #include "mpg123lib_intern.h"
  16.  
  17. #define backbits(fr,nob) ((void)( \
  18.   fr->bitindex    -= nob, \
  19.   fr->wordpointer += (fr->bitindex>>3), \
  20.   fr->bitindex    &= 0x7 ))
  21.  
  22. #define getbitoffset(fr) ((-fr->bitindex)&0x7)
  23. #define getbyte(fr)      (*fr->wordpointer++)
  24.  
  25. /* There is something wrong with that macro... the function below works also for the layer1 test case. */
  26. #define macro_getbits(fr, nob) ( \
  27.   fr->ultmp = fr->wordpointer[0],\
  28.   fr->ultmp <<= 8, \
  29.   fr->ultmp |= fr->wordpointer[1], \
  30.   fr->ultmp <<= 8, \
  31.   fr->ultmp |= fr->wordpointer[2], \
  32.   fr->ultmp <<= fr->bitindex, \
  33.   fr->ultmp &= 0xffffff, \
  34.   fr->bitindex += nob, \
  35.   fr->ultmp >>= (24-nob), \
  36.   fr->wordpointer += (fr->bitindex>>3), \
  37.   fr->bitindex &= 7, \
  38.   fr->ultmp)
  39.  
  40. static unsigned int getbits(mpg123_handle *fr, int number_of_bits)
  41. {
  42.   unsigned long rval;
  43.  
  44. #ifdef DEBUG_GETBITS
  45. fprintf(stderr,"g%d",number_of_bits);
  46. #endif
  47.  
  48. /*  This is actually slow: if(!number_of_bits)
  49.     return 0; */
  50.  
  51. #if 0
  52.    check_buffer_range(number_of_bits+fr->bitindex);
  53. #endif
  54.  
  55.   {
  56.     rval = fr->wordpointer[0];
  57.     rval <<= 8;
  58.     rval |= fr->wordpointer[1];
  59.     rval <<= 8;
  60.     rval |= fr->wordpointer[2];
  61.  
  62.     rval <<= fr->bitindex;
  63.     rval &= 0xffffff;
  64.  
  65.     fr->bitindex += number_of_bits;
  66.  
  67.     rval >>= (24-number_of_bits);
  68.  
  69.     fr->wordpointer += (fr->bitindex>>3);
  70.     fr->bitindex &= 7;
  71.   }
  72.  
  73. #ifdef DEBUG_GETBITS
  74. fprintf(stderr,":%lx\n",rval);
  75. #endif
  76.  
  77.   return rval;
  78. }
  79.  
  80.  
  81. #define skipbits(fr, nob) fr->ultmp = ( \
  82.   fr->ultmp = fr->wordpointer[0], fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[1], \
  83.   fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[2], fr->ultmp <<= fr->bitindex, \
  84.   fr->ultmp &= 0xffffff, fr->bitindex += nob, \
  85.   fr->ultmp >>= (24-nob), fr->wordpointer += (fr->bitindex>>3), \
  86.   fr->bitindex &= 7 )
  87.  
  88. #define getbits_fast(fr, nob) ( \
  89.   fr->ultmp = (unsigned char) (fr->wordpointer[0] << fr->bitindex), \
  90.   fr->ultmp |= ((unsigned long) fr->wordpointer[1]<<fr->bitindex)>>8, \
  91.   fr->ultmp <<= nob, fr->ultmp >>= 8, \
  92.   fr->bitindex += nob, fr->wordpointer += (fr->bitindex>>3), \
  93.   fr->bitindex &= 7, fr->ultmp )
  94.  
  95. #define get1bit(fr) ( \
  96.   fr->uctmp = *fr->wordpointer << fr->bitindex, fr->bitindex++, \
  97.   fr->wordpointer += (fr->bitindex>>3), fr->bitindex &= 7, fr->uctmp>>7 )
  98.  
  99.  
  100. #endif
  101.