Coverage Report

Created: 2025-10-12 07:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libde265/libde265/bitstream.cc
Line
Count
Source
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
26.1k
{
32
26.1k
  br->data = buffer;
33
26.1k
  br->bytes_remaining = len;
34
35
26.1k
  br->nextbits=0;
36
26.1k
  br->nextbits_cnt=0;
37
38
26.1k
  bitreader_refill(br);
39
26.1k
}
40
41
void bitreader_refill(bitreader* br)
42
324k
{
43
324k
  int shift = 64-br->nextbits_cnt;
44
45
537k
  while (shift >= 8 && br->bytes_remaining) {
46
213k
    uint64_t newval = *br->data++;
47
213k
    br->bytes_remaining--;
48
49
213k
    shift -= 8;
50
213k
    newval <<= shift;
51
213k
    br->nextbits |= newval;
52
213k
  }
53
54
324k
  br->nextbits_cnt = 64-shift;
55
324k
}
56
57
int  get_bits(bitreader* br, int n)
58
1.00M
{
59
1.00M
  if (br->nextbits_cnt < n) {
60
283k
    bitreader_refill(br);
61
283k
  }
62
63
1.00M
  uint64_t val = br->nextbits;
64
1.00M
  val >>= 64-n;
65
66
1.00M
  br->nextbits <<= n;
67
1.00M
  br->nextbits_cnt -= n;
68
69
1.00M
  return val;
70
1.00M
}
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
52.3k
{
99
52.3k
  if (br->nextbits_cnt < n) {
100
14.4k
    bitreader_refill(br);
101
14.4k
  }
102
103
52.3k
  br->nextbits <<= n;
104
52.3k
  br->nextbits_cnt -= n;
105
52.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
2.51k
{
115
2.51k
  int nskip = (br->nextbits_cnt & 7);
116
117
2.51k
  br->nextbits <<= nskip;
118
2.51k
  br->nextbits_cnt -= nskip;
119
2.51k
}
120
121
void prepare_for_CABAC(bitreader* br)
122
2.51k
{
123
2.51k
  skip_to_byte_boundary(br);
124
125
2.51k
  int rewind = br->nextbits_cnt/8;
126
2.51k
  br->data -= rewind;
127
2.51k
  br->bytes_remaining += rewind;
128
2.51k
  br->nextbits = 0;
129
2.51k
  br->nextbits_cnt = 0;
130
2.51k
}
131
132
int  get_uvlc(bitreader* br)
133
140k
{
134
140k
  int num_zeros=0;
135
136
303k
  while (get_bits(br,1)==0) {
137
163k
    num_zeros++;
138
139
163k
    if (num_zeros > MAX_UVLC_LEADING_ZEROS) { return UVLC_ERROR; }
140
163k
  }
141
142
140k
  int offset = 0;
143
140k
  if (num_zeros != 0) {
144
51.8k
    offset = get_bits(br, num_zeros);
145
51.8k
    int value = offset + (1<<num_zeros)-1;
146
51.8k
    assert(value>0);
147
51.8k
    return value;
148
88.2k
  } else {
149
88.2k
    return 0;
150
88.2k
  }
151
140k
}
152
153
int  get_svlc(bitreader* br)
154
30.8k
{
155
30.8k
  int v = get_uvlc(br);
156
30.8k
  if (v==0) return v;
157
8.78k
  if (v==UVLC_ERROR) return UVLC_ERROR;
158
159
8.74k
  bool negative = ((v&1)==0);
160
8.74k
  return negative ? -v/2 : (v+1)/2;
161
8.78k
}
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
}