/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 |