Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1905 serge 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]<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