00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #define CONTEXT_INI_C
00017
00018 #include <math.h>
00019
00020 #include "global.h"
00021
00022 #include "ctx_tables.h"
00023 #include "biariencode.h"
00024 #include "memalloc.h"
00025
00026 #define DEFAULT_CTX_MODEL 0
00027 #define RELIABLE_COUNT 32.0
00028 #define FRAME_TYPES 4
00029 #define FIXED 0
00030
00031
00032 int num_mb_per_slice;
00033 int number_of_slices;
00034 int*** initialized;
00035 int*** model_number;
00036
00037
00038 double entropy [128];
00039 double probability[128] =
00040 {
00041 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00042 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00043 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00044 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00045 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00046 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00047 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00048 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
00049
00050 0.500000, 0.474609, 0.450507, 0.427629, 0.405912, 0.385299, 0.365732, 0.347159,
00051 0.329530, 0.312795, 0.296911, 0.281833, 0.267520, 0.253935, 0.241039, 0.228799,
00052 0.217180, 0.206151, 0.195682, 0.185744, 0.176312, 0.167358, 0.158859, 0.150792,
00053 0.143134, 0.135866, 0.128966, 0.122417, 0.116200, 0.110299, 0.104698, 0.099381,
00054 0.094334, 0.089543, 0.084996, 0.080680, 0.076583, 0.072694, 0.069002, 0.065498,
00055 0.062172, 0.059014, 0.056018, 0.053173, 0.050473, 0.047909, 0.045476, 0.043167,
00056 0.040975, 0.038894, 0.036919, 0.035044, 0.033264, 0.031575, 0.029972, 0.028450,
00057 0.027005, 0.025633, 0.024332, 0.023096, 0.021923, 0.020810, 0.019753, 0.018750
00058 };
00059
00060
00061
00062 void create_context_memory (void)
00063 {
00064 int k;
00065 int num_mb = img->FrameSizeInMbs;
00066 double log2 = log(2.0);
00067
00068 num_mb_per_slice = (params->slice_mode == 1 ? params->slice_argument : num_mb);
00069 number_of_slices = (num_mb + num_mb_per_slice - 1) / num_mb_per_slice;
00070 get_mem3Dint(&initialized, 3, FRAME_TYPES, number_of_slices);
00071
00072 memset(&initialized[0][0][0], 0, 3 * FRAME_TYPES * number_of_slices * sizeof(int));
00073 get_mem3Dint(&model_number, 3, FRAME_TYPES, number_of_slices);
00074
00075
00076 for( k=0; k<64; k++ )
00077 {
00078 probability[k] = 1.0 - probability[127-k];
00079 entropy [k] = log (probability[ k]) / log2;
00080 entropy[127-k] = log (probability[127 - k]) / log2;
00081 }
00082 }
00083
00084 void free_context_memory (void)
00085 {
00086 free_mem3Dint(initialized);
00087 free_mem3Dint(model_number);
00088 }
00089
00090
00091 #define BIARI_CTX_INIT2(ii,jj,ctx,tab,num) \
00092 { \
00093 if ((img->type==I_SLICE)||(img->type==SI_SLICE)) \
00094 for (i=0; i<ii; i++) \
00095 for (j=0; j<jj; j++) \
00096 { \
00097 biari_init_context (&(ctx[i][j]), &(tab ## _I[num][i][j][0])); \
00098 } \
00099 else \
00100 for (i=0; i<ii; i++) \
00101 for (j=0; j<jj; j++) \
00102 { \
00103 biari_init_context (&(ctx[i][j]), &(tab ## _P[num][i][j][0])); \
00104 } \
00105 }
00106
00107 #define BIARI_CTX_INIT1(jj,ctx,tab,num) \
00108 { \
00109 if ((img->type==I_SLICE)||(img->type==SI_SLICE)) \
00110 for (j=0; j<jj; j++) \
00111 { \
00112 biari_init_context (&(ctx[j]), &(tab ## _I[num][0][j][0])); \
00113 } \
00114 else \
00115 for (j=0; j<jj; j++) \
00116 { \
00117 biari_init_context (&(ctx[j]), &(tab ## _P[num][0][j][0])); \
00118 } \
00119 }
00120
00121 void SetCtxModelNumber (void)
00122 {
00123 int frame_field = img->field_picture;
00124 int img_type = img->type;
00125 int ctx_number = img->currentSlice->start_mb_nr / num_mb_per_slice;
00126
00127 if(img->type==I_SLICE)
00128 {
00129 img->model_number=DEFAULT_CTX_MODEL;
00130 return;
00131 }
00132 if(params->context_init_method==FIXED)
00133 {
00134 img->model_number=params->model_number;
00135 return;
00136 }
00137
00138 if (initialized [frame_field][img_type][ctx_number])
00139 {
00140 img->model_number = model_number[frame_field][img_type][ctx_number];
00141 }
00142 else if (ctx_number && initialized[frame_field][img_type][ctx_number-1])
00143 {
00144 img->model_number = model_number[frame_field][img_type][ctx_number-1];
00145 }
00146 else
00147 {
00148 img->model_number = DEFAULT_CTX_MODEL;
00149 }
00150 }
00151
00152 void init_contexts (void)
00153 {
00154 MotionInfoContexts* mc = img->currentSlice->mot_ctx;
00155 TextureInfoContexts* tc = img->currentSlice->tex_ctx;
00156 int i, j;
00157
00158
00159 BIARI_CTX_INIT2 (3, NUM_MB_TYPE_CTX, mc->mb_type_contexts, INIT_MB_TYPE, img->model_number);
00160 BIARI_CTX_INIT2 (2, NUM_B8_TYPE_CTX, mc->b8_type_contexts, INIT_B8_TYPE, img->model_number);
00161 BIARI_CTX_INIT2 (2, NUM_MV_RES_CTX, mc->mv_res_contexts, INIT_MV_RES, img->model_number);
00162 BIARI_CTX_INIT2 (2, NUM_REF_NO_CTX, mc->ref_no_contexts, INIT_REF_NO, img->model_number);
00163 BIARI_CTX_INIT1 ( NUM_DELTA_QP_CTX, mc->delta_qp_contexts, INIT_DELTA_QP, img->model_number);
00164 #if ENABLE_FIELD_CTX
00165 BIARI_CTX_INIT1 ( NUM_MB_AFF_CTX, mc->mb_aff_contexts, INIT_MB_AFF, img->model_number);
00166 #endif
00167 BIARI_CTX_INIT1 ( NUM_TRANSFORM_SIZE_CTX, mc->transform_size_contexts, INIT_TRANSFORM_SIZE, img->model_number);
00168
00169
00170 BIARI_CTX_INIT1 ( NUM_IPR_CTX, tc->ipr_contexts, INIT_IPR, img->model_number);
00171 BIARI_CTX_INIT1 ( NUM_CIPR_CTX, tc->cipr_contexts, INIT_CIPR, img->model_number);
00172 BIARI_CTX_INIT2 (3, NUM_CBP_CTX, tc->cbp_contexts, INIT_CBP, img->model_number);
00173 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_BCBP_CTX, tc->bcbp_contexts, INIT_BCBP, img->model_number);
00174 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_MAP_CTX, tc->map_contexts[0], INIT_MAP, img->model_number);
00175 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts[0], INIT_LAST, img->model_number);
00176 #if ENABLE_FIELD_CTX
00177 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_MAP_CTX, tc->map_contexts[1], INIT_FLD_MAP, img->model_number);
00178 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts[1], INIT_FLD_LAST, img->model_number);
00179 #endif
00180 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_ONE_CTX, tc->one_contexts, INIT_ONE, img->model_number);
00181 BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_ABS_CTX, tc->abs_contexts, INIT_ABS, img->model_number);
00182 }
00183
00184
00185 double XRate (BiContextTypePtr ctx, const char* model)
00186 {
00187 int ctx_state, mod_state;
00188 double weight, xr = 0.0;
00189 int qp = imax(0, img->qp);
00190
00191 weight = dmin (1.0, (double)ctx->count/(double)RELIABLE_COUNT);
00192
00193 mod_state = ((model[0]*qp)>>4)+model[1];
00194 mod_state = iClip3(0, 127, mod_state);
00195 ctx_state = (ctx->MPS ? 64+ctx->state : 63-ctx->state);
00196
00197 xr -= weight * probability[ ctx_state] * entropy[ mod_state];
00198 xr -= weight * probability[127-ctx_state] * entropy[127-mod_state];
00199
00200 return xr;
00201 }
00202
00203 #define ADD_XRATE2(ii,jj,ctx,tab,num) \
00204 { \
00205 if (img->type==I_SLICE) \
00206 for (i=0; i<ii; i++) \
00207 for (j=0; j<jj; j++) \
00208 { \
00209 xr += XRate (&(ctx[i][j]), &(tab ## _I[num][i][j][0])); \
00210 } \
00211 else \
00212 for (i=0; i<ii; i++) \
00213 for (j=0; j<jj; j++) \
00214 { \
00215 xr += XRate (&(ctx[i][j]), &(tab ## _P[num][i][j][0])); \
00216 } \
00217 }
00218
00219 #define ADD_XRATE1(jj,ctx,tab,num) \
00220 { \
00221 if (img->type==I_SLICE) \
00222 for (j=0; j<jj; j++) \
00223 { \
00224 xr += XRate (&(ctx[j]), &(tab ## _I[num][0][j][0])); \
00225 } \
00226 else \
00227 for (j=0; j<jj; j++) \
00228 { \
00229 xr += XRate (&(ctx[j]), &(tab ## _P[num][0][j][0])); \
00230 } \
00231 }
00232
00233
00234 void GetCtxModelNumber (int* mnumber, MotionInfoContexts* mc, TextureInfoContexts* tc)
00235 {
00236 int model, j, i;
00237 int num_models = (img->type==I_SLICE ? NUM_CTX_MODELS_I : NUM_CTX_MODELS_P);
00238 double xr, min_xr = 1e30;
00239
00240 for (model=0; model<num_models; model++)
00241 {
00242 xr = 0.0;
00243
00244 ADD_XRATE2 (3, NUM_MB_TYPE_CTX, mc->mb_type_contexts, INIT_MB_TYPE, model);
00245 ADD_XRATE2 (2, NUM_B8_TYPE_CTX, mc->b8_type_contexts, INIT_B8_TYPE, model);
00246 ADD_XRATE2 (2, NUM_MV_RES_CTX, mc->mv_res_contexts, INIT_MV_RES, model);
00247 ADD_XRATE2 (2, NUM_REF_NO_CTX, mc->ref_no_contexts, INIT_REF_NO, model);
00248 ADD_XRATE1 ( NUM_DELTA_QP_CTX, mc->delta_qp_contexts, INIT_DELTA_QP, model);
00249 #if ENABLE_FIELD_CTX
00250 ADD_XRATE1 ( NUM_MB_AFF_CTX, mc->mb_aff_contexts, INIT_MB_AFF, model);
00251 #endif
00252 ADD_XRATE1 ( NUM_TRANSFORM_SIZE_CTX, mc->transform_size_contexts, INIT_TRANSFORM_SIZE, model);
00253
00254
00255 ADD_XRATE1 ( NUM_IPR_CTX, tc->ipr_contexts, INIT_IPR, model);
00256 ADD_XRATE1 ( NUM_CIPR_CTX, tc->cipr_contexts, INIT_CIPR, model);
00257 ADD_XRATE2 (3, NUM_CBP_CTX, tc->cbp_contexts, INIT_CBP, model);
00258 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_BCBP_CTX, tc->bcbp_contexts, INIT_BCBP, model);
00259 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_MAP_CTX, tc->map_contexts[0], INIT_MAP, model);
00260 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts[0], INIT_LAST, model);
00261 #if ENABLE_FIELD_CTX
00262 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_MAP_CTX, tc->map_contexts[1], INIT_FLD_MAP, model);
00263 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts[1], INIT_FLD_LAST, model);
00264 #endif
00265 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_ONE_CTX, tc->one_contexts, INIT_ONE, model);
00266 ADD_XRATE2 (NUM_BLOCK_TYPES, NUM_ABS_CTX, tc->abs_contexts, INIT_ABS, model);
00267
00268 if (xr<min_xr)
00269 {
00270 min_xr = xr;
00271 *mnumber = model;
00272 }
00273 }
00274 }
00275
00276 #undef ADD_XRATE2
00277 #undef ADD_XRATE1
00278
00279 void store_contexts (void)
00280 {
00281 int frame_field = img->field_picture;
00282 int img_type = img->type;
00283 int ctx_number = img->currentSlice->start_mb_nr / num_mb_per_slice;
00284
00285 if( params->context_init_method )
00286 {
00287 initialized [frame_field][img_type][ctx_number] = 1;
00288 GetCtxModelNumber (model_number[frame_field][img_type]+ctx_number, img->currentSlice->mot_ctx, img->currentSlice->tex_ctx);
00289 }
00290 else
00291 {
00292
00293 }
00294 }
00295
00296
00297 void update_field_frame_contexts (int field)
00298 {
00299 int i, j;
00300
00301 if (field)
00302 {
00303
00304 for (j=0; j<FRAME_TYPES; j++)
00305 {
00306 for (i=0; i<number_of_slices; i++)
00307 {
00308 initialized [0][j][i] = initialized [1][j][i>>1];
00309 model_number[0][j][i] = model_number[1][j][i>>1];
00310 }
00311 }
00312 }
00313 else
00314 {
00315
00316 for (j=0; j<FRAME_TYPES; j++)
00317 {
00318 for (i=0; i<((number_of_slices+1)>>1); i++)
00319 {
00320 initialized [1][j][i] = initialized [0][j][i<<1];
00321 model_number[1][j][i] = model_number[0][j][i<<1];
00322 }
00323 }
00324 }
00325 }
00326