]> git.sesse.net Git - ffmpeg/blob - libavcodec/cabac.c
avcodec/jpeg2000: replace naive pow call with smarter exp2fi
[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 int 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     if ((c->range<<(CABAC_BITS+1)) < c->low)
192         return AVERROR_INVALIDDATA;
193     return 0;
194 }
195
196 #ifdef TEST
197 #define SIZE 10240
198
199 #include "libavutil/lfg.h"
200 #include "avcodec.h"
201
202 static inline void put_cabac_bit(CABACContext *c, int b){
203     put_bits(&c->pb, 1, b);
204     for(;c->outstanding_count; c->outstanding_count--){
205         put_bits(&c->pb, 1, 1-b);
206     }
207 }
208
209 static inline void renorm_cabac_encoder(CABACContext *c){
210     while(c->range < 0x100){
211         //FIXME optimize
212         if(c->low<0x100){
213             put_cabac_bit(c, 0);
214         }else if(c->low<0x200){
215             c->outstanding_count++;
216             c->low -= 0x100;
217         }else{
218             put_cabac_bit(c, 1);
219             c->low -= 0x200;
220         }
221
222         c->range+= c->range;
223         c->low += c->low;
224     }
225 }
226
227 static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
228     int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
229
230     if(bit == ((*state)&1)){
231         c->range -= RangeLPS;
232         *state    = ff_h264_mlps_state[128 + *state];
233     }else{
234         c->low += c->range - RangeLPS;
235         c->range = RangeLPS;
236         *state= ff_h264_mlps_state[127 - *state];
237     }
238
239     renorm_cabac_encoder(c);
240 }
241
242 /**
243  * @param bit 0 -> write zero bit, !=0 write one bit
244  */
245 static void put_cabac_bypass(CABACContext *c, int bit){
246     c->low += c->low;
247
248     if(bit){
249         c->low += c->range;
250     }
251 //FIXME optimize
252     if(c->low<0x200){
253         put_cabac_bit(c, 0);
254     }else if(c->low<0x400){
255         c->outstanding_count++;
256         c->low -= 0x200;
257     }else{
258         put_cabac_bit(c, 1);
259         c->low -= 0x400;
260     }
261 }
262
263 /**
264  *
265  * @return the number of bytes written
266  */
267 static int put_cabac_terminate(CABACContext *c, int bit){
268     c->range -= 2;
269
270     if(!bit){
271         renorm_cabac_encoder(c);
272     }else{
273         c->low += c->range;
274         c->range= 2;
275
276         renorm_cabac_encoder(c);
277
278         av_assert0(c->low <= 0x1FF);
279         put_cabac_bit(c, c->low>>9);
280         put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
281
282         flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
283     }
284
285     return (put_bits_count(&c->pb)+7)>>3;
286 }
287
288 int main(void){
289     CABACContext c;
290     uint8_t b[9*SIZE];
291     uint8_t r[9*SIZE];
292     int i, ret = 0;
293     uint8_t state[10]= {0};
294     AVLFG prng;
295
296     av_lfg_init(&prng, 1);
297     ff_init_cabac_encoder(&c, b, SIZE);
298
299     for(i=0; i<SIZE; i++){
300         if(2*i<SIZE) r[i] = av_lfg_get(&prng) % 7;
301         else         r[i] = (i>>8)&1;
302     }
303
304     for(i=0; i<SIZE; i++){
305         put_cabac_bypass(&c, r[i]&1);
306     }
307
308     for(i=0; i<SIZE; i++){
309         put_cabac(&c, state, r[i]&1);
310     }
311
312     put_cabac_terminate(&c, 1);
313
314     ff_init_cabac_decoder(&c, b, SIZE);
315
316     memset(state, 0, sizeof(state));
317
318     for(i=0; i<SIZE; i++){
319         if( (r[i]&1) != get_cabac_bypass(&c) ) {
320             av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i);
321             ret = 1;
322         }
323     }
324
325     for(i=0; i<SIZE; i++){
326         if( (r[i]&1) != get_cabac_noinline(&c, state) ) {
327             av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
328             ret = 1;
329         }
330     }
331     if(!get_cabac_terminate(&c)) {
332         av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n");
333         ret = 1;
334     }
335
336     return ret;
337 }
338
339 #endif /* TEST */