Coverage Report

Created: 2025-07-23 06:48

/src/mpg123/src/libmpg123/getbits.h
Line
Count
Source (jump to first uncovered line)
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
#include "../common/debug.h"
17
18
65.0k
#define backbits(fr,nob) ((void)( \
19
65.0k
  fr->bits_avail  += nob, \
20
65.0k
  fr->bitindex    -= nob, \
21
65.0k
  fr->wordpointer += (fr->bitindex>>3), \
22
65.0k
  fr->bitindex    &= 0x7 ))
23
24
49.2k
#define getbitoffset(fr) ((-fr->bitindex)&0x7)
25
/* Precomputing the bytes to be read is error-prone, and some over-read
26
   is even expected for Huffman. Just play safe and return zeros in case
27
   of overflow. This assumes you made bitindex zero already! */
28
4.32M
#define getbyte(fr) ( (fr)->bits_avail-=8, (fr)->bits_avail >= 0 \
29
4.32M
  ? *((fr)->wordpointer++) \
30
4.32M
  : 0 )
31
32
static unsigned int getbits(mpg123_handle *fr, int number_of_bits)
33
38.6M
{
34
38.6M
  unsigned long rval;
35
36
#ifdef DEBUG_GETBITS
37
fprintf(stderr,"g%d",number_of_bits);
38
#endif
39
38.6M
  fr->bits_avail -= number_of_bits;
40
  /* Safety catch until we got the nasty code fully figured out. */
41
  /* No, that catch stays here, even if we think we got it figured out! */
42
38.6M
  if(fr->bits_avail < 0)
43
32.7M
  {
44
32.7M
    if(NOQUIET)
45
32.7M
      error2( "Tried to read %i bits with %li available."
46
32.7M
      ,  number_of_bits, fr->bits_avail );
47
32.7M
    return 0;
48
32.7M
  }
49
/*  This is actually slow: if(!number_of_bits)
50
    return 0; */
51
52
#if 0
53
   check_buffer_range(number_of_bits+fr->bitindex);
54
#endif
55
56
5.90M
  {
57
5.90M
    rval = fr->wordpointer[0];
58
5.90M
    rval <<= 8;
59
5.90M
    rval |= fr->wordpointer[1];
60
5.90M
    rval <<= 8;
61
5.90M
    rval |= fr->wordpointer[2];
62
63
5.90M
    rval <<= fr->bitindex;
64
5.90M
    rval &= 0xffffff;
65
66
5.90M
    fr->bitindex += number_of_bits;
67
68
5.90M
    rval >>= (24-number_of_bits);
69
70
5.90M
    fr->wordpointer += (fr->bitindex>>3);
71
5.90M
    fr->bitindex &= 7;
72
5.90M
  }
73
74
#ifdef DEBUG_GETBITS
75
fprintf(stderr,":%lx\n",rval);
76
#endif
77
78
5.90M
  return rval;
79
38.6M
}
parse.c:getbits
Line
Count
Source
33
148k
{
34
148k
  unsigned long rval;
35
36
#ifdef DEBUG_GETBITS
37
fprintf(stderr,"g%d",number_of_bits);
38
#endif
39
148k
  fr->bits_avail -= number_of_bits;
40
  /* Safety catch until we got the nasty code fully figured out. */
41
  /* No, that catch stays here, even if we think we got it figured out! */
42
148k
  if(fr->bits_avail < 0)
43
99.1k
  {
44
99.1k
    if(NOQUIET)
45
99.1k
      error2( "Tried to read %i bits with %li available."
46
99.1k
      ,  number_of_bits, fr->bits_avail );
47
99.1k
    return 0;
48
99.1k
  }
49
/*  This is actually slow: if(!number_of_bits)
50
    return 0; */
51
52
#if 0
53
   check_buffer_range(number_of_bits+fr->bitindex);
54
#endif
55
56
49.3k
  {
57
49.3k
    rval = fr->wordpointer[0];
58
49.3k
    rval <<= 8;
59
49.3k
    rval |= fr->wordpointer[1];
60
49.3k
    rval <<= 8;
61
49.3k
    rval |= fr->wordpointer[2];
62
63
49.3k
    rval <<= fr->bitindex;
64
49.3k
    rval &= 0xffffff;
65
66
49.3k
    fr->bitindex += number_of_bits;
67
68
49.3k
    rval >>= (24-number_of_bits);
69
70
49.3k
    fr->wordpointer += (fr->bitindex>>3);
71
49.3k
    fr->bitindex &= 7;
72
49.3k
  }
73
74
#ifdef DEBUG_GETBITS
75
fprintf(stderr,":%lx\n",rval);
76
#endif
77
78
49.3k
  return rval;
79
148k
}
layer1.c:getbits
Line
Count
Source
33
733k
{
34
733k
  unsigned long rval;
35
36
#ifdef DEBUG_GETBITS
37
fprintf(stderr,"g%d",number_of_bits);
38
#endif
39
733k
  fr->bits_avail -= number_of_bits;
40
  /* Safety catch until we got the nasty code fully figured out. */
41
  /* No, that catch stays here, even if we think we got it figured out! */
42
733k
  if(fr->bits_avail < 0)
43
0
  {
44
0
    if(NOQUIET)
45
0
      error2( "Tried to read %i bits with %li available."
46
0
      ,  number_of_bits, fr->bits_avail );
47
0
    return 0;
48
0
  }
49
/*  This is actually slow: if(!number_of_bits)
50
    return 0; */
51
52
#if 0
53
   check_buffer_range(number_of_bits+fr->bitindex);
54
#endif
55
56
733k
  {
57
733k
    rval = fr->wordpointer[0];
58
733k
    rval <<= 8;
59
733k
    rval |= fr->wordpointer[1];
60
733k
    rval <<= 8;
61
733k
    rval |= fr->wordpointer[2];
62
63
733k
    rval <<= fr->bitindex;
64
733k
    rval &= 0xffffff;
65
66
733k
    fr->bitindex += number_of_bits;
67
68
733k
    rval >>= (24-number_of_bits);
69
70
733k
    fr->wordpointer += (fr->bitindex>>3);
71
733k
    fr->bitindex &= 7;
72
733k
  }
73
74
#ifdef DEBUG_GETBITS
75
fprintf(stderr,":%lx\n",rval);
76
#endif
77
78
733k
  return rval;
79
733k
}
layer2.c:getbits
Line
Count
Source
33
36.8M
{
34
36.8M
  unsigned long rval;
35
36
#ifdef DEBUG_GETBITS
37
fprintf(stderr,"g%d",number_of_bits);
38
#endif
39
36.8M
  fr->bits_avail -= number_of_bits;
40
  /* Safety catch until we got the nasty code fully figured out. */
41
  /* No, that catch stays here, even if we think we got it figured out! */
42
36.8M
  if(fr->bits_avail < 0)
43
32.6M
  {
44
32.6M
    if(NOQUIET)
45
32.6M
      error2( "Tried to read %i bits with %li available."
46
32.6M
      ,  number_of_bits, fr->bits_avail );
47
32.6M
    return 0;
48
32.6M
  }
49
/*  This is actually slow: if(!number_of_bits)
50
    return 0; */
51
52
#if 0
53
   check_buffer_range(number_of_bits+fr->bitindex);
54
#endif
55
56
4.27M
  {
57
4.27M
    rval = fr->wordpointer[0];
58
4.27M
    rval <<= 8;
59
4.27M
    rval |= fr->wordpointer[1];
60
4.27M
    rval <<= 8;
61
4.27M
    rval |= fr->wordpointer[2];
62
63
4.27M
    rval <<= fr->bitindex;
64
4.27M
    rval &= 0xffffff;
65
66
4.27M
    fr->bitindex += number_of_bits;
67
68
4.27M
    rval >>= (24-number_of_bits);
69
70
4.27M
    fr->wordpointer += (fr->bitindex>>3);
71
4.27M
    fr->bitindex &= 7;
72
4.27M
  }
73
74
#ifdef DEBUG_GETBITS
75
fprintf(stderr,":%lx\n",rval);
76
#endif
77
78
4.27M
  return rval;
79
36.8M
}
layer3.c:getbits
Line
Count
Source
33
853k
{
34
853k
  unsigned long rval;
35
36
#ifdef DEBUG_GETBITS
37
fprintf(stderr,"g%d",number_of_bits);
38
#endif
39
853k
  fr->bits_avail -= number_of_bits;
40
  /* Safety catch until we got the nasty code fully figured out. */
41
  /* No, that catch stays here, even if we think we got it figured out! */
42
853k
  if(fr->bits_avail < 0)
43
3.69k
  {
44
3.69k
    if(NOQUIET)
45
3.69k
      error2( "Tried to read %i bits with %li available."
46
3.69k
      ,  number_of_bits, fr->bits_avail );
47
3.69k
    return 0;
48
3.69k
  }
49
/*  This is actually slow: if(!number_of_bits)
50
    return 0; */
51
52
#if 0
53
   check_buffer_range(number_of_bits+fr->bitindex);
54
#endif
55
56
849k
  {
57
849k
    rval = fr->wordpointer[0];
58
849k
    rval <<= 8;
59
849k
    rval |= fr->wordpointer[1];
60
849k
    rval <<= 8;
61
849k
    rval |= fr->wordpointer[2];
62
63
849k
    rval <<= fr->bitindex;
64
849k
    rval &= 0xffffff;
65
66
849k
    fr->bitindex += number_of_bits;
67
68
849k
    rval >>= (24-number_of_bits);
69
70
849k
    fr->wordpointer += (fr->bitindex>>3);
71
849k
    fr->bitindex &= 7;
72
849k
  }
73
74
#ifdef DEBUG_GETBITS
75
fprintf(stderr,":%lx\n",rval);
76
#endif
77
78
849k
  return rval;
79
853k
}
80
81
82
723k
#define skipbits(fr, nob) fr->ultmp = ( \
83
723k
  fr->ultmp = fr->wordpointer[0], fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[1], \
84
723k
  fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[2], fr->ultmp <<= fr->bitindex, \
85
723k
  fr->ultmp &= 0xffffff, fr->bitindex += nob, fr->bits_avail -= nob, \
86
723k
  fr->ultmp >>= (24-nob), fr->wordpointer += (fr->bitindex>>3), \
87
723k
  fr->bitindex &= 7 )
88
89
7.28M
#define getbits_fast(fr, nob) ( \
90
7.28M
  fr->ultmp = (unsigned char) (fr->wordpointer[0] << fr->bitindex), \
91
7.28M
  fr->ultmp |= ((unsigned long) fr->wordpointer[1]<<fr->bitindex)>>8, \
92
7.28M
  fr->ultmp <<= nob, fr->ultmp >>= 8, \
93
7.28M
  fr->bitindex += nob, fr->bits_avail -= nob, \
94
7.28M
  fr->wordpointer += (fr->bitindex>>3), \
95
7.28M
  fr->bitindex &= 7, fr->ultmp )
96
97
411k
#define get1bit(fr) ( \
98
411k
  fr->uctmp = *fr->wordpointer << fr->bitindex, \
99
411k
  ++fr->bitindex, --fr->bits_avail, \
100
411k
  fr->wordpointer += (fr->bitindex>>3), fr->bitindex &= 7, fr->uctmp>>7 )
101
102
103
#endif