2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
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.
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.
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
24 * Context Adaptive Binary Arithmetic Coder.
29 #include "libavutil/common.h"
32 #include "cabac_functions.h"
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,
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},
76 static const uint8_t mps_state[64]= {
77 1, 2, 3, 4, 5, 6, 7, 8,
78 9,10,11,12,13,14,15,16,
79 17,18,19,20,21,22,23,24,
80 25,26,27,28,29,30,31,32,
81 33,34,35,36,37,38,39,40,
82 41,42,43,44,45,46,47,48,
83 49,50,51,52,53,54,55,56,
84 57,58,59,60,61,62,62,63,
87 static const uint8_t lps_state[64]= {
88 0, 0, 1, 2, 2, 4, 4, 5,
89 6, 7, 8, 9, 9,11,11,12,
90 13,13,15,15,16,16,18,18,
91 19,19,21,21,22,22,23,24,
92 24,25,26,26,27,27,28,29,
93 29,30,30,30,31,32,32,33,
94 33,33,34,34,35,35,35,36,
95 36,36,37,37,37,38,38,63,
98 static const uint8_t last_coeff_flag_offset_8x8[63] = {
99 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
100 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
101 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
102 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
107 * @param buf_size size of buf in bits
109 void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){
110 init_put_bits(&c->pb, buf, buf_size);
114 c->outstanding_count= 0;
115 c->pb.bit_left++; //avoids firstBitFlag
120 * @param buf_size size of buf in bits
122 void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size){
125 c->bytestream_end= buf + buf_size;
128 c->low = (*c->bytestream++)<<18;
129 c->low+= (*c->bytestream++)<<10;
131 c->low = (*c->bytestream++)<<10;
133 c->low+= ((*c->bytestream++)<<2) + 2;
137 void ff_init_cabac_states(void)
140 static int initialized = 0;
146 for(j=0; j<4; j++){ //FIXME check if this is worth the 1 shift we save
147 ff_h264_lps_range[j*2*64+2*i+0]=
148 ff_h264_lps_range[j*2*64+2*i+1]= lps_range[i][j];
150 ff_h264_mlps_state[128 + 2 * i + 0] = 2 * mps_state[i] + 0;
151 ff_h264_mlps_state[128 + 2 * i + 1] = 2 * mps_state[i] + 1;
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;
157 ff_h264_mlps_state[128-2*i-1]= 1;
158 ff_h264_mlps_state[128-2*i-2]= 0;
161 for(i=0; i< 63; i++){
162 ff_h264_last_coeff_flag_offset_8x8[i] = last_coeff_flag_offset_8x8[i];
171 #include "libavutil/lfg.h"
174 static inline void put_cabac_bit(CABACContext *c, int b){
175 put_bits(&c->pb, 1, b);
176 for(;c->outstanding_count; c->outstanding_count--){
177 put_bits(&c->pb, 1, 1-b);
181 static inline void renorm_cabac_encoder(CABACContext *c){
182 while(c->range < 0x100){
186 }else if(c->low<0x200){
187 c->outstanding_count++;
199 static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
200 int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
202 if(bit == ((*state)&1)){
203 c->range -= RangeLPS;
204 *state = ff_h264_mlps_state[128 + *state];
206 c->low += c->range - RangeLPS;
208 *state= ff_h264_mlps_state[127 - *state];
211 renorm_cabac_encoder(c);
215 * @param bit 0 -> write zero bit, !=0 write one bit
217 static void put_cabac_bypass(CABACContext *c, int bit){
226 }else if(c->low<0x400){
227 c->outstanding_count++;
237 * @return the number of bytes written
239 static int put_cabac_terminate(CABACContext *c, int bit){
243 renorm_cabac_encoder(c);
248 renorm_cabac_encoder(c);
250 av_assert0(c->low <= 0x1FF);
251 put_cabac_bit(c, c->low>>9);
252 put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
254 flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
257 return (put_bits_count(&c->pb)+7)>>3;
265 uint8_t state[10]= {0};
268 av_lfg_init(&prng, 1);
269 ff_init_cabac_encoder(&c, b, SIZE);
270 ff_init_cabac_states();
272 for(i=0; i<SIZE; i++){
273 if(2*i<SIZE) r[i] = av_lfg_get(&prng) % 7;
274 else r[i] = (i>>8)&1;
277 for(i=0; i<SIZE; i++){
279 put_cabac_bypass(&c, r[i]&1);
280 STOP_TIMER("put_cabac_bypass")
283 for(i=0; i<SIZE; i++){
285 put_cabac(&c, state, r[i]&1);
286 STOP_TIMER("put_cabac")
289 put_cabac_terminate(&c, 1);
291 ff_init_cabac_decoder(&c, b, SIZE);
293 memset(state, 0, sizeof(state));
295 for(i=0; i<SIZE; i++){
297 if( (r[i]&1) != get_cabac_bypass(&c) )
298 av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i);
299 STOP_TIMER("get_cabac_bypass")
302 for(i=0; i<SIZE; i++){
304 if( (r[i]&1) != get_cabac(&c, state) )
305 av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
306 STOP_TIMER("get_cabac")
308 if(!get_cabac_terminate(&c))
309 av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n");