]> git.sesse.net Git - ffmpeg/blob - libavcodec/cabac.c
rv40: don't always do the full prev_type search
[ffmpeg] / libavcodec / cabac.c
1 /*
2  * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
3  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav 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 GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * Context Adaptive Binary Arithmetic Coder.
25  */
26
27 #include <string.h>
28
29 #include "libavutil/common.h"
30 #include "get_bits.h"
31 #include "cabac.h"
32 #include "cabac_functions.h"
33
34 uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
35  9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
36  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
37  3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
38  3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
39  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
40  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
41  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
42  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
43  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
44  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
45  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
46  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
47  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
48  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
49  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
50  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
51  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
52  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
53  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
54  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
55 };
56
57 static const uint8_t lps_range[64][4]= {
58 {128,176,208,240}, {128,167,197,227}, {128,158,187,216}, {123,150,178,205},
59 {116,142,169,195}, {111,135,160,185}, {105,128,152,175}, {100,122,144,166},
60 { 95,116,137,158}, { 90,110,130,150}, { 85,104,123,142}, { 81, 99,117,135},
61 { 77, 94,111,128}, { 73, 89,105,122}, { 69, 85,100,116}, { 66, 80, 95,110},
62 { 62, 76, 90,104}, { 59, 72, 86, 99}, { 56, 69, 81, 94}, { 53, 65, 77, 89},
63 { 51, 62, 73, 85}, { 48, 59, 69, 80}, { 46, 56, 66, 76}, { 43, 53, 63, 72},
64 { 41, 50, 59, 69}, { 39, 48, 56, 65}, { 37, 45, 54, 62}, { 35, 43, 51, 59},
65 { 33, 41, 48, 56}, { 32, 39, 46, 53}, { 30, 37, 43, 50}, { 29, 35, 41, 48},
66 { 27, 33, 39, 45}, { 26, 31, 37, 43}, { 24, 30, 35, 41}, { 23, 28, 33, 39},
67 { 22, 27, 32, 37}, { 21, 26, 30, 35}, { 20, 24, 29, 33}, { 19, 23, 27, 31},
68 { 18, 22, 26, 30}, { 17, 21, 25, 28}, { 16, 20, 23, 27}, { 15, 19, 22, 25},
69 { 14, 18, 21, 24}, { 14, 17, 20, 23}, { 13, 16, 19, 22}, { 12, 15, 18, 21},
70 { 12, 14, 17, 20}, { 11, 14, 16, 19}, { 11, 13, 15, 18}, { 10, 12, 15, 17},
71 { 10, 12, 14, 16}, {  9, 11, 13, 15}, {  9, 11, 12, 14}, {  8, 10, 12, 14},
72 {  8,  9, 11, 13}, {  7,  9, 11, 12}, {  7,  9, 10, 12}, {  7,  8, 10, 11},
73 {  6,  8,  9, 11}, {  6,  7,  9, 10}, {  6,  7,  8,  9}, {  2,  2,  2,  2},
74 };
75
76 static uint8_t h264_mps_state[2 * 64];
77
78 static const uint8_t mps_state[64]= {
79   1, 2, 3, 4, 5, 6, 7, 8,
80   9,10,11,12,13,14,15,16,
81  17,18,19,20,21,22,23,24,
82  25,26,27,28,29,30,31,32,
83  33,34,35,36,37,38,39,40,
84  41,42,43,44,45,46,47,48,
85  49,50,51,52,53,54,55,56,
86  57,58,59,60,61,62,62,63,
87 };
88
89 static const uint8_t lps_state[64]= {
90   0, 0, 1, 2, 2, 4, 4, 5,
91   6, 7, 8, 9, 9,11,11,12,
92  13,13,15,15,16,16,18,18,
93  19,19,21,21,22,22,23,24,
94  24,25,26,26,27,27,28,29,
95  29,30,30,30,31,32,32,33,
96  33,33,34,34,35,35,35,36,
97  36,36,37,37,37,38,38,63,
98 };
99
100 static const uint8_t last_coeff_flag_offset_8x8[63] = {
101  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
102  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
103  3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
104  5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
105 };
106
107 /**
108  *
109  * @param buf_size size of buf in bits
110  */
111 void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){
112     init_put_bits(&c->pb, buf, buf_size);
113
114     c->low= 0;
115     c->range= 0x1FE;
116     c->outstanding_count= 0;
117     c->pb.bit_left++; //avoids firstBitFlag
118 }
119
120 /**
121  *
122  * @param buf_size size of buf in bits
123  */
124 void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size){
125     c->bytestream_start=
126     c->bytestream= buf;
127     c->bytestream_end= buf + buf_size;
128
129 #if CABAC_BITS == 16
130     c->low =  (*c->bytestream++)<<18;
131     c->low+=  (*c->bytestream++)<<10;
132 #else
133     c->low =  (*c->bytestream++)<<10;
134 #endif
135     c->low+= ((*c->bytestream++)<<2) + 2;
136     c->range= 0x1FE;
137 }
138
139 void ff_init_cabac_states(CABACContext *c){
140     int i, j;
141
142     for(i=0; i<64; i++){
143         for(j=0; j<4; j++){ //FIXME check if this is worth the 1 shift we save
144             ff_h264_lps_range[j*2*64+2*i+0]=
145             ff_h264_lps_range[j*2*64+2*i+1]= lps_range[i][j];
146         }
147
148         ff_h264_mlps_state[128+2*i+0]=
149         h264_mps_state[2 * i + 0] = 2 * mps_state[i] + 0;
150         ff_h264_mlps_state[128+2*i+1]=
151         h264_mps_state[2 * i + 1] = 2 * mps_state[i] + 1;
152
153         if( i ){
154             ff_h264_mlps_state[128-2*i-1]= 2*lps_state[i]+0;
155             ff_h264_mlps_state[128-2*i-2]= 2*lps_state[i]+1;
156         }else{
157             ff_h264_mlps_state[128-2*i-1]= 1;
158             ff_h264_mlps_state[128-2*i-2]= 0;
159         }
160     }
161     for(i=0; i< 63; i++){
162       ff_h264_last_coeff_flag_offset_8x8[i] = last_coeff_flag_offset_8x8[i];
163     }
164 }
165
166 #ifdef TEST
167 #define SIZE 10240
168
169 #include "libavutil/lfg.h"
170 #include "avcodec.h"
171 #include "cabac.h"
172
173 static inline void put_cabac_bit(CABACContext *c, int b){
174     put_bits(&c->pb, 1, b);
175     for(;c->outstanding_count; c->outstanding_count--){
176         put_bits(&c->pb, 1, 1-b);
177     }
178 }
179
180 static inline void renorm_cabac_encoder(CABACContext *c){
181     while(c->range < 0x100){
182         //FIXME optimize
183         if(c->low<0x100){
184             put_cabac_bit(c, 0);
185         }else if(c->low<0x200){
186             c->outstanding_count++;
187             c->low -= 0x100;
188         }else{
189             put_cabac_bit(c, 1);
190             c->low -= 0x200;
191         }
192
193         c->range+= c->range;
194         c->low += c->low;
195     }
196 }
197
198 static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
199     int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
200
201     if(bit == ((*state)&1)){
202         c->range -= RangeLPS;
203         *state    = h264_mps_state[*state];
204     }else{
205         c->low += c->range - RangeLPS;
206         c->range = RangeLPS;
207     }
208
209     renorm_cabac_encoder(c);
210 }
211
212 /**
213  * @param bit 0 -> write zero bit, !=0 write one bit
214  */
215 static void put_cabac_bypass(CABACContext *c, int bit){
216     c->low += c->low;
217
218     if(bit){
219         c->low += c->range;
220     }
221 //FIXME optimize
222     if(c->low<0x200){
223         put_cabac_bit(c, 0);
224     }else if(c->low<0x400){
225         c->outstanding_count++;
226         c->low -= 0x200;
227     }else{
228         put_cabac_bit(c, 1);
229         c->low -= 0x400;
230     }
231 }
232
233 /**
234  *
235  * @return the number of bytes written
236  */
237 static int put_cabac_terminate(CABACContext *c, int bit){
238     c->range -= 2;
239
240     if(!bit){
241         renorm_cabac_encoder(c);
242     }else{
243         c->low += c->range;
244         c->range= 2;
245
246         renorm_cabac_encoder(c);
247
248         assert(c->low <= 0x1FF);
249         put_cabac_bit(c, c->low>>9);
250         put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
251
252         flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
253     }
254
255     return (put_bits_count(&c->pb)+7)>>3;
256 }
257
258 int main(void){
259     CABACContext c;
260     uint8_t b[9*SIZE];
261     uint8_t r[9*SIZE];
262     int i;
263     uint8_t state[10]= {0};
264     AVLFG prng;
265
266     av_lfg_init(&prng, 1);
267     ff_init_cabac_encoder(&c, b, SIZE);
268     ff_init_cabac_states(&c);
269
270     for(i=0; i<SIZE; i++){
271         r[i] = av_lfg_get(&prng) % 7;
272     }
273
274     for(i=0; i<SIZE; i++){
275 START_TIMER
276         put_cabac_bypass(&c, r[i]&1);
277 STOP_TIMER("put_cabac_bypass")
278     }
279
280     for(i=0; i<SIZE; i++){
281 START_TIMER
282         put_cabac(&c, state, r[i]&1);
283 STOP_TIMER("put_cabac")
284     }
285
286     put_cabac_terminate(&c, 1);
287
288     ff_init_cabac_decoder(&c, b, SIZE);
289
290     memset(state, 0, sizeof(state));
291
292     for(i=0; i<SIZE; i++){
293 START_TIMER
294         if( (r[i]&1) != get_cabac_bypass(&c) )
295             av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i);
296 STOP_TIMER("get_cabac_bypass")
297     }
298
299     for(i=0; i<SIZE; i++){
300 START_TIMER
301         if( (r[i]&1) != get_cabac(&c, state) )
302             av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
303 STOP_TIMER("get_cabac")
304     }
305     if(!get_cabac_terminate(&c))
306         av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n");
307
308     return 0;
309 }
310
311 #endif /* TEST */