Coverage Report

Created: 2025-06-16 07:00

/src/libde265/libde265/cabac.h
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
#ifndef DE265_CABAC_H
22
#define DE265_CABAC_H
23
24
#include <stdint.h>
25
#include "contextmodel.h"
26
27
28
typedef struct {
29
  uint8_t* bitstream_start;
30
  uint8_t* bitstream_curr;
31
  uint8_t* bitstream_end;
32
33
  uint32_t range;
34
  uint32_t value;
35
  int16_t  bits_needed;
36
} CABAC_decoder;
37
38
39
void init_CABAC_decoder(CABAC_decoder* decoder, uint8_t* bitstream, int length);
40
void init_CABAC_decoder_2(CABAC_decoder* decoder);
41
int  decode_CABAC_bit(CABAC_decoder* decoder, context_model* model);
42
int  decode_CABAC_TU(CABAC_decoder* decoder, int cMax, context_model* model);
43
int  decode_CABAC_term_bit(CABAC_decoder* decoder);
44
45
int  decode_CABAC_bypass(CABAC_decoder* decoder);
46
int  decode_CABAC_TU_bypass(CABAC_decoder* decoder, int cMax);
47
uint32_t  decode_CABAC_FL_bypass(CABAC_decoder* decoder, int nBits);
48
int  decode_CABAC_TR_bypass(CABAC_decoder* decoder, int cRiceParam, int cTRMax);
49
int  decode_CABAC_EGk_bypass(CABAC_decoder* decoder, int k);
50
51
52
// ---------------------------------------------------------------------------
53
54
class CABAC_encoder
55
{
56
public:
57
0
 CABAC_encoder() : mCtxModels(NULL) { }
58
0
  virtual ~CABAC_encoder() { }
59
60
  virtual int size() const = 0;
61
  virtual void reset() = 0;
62
63
  // --- VLC ---
64
65
  virtual void write_bits(uint32_t bits,int n) = 0;
66
0
  virtual void write_bit(int bit) { write_bits(bit,1); }
67
  virtual void write_uvlc(int value);
68
  virtual void write_svlc(int value);
69
  virtual bool write_startcode() = 0;
70
  virtual void skip_bits(int nBits) = 0;
71
72
  virtual void add_trailing_bits();
73
  virtual int  number_free_bits_in_byte() const = 0;
74
75
  // output all remaining bits and fill with zeros to next byte boundary
76
0
  virtual void flush_VLC() { }
77
78
79
  // --- CABAC ---
80
81
0
  void set_context_models(context_model_table* models) { mCtxModels=models; }
82
83
0
  virtual void init_CABAC() { }
84
  virtual void write_CABAC_bit(int modelIdx, int bit) = 0;
85
  virtual void write_CABAC_bypass(int bit) = 0;
86
  virtual void write_CABAC_TU_bypass(int value, int cMax);
87
  virtual void write_CABAC_FL_bypass(int value, int nBits);
88
  virtual void write_CABAC_term_bit(int bit) = 0;
89
0
  virtual void flush_CABAC()  { }
90
91
  void write_CABAC_EGk(int absolute_symbol, int k); // absolute_symbol >= 0
92
93
  virtual bool modifies_context() const = 0;
94
95
  float RDBits_for_CABAC_bin(int modelIdx, int bit);
96
97
 protected:
98
  context_model_table* mCtxModels;
99
};
100
101
102
class CABAC_encoder_bitstream : public CABAC_encoder
103
{
104
public:
105
  CABAC_encoder_bitstream();
106
  ~CABAC_encoder_bitstream();
107
108
  virtual void reset();
109
110
0
  virtual int size() const { return data_size; }
111
0
  uint8_t* data() const { return data_mem; }
112
113
  // --- VLC ---
114
115
  virtual void write_bits(uint32_t bits,int n);
116
  virtual bool write_startcode();
117
  virtual void skip_bits(int nBits);
118
119
  virtual int  number_free_bits_in_byte() const;
120
121
  // output all remaining bits and fill with zeros to next byte boundary
122
  virtual void flush_VLC();
123
124
125
  // --- CABAC ---
126
127
  virtual void init_CABAC();
128
  virtual void write_CABAC_bit(int modelIdx, int bit);
129
  virtual void write_CABAC_bypass(int bit);
130
  virtual void write_CABAC_term_bit(int bit);
131
  virtual void flush_CABAC();
132
133
0
  virtual bool modifies_context() const { return true; }
134
135
private:
136
  // data buffer
137
138
  uint8_t* data_mem;
139
  uint32_t data_capacity;
140
  uint32_t data_size;
141
  char     state; // for inserting emulation-prevention bytes
142
143
  // VLC
144
145
  uint32_t vlc_buffer;
146
  uint32_t vlc_buffer_len;
147
148
149
  // CABAC
150
151
  uint32_t range;
152
  uint32_t low;
153
  int8_t   bits_left;
154
  uint8_t  buffered_byte;
155
  uint16_t num_buffered_bytes;
156
157
158
  bool check_size_and_resize(int nBytes);
159
  void testAndWriteOut();
160
  void write_out();
161
  bool append_byte(int byte);
162
};
163
164
165
class CABAC_encoder_estim : public CABAC_encoder
166
{
167
public:
168
0
  CABAC_encoder_estim() : mFracBits(0) { }
169
170
0
  virtual void reset() { mFracBits=0; }
171
172
0
  virtual int size() const { return mFracBits>>(15+3); }
173
174
0
  uint64_t getFracBits() const { return mFracBits; }
175
0
  float    getRDBits() const { return mFracBits / float(1<<15); }
176
177
  // --- VLC ---
178
179
0
  virtual void write_bits(uint32_t bits,int n) { mFracBits += n<<15; }
180
0
  virtual void write_bit(int bit) { mFracBits+=1<<15; }
181
0
  virtual bool write_startcode() { mFracBits += (1<<15)*8*3; return true; }
182
0
  virtual void skip_bits(int nBits) { mFracBits += nBits<<15; }
183
0
  virtual int  number_free_bits_in_byte() const { return 0; } // TODO, good enough for now
184
185
  // --- CABAC ---
186
187
  virtual void write_CABAC_bit(int modelIdx, int bit);
188
0
  virtual void write_CABAC_bypass(int bit) {
189
0
    mFracBits += 0x8000;
190
0
  }
191
0
  virtual void write_CABAC_FL_bypass(int value, int nBits) {
192
0
    mFracBits += nBits<<15;
193
0
  }
194
0
  virtual void write_CABAC_term_bit(int bit) { /* not implemented (not needed) */ }
195
196
0
  virtual bool modifies_context() const { return true; }
197
198
 protected:
199
  uint64_t mFracBits;
200
};
201
202
203
class CABAC_encoder_estim_constant : public CABAC_encoder_estim
204
{
205
 public:
206
  void write_CABAC_bit(int modelIdx, int bit);
207
208
0
  virtual bool modifies_context() const { return false; }
209
};
210
211
#endif