Coverage Report

Created: 2022-08-24 06:11

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