[FFmpeg-devel] [PATCH 4/4] h264: get rid of the additional helper pointers for the cabac tables
Roland Scheidegger
rscheidegger_lists at hispeed.ch
Fri Apr 27 02:47:09 CEST 2012
Just use offsets directly instead. This lets gcc generate better code with
only a minor ugliness increase.
In particular the c code should be as efficient as before the single table
was introduced for non-pic case, and better for pic case (the latter verified,
though only for get_cabac_noinline, as it's possible for the inline case gcc
is able to hold all table addresses in registers anyway). Well at least better
for x86 that is.
---
libavcodec/cabac.c | 7 +++----
libavcodec/cabac_functions.h | 11 ++++-------
libavcodec/h264_cabac.c | 5 ++---
3 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
index 539ea32..5b4d459 100644
--- a/libavcodec/cabac.c
+++ b/libavcodec/cabac.c
@@ -54,10 +54,9 @@ uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
-uint8_t * const ff_h264_norm_shift = ff_h264_cabac_tables + H264_NORM_SHIFT_OFFSET;
-uint8_t * const ff_h264_lps_range = ff_h264_cabac_tables + H264_LPS_RANGE_OFFSET;
-uint8_t * const ff_h264_mlps_state = ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET;
-uint8_t * const ff_h264_last_coeff_flag_offset_8x8 = ff_h264_cabac_tables + H264_LAST_COEFF_FLAG_OFFSET_8x8_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 lps_range[64][4]= {
{128,176,208,240}, {128,167,197,227}, {128,158,187,216}, {123,150,178,205},
diff --git a/libavcodec/cabac_functions.h b/libavcodec/cabac_functions.h
index 9db365e..db40b2c 100644
--- a/libavcodec/cabac_functions.h
+++ b/libavcodec/cabac_functions.h
@@ -36,9 +36,6 @@
# include "x86/cabac.h"
#endif
-extern uint8_t * const ff_h264_norm_shift;
-extern uint8_t * const ff_h264_mlps_state;
-extern uint8_t * const ff_h264_lps_range; ///< rangeTabLPS
extern uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63];
static void refill(CABACContext *c){
@@ -64,7 +61,7 @@ static void refill2(CABACContext *c){
int i, x;
x= c->low ^ (c->low-1);
- i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)];
+ i= 7 - (ff_h264_cabac_tables+H264_NORM_SHIFT_OFFSET)[x>>(CABAC_BITS-1)];
x= -CABAC_MASK;
@@ -80,7 +77,7 @@ static void refill2(CABACContext *c){
static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t * const state){
int s = *state;
- int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s];
+ int RangeLPS= (ff_h264_cabac_tables+H264_LPS_RANGE_OFFSET)[2*(c->range&0xC0) + s];
int bit, lps_mask;
c->range -= RangeLPS;
@@ -90,10 +87,10 @@ static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t * const st
c->range += (RangeLPS - c->range) & lps_mask;
s^=lps_mask;
- *state= (ff_h264_mlps_state+128)[s];
+ *state= (ff_h264_cabac_tables+H264_MLPS_STATE_OFFSET+128)[s];
bit= s&1;
- lps_mask= ff_h264_norm_shift[c->range];
+ lps_mask= (ff_h264_cabac_tables+H264_NORM_SHIFT_OFFSET)[c->range];
c->range<<= lps_mask;
c->low <<= lps_mask;
if(!(c->low & CABAC_MASK))
diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c
index 7b5b128..5488bf6 100644
--- a/libavcodec/h264_cabac.c
+++ b/libavcodec/h264_cabac.c
@@ -1561,8 +1561,6 @@ static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx,
return base_ctx[cat] + ctx;
}
-extern uint8_t * const ff_h264_last_coeff_flag_offset_8x8;
-
static av_always_inline void
decode_cabac_residual_internal(H264Context *h, DCTELEM *block,
int cat, int n, const uint8_t *scantable,
@@ -1665,7 +1663,8 @@ decode_cabac_residual_internal(H264Context *h, DCTELEM *block,
last_coeff_ctx_base-significant_coeff_ctx_base);
}
#else
- DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
+ DECODE_SIGNIFICANCE( 63, sig_off[last],
+ (ff_h264_cabac_tables+H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET)[last] );
} else {
if (is_dc && chroma422) { // dc 422
DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
--
1.7.1
More information about the ffmpeg-devel
mailing list