Coverage Report

Created: 2025-07-16 07:53

/src/libde265/libde265/bitstream.cc
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * H.265 video codec.
3
 * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de>
4
 *
5
 * This file is part of libde265.
6
 *
7
 * libde265 is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU Lesser General Public License as
9
 * published by the Free Software Foundation, either version 3 of
10
 * the License, or (at your option) any later version.
11
 *
12
 * libde265 is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public License
18
 * along with libde265.  If not, see <http://www.gnu.org/licenses/>.
19
 */
20
21
#include "bitstream.h"
22
#include "de265.h"
23
24
#include <stdlib.h>
25
#include <string.h>
26
#include <assert.h>
27
28
29
30
void bitreader_init(bitreader* br, unsigned char* buffer, int len)
31
19.5k
{
32
19.5k
  br->data = buffer;
33
19.5k
  br->bytes_remaining = len;
34
35
19.5k
  br->nextbits=0;
36
19.5k
  br->nextbits_cnt=0;
37
38
19.5k
  bitreader_refill(br);
39
19.5k
}
40
41
void bitreader_refill(bitreader* br)
42
336k
{
43
336k
  int shift = 64-br->nextbits_cnt;
44
45
684k
  while (shift >= 8 && br->bytes_remaining) {
46
348k
    uint64_t newval = *br->data++;
47
348k
    br->bytes_remaining--;
48
49
348k
    shift -= 8;
50
348k
    newval <<= shift;
51
348k
    br->nextbits |= newval;
52
348k
  }
53
54
336k
  br->nextbits_cnt = 64-shift;
55
336k
}
56
57
int  get_bits(bitreader* br, int n)
58
1.44M
{
59
1.44M
  if (br->nextbits_cnt < n) {
60
312k
    bitreader_refill(br);
61
312k
  }
62
63
1.44M
  uint64_t val = br->nextbits;
64
1.44M
  val >>= 64-n;
65
66
1.44M
  br->nextbits <<= n;
67
1.44M
  br->nextbits_cnt -= n;
68
69
1.44M
  return val;
70
1.44M
}
71
72
int  get_bits_fast(bitreader* br, int n)
73
0
{
74
0
  assert(br->nextbits_cnt >= n);
75
76
0
  uint64_t val = br->nextbits;
77
0
  val >>= 64-n;
78
79
0
  br->nextbits <<= n;
80
0
  br->nextbits_cnt -= n;
81
82
0
  return val;
83
0
}
84
85
int  peek_bits(bitreader* br, int n)
86
0
{
87
0
  if (br->nextbits_cnt < n) {
88
0
    bitreader_refill(br);
89
0
  }
90
91
0
  uint64_t val = br->nextbits;
92
0
  val >>= 64-n;
93
94
0
  return val;
95
0
}
96
97
void skip_bits(bitreader* br, int n)
98
38.3k
{
99
38.3k
  if (br->nextbits_cnt < n) {
100
4.38k
    bitreader_refill(br);
101
4.38k
  }
102
103
38.3k
  br->nextbits <<= n;
104
38.3k
  br->nextbits_cnt -= n;
105
38.3k
}
106
107
void skip_bits_fast(bitreader* br, int n)
108
0
{
109
0
  br->nextbits <<= n;
110
0
  br->nextbits_cnt -= n;
111
0
}
112
113
void skip_to_byte_boundary(bitreader* br)
114
4.35k
{
115
4.35k
  int nskip = (br->nextbits_cnt & 7);
116
117
4.35k
  br->nextbits <<= nskip;
118
4.35k
  br->nextbits_cnt -= nskip;
119
4.35k
}
120
121
void prepare_for_CABAC(bitreader* br)
122
4.35k
{
123
4.35k
  skip_to_byte_boundary(br);
124
125
4.35k
  int rewind = br->nextbits_cnt/8;
126
4.35k
  br->data -= rewind;
127
4.35k
  br->bytes_remaining += rewind;
128
4.35k
  br->nextbits = 0;
129
4.35k
  br->nextbits_cnt = 0;
130
4.35k
}
131
132
int  get_uvlc(bitreader* br)
133
182k
{
134
182k
  int num_zeros=0;
135
136
400k
  while (get_bits(br,1)==0) {
137
217k
    num_zeros++;
138
139
217k
    if (num_zeros > MAX_UVLC_LEADING_ZEROS) { return UVLC_ERROR; }
140
217k
  }
141
142
182k
  int offset = 0;
143
182k
  if (num_zeros != 0) {
144
79.0k
    offset = get_bits(br, num_zeros);
145
79.0k
    int value = offset + (1<<num_zeros)-1;
146
79.0k
    assert(value>0);
147
79.0k
    return value;
148
103k
  } else {
149
103k
    return 0;
150
103k
  }
151
182k
}
152
153
int  get_svlc(bitreader* br)
154
31.0k
{
155
31.0k
  int v = get_uvlc(br);
156
31.0k
  if (v==0) return v;
157
11.3k
  if (v==UVLC_ERROR) return UVLC_ERROR;
158
159
11.2k
  bool negative = ((v&1)==0);
160
11.2k
  return negative ? -v/2 : (v+1)/2;
161
11.3k
}
162
163
bool check_rbsp_trailing_bits(bitreader* br)
164
0
{
165
0
  int stop_bit = get_bits(br,1);
166
0
  assert(stop_bit==1);
167
168
0
  while (br->nextbits_cnt>0 || br->bytes_remaining>0) {
169
0
    int filler = get_bits(br,1);
170
0
    if (filler!=0) {
171
0
      return false;
172
0
    }
173
0
  }
174
175
0
  return true;
176
0
}