]> git.sesse.net Git - ffmpeg/blob - libavcodec/cabac.c
vp9: add 12bpp sse2 versions of iadst4.
[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 FFmpeg.
6  *
7  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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 "libavutil/timer.h"
31 #include "get_bits.h"
32 #include "cabac.h"
33 #include "cabac_functions.h"
34
35 const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
36     9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
37     4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
38     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
39     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
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     2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
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     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,
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     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,
56     // LPS range
57     -128,    -128,    -128,    -128,    -128,    -128,    123,     123,
58     116,     116,     111,     111,     105,     105,     100,     100,
59     95,      95,      90,      90,      85,      85,      81,      81,
60     77,      77,      73,      73,      69,      69,      66,      66,
61     62,      62,      59,      59,      56,      56,      53,      53,
62     51,      51,      48,      48,      46,      46,      43,      43,
63     41,      41,      39,      39,      37,      37,      35,      35,
64     33,      33,      32,      32,      30,      30,      29,      29,
65     27,      27,      26,      26,      24,      24,      23,      23,
66     22,      22,      21,      21,      20,      20,      19,      19,
67     18,      18,      17,      17,      16,      16,      15,      15,
68     14,      14,      14,      14,      13,      13,      12,      12,
69     12,      12,      11,      11,      11,      11,      10,      10,
70     10,      10,      9,       9,       9,       9,       8,       8,
71     8,       8,       7,       7,       7,       7,       7,       7,
72     6,       6,       6,       6,       6,       6,       2,       2,
73     -80,     -80,     -89,     -89,     -98,     -98,     -106,    -106,
74     -114,    -114,    -121,    -121,    -128,    -128,    122,     122,
75     116,     116,     110,     110,     104,     104,     99,      99,
76     94,      94,      89,      89,      85,      85,      80,      80,
77     76,      76,      72,      72,      69,      69,      65,      65,
78     62,      62,      59,      59,      56,      56,      53,      53,
79     50,      50,      48,      48,      45,      45,      43,      43,
80     41,      41,      39,      39,      37,      37,      35,      35,
81     33,      33,      31,      31,      30,      30,      28,      28,
82     27,      27,      26,      26,      24,      24,      23,      23,
83     22,      22,      21,      21,      20,      20,      19,      19,
84     18,      18,      17,      17,      16,      16,      15,      15,
85     14,      14,      14,      14,      13,      13,      12,      12,
86     12,      12,      11,      11,      11,      11,      10,      10,
87     9,       9,       9,       9,       9,       9,       8,       8,
88     8,       8,       7,       7,       7,       7,       2,       2,
89     -48,     -48,     -59,     -59,     -69,     -69,     -78,     -78,
90     -87,     -87,     -96,     -96,     -104,    -104,    -112,    -112,
91     -119,    -119,    -126,    -126,    123,     123,     117,     117,
92     111,     111,     105,     105,     100,     100,     95,      95,
93     90,      90,      86,      86,      81,      81,      77,      77,
94     73,      73,      69,      69,      66,      66,      63,      63,
95     59,      59,      56,      56,      54,      54,      51,      51,
96     48,      48,      46,      46,      43,      43,      41,      41,
97     39,      39,      37,      37,      35,      35,      33,      33,
98     32,      32,      30,      30,      29,      29,      27,      27,
99     26,      26,      25,      25,      23,      23,      22,      22,
100     21,      21,      20,      20,      19,      19,      18,      18,
101     17,      17,      16,      16,      15,      15,      15,      15,
102     14,      14,      13,      13,      12,      12,      12,      12,
103     11,      11,      11,      11,      10,      10,      10,      10,
104     9,       9,       9,       9,       8,       8,       2,       2,
105     -16,     -16,     -29,     -29,     -40,     -40,     -51,     -51,
106     -61,     -61,     -71,     -71,     -81,     -81,     -90,     -90,
107     -98,     -98,     -106,    -106,    -114,    -114,    -121,    -121,
108     -128,    -128,    122,     122,     116,     116,     110,     110,
109     104,     104,     99,      99,      94,      94,      89,      89,
110     85,      85,      80,      80,      76,      76,      72,      72,
111     69,      69,      65,      65,      62,      62,      59,      59,
112     56,      56,      53,      53,      50,      50,      48,      48,
113     45,      45,      43,      43,      41,      41,      39,      39,
114     37,      37,      35,      35,      33,      33,      31,      31,
115     30,      30,      28,      28,      27,      27,      25,      25,
116     24,      24,      23,      23,      22,      22,      21,      21,
117     20,      20,      19,      19,      18,      18,      17,      17,
118     16,      16,      15,      15,      14,      14,      14,      14,
119     13,      13,      12,      12,      12,      12,      11,      11,
120     11,      11,      10,      10,      9,       9,       2,       2,
121     // mlps state
122     127,     126,     77,      76,      77,      76,      75,      74,
123     75,      74,      75,      74,      73,      72,      73,      72,
124     73,      72,      71,      70,      71,      70,      71,      70,
125     69,      68,      69,      68,      67,      66,      67,      66,
126     67,      66,      65,      64,      65,      64,      63,      62,
127     61,      60,      61,      60,      61,      60,      59,      58,
128     59,      58,      57,      56,      55,      54,      55,      54,
129     53,      52,      53,      52,      51,      50,      49,      48,
130     49,      48,      47,      46,      45,      44,      45,      44,
131     43,      42,      43,      42,      39,      38,      39,      38,
132     37,      36,      37,      36,      33,      32,      33,      32,
133     31,      30,      31,      30,      27,      26,      27,      26,
134     25,      24,      23,      22,      23,      22,      19,      18,
135     19,      18,      17,      16,      15,      14,      13,      12,
136     11,      10,      9,       8,       9,       8,       5,       4,
137     5,       4,       3,       2,       1,       0,       0,       1,
138     2,       3,       4,       5,       6,       7,       8,       9,
139     10,      11,      12,      13,      14,      15,      16,      17,
140     18,      19,      20,      21,      22,      23,      24,      25,
141     26,      27,      28,      29,      30,      31,      32,      33,
142     34,      35,      36,      37,      38,      39,      40,      41,
143     42,      43,      44,      45,      46,      47,      48,      49,
144     50,      51,      52,      53,      54,      55,      56,      57,
145     58,      59,      60,      61,      62,      63,      64,      65,
146     66,      67,      68,      69,      70,      71,      72,      73,
147     74,      75,      76,      77,      78,      79,      80,      81,
148     82,      83,      84,      85,      86,      87,      88,      89,
149     90,      91,      92,      93,      94,      95,      96,      97,
150     98,      99,      100,     101,     102,     103,     104,     105,
151     106,     107,     108,     109,     110,     111,     112,     113,
152     114,     115,     116,     117,     118,     119,     120,     121,
153     122,     123,     124,     125,     124,     125,     126,     127,
154     // last_coeff_flag_offset_8x8
155     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
156     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
157     3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
158     5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
159 };
160
161 /**
162  *
163  * @param buf_size size of buf in bits
164  */
165 void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){
166     init_put_bits(&c->pb, buf, buf_size);
167
168     c->low= 0;
169     c->range= 0x1FE;
170     c->outstanding_count= 0;
171     c->pb.bit_left++; //avoids firstBitFlag
172 }
173
174 /**
175  *
176  * @param buf_size size of buf in bits
177  */
178 void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size){
179     c->bytestream_start=
180     c->bytestream= buf;
181     c->bytestream_end= buf + buf_size;
182
183 #if CABAC_BITS == 16
184     c->low =  (*c->bytestream++)<<18;
185     c->low+=  (*c->bytestream++)<<10;
186 #else
187     c->low =  (*c->bytestream++)<<10;
188 #endif
189     c->low+= ((*c->bytestream++)<<2) + 2;
190     c->range= 0x1FE;
191 }
192
193 #ifdef TEST
194 #define SIZE 10240
195
196 #include "libavutil/lfg.h"
197 #include "avcodec.h"
198
199 static inline void put_cabac_bit(CABACContext *c, int b){
200     put_bits(&c->pb, 1, b);
201     for(;c->outstanding_count; c->outstanding_count--){
202         put_bits(&c->pb, 1, 1-b);
203     }
204 }
205
206 static inline void renorm_cabac_encoder(CABACContext *c){
207     while(c->range < 0x100){
208         //FIXME optimize
209         if(c->low<0x100){
210             put_cabac_bit(c, 0);
211         }else if(c->low<0x200){
212             c->outstanding_count++;
213             c->low -= 0x100;
214         }else{
215             put_cabac_bit(c, 1);
216             c->low -= 0x200;
217         }
218
219         c->range+= c->range;
220         c->low += c->low;
221     }
222 }
223
224 static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
225     int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
226
227     if(bit == ((*state)&1)){
228         c->range -= RangeLPS;
229         *state    = ff_h264_mlps_state[128 + *state];
230     }else{
231         c->low += c->range - RangeLPS;
232         c->range = RangeLPS;
233         *state= ff_h264_mlps_state[127 - *state];
234     }
235
236     renorm_cabac_encoder(c);
237 }
238
239 /**
240  * @param bit 0 -> write zero bit, !=0 write one bit
241  */
242 static void put_cabac_bypass(CABACContext *c, int bit){
243     c->low += c->low;
244
245     if(bit){
246         c->low += c->range;
247     }
248 //FIXME optimize
249     if(c->low<0x200){
250         put_cabac_bit(c, 0);
251     }else if(c->low<0x400){
252         c->outstanding_count++;
253         c->low -= 0x200;
254     }else{
255         put_cabac_bit(c, 1);
256         c->low -= 0x400;
257     }
258 }
259
260 /**
261  *
262  * @return the number of bytes written
263  */
264 static int put_cabac_terminate(CABACContext *c, int bit){
265     c->range -= 2;
266
267     if(!bit){
268         renorm_cabac_encoder(c);
269     }else{
270         c->low += c->range;
271         c->range= 2;
272
273         renorm_cabac_encoder(c);
274
275         av_assert0(c->low <= 0x1FF);
276         put_cabac_bit(c, c->low>>9);
277         put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
278
279         flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
280     }
281
282     return (put_bits_count(&c->pb)+7)>>3;
283 }
284
285 int main(void){
286     CABACContext c;
287     uint8_t b[9*SIZE];
288     uint8_t r[9*SIZE];
289     int i, ret = 0;
290     uint8_t state[10]= {0};
291     AVLFG prng;
292
293     av_lfg_init(&prng, 1);
294     ff_init_cabac_encoder(&c, b, SIZE);
295
296     for(i=0; i<SIZE; i++){
297         if(2*i<SIZE) r[i] = av_lfg_get(&prng) % 7;
298         else         r[i] = (i>>8)&1;
299     }
300
301     for(i=0; i<SIZE; i++){
302         put_cabac_bypass(&c, r[i]&1);
303     }
304
305     for(i=0; i<SIZE; i++){
306         put_cabac(&c, state, r[i]&1);
307     }
308
309     put_cabac_terminate(&c, 1);
310
311     ff_init_cabac_decoder(&c, b, SIZE);
312
313     memset(state, 0, sizeof(state));
314
315     for(i=0; i<SIZE; i++){
316         if( (r[i]&1) != get_cabac_bypass(&c) ) {
317             av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i);
318             ret = 1;
319         }
320     }
321
322     for(i=0; i<SIZE; i++){
323         if( (r[i]&1) != get_cabac_noinline(&c, state) ) {
324             av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
325             ret = 1;
326         }
327     }
328     if(!get_cabac_terminate(&c)) {
329         av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n");
330         ret = 1;
331     }
332
333     return ret;
334 }
335
336 #endif /* TEST */