Coverage Report

Created: 2025-11-14 07:32

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
32.6k
{
32
32.6k
  br->data = buffer;
33
32.6k
  br->bytes_remaining = len;
34
35
32.6k
  br->nextbits=0;
36
32.6k
  br->nextbits_cnt=0;
37
38
32.6k
  bitreader_refill(br);
39
32.6k
}
40
41
void bitreader_refill(bitreader* br)
42
604k
{
43
604k
  int shift = 64-br->nextbits_cnt;
44
45
874k
  while (shift >= 8 && br->bytes_remaining) {
46
269k
    uint64_t newval = *br->data++;
47
269k
    br->bytes_remaining--;
48
49
269k
    shift -= 8;
50
269k
    newval <<= shift;
51
269k
    br->nextbits |= newval;
52
269k
  }
53
54
604k
  br->nextbits_cnt = 64-shift;
55
604k
}
56
57
int  get_bits(bitreader* br, int n)
58
1.46M
{
59
1.46M
  if (br->nextbits_cnt < n) {
60
554k
    bitreader_refill(br);
61
554k
  }
62
63
1.46M
  uint64_t val = br->nextbits;
64
1.46M
  val >>= 64-n;
65
66
1.46M
  br->nextbits <<= n;
67
1.46M
  br->nextbits_cnt -= n;
68
69
1.46M
  return val;
70
1.46M
}
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
65.9k
{
99
65.9k
  if (br->nextbits_cnt < n) {
100
18.0k
    bitreader_refill(br);
101
18.0k
  }
102
103
65.9k
  br->nextbits <<= n;
104
65.9k
  br->nextbits_cnt -= n;
105
65.9k
}
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
3.09k
{
115
3.09k
  int nskip = (br->nextbits_cnt & 7);
116
117
3.09k
  br->nextbits <<= nskip;
118
3.09k
  br->nextbits_cnt -= nskip;
119
3.09k
}
120
121
void prepare_for_CABAC(bitreader* br)
122
3.09k
{
123
3.09k
  skip_to_byte_boundary(br);
124
125
3.09k
  int rewind = br->nextbits_cnt/8;
126
3.09k
  br->data -= rewind;
127
3.09k
  br->bytes_remaining += rewind;
128
3.09k
  br->nextbits = 0;
129
3.09k
  br->nextbits_cnt = 0;
130
3.09k
}
131
132
int  get_uvlc(bitreader* br)
133
174k
{
134
174k
  int num_zeros=0;
135
136
383k
  while (get_bits(br,1)==0) {
137
209k
    num_zeros++;
138
139
209k
    if (num_zeros > MAX_UVLC_LEADING_ZEROS) { return UVLC_ERROR; }
140
209k
  }
141
142
173k
  int offset = 0;
143
173k
  if (num_zeros != 0) {
144
64.5k
    offset = get_bits(br, num_zeros);
145
64.5k
    int value = offset + (1<<num_zeros)-1;
146
64.5k
    assert(value>0);
147
64.5k
    return value;
148
109k
  } else {
149
109k
    return 0;
150
109k
  }
151
173k
}
152
153
int  get_svlc(bitreader* br)
154
37.0k
{
155
37.0k
  int v = get_uvlc(br);
156
37.0k
  if (v==0) return v;
157
10.5k
  if (v==UVLC_ERROR) return UVLC_ERROR;
158
159
10.4k
  bool negative = ((v&1)==0);
160
10.4k
  return negative ? -v/2 : (v+1)/2;
161
10.5k
}
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
}