context_ini.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:12k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file context_ini.c
  4.  *
  5.  * brief
  6.  *    CABAC context initializations
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Detlev Marpe                    <marpe@hhi.de>
  11.  *    - Heiko Schwarz                   <hschwarz@hhi.de>
  12.  **************************************************************************************
  13.  */
  14. #define CONTEXT_INI_C
  15. #include <math.h>
  16. #include "global.h"
  17. #include "ctx_tables.h"
  18. #include "cabac.h"
  19. #define DEFAULT_CTX_MODEL   0
  20. #define RELIABLE_COUNT      32.0
  21. #define FRAME_TYPES         4
  22. #define FIXED               0
  23. int    num_mb_per_slice;
  24. int    number_of_slices;
  25. int*** initialized;
  26. int*** model_number;
  27. double entropy    [128];
  28. double probability[128] =
  29. {
  30.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  31.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  32.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  33.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  34.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  35.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  36.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  37.   0.000000, 0.000000, 0.000000, 0.000000,    0.000000, 0.000000, 0.000000, 0.000000,
  38.   //--------------------------------------------------------------------------------
  39.   0.500000, 0.474609, 0.450507, 0.427629,    0.405912, 0.385299, 0.365732, 0.347159,
  40.   0.329530, 0.312795, 0.296911, 0.281833,    0.267520, 0.253935, 0.241039, 0.228799,
  41.   0.217180, 0.206151, 0.195682, 0.185744,    0.176312, 0.167358, 0.158859, 0.150792,
  42.   0.143134, 0.135866, 0.128966, 0.122417,    0.116200, 0.110299, 0.104698, 0.099381,
  43.   0.094334, 0.089543, 0.084996, 0.080680,    0.076583, 0.072694, 0.069002, 0.065498,
  44.   0.062172, 0.059014, 0.056018, 0.053173,    0.050473, 0.047909, 0.045476, 0.043167,
  45.   0.040975, 0.038894, 0.036919, 0.035044,    0.033264, 0.031575, 0.029972, 0.028450,
  46.   0.027005, 0.025633, 0.024332, 0.023096,    0.021923, 0.020810, 0.019753, 0.018750
  47. };
  48. void create_context_memory (void)
  49. {
  50.   int i, j, k;
  51.   int num_mb  = img->FrameSizeInMbs; // number of macroblocks for frame
  52.   double log2 = log(2.0);
  53.   num_mb_per_slice  = (params->slice_mode == 1 ? params->slice_argument : num_mb);
  54.   number_of_slices  = (num_mb + num_mb_per_slice - 1) / num_mb_per_slice;
  55.   if ((initialized  = (int***) malloc (3 * sizeof(int**))) == NULL)
  56.   {
  57.     no_mem_exit ("create_context_memory: initialized");
  58.   }
  59.   if ((model_number = (int***) malloc (3 * sizeof(int**))) == NULL)
  60.   {
  61.     no_mem_exit ("create_context_memory: model_number");
  62.   }
  63.   for (k=0; k<3; k++)
  64.   {
  65.     if ((initialized[k] = (int**) malloc (FRAME_TYPES * sizeof(int*))) == NULL)
  66.     {
  67.       no_mem_exit ("create_context_memory: initialized");
  68.     }
  69.     if ((model_number[k]= (int**) malloc (FRAME_TYPES * sizeof(int*))) == NULL)
  70.     {
  71.       no_mem_exit ("create_context_memory: model_number");
  72.     }
  73.     for (i=0; i<FRAME_TYPES; i++)
  74.     {
  75.       if ((initialized[k][i] = (int*) malloc (number_of_slices * sizeof(int))) == NULL)
  76.       {
  77.         no_mem_exit ("create_context_memory: initialized");
  78.       }
  79.       if ((model_number[k][i]= (int*) malloc (number_of_slices * sizeof(int))) == NULL)
  80.       {
  81.         no_mem_exit ("create_context_memory: model_number");
  82.       }
  83.     }
  84.   }
  85.   //===== set all context sets as "uninitialized" =====
  86.   for (k=0; k<3; k++)
  87.   {
  88.     for (i=0; i<FRAME_TYPES; i++)
  89.     {
  90.       for (j=0; j<number_of_slices; j++)
  91.       {
  92.         initialized[k][i][j] = 0;
  93.       }
  94.     }
  95.   }
  96.   //----- init tables -----
  97.   for( k=0; k<64; k++ )
  98.   {
  99.     probability[k] = 1.0 - probability[127-k];
  100.     entropy    [k] = log (probability[    k]) / log2;
  101.     entropy[127-k] = log (probability[127-k]) / log2;
  102.   }
  103. }
  104. void free_context_memory (void)
  105. {
  106.   int i, k;
  107.   for (k=0; k<3; k++)
  108.   {
  109.     for (i=0; i<FRAME_TYPES; i++)
  110.     {
  111.       free (initialized [k][i]);
  112.       free (model_number[k][i]);
  113.     }
  114.     free (initialized [k]);
  115.     free (model_number[k]);
  116.   }
  117.   free (initialized);
  118.   free (model_number);
  119. }
  120. #define BIARI_CTX_INIT2(ii,jj,ctx,tab,num) 
  121.   if ((img->type==I_SLICE)||(img->type==SI_SLICE))  
  122.   for (i=0; i<ii; i++) 
  123.   for (j=0; j<jj; j++) 
  124.   { 
  125.     biari_init_context (&(ctx[i][j]), &(tab ## _I[num][i][j][0])); 
  126.   } 
  127.   else 
  128.   for (i=0; i<ii; i++) 
  129.   for (j=0; j<jj; j++) 
  130.   { 
  131.     biari_init_context (&(ctx[i][j]), &(tab ## _P[num][i][j][0])); 
  132.   } 
  133. }
  134. #define BIARI_CTX_INIT1(jj,ctx,tab,num) 
  135.   if ((img->type==I_SLICE)||(img->type==SI_SLICE))  
  136.   for (j=0; j<jj; j++) 
  137.   { 
  138.     biari_init_context (&(ctx[j]), &(tab ## _I[num][0][j][0])); 
  139.   } 
  140.   else 
  141.   for (j=0; j<jj; j++) 
  142.   { 
  143.     biari_init_context (&(ctx[j]), &(tab ## _P[num][0][j][0])); 
  144.   } 
  145. }
  146. void SetCtxModelNumber (void)
  147. {
  148.   int frame_field = img->field_picture;
  149.   int img_type    = img->type;
  150.   int ctx_number  = img->currentSlice->start_mb_nr / num_mb_per_slice;
  151.   if(img->type==I_SLICE)
  152.   {
  153.     img->model_number=DEFAULT_CTX_MODEL;
  154.     return;
  155.   }
  156.   if(params->context_init_method==FIXED)
  157.   {
  158.     img->model_number=params->model_number;
  159.     return;
  160.   }
  161.   if (initialized [frame_field][img_type][ctx_number])
  162.   {
  163.     img->model_number = model_number[frame_field][img_type][ctx_number];
  164.   }
  165.   else if (ctx_number && initialized[frame_field][img_type][ctx_number-1])
  166.   {
  167.     img->model_number = model_number[frame_field][img_type][ctx_number-1];
  168.   }
  169.   else
  170.   {
  171.     img->model_number = DEFAULT_CTX_MODEL;
  172.   }
  173. }
  174. void init_contexts (void)
  175. {
  176.   MotionInfoContexts*  mc = img->currentSlice->mot_ctx;
  177.   TextureInfoContexts* tc = img->currentSlice->tex_ctx;
  178.   int i, j;
  179.   //--- motion coding contexts ---
  180.   BIARI_CTX_INIT2 (3, NUM_MB_TYPE_CTX,   mc->mb_type_contexts,     INIT_MB_TYPE,    img->model_number);
  181.   BIARI_CTX_INIT2 (2, NUM_B8_TYPE_CTX,   mc->b8_type_contexts,     INIT_B8_TYPE,    img->model_number);
  182.   BIARI_CTX_INIT2 (2, NUM_MV_RES_CTX,    mc->mv_res_contexts,      INIT_MV_RES,     img->model_number);
  183.   BIARI_CTX_INIT2 (2, NUM_REF_NO_CTX,    mc->ref_no_contexts,      INIT_REF_NO,     img->model_number);
  184.   BIARI_CTX_INIT1 (   NUM_DELTA_QP_CTX,  mc->delta_qp_contexts,    INIT_DELTA_QP,   img->model_number);
  185.   BIARI_CTX_INIT1 (   NUM_MB_AFF_CTX,    mc->mb_aff_contexts,      INIT_MB_AFF,     img->model_number);
  186.   BIARI_CTX_INIT1 (   NUM_TRANSFORM_SIZE_CTX,  mc->transform_size_contexts,    INIT_TRANSFORM_SIZE,   img->model_number);
  187.   //--- texture coding contexts ---
  188.   BIARI_CTX_INIT1 (                 NUM_IPR_CTX,  tc->ipr_contexts,     INIT_IPR,       img->model_number);
  189.   BIARI_CTX_INIT1 (                 NUM_CIPR_CTX, tc->cipr_contexts,    INIT_CIPR,      img->model_number);
  190.   BIARI_CTX_INIT2 (3,               NUM_CBP_CTX,  tc->cbp_contexts,     INIT_CBP,       img->model_number);
  191.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_BCBP_CTX, tc->bcbp_contexts,    INIT_BCBP,      img->model_number);
  192.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_MAP_CTX,  tc->map_contexts[0],  INIT_MAP,       img->model_number);
  193.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts[0], INIT_LAST,      img->model_number);  
  194. #if ENABLE_FIELD_CTX
  195.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_MAP_CTX,  tc->map_contexts[1],  INIT_FLD_MAP,   img->model_number);
  196.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_LAST_CTX, tc->last_contexts[1], INIT_FLD_LAST,  img->model_number);
  197. #endif
  198.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_ONE_CTX,  tc->one_contexts,     INIT_ONE,       img->model_number);
  199.   BIARI_CTX_INIT2 (NUM_BLOCK_TYPES, NUM_ABS_CTX,  tc->abs_contexts,     INIT_ABS,       img->model_number);
  200. }
  201. double XRate (BiContextTypePtr ctx, const int* model)
  202. {
  203.   int     ctx_state, mod_state;
  204.   double  weight, xr = 0.0;
  205.   int     qp = imax(0, img->qp);
  206.   weight    = dmin (1.0, (double)ctx->count/(double)RELIABLE_COUNT);
  207.   mod_state = ((model[0]*qp)>>4)+model[1];
  208.   mod_state = iClip3(0, 127, mod_state);
  209.   ctx_state = (ctx->MPS ? 64+ctx->state : 63-ctx->state);
  210.   xr -= weight * probability[    ctx_state] * entropy[    mod_state];
  211.   xr -= weight * probability[127-ctx_state] * entropy[127-mod_state];
  212.   return xr;
  213. }
  214. #define ADD_XRATE2(ii,jj,ctx,tab,num) 
  215.   if      (img->type==I_SLICE)  
  216.   for (i=0; i<ii; i++) 
  217.   for (j=0; j<jj; j++) 
  218.   { 
  219.     xr += XRate (&(ctx[i][j]), &(tab ## _I[num][i][j][0])); 
  220.   } 
  221.   else 
  222.   for (i=0; i<ii; i++) 
  223.   for (j=0; j<jj; j++) 
  224.   { 
  225.     xr += XRate (&(ctx[i][j]), &(tab ## _P[num][i][j][0])); 
  226.   } 
  227. }
  228. #define ADD_XRATE1(jj,ctx,tab,num) 
  229.   if      (img->type==I_SLICE)  
  230.   for (j=0; j<jj; j++) 
  231.   { 
  232.     xr += XRate (&(ctx[j]), &(tab ## _I[num][0][j][0])); 
  233.   } 
  234.   else 
  235.   for (j=0; j<jj; j++) 
  236.   { 
  237.     xr += XRate (&(ctx[j]), &(tab ## _P[num][0][j][0])); 
  238.   } 
  239. }
  240. void GetCtxModelNumber (int* mnumber, MotionInfoContexts* mc, TextureInfoContexts* tc)
  241. {
  242.   int     model, j, i;
  243.   int     num_models = (img->type==I_SLICE ? NUM_CTX_MODELS_I : NUM_CTX_MODELS_P);
  244.   double  xr, min_xr = 1e30;
  245.   for (model=0; model<num_models; model++)
  246.   {
  247.     xr = 0.0;
  248.     //--- motion coding contexts ---
  249.     ADD_XRATE2 (3, NUM_MB_TYPE_CTX,   mc->mb_type_contexts,     INIT_MB_TYPE,   model);
  250.     ADD_XRATE2 (2, NUM_B8_TYPE_CTX,   mc->b8_type_contexts,     INIT_B8_TYPE,   model);
  251.     ADD_XRATE2 (2, NUM_MV_RES_CTX,    mc->mv_res_contexts,      INIT_MV_RES,    model);
  252.     ADD_XRATE2 (2, NUM_REF_NO_CTX,    mc->ref_no_contexts,      INIT_REF_NO,    model);
  253.     ADD_XRATE1 (   NUM_DELTA_QP_CTX,  mc->delta_qp_contexts,    INIT_DELTA_QP,  model);
  254.     ADD_XRATE1 (   NUM_MB_AFF_CTX,    mc->mb_aff_contexts,      INIT_MB_AFF,    model);
  255.     ADD_XRATE1 (   NUM_TRANSFORM_SIZE_CTX,  mc->transform_size_contexts, INIT_TRANSFORM_SIZE,  model);
  256.     //--- texture coding contexts ---
  257.     ADD_XRATE1 (                  NUM_IPR_CTX,  tc->ipr_contexts,       INIT_IPR,       model);
  258.     ADD_XRATE1 (                  NUM_CIPR_CTX, tc->cipr_contexts,      INIT_CIPR,      model);
  259.     ADD_XRATE2 (3,                NUM_CBP_CTX,  tc->cbp_contexts,       INIT_CBP,       model);
  260.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_BCBP_CTX, tc->bcbp_contexts,      INIT_BCBP,      model);
  261.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_MAP_CTX,  tc->map_contexts[0],    INIT_MAP,       model);
  262.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_LAST_CTX, tc->last_contexts[0],   INIT_LAST,      model);
  263. #if ENABLE_FIELD_CTX
  264.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_MAP_CTX,  tc->map_contexts[1],    INIT_FLD_MAP,   model);
  265.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_LAST_CTX, tc->last_contexts[1],   INIT_FLD_LAST,  model);
  266. #endif
  267.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_ONE_CTX,  tc->one_contexts,       INIT_ONE,       model);
  268.     ADD_XRATE2 (NUM_BLOCK_TYPES,  NUM_ABS_CTX,  tc->abs_contexts,       INIT_ABS,       model);
  269.     if (xr<min_xr)
  270.     {
  271.       min_xr    = xr;
  272.       *mnumber  = model;
  273.     }
  274.   }
  275. }
  276. #undef ADD_XRATE2
  277. #undef ADD_XRATE1
  278. void store_contexts (void)
  279. {
  280.   int frame_field = img->field_picture;
  281.   int img_type    = img->type;
  282.   int ctx_number  = img->currentSlice->start_mb_nr / num_mb_per_slice;
  283.   if( params->context_init_method )
  284.   {
  285.     initialized [frame_field][img_type][ctx_number] = 1;
  286.     GetCtxModelNumber (model_number[frame_field][img_type]+ctx_number, img->currentSlice->mot_ctx, img->currentSlice->tex_ctx);
  287.   }
  288.   else
  289.   {
  290.     // do nothing
  291.   }
  292. }
  293. void update_field_frame_contexts (int field)
  294. {
  295.   int i, j;
  296.   if (field)
  297.   {
  298.     // set frame contexts
  299.     for (j=0; j<FRAME_TYPES; j++)
  300.     {
  301.       for (i=0; i<number_of_slices; i++)
  302.       {
  303.         initialized [0][j][i] = initialized [1][j][i>>1];
  304.         model_number[0][j][i] = model_number[1][j][i>>1];
  305.       }
  306.     }
  307.   }
  308.   else
  309.   {
  310.     // set field contexts
  311.     for (j=0; j<FRAME_TYPES; j++)
  312.     {
  313.       for (i=0; i<((number_of_slices+1)>>1); i++)
  314.       {
  315.         initialized [1][j][i] = initialized [0][j][i<<1];
  316.         model_number[1][j][i] = model_number[0][j][i<<1];
  317.       }
  318.     }
  319.   }
  320. }