Skip to content

Commit

Permalink
cabac: Make CABAC states hardcoded
Browse files Browse the repository at this point in the history
There is not much reason to generate such a small table at runtime.

Signed-off-by: Derek Buitenhuis <derekb@vimeo.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
  • Loading branch information
elenril authored and lu-zero committed Oct 8, 2015
1 parent 2830bce commit a8956ec
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 111 deletions.
225 changes: 124 additions & 101 deletions libavcodec/cabac.c
Expand Up @@ -31,75 +31,130 @@
#include "cabac.h"
#include "cabac_functions.h"

uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
};

static const uint8_t lps_range[64][4]= {
{128,176,208,240}, {128,167,197,227}, {128,158,187,216}, {123,150,178,205},
{116,142,169,195}, {111,135,160,185}, {105,128,152,175}, {100,122,144,166},
{ 95,116,137,158}, { 90,110,130,150}, { 85,104,123,142}, { 81, 99,117,135},
{ 77, 94,111,128}, { 73, 89,105,122}, { 69, 85,100,116}, { 66, 80, 95,110},
{ 62, 76, 90,104}, { 59, 72, 86, 99}, { 56, 69, 81, 94}, { 53, 65, 77, 89},
{ 51, 62, 73, 85}, { 48, 59, 69, 80}, { 46, 56, 66, 76}, { 43, 53, 63, 72},
{ 41, 50, 59, 69}, { 39, 48, 56, 65}, { 37, 45, 54, 62}, { 35, 43, 51, 59},
{ 33, 41, 48, 56}, { 32, 39, 46, 53}, { 30, 37, 43, 50}, { 29, 35, 41, 48},
{ 27, 33, 39, 45}, { 26, 31, 37, 43}, { 24, 30, 35, 41}, { 23, 28, 33, 39},
{ 22, 27, 32, 37}, { 21, 26, 30, 35}, { 20, 24, 29, 33}, { 19, 23, 27, 31},
{ 18, 22, 26, 30}, { 17, 21, 25, 28}, { 16, 20, 23, 27}, { 15, 19, 22, 25},
{ 14, 18, 21, 24}, { 14, 17, 20, 23}, { 13, 16, 19, 22}, { 12, 15, 18, 21},
{ 12, 14, 17, 20}, { 11, 14, 16, 19}, { 11, 13, 15, 18}, { 10, 12, 15, 17},
{ 10, 12, 14, 16}, { 9, 11, 13, 15}, { 9, 11, 12, 14}, { 8, 10, 12, 14},
{ 8, 9, 11, 13}, { 7, 9, 11, 12}, { 7, 9, 10, 12}, { 7, 8, 10, 11},
{ 6, 8, 9, 11}, { 6, 7, 9, 10}, { 6, 7, 8, 9}, { 2, 2, 2, 2},
};

static const uint8_t mps_state[64]= {
1, 2, 3, 4, 5, 6, 7, 8,
9,10,11,12,13,14,15,16,
17,18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32,
33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,
49,50,51,52,53,54,55,56,
57,58,59,60,61,62,62,63,
};

static const uint8_t lps_state[64]= {
0, 0, 1, 2, 2, 4, 4, 5,
6, 7, 8, 9, 9,11,11,12,
13,13,15,15,16,16,18,18,
19,19,21,21,22,22,23,24,
24,25,26,26,27,27,28,29,
29,30,30,30,31,32,32,33,
33,33,34,34,35,35,35,36,
36,36,37,37,37,38,38,63,
};

static const uint8_t last_coeff_flag_offset_8x8[63] = {
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
// LPS range
-128, -128, -128, -128, -128, -128, 123, 123,
116, 116, 111, 111, 105, 105, 100, 100,
95, 95, 90, 90, 85, 85, 81, 81,
77, 77, 73, 73, 69, 69, 66, 66,
62, 62, 59, 59, 56, 56, 53, 53,
51, 51, 48, 48, 46, 46, 43, 43,
41, 41, 39, 39, 37, 37, 35, 35,
33, 33, 32, 32, 30, 30, 29, 29,
27, 27, 26, 26, 24, 24, 23, 23,
22, 22, 21, 21, 20, 20, 19, 19,
18, 18, 17, 17, 16, 16, 15, 15,
14, 14, 14, 14, 13, 13, 12, 12,
12, 12, 11, 11, 11, 11, 10, 10,
10, 10, 9, 9, 9, 9, 8, 8,
8, 8, 7, 7, 7, 7, 7, 7,
6, 6, 6, 6, 6, 6, 2, 2,
-80, -80, -89, -89, -98, -98, -106, -106,
-114, -114, -121, -121, -128, -128, 122, 122,
116, 116, 110, 110, 104, 104, 99, 99,
94, 94, 89, 89, 85, 85, 80, 80,
76, 76, 72, 72, 69, 69, 65, 65,
62, 62, 59, 59, 56, 56, 53, 53,
50, 50, 48, 48, 45, 45, 43, 43,
41, 41, 39, 39, 37, 37, 35, 35,
33, 33, 31, 31, 30, 30, 28, 28,
27, 27, 26, 26, 24, 24, 23, 23,
22, 22, 21, 21, 20, 20, 19, 19,
18, 18, 17, 17, 16, 16, 15, 15,
14, 14, 14, 14, 13, 13, 12, 12,
12, 12, 11, 11, 11, 11, 10, 10,
9, 9, 9, 9, 9, 9, 8, 8,
8, 8, 7, 7, 7, 7, 2, 2,
-48, -48, -59, -59, -69, -69, -78, -78,
-87, -87, -96, -96, -104, -104, -112, -112,
-119, -119, -126, -126, 123, 123, 117, 117,
111, 111, 105, 105, 100, 100, 95, 95,
90, 90, 86, 86, 81, 81, 77, 77,
73, 73, 69, 69, 66, 66, 63, 63,
59, 59, 56, 56, 54, 54, 51, 51,
48, 48, 46, 46, 43, 43, 41, 41,
39, 39, 37, 37, 35, 35, 33, 33,
32, 32, 30, 30, 29, 29, 27, 27,
26, 26, 25, 25, 23, 23, 22, 22,
21, 21, 20, 20, 19, 19, 18, 18,
17, 17, 16, 16, 15, 15, 15, 15,
14, 14, 13, 13, 12, 12, 12, 12,
11, 11, 11, 11, 10, 10, 10, 10,
9, 9, 9, 9, 8, 8, 2, 2,
-16, -16, -29, -29, -40, -40, -51, -51,
-61, -61, -71, -71, -81, -81, -90, -90,
-98, -98, -106, -106, -114, -114, -121, -121,
-128, -128, 122, 122, 116, 116, 110, 110,
104, 104, 99, 99, 94, 94, 89, 89,
85, 85, 80, 80, 76, 76, 72, 72,
69, 69, 65, 65, 62, 62, 59, 59,
56, 56, 53, 53, 50, 50, 48, 48,
45, 45, 43, 43, 41, 41, 39, 39,
37, 37, 35, 35, 33, 33, 31, 31,
30, 30, 28, 28, 27, 27, 25, 25,
24, 24, 23, 23, 22, 22, 21, 21,
20, 20, 19, 19, 18, 18, 17, 17,
16, 16, 15, 15, 14, 14, 14, 14,
13, 13, 12, 12, 12, 12, 11, 11,
11, 11, 10, 10, 9, 9, 2, 2,
// mlps state
127, 126, 77, 76, 77, 76, 75, 74,
75, 74, 75, 74, 73, 72, 73, 72,
73, 72, 71, 70, 71, 70, 71, 70,
69, 68, 69, 68, 67, 66, 67, 66,
67, 66, 65, 64, 65, 64, 63, 62,
61, 60, 61, 60, 61, 60, 59, 58,
59, 58, 57, 56, 55, 54, 55, 54,
53, 52, 53, 52, 51, 50, 49, 48,
49, 48, 47, 46, 45, 44, 45, 44,
43, 42, 43, 42, 39, 38, 39, 38,
37, 36, 37, 36, 33, 32, 33, 32,
31, 30, 31, 30, 27, 26, 27, 26,
25, 24, 23, 22, 23, 22, 19, 18,
19, 18, 17, 16, 15, 14, 13, 12,
11, 10, 9, 8, 9, 8, 5, 4,
5, 4, 3, 2, 1, 0, 0, 1,
2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81,
82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97,
98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 109, 110, 111, 112, 113,
114, 115, 116, 117, 118, 119, 120, 121,
122, 123, 124, 125, 124, 125, 126, 127,
// last_coeff_flag_offset_8x8
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
};

/**
Expand All @@ -120,35 +175,3 @@ void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size){
c->low+= ((*c->bytestream++)<<2) + 2;
c->range= 0x1FE;
}

void ff_init_cabac_states(void)
{
int i, j;
static int initialized = 0;

if (initialized)
return;

for(i=0; i<64; i++){
for(j=0; j<4; j++){ //FIXME check if this is worth the 1 shift we save
ff_h264_lps_range[j*2*64+2*i+0]=
ff_h264_lps_range[j*2*64+2*i+1]= lps_range[i][j];
}

ff_h264_mlps_state[128 + 2 * i + 0] = 2 * mps_state[i] + 0;
ff_h264_mlps_state[128 + 2 * i + 1] = 2 * mps_state[i] + 1;

if( i ){
ff_h264_mlps_state[128-2*i-1]= 2*lps_state[i]+0;
ff_h264_mlps_state[128-2*i-2]= 2*lps_state[i]+1;
}else{
ff_h264_mlps_state[128-2*i-1]= 1;
ff_h264_mlps_state[128-2*i-2]= 0;
}
}
for(i=0; i< 63; i++){
ff_h264_last_coeff_flag_offset_8x8[i] = last_coeff_flag_offset_8x8[i];
}

initialized = 1;
}
3 changes: 1 addition & 2 deletions libavcodec/cabac.h
Expand Up @@ -31,7 +31,7 @@

#include "put_bits.h"

extern uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63];
extern const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63];
#define H264_NORM_SHIFT_OFFSET 0
#define H264_LPS_RANGE_OFFSET 512
#define H264_MLPS_STATE_OFFSET 1024
Expand All @@ -49,6 +49,5 @@ typedef struct CABACContext{
}CABACContext;

void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size);
void ff_init_cabac_states(void);

#endif /* AVCODEC_CABAC_H */
8 changes: 4 additions & 4 deletions libavcodec/cabac_functions.h
Expand Up @@ -42,10 +42,10 @@
# include "x86/cabac.h"
#endif

static uint8_t * const ff_h264_norm_shift = ff_h264_cabac_tables + H264_NORM_SHIFT_OFFSET;
static uint8_t * const ff_h264_lps_range = ff_h264_cabac_tables + H264_LPS_RANGE_OFFSET;
static uint8_t * const ff_h264_mlps_state = ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET;
static uint8_t * const ff_h264_last_coeff_flag_offset_8x8 = ff_h264_cabac_tables + H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET;
static const uint8_t * const ff_h264_norm_shift = ff_h264_cabac_tables + H264_NORM_SHIFT_OFFSET;
static const uint8_t * const ff_h264_lps_range = ff_h264_cabac_tables + H264_LPS_RANGE_OFFSET;
static const uint8_t * const ff_h264_mlps_state = ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET;
static const uint8_t * const ff_h264_last_coeff_flag_offset_8x8 = ff_h264_cabac_tables + H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET;

static void refill(CABACContext *c){
#if CABAC_BITS == 16
Expand Down
2 changes: 0 additions & 2 deletions libavcodec/h264.c
Expand Up @@ -621,8 +621,6 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)

ff_h264_decode_init_vlc();

ff_init_cabac_states();

if (avctx->codec_id == AV_CODEC_ID_H264) {
if (avctx->ticks_per_frame == 1)
h->avctx->framerate.num *= 2;
Expand Down
2 changes: 0 additions & 2 deletions libavcodec/hevc.c
Expand Up @@ -2984,8 +2984,6 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
HEVCContext *s = avctx->priv_data;
int ret;

ff_init_cabac_states();

avctx->internal->allocate_progress = 1;

ret = hevc_init_context(avctx);
Expand Down

0 comments on commit a8956ec

Please sign in to comment.