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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file cabac.c
  4.  *
  5.  * brief
  6.  *    CABAC entropy coding routines
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Detlev Marpe                    <marpe@hhi.de>
  11.  **************************************************************************************
  12.  */
  13. #include "global.h"
  14. #include "cabac.h"
  15. #include "image.h"
  16. #include "mb_access.h"
  17. #if TRACE
  18.   #define CABAC_TRACE if (dp->bitstream->trace_enabled) trace2out_cabac (se)
  19. #else
  20.   #define CABAC_TRACE
  21. #endif
  22. /***********************************************************************
  23.  * L O C A L L Y   D E F I N E D   F U N C T I O N   P R O T O T Y P E S
  24.  ***********************************************************************
  25.  */
  26. void unary_bin_encode(EncodingEnvironmentPtr eep_frame,
  27.                       unsigned int symbol,
  28.                       BiContextTypePtr ctx,
  29.                       int ctx_offset);
  30. void unary_bin_max_encode(EncodingEnvironmentPtr eep_frame,
  31.                           unsigned int symbol,
  32.                           BiContextTypePtr ctx,
  33.                           int ctx_offset,
  34.                           unsigned int max_symbol);
  35. void unary_exp_golomb_level_encode( EncodingEnvironmentPtr eep_dp,
  36.                                     unsigned int symbol,
  37.                                     BiContextTypePtr ctx);
  38. void unary_exp_golomb_mv_encode(EncodingEnvironmentPtr eep_dp,
  39.                                 unsigned int symbol,
  40.                                 BiContextTypePtr ctx,
  41.                                 unsigned int max_bin);
  42. /*!
  43.  ************************************************************************
  44.  * brief
  45.  *    Check for available neighbouring blocks
  46.  *    and set pointers in current macroblock
  47.  ************************************************************************
  48.  */
  49. void CheckAvailabilityOfNeighborsCABAC(Macroblock *currMB)
  50. {
  51.   PixelPos up, left;
  52.   int *mb_size = img->mb_size[IS_LUMA];
  53.   getNeighbour(currMB, -1,  0, mb_size, &left);
  54.   getNeighbour(currMB,  0, -1, mb_size, &up);
  55.   if (up.available)
  56.     currMB->mb_available_up = &img->mb_data[up.mb_addr];
  57.   else
  58.     currMB->mb_available_up = NULL;
  59.   if (left.available)
  60.     currMB->mb_available_left = &img->mb_data[left.mb_addr];
  61.   else
  62.     currMB->mb_available_left = NULL;
  63. }
  64. /*!
  65.  ************************************************************************
  66.  * brief
  67.  *    Allocation of contexts models for the motion info
  68.  *    used for arithmetic encoding
  69.  ************************************************************************
  70.  */
  71. MotionInfoContexts* create_contexts_MotionInfo(void)
  72. {
  73.   MotionInfoContexts* enco_ctx;
  74.   enco_ctx = (MotionInfoContexts*) calloc(1, sizeof(MotionInfoContexts) );
  75.   if( enco_ctx == NULL )
  76.     no_mem_exit("create_contexts_MotionInfo: enco_ctx");
  77.   return enco_ctx;
  78. }
  79. /*!
  80.  ************************************************************************
  81.  * brief
  82.  *    Allocates of contexts models for the texture info
  83.  *    used for arithmetic encoding
  84.  ************************************************************************
  85.  */
  86. TextureInfoContexts* create_contexts_TextureInfo(void)
  87. {
  88.   TextureInfoContexts*  enco_ctx = (TextureInfoContexts*) calloc(1, sizeof(TextureInfoContexts) );
  89.   if( enco_ctx == NULL )
  90.     no_mem_exit("create_contexts_TextureInfo: enco_ctx");
  91.   return enco_ctx;
  92. }
  93. /*!
  94.  ************************************************************************
  95.  * brief
  96.  *    Frees the memory of the contexts models
  97.  *    used for arithmetic encoding of the motion info.
  98.  ************************************************************************
  99.  */
  100. void delete_contexts_MotionInfo(MotionInfoContexts *enco_ctx)
  101. {
  102.   if( enco_ctx == NULL )
  103.     return;
  104.   free( enco_ctx );
  105. }
  106. /*!
  107.  ************************************************************************
  108.  * brief
  109.  *    Frees the memory of the contexts models
  110.  *    used for arithmetic encoding of the texture info.
  111.  ************************************************************************
  112.  */
  113. void delete_contexts_TextureInfo(TextureInfoContexts *enco_ctx)
  114. {
  115.   if( enco_ctx == NULL )
  116.     return;
  117.   free( enco_ctx );
  118. }
  119. /*!
  120.  ***************************************************************************
  121.  * brief
  122.  *    This function is used to arithmetically encode the field
  123.  *    mode info of a given MB  in the case of mb-based frame/field decision
  124.  ***************************************************************************
  125.  */
  126. void writeFieldModeInfo_CABAC(SyntaxElement *se, DataPartition *dp)
  127. {
  128.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  129.   int curr_len = arienco_bits_written(eep_dp);
  130.   MotionInfoContexts *ctx     = (img->currentSlice)->mot_ctx;
  131.   Macroblock         *currMB  = &img->mb_data[img->current_mb_nr];
  132.   int                mb_field = se->value1;
  133.   int a = currMB->mbAvailA ? img->mb_data[currMB->mbAddrA].mb_field : 0;
  134.   int b = currMB->mbAvailB ? img->mb_data[currMB->mbAddrB].mb_field : 0;
  135.   int act_ctx = a + b;
  136.   biari_encode_symbol(eep_dp, (signed short) (mb_field != 0),&ctx->mb_aff_contexts[act_ctx]);
  137.   se->context = act_ctx;
  138.   dp->bitstream->write_flag = 1;
  139.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  140.   CABAC_TRACE;
  141. }
  142. /*!
  143. ***************************************************************************
  144. * brief
  145. *    This function is used to arithmetically encode the mb_skip_flag.
  146. ***************************************************************************
  147. */
  148. void writeMB_skip_flagInfo_CABAC(Macroblock *currMB, SyntaxElement *se, DataPartition *dp)
  149. {
  150.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  151.   int curr_len = arienco_bits_written(eep_dp);
  152.   MotionInfoContexts *ctx = (img->currentSlice)->mot_ctx;
  153.   int        curr_mb_type = se->value1;
  154.   int a = (currMB->mb_available_left != NULL && (currMB->mb_available_left->skip_flag == 0)) ? 1 : 0;
  155.   int b = (currMB->mb_available_up   != NULL && (currMB->mb_available_up  ->skip_flag == 0)) ? 1 : 0;
  156.   int act_ctx = a + b;
  157.   if (img->type == B_SLICE)
  158.   {
  159.     act_ctx += 7;
  160.     if (se->value1==0 && se->value2==0) // DIRECT mode, no coefficients
  161.       biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][act_ctx]);
  162.     else
  163.       biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[2][act_ctx]);
  164.     currMB->skip_flag = (se->value1==0 && se->value2==0) ? 1 : 0;
  165.   }
  166.   else
  167.   {
  168.     if (curr_mb_type==0) // SKIP
  169.       biari_encode_symbol(eep_dp, 1,&ctx->mb_type_contexts[1][act_ctx]);
  170.     else
  171.       biari_encode_symbol(eep_dp, 0,&ctx->mb_type_contexts[1][act_ctx]);
  172.     currMB->skip_flag = (curr_mb_type==0) ? 1 : 0;
  173.   }
  174.   se->context = act_ctx;
  175.   se->value1  = 1 - currMB->skip_flag;
  176.   dp->bitstream->write_flag = 1;
  177.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  178.   CABAC_TRACE;
  179. }
  180. /*!
  181. ***************************************************************************
  182. * brief
  183. *    This function is used to arithmetically encode the macroblock
  184. *    intra_pred_size flag info of a given MB.
  185. ***************************************************************************
  186. */
  187. void writeMB_transform_size_CABAC(SyntaxElement *se, DataPartition *dp)
  188. {
  189.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  190.   MotionInfoContexts *ctx         = (img->currentSlice)->mot_ctx;
  191.   Macroblock         *currMB      = &img->mb_data[img->current_mb_nr];
  192.   int curr_len = arienco_bits_written(eep_dp);
  193.   int act_sym = currMB->luma_transform_size_8x8_flag;
  194.   int b = (currMB->mb_available_up == NULL) ? 0 : currMB->mb_available_up->luma_transform_size_8x8_flag;
  195.   int a = (currMB->mb_available_left == NULL) ? 0 :currMB->mb_available_left->luma_transform_size_8x8_flag;
  196.   int act_ctx     = a + b;
  197.   se->context = act_ctx; // store context
  198.   biari_encode_symbol(eep_dp, (signed short) (act_sym != 0), ctx->transform_size_contexts + act_ctx );
  199.   dp->bitstream->write_flag = 1;
  200.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  201.   CABAC_TRACE;
  202. }
  203. /*!
  204.  ***************************************************************************
  205.  * brief
  206.  *    This function is used to arithmetically encode the macroblock
  207.  *    type info of a given MB.
  208.  ***************************************************************************
  209.  */
  210. void writeMB_typeInfo_CABAC(SyntaxElement *se, DataPartition *dp)
  211. {
  212.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  213.   int curr_len = arienco_bits_written(eep_dp);
  214.   int a, b;
  215.   int act_ctx = 0;
  216.   int act_sym;
  217.   signed short csym;
  218.   int bframe   = (img->type==B_SLICE);
  219.   int mode_sym = 0;
  220.   int mode16x16;
  221.   MotionInfoContexts *ctx         = (img->currentSlice)->mot_ctx;
  222.   Macroblock         *currMB      = &img->mb_data[img->current_mb_nr];
  223.   int                curr_mb_type = se->value1;
  224.   if(img->type == I_SLICE)  // INTRA-frame
  225.   {
  226.     if (currMB->mb_available_up == NULL)
  227.       b = 0;
  228.     else
  229.       b = ((currMB->mb_available_up->mb_type != I4MB &&  currMB->mb_available_up->mb_type != I8MB) ? 1 : 0 );
  230.     if (currMB->mb_available_left == NULL)
  231.       a = 0;
  232.     else
  233.       a = ((currMB->mb_available_left->mb_type != I4MB &&  currMB->mb_available_left->mb_type != I8MB) ? 1 : 0 );
  234.     act_ctx     = a + b;
  235.     act_sym     = curr_mb_type;
  236.     se->context = act_ctx; // store context
  237.     if (act_sym==0) // 4x4 Intra
  238.     {
  239.       biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[0] + act_ctx );
  240.     }
  241.     else if( act_sym == 25 ) // PCM-MODE
  242.     {
  243.       biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[0] + act_ctx );
  244.       biari_encode_symbol_final(eep_dp, 1);
  245.     }
  246.     else // 16x16 Intra
  247.     {
  248.       biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[0] + act_ctx );
  249.       biari_encode_symbol_final(eep_dp, 0);
  250.       mode_sym = act_sym-1; // Values in the range of 0...23
  251.       act_ctx  = 4;
  252.       act_sym  = mode_sym/12;
  253.       biari_encode_symbol(eep_dp, (signed short) act_sym, ctx->mb_type_contexts[0] + act_ctx ); // coding of AC/no AC
  254.       mode_sym = mode_sym % 12;
  255.       act_sym  = mode_sym / 4; // coding of cbp: 0,1,2
  256.       act_ctx  = 5;
  257.       if (act_sym==0)
  258.       {
  259.         biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[0] + act_ctx );
  260.       }
  261.       else
  262.       {
  263.         biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[0] + act_ctx );
  264.         act_ctx=6;
  265.         biari_encode_symbol(eep_dp, (signed short) (act_sym!=1), ctx->mb_type_contexts[0] + act_ctx );
  266.       }
  267.       mode_sym = mode_sym & 0x03; // coding of I pred-mode: 0,1,2,3
  268.       act_sym  = mode_sym >> 1;
  269.       act_ctx  = 7;
  270.       biari_encode_symbol(eep_dp, (signed short) act_sym, ctx->mb_type_contexts[0] + act_ctx );
  271.       act_ctx  = 8;
  272.       act_sym  = mode_sym & 0x01;
  273.       biari_encode_symbol(eep_dp, (signed short) act_sym, ctx->mb_type_contexts[0] + act_ctx );
  274.     }
  275.   }
  276.   else // INTER
  277.   {
  278.     if (bframe)
  279.     {
  280.       if (currMB->mb_available_up == NULL)
  281.         b = 0;
  282.       else
  283.         b = ((currMB->mb_available_up->mb_type != 0) ? 1 : 0 );
  284.       if (currMB->mb_available_left == NULL)
  285.         a = 0;
  286.       else
  287.         a = ((currMB->mb_available_left->mb_type != 0) ? 1 : 0 );
  288.       act_ctx = a + b;
  289.       se->context = act_ctx; // store context
  290.     }
  291.     act_sym = curr_mb_type;
  292.     if (act_sym>=(mode16x16=(bframe?24:7)))
  293.     {
  294.       mode_sym = act_sym-mode16x16;
  295.       act_sym  = mode16x16; // 16x16 mode info
  296.     }
  297.     if (!bframe)
  298.     {
  299.       switch (act_sym)
  300.       {
  301.       case 0:
  302.         break;
  303.       case 1:
  304.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][4]);
  305.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][5]);
  306.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][6]);
  307.         break;
  308.       case 2:
  309.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][4]);
  310.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][5]);
  311.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][7]);
  312.         break;
  313.       case 3:
  314.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][4]);
  315.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][5]);
  316.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][7]);
  317.         break;
  318.       case 4:
  319.       case 5:
  320.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][4]);
  321.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][5]);
  322.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][6]);
  323.         break;
  324.       case 6:
  325.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][4]);
  326.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[1][7]);
  327.         break;
  328.       case 7:
  329.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][4]);
  330.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[1][7]);
  331.         break;
  332.       default:
  333.         printf ("Unsupported MB-MODE in writeMB_typeInfo_CABAC!n");
  334.         exit (1);
  335.       }
  336.     }
  337.     else //===== B-FRAMES =====
  338.     {
  339.       if (act_sym==0)
  340.       {
  341.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[2][act_ctx]);
  342.       }
  343.       else if (act_sym<=2)
  344.       {
  345.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][act_ctx]);
  346.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[2][4]);
  347.         csym = (act_sym-1 != 0);
  348.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  349.       }
  350.       else if (act_sym<=10)
  351.       {
  352.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][act_ctx]);
  353.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][4]);
  354.         biari_encode_symbol (eep_dp, 0, &ctx->mb_type_contexts[2][5]);
  355.         csym=(((act_sym-3)>>2)&0x01) != 0;
  356.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  357.         csym=(((act_sym-3)>>1)&0x01) != 0;
  358.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  359.         csym=((act_sym-3)&0x01) != 0;
  360.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  361.       }
  362.       else if (act_sym==11 || act_sym==22)
  363.       {
  364.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][act_ctx]);
  365.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][4]);
  366.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][5]);
  367.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][6]);
  368.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][6]);
  369.         csym = (act_sym != 11);
  370.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  371.       }
  372.       else
  373.       {
  374.         if (act_sym > 22) act_sym--;
  375.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][act_ctx]);
  376.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][4]);
  377.         biari_encode_symbol (eep_dp, 1, &ctx->mb_type_contexts[2][5]);
  378.         csym=(((act_sym-12)>>3)&0x01) != 0;
  379.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  380.         csym=(((act_sym-12)>>2)&0x01) != 0;
  381.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  382.         csym=(((act_sym-12)>>1)&0x01) != 0;
  383.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  384.         csym=((act_sym-12)&0x01) != 0;
  385.         biari_encode_symbol (eep_dp, csym, &ctx->mb_type_contexts[2][6]);
  386.         if (act_sym >=22) act_sym++;
  387.       }
  388.     }
  389.     if(act_sym==mode16x16) // additional info for 16x16 Intra-mode
  390.     {
  391.       if( mode_sym==24 )
  392.       {
  393.         biari_encode_symbol_final(eep_dp, 1 );
  394.         dp->bitstream->write_flag = 1;
  395.         se->len = (arienco_bits_written(eep_dp) - curr_len);
  396.         CABAC_TRACE;
  397.         return;
  398.       }
  399.       biari_encode_symbol_final(eep_dp, 0 );
  400.       act_ctx = 8;
  401.       act_sym = mode_sym/12;
  402.       biari_encode_symbol(eep_dp, (signed short) act_sym, ctx->mb_type_contexts[1] + act_ctx ); // coding of AC/no AC
  403.       mode_sym = mode_sym % 12;
  404.       act_sym = mode_sym / 4; // coding of cbp: 0,1,2
  405.       act_ctx = 9;
  406.       if (act_sym==0)
  407.       {
  408.         biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[1] + act_ctx );
  409.       }
  410.       else
  411.       {
  412.         biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[1] + act_ctx );
  413.         biari_encode_symbol(eep_dp, (signed short) (act_sym!=1), ctx->mb_type_contexts[1] + act_ctx );
  414.       }
  415.       mode_sym = mode_sym % 4; // coding of I pred-mode: 0,1,2,3
  416.       act_ctx  = 10;
  417.       act_sym  = mode_sym/2;
  418.       biari_encode_symbol(eep_dp, (signed short) act_sym, ctx->mb_type_contexts[1] + act_ctx );
  419.       act_sym  = mode_sym%2;
  420.       biari_encode_symbol(eep_dp, (signed short) act_sym, ctx->mb_type_contexts[1] + act_ctx );
  421.     }
  422.   }
  423.   dp->bitstream->write_flag = 1;
  424.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  425.   CABAC_TRACE;
  426. }
  427. /*!
  428.  ***************************************************************************
  429.  * brief
  430.  *    This function is used to arithmetically encode the 8x8 block
  431.  *    type info
  432.  ***************************************************************************
  433.  */
  434. void writeB8_typeInfo_CABAC(SyntaxElement *se, DataPartition *dp)
  435. {
  436.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  437.   int curr_len = arienco_bits_written(eep_dp);
  438.   int act_ctx;
  439.   int act_sym;
  440.   signed short csym;
  441.   int bframe=(img->type==B_SLICE);
  442.   BiContextType (*b8_type_contexts)[9] = (img->currentSlice)->mot_ctx->b8_type_contexts;
  443.   act_sym = se->value1;
  444.   act_ctx = 0;
  445.   if (!bframe)
  446.   {
  447.     switch (act_sym)
  448.     {
  449.     case 0:
  450.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[0][1]);
  451.       break;
  452.     case 1:
  453.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[0][1]);
  454.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[0][3]);
  455.       break;
  456.     case 2:
  457.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[0][1]);
  458.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[0][3]);
  459.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[0][4]);
  460.       break;
  461.     case 3:
  462.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[0][1]);
  463.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[0][3]);
  464.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[0][4]);
  465.       break;
  466.     }
  467.   }
  468.   else //===== B-FRAME =====
  469.   {
  470.     if (act_sym==0)
  471.     {
  472.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[1][0]);
  473.       dp->bitstream->write_flag = 1;
  474.       se->len = (arienco_bits_written(eep_dp) - curr_len);
  475.       CABAC_TRACE;
  476.       return;
  477.     }
  478.     else
  479.     {
  480.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[1][0]);
  481.       act_sym--;
  482.     }
  483.     if (act_sym < 2)
  484.     {
  485.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[1][1]);
  486.       biari_encode_symbol (eep_dp, (signed short) (act_sym!=0), &b8_type_contexts[1][3]);
  487.     }
  488.     else if (act_sym < 6)
  489.     {
  490.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[1][1]);
  491.       biari_encode_symbol (eep_dp, 0, &b8_type_contexts[1][2]);
  492.       csym=(((act_sym - 2) >> 1) & 0x01) != 0;
  493.       biari_encode_symbol (eep_dp, csym, &b8_type_contexts[1][3]);
  494.       csym=((act_sym - 2) & 0x01) != 0;
  495.       biari_encode_symbol (eep_dp, csym, &b8_type_contexts[1][3]);
  496.     }
  497.     else
  498.     {
  499.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[1][1]);
  500.       biari_encode_symbol (eep_dp, 1, &b8_type_contexts[1][2]);
  501.       csym=(((act_sym - 6)>> 2) & 0x01);
  502.       if (csym)
  503.       {
  504.         biari_encode_symbol (eep_dp, 1, &b8_type_contexts[1][3]);
  505.         csym=((act_sym - 6) & 0x01) != 0;
  506.         biari_encode_symbol (eep_dp, csym, &b8_type_contexts[1][3]);
  507.       }
  508.       else
  509.       {
  510.         biari_encode_symbol (eep_dp, 0, &b8_type_contexts[1][3]);
  511.         csym=(((act_sym - 6) >> 1) & 0x01) != 0;
  512.         biari_encode_symbol (eep_dp, csym, &b8_type_contexts[1][3]);
  513.         csym=((act_sym - 6) & 0x01) != 0;
  514.         biari_encode_symbol (eep_dp, csym, &b8_type_contexts[1][3]);
  515.       }
  516.     }
  517.   }
  518.   dp->bitstream->write_flag = 1;
  519.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  520.   CABAC_TRACE;
  521. }
  522. /*!
  523.  ****************************************************************************
  524.  * brief
  525.  *    This function is used to arithmetically encode a pair of
  526.  *    intra prediction modes of a given MB.
  527.  ****************************************************************************
  528.  */
  529. void writeIntraPredMode_CABAC(SyntaxElement *se, DataPartition *dp)
  530. {
  531.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  532.   int curr_len = arienco_bits_written(eep_dp);
  533.   BiContextType *ipr_contexts = (img->currentSlice)->tex_ctx->ipr_contexts;
  534.   // use_most_probable_mode
  535.   if (se->value1 == -1)
  536.     biari_encode_symbol(eep_dp, 1, ipr_contexts);
  537.   else
  538.   {
  539.     biari_encode_symbol(eep_dp, 0, ipr_contexts);
  540.     // remaining_mode_selector
  541.     biari_encode_symbol(eep_dp,(signed short)( se->value1 & 0x1    ), ipr_contexts+1);
  542.     biari_encode_symbol(eep_dp,(signed short)((se->value1 & 0x2)>>1), ipr_contexts+1);
  543.     biari_encode_symbol(eep_dp,(signed short)((se->value1 & 0x4)>>2), ipr_contexts+1);
  544.   }
  545.   dp->bitstream->write_flag = 1;
  546.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  547.   CABAC_TRACE;
  548. }
  549. /*!
  550.  ****************************************************************************
  551.  * brief
  552.  *    This function is used to arithmetically encode the reference
  553.  *    parameter of a given MB.
  554.  ****************************************************************************
  555.  */
  556. void writeRefFrame_CABAC(SyntaxElement *se, DataPartition *dp)
  557. {
  558.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  559.   int curr_len = arienco_bits_written(eep_dp);
  560.   int   mb_nr = img->current_mb_nr;
  561.   MotionInfoContexts  *ctx    = img->currentSlice->mot_ctx;
  562.   Macroblock          *currMB = &img->mb_data[mb_nr];
  563.   int                 addctx  = 0;
  564.   int   a, b;
  565.   int   act_ctx;
  566.   int   act_sym;
  567.   char** refframe_array = enc_picture->motion.ref_idx[se->value2];
  568.   int bslice = (img->type==B_SLICE);
  569.   int   b8a, b8b;
  570.   PixelPos block_a, block_b;
  571.   int *mb_size = img->mb_size[IS_LUMA];
  572.   get4x4Neighbour(currMB, (img->subblock_x << 2) - 1, (img->subblock_y << 2)    , mb_size, &block_a);
  573.   get4x4Neighbour(currMB, (img->subblock_x << 2),     (img->subblock_y << 2) - 1, mb_size, &block_b);
  574.   b8a=((block_a.x >> 1) & 0x01)+2*((block_a.y >> 1) & 0x01);
  575.   b8b=((block_b.x >> 1) & 0x01)+2*((block_b.y >> 1) & 0x01);
  576.   if (!block_b.available)
  577.     b=0;
  578.   //else if (IS_DIRECT(&img->mb_data[block_b.mb_addr]) || (img->mb_data[block_b.mb_addr].b8mode[b8b]==0 && bslice))
  579.   else if ((IS_DIRECT(&img->mb_data[block_b.mb_addr]) && !giRDOpt_B8OnlyFlag) || (img->mb_data[block_b.mb_addr].b8mode[b8b]==0 && bslice))
  580.     b=0;
  581.   else
  582.   {
  583.     if (img->MbaffFrameFlag && (currMB->mb_field == 0) && (img->mb_data[block_b.mb_addr].mb_field == 1))
  584.       b = (refframe_array[block_b.pos_y][block_b.pos_x] > 1 ? 1 : 0);
  585.     else
  586.       b = (refframe_array[block_b.pos_y][block_b.pos_x] > 0 ? 1 : 0);
  587.   }
  588.   if (!block_a.available)
  589.     a=0;
  590.   // else if (IS_DIRECT(&img->mb_data[block_a.mb_addr]) || (img->mb_data[block_a.mb_addr].b8mode[b8a]==0 && bslice))
  591.   else if ((IS_DIRECT(&img->mb_data[block_a.mb_addr]) && !giRDOpt_B8OnlyFlag) || (img->mb_data[block_a.mb_addr].b8mode[b8a]==0 && bslice))
  592.     a=0;
  593.   else
  594.   {
  595.     if (img->MbaffFrameFlag && (currMB->mb_field == 0) && (img->mb_data[block_a.mb_addr].mb_field == 1))
  596.       a = (refframe_array[block_a.pos_y][block_a.pos_x] > 1 ? 1 : 0);
  597.     else
  598.       a = (refframe_array[block_a.pos_y][block_a.pos_x] > 0 ? 1 : 0);
  599.   }
  600.   act_ctx     = a + 2*b;
  601.   se->context = act_ctx; // store context
  602.   act_sym     = se->value1;
  603.   if (act_sym==0)
  604.   {
  605.     biari_encode_symbol(eep_dp, 0, ctx->ref_no_contexts[addctx] + act_ctx );
  606.   }
  607.   else
  608.   {
  609.     biari_encode_symbol(eep_dp, 1, ctx->ref_no_contexts[addctx] + act_ctx);
  610.     act_sym--;
  611.     act_ctx=4;
  612.     unary_bin_encode(eep_dp, act_sym,ctx->ref_no_contexts[addctx] + act_ctx,1);
  613.   }
  614.   dp->bitstream->write_flag = 1;
  615.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  616.   CABAC_TRACE;
  617. }
  618. /*!
  619.  ****************************************************************************
  620.  * brief
  621.  *    This function is used to arithmetically encode the coded
  622.  *    block pattern of a given delta quant.
  623.  ****************************************************************************
  624.  */
  625. void writeDquant_CABAC(SyntaxElement *se, DataPartition *dp)
  626. {
  627.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  628.   int curr_len = arienco_bits_written(eep_dp);
  629.   MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  630.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  631.  
  632.   int dquant = se->value1;
  633.   int sign    = (dquant <= 0) ? 0 : -1;
  634.   int act_sym = (iabs(dquant) << 1) + sign;
  635.   int act_ctx = ((currMB->prev_dqp != 0) ? 1 : 0);
  636.   if (act_sym==0)
  637.   {
  638.     biari_encode_symbol(eep_dp, 0, ctx->delta_qp_contexts + act_ctx );
  639.   }
  640.   else
  641.   {
  642.     biari_encode_symbol(eep_dp, 1, ctx->delta_qp_contexts + act_ctx);
  643.     act_ctx=2;
  644.     act_sym--;
  645.     unary_bin_encode(eep_dp, act_sym,ctx->delta_qp_contexts+act_ctx,1);
  646.   }
  647.   dp->bitstream->write_flag = 1;
  648.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  649.   CABAC_TRACE;
  650. }
  651. /*!
  652.  ****************************************************************************
  653.  * brief
  654.  *    This function is used to arithmetically encode the motion
  655.  *    vector data of a B-frame MB.
  656.  ****************************************************************************
  657.  */
  658. void writeMVD_CABAC(SyntaxElement *se, DataPartition *dp)
  659. {
  660.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  661.   int curr_len = arienco_bits_written(eep_dp);
  662.   int i = (img->subblock_x << 2);
  663.   int j = (img->subblock_y << 2);
  664.   int a, b;
  665.   int act_ctx;
  666.   int act_sym;
  667.   int mv_pred_res;
  668.   int mv_local_err;
  669.   int mv_sign;
  670.   int list_idx = se->value2 & 0x01;
  671.   int k = (se->value2>>1); // MVD component
  672.   int mb_nr = img->current_mb_nr;
  673.   PixelPos block_a, block_b;
  674.   MotionInfoContexts  *ctx    = img->currentSlice->mot_ctx;
  675.   Macroblock          *currMB = &img->mb_data[mb_nr];
  676.   int *mb_size = img->mb_size[IS_LUMA];
  677.   get4x4Neighbour(currMB, i - 1, j    , mb_size, &block_a);
  678.   get4x4Neighbour(currMB, i    , j - 1, mb_size, &block_b);
  679.   if (block_b.available)
  680.   {
  681.     b = iabs(img->mb_data[block_b.mb_addr].mvd[list_idx][block_b.y][block_b.x][k]);
  682.     if (img->MbaffFrameFlag && (k==1))
  683.     {
  684.       if ((currMB->mb_field==0) && (img->mb_data[block_b.mb_addr].mb_field==1))
  685.         b *= 2;
  686.       else if ((currMB->mb_field==1) && (img->mb_data[block_b.mb_addr].mb_field==0))
  687.         b /= 2;
  688.     }
  689.   }
  690.   else
  691.     b=0;
  692.   if (block_a.available)
  693.   {
  694.     a = iabs(img->mb_data[block_a.mb_addr].mvd[list_idx][block_a.y][block_a.x][k]);
  695.     if (img->MbaffFrameFlag && (k==1))
  696.     {
  697.       if ((currMB->mb_field==0) && (img->mb_data[block_a.mb_addr].mb_field==1))
  698.         a *= 2;
  699.       else if ((currMB->mb_field==1) && (img->mb_data[block_a.mb_addr].mb_field==0))
  700.         a /= 2;
  701.     }
  702.   }
  703.   else
  704.     a = 0;
  705.   if ((mv_local_err=a+b)<3)
  706.     act_ctx = 5*k;
  707.   else
  708.   {
  709.     if (mv_local_err>32)
  710.       act_ctx=5*k+3;
  711.     else
  712.       act_ctx=5*k+2;
  713.   }
  714.   mv_pred_res = se->value1;
  715.   se->context = act_ctx;
  716.   act_sym = iabs(mv_pred_res);
  717.   if (act_sym == 0)
  718.     biari_encode_symbol(eep_dp, 0, &ctx->mv_res_contexts[0][act_ctx] );
  719.   else
  720.   {
  721.     biari_encode_symbol(eep_dp, 1, &ctx->mv_res_contexts[0][act_ctx] );
  722.     act_sym--;
  723.     act_ctx=5*k;
  724.     unary_exp_golomb_mv_encode(eep_dp,act_sym,ctx->mv_res_contexts[1]+act_ctx,3);
  725.     mv_sign = (mv_pred_res<0) ? 1: 0;
  726.     biari_encode_symbol_eq_prob(eep_dp, (signed short) mv_sign);
  727.   }
  728.   dp->bitstream->write_flag = 1;
  729.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  730.   CABAC_TRACE;
  731. }
  732. /*!
  733.  ****************************************************************************
  734.  * brief
  735.  *    This function is used to arithmetically encode the chroma
  736.  *    intra prediction mode of an 8x8 block
  737.  ****************************************************************************
  738.  */
  739. void writeCIPredMode_CABAC(SyntaxElement *se, DataPartition *dp)
  740. {
  741.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  742.   int curr_len = arienco_bits_written(eep_dp);
  743.   TextureInfoContexts *ctx     = img->currentSlice->tex_ctx;
  744.   Macroblock          *currMB  = &img->mb_data[img->current_mb_nr];
  745.   int                 act_sym  = se->value1;
  746.   
  747.   Macroblock          *MbUp   = currMB->mb_available_up;
  748.   Macroblock          *MbLeft = currMB->mb_available_left;
  749.   int b = (MbUp   != NULL) ? (((MbUp->c_ipred_mode != 0) && (MbUp->mb_type != IPCM)) ? 1 : 0) : 0;
  750.   int a = (MbLeft != NULL) ? (((MbLeft->c_ipred_mode != 0) && (MbLeft->mb_type != IPCM)) ? 1 : 0) : 0;
  751.   int act_ctx = a + b;
  752.   if (act_sym==0)
  753.     biari_encode_symbol(eep_dp, 0, ctx->cipr_contexts + act_ctx );
  754.   else
  755.   {
  756.     biari_encode_symbol(eep_dp, 1, ctx->cipr_contexts + act_ctx );
  757.     unary_bin_max_encode(eep_dp,(unsigned int) (act_sym-1),ctx->cipr_contexts+3,0,2);
  758.   }
  759.   dp->bitstream->write_flag = 1;
  760.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  761.   CABAC_TRACE;
  762. }
  763. /*!
  764.  ****************************************************************************
  765.  * brief
  766.  *    This function is used to arithmetically encode the coded
  767.  *    block pattern of an 8x8 block
  768.  ****************************************************************************
  769.  */
  770. void writeCBP_BIT_CABAC (Macroblock* currMB, int b8, int bit, int cbp, int inter, EncodingEnvironmentPtr eep_dp, TextureInfoContexts *ctx)
  771. {
  772.   PixelPos block_a;
  773.   int a = 0, b = 0;
  774.   int mb_x=(b8 & 0x01)<<1;
  775.   int mb_y=(b8 >> 1)<<1;
  776.   if (mb_y == 0)
  777.   {
  778.     if (!((currMB->mb_available_up == NULL) || ((currMB->mb_available_up)->mb_type==IPCM)))
  779.     {
  780.       b = (( ((currMB->mb_available_up)->cbp & (1<<(2+(mb_x>>1)))) == 0) ? 1 : 0);   //VG-ADD
  781.     }
  782.   }
  783.   else
  784.     b = ( ((cbp & (1<<(mb_x >> 1))) == 0) ? 1: 0);
  785.   if (mb_x == 0)
  786.   {
  787.     get4x4Neighbour(currMB, (mb_x << 2) - 1, (mb_y << 2), img->mb_size[IS_LUMA], &block_a);
  788.     if (block_a.available && (!(img->mb_data[block_a.mb_addr].mb_type==IPCM)))
  789.     {
  790.       a = (( (img->mb_data[block_a.mb_addr].cbp & (1<<(2*(block_a.y>>1)+1))) == 0) ? 1 : 0); //VG-ADD
  791.     }    
  792.   }
  793.   else
  794.     a = ( ((cbp & (1<<mb_y)) == 0) ? 1: 0);
  795.   //===== WRITE BIT =====
  796.   biari_encode_symbol (eep_dp, (signed short) bit, ctx->cbp_contexts[0] + a+2*b);
  797. }
  798. /*!
  799. ****************************************************************************
  800. * brief
  801. *    This function is used to arithmetically encode the coded
  802. *    block pattern of a macroblock
  803. ****************************************************************************
  804. */
  805. void writeCBP_CABAC(Macroblock *currMB, SyntaxElement *se, DataPartition *dp)
  806. {
  807.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  808.   int curr_len = arienco_bits_written(eep_dp);
  809.   TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
  810.   int a0 = 0, a1 = 0, b0 = 0, b1 = 0;
  811.   int curr_cbp_ctx, curr_cbp_idx;
  812.   int cbp = se->value1; // symbol to encode
  813.   int cbp_bit;
  814.   int b8;
  815.   for (b8=0; b8<4; b8++)
  816.   {
  817.     curr_cbp_idx = (currMB->b8mode[b8] == IBLOCK ? 0 : 1);
  818.     writeCBP_BIT_CABAC (currMB, b8, cbp&(1<<b8), cbp, curr_cbp_idx, eep_dp, ctx);
  819.   }
  820.   if ((img->yuv_format != YUV400) && (img->yuv_format != YUV444) )
  821.   {
  822.     // coding of chroma part
  823.     if (currMB->mb_available_up != NULL)
  824.     {
  825.       if((currMB->mb_available_up)->mb_type == IPCM || ((currMB->mb_available_up)->cbp > 15))
  826.         b0 = 2;
  827.     }
  828.     if (currMB->mb_available_left != NULL)
  829.     {
  830.       if((currMB->mb_available_left)->mb_type==IPCM || ((currMB->mb_available_left)->cbp > 15))
  831.         a0 = 1;
  832.     }
  833.     curr_cbp_ctx = a0 + b0;
  834.     cbp_bit = (cbp > 15 ) ? 1 : 0;
  835.     biari_encode_symbol(eep_dp, (signed short) cbp_bit, ctx->cbp_contexts[1] + curr_cbp_ctx );
  836.     if (cbp > 15)
  837.     {
  838.       if (currMB->mb_available_up != NULL)
  839.       {
  840.         if((currMB->mb_available_up)->mb_type==IPCM || 
  841.           (((currMB->mb_available_up)->cbp > 15) && ( ((currMB->mb_available_up)->cbp >> 4) == 2)))
  842.           b1 = 2;
  843.       }
  844.       if (currMB->mb_available_left != NULL)
  845.       {
  846.         if((currMB->mb_available_left)->mb_type==IPCM || 
  847.           (((currMB->mb_available_left)->cbp > 15) && ( ((currMB->mb_available_left)->cbp >> 4) == 2)))
  848.           a1 = 1;
  849.       }
  850.       curr_cbp_ctx = a1 + b1;
  851.       cbp_bit = ((cbp>>4) == 2) ? 1 : 0;
  852.       biari_encode_symbol(eep_dp, (signed short) cbp_bit, ctx->cbp_contexts[2] + curr_cbp_ctx );
  853.     }
  854.   }
  855.   dp->bitstream->write_flag = 1;
  856.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  857.   CABAC_TRACE;
  858. }
  859. const int maxpos       [] = {15, 14, 63, 31, 31, 15,  3, 14,  7, 15, 15, 14, 63, 31, 31, 15, 15, 14, 63, 31, 31, 15};
  860. const int c1isdc       [] = { 1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1};
  861. const int type2ctx_bcbp[] = { 0,  1,  2,  3,  3,  4,  5,  6,  5,  5, 10, 11, 12, 13, 13, 14, 16, 17, 18, 19, 19, 20};
  862. const int type2ctx_map [] = { 0,  1,  2,  3,  4,  5,  6,  7,  6,  6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; // 8
  863. const int type2ctx_last[] = { 0,  1,  2,  3,  4,  5,  6,  7,  6,  6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; // 8
  864. const int type2ctx_one [] = { 0,  1,  2,  3,  3,  4,  5,  6,  5,  5, 10, 11, 12, 13, 13, 14, 16, 17, 18, 19, 19, 20}; // 7
  865. const int type2ctx_abs [] = { 0,  1,  2,  3,  3,  4,  5,  6,  5,  5, 10, 11, 12, 13, 13, 14, 16, 17, 18, 19, 19, 20}; // 7
  866. const int max_c2       [] = { 4,  4,  4,  4,  4,  4,  3,  4,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4}; // 9
  867. /*!
  868.  ****************************************************************************
  869.  * brief
  870.  *    Write CBP4-BIT
  871.  ****************************************************************************
  872.  */
  873. void write_and_store_CBP_block_bit (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int cbp_bit, TextureInfoContexts*  tex_ctx)
  874. {
  875. #define BIT_SET(x,n)  ((int)(((x)&((int64)1<<(n)))>>(n)))
  876.   int y_ac        = (type==LUMA_16AC || type==LUMA_8x8 || type==LUMA_8x4 || type==LUMA_4x8 || type==LUMA_4x4
  877.                      || type==CB_16AC || type==CB_8x8 || type==CB_8x4 || type==CB_4x8 || type==CB_4x4
  878.                      || type==CR_16AC || type==CR_8x8 || type==CR_8x4 || type==CR_4x8 || type==CR_4x4);
  879.   int y_dc        = (type==LUMA_16DC || type==CB_16DC || type==CR_16DC); 
  880.   int u_ac        = (type==CHROMA_AC && !img->is_v_block);
  881.   int v_ac        = (type==CHROMA_AC &&  img->is_v_block);
  882.   int chroma_dc   = (type==CHROMA_DC || type==CHROMA_DC_2x4 || type==CHROMA_DC_4x4);
  883.   int u_dc        = (chroma_dc && !img->is_v_block);
  884.   int v_dc        = (chroma_dc &&  img->is_v_block);
  885.   int j           = ((y_ac || u_ac || v_ac ? img->subblock_y : 0) << 2);
  886.   int i           =  (y_ac || u_ac || v_ac ? img->subblock_x : 0);
  887.   int bit         =  (y_dc ? 0 : y_ac ? 1 : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 : 23);
  888.   int default_bit =  (img->is_intra_block ? 1 : 0);
  889.   int upper_bit   = default_bit;
  890.   int left_bit    = default_bit;
  891.   int ctx;
  892.   int bit_pos_a   = 0;
  893.   int bit_pos_b   = 0;
  894.   PixelPos block_a, block_b;
  895.   if (y_ac || y_dc)
  896.   {
  897.     get4x4Neighbour(currMB, (i << 2) - 1, j   , img->mb_size[IS_LUMA], &block_a);
  898.     get4x4Neighbour(currMB, (i << 2),     j -1, img->mb_size[IS_LUMA], &block_b);
  899.     if (y_ac)
  900.     {
  901.       if (block_a.available)
  902.         bit_pos_a = 4*block_a.y + block_a.x;
  903.       if (block_b.available)
  904.         bit_pos_b = 4*block_b.y + block_b.x;
  905.     }
  906.   }
  907.   else
  908.   {
  909.     get4x4Neighbour(currMB, (i << 2) - 1, j    , img->mb_size[IS_CHROMA], &block_a);
  910.     get4x4Neighbour(currMB, (i << 2),     j - 1, img->mb_size[IS_CHROMA], &block_b);
  911.     if (u_ac||v_ac)
  912.     {
  913.       if (block_a.available)
  914.         bit_pos_a = (block_a.y << 2) + block_a.x;
  915.       if (block_b.available)
  916.         bit_pos_b = (block_b.y << 2) + block_b.x;
  917.     }
  918.   }
  919.   bit = (y_dc ? 0 : y_ac ? 1 + j + i : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 + j + i : 35 + j + i);
  920.   //--- set bits for current block ---
  921.   if (cbp_bit)
  922.   {    
  923.     if (type==LUMA_8x8)
  924.     {
  925.       currMB->cbp_bits[0] |= ((int64) 0x33 << bit);
  926.       if (enc_picture->chroma_format_idc==YUV444)
  927.       {
  928.         currMB->cbp_bits_8x8[0] |= ((int64) 0x33 << bit);
  929.       }
  930.     }
  931.     else if (type==CB_8x8)
  932.     {
  933.       currMB->cbp_bits_8x8[1] |= ((int64) 0x33 << bit);
  934.       currMB->cbp_bits[1]     |= ((int64) 0x33 << bit);
  935.     }
  936.     else if (type==CR_8x8)
  937.     {
  938.       currMB->cbp_bits_8x8[2] |= ((int64) 0x33 << bit);
  939.       currMB->cbp_bits[2]     |= ((int64) 0x33 << bit);
  940.     }
  941.     else if (type==LUMA_8x4)
  942.     {      
  943.       currMB->cbp_bits[0]     |= ((int64) 0x03 << bit);
  944.     }
  945.     else if (type==LUMA_4x8)
  946.     {      
  947.       currMB->cbp_bits[0]     |= ((int64) 0x11 << bit);
  948.     }
  949.     else if (type==CB_8x4)
  950.     {
  951.       currMB->cbp_bits[1]     |= ((int64) 0x03 << bit);
  952.     }
  953.     else if (type==CR_8x4)
  954.     {
  955.       currMB->cbp_bits[2]     |= ((int64) 0x03 << bit);
  956.     }
  957.     else if (type==CB_4x8)
  958.     {
  959.       currMB->cbp_bits[1]     |= ((int64) 0x11 << bit);
  960.     }
  961.     else if (type==CR_4x8)
  962.     {
  963.       currMB->cbp_bits[2]     |= ((int64) 0x11 << bit);
  964.     }
  965.     else if ((type==CB_4x4)||(type==CB_16AC)||(type==CB_16DC))
  966.     {
  967.       currMB->cbp_bits[1]     |= ((int64) 0x01 << bit);
  968.     }
  969.     else if ((type == CR_4x4)||(type == CR_16AC)||(type == CR_16DC))
  970.     {
  971.       currMB->cbp_bits[2]     |= ((int64) 0x01 << bit);
  972.     }
  973.     else
  974.     {
  975.       currMB->cbp_bits[0]     |= ((int64) 0x01 << bit);
  976.     }
  977.   }
  978.   bit = (y_dc ? 0 : y_ac ? 1 : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 : 35);
  979.   if (enc_picture->chroma_format_idc!=YUV444)
  980.   {
  981.     if (type!=LUMA_8x8)
  982.     {
  983.       if (block_b.available)
  984.       {
  985.         if(img->mb_data[block_b.mb_addr].mb_type==IPCM)
  986.           upper_bit = 1;
  987.         else
  988.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[0],bit+bit_pos_b);
  989.       }
  990.       if (block_a.available)
  991.       {
  992.         if(img->mb_data[block_a.mb_addr].mb_type == IPCM)
  993.           left_bit = 1;
  994.         else
  995.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[0], bit + bit_pos_a);
  996.       }
  997.       ctx = 2 * upper_bit + left_bit;
  998.       //===== encode symbol =====
  999.       biari_encode_symbol (eep_dp, (short)cbp_bit, tex_ctx->bcbp_contexts[type2ctx_bcbp[type]] + ctx);
  1000.     }
  1001.   }
  1002.   else if( IS_INDEPENDENT(params) )
  1003.   {
  1004.     if (type!=LUMA_8x8)
  1005.     {
  1006.       if (block_b.available)
  1007.       {
  1008.         if(img->mb_data[block_b.mb_addr].mb_type==IPCM)
  1009.           upper_bit = 1;
  1010.         else
  1011.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[0],bit+bit_pos_b);
  1012.       }
  1013.       if (block_a.available)
  1014.       {
  1015.         if(img->mb_data[block_a.mb_addr].mb_type == IPCM)
  1016.           left_bit = 1;
  1017.         else
  1018.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[0], bit + bit_pos_a);
  1019.       }
  1020.       ctx = 2 * upper_bit + left_bit;
  1021.       //===== encode symbol =====
  1022.       biari_encode_symbol (eep_dp, (short)cbp_bit, tex_ctx->bcbp_contexts[type2ctx_bcbp[type]] + ctx);
  1023.     }
  1024.   }
  1025.   else 
  1026.   {
  1027.     if (block_b.available)
  1028.     {
  1029.       if(img->mb_data[block_b.mb_addr].mb_type == IPCM)
  1030.         upper_bit=1;
  1031.       else
  1032.       {
  1033.         if(type==LUMA_8x8)
  1034.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits_8x8[0], bit + bit_pos_b);
  1035.         else if (type==CB_8x8)
  1036.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits_8x8[1], bit + bit_pos_b);
  1037.         else if (type==CR_8x8)
  1038.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits_8x8[2], bit + bit_pos_b);
  1039.         else if ((type==CB_4x4)||(type==CB_4x8)||(type==CB_8x4)||(type==CB_16AC)||(type==CB_16DC))
  1040.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[1], bit + bit_pos_b);
  1041.         else if ((type==CR_4x4)||(type==CR_4x8)||(type==CR_8x4)||(type==CR_16AC)||(type==CR_16DC))
  1042.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[2], bit + bit_pos_b);
  1043.         else
  1044.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[0], bit + bit_pos_b);
  1045.       }
  1046.     }
  1047.     if (block_a.available)
  1048.     {
  1049.       if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
  1050.         left_bit = 1;
  1051.       else
  1052.       {
  1053.         if(type==LUMA_8x8)
  1054.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits_8x8[0],bit + bit_pos_a);
  1055.         else if (type==CB_8x8)
  1056.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits_8x8[1],bit + bit_pos_a);
  1057.         else if (type==CR_8x8)
  1058.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits_8x8[2],bit + bit_pos_a);
  1059.         else if ((type==CB_4x4)||(type==CB_4x8)||(type==CB_8x4)||(type==CB_16AC)||(type==CB_16DC))
  1060.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[1],bit + bit_pos_a);
  1061.         else if ((type==CR_4x4)||(type==CR_4x8)||(type==CR_8x4)||(type==CR_16AC)||(type==CR_16DC))
  1062.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[2],bit + bit_pos_a);
  1063.         else
  1064.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[0],bit + bit_pos_a);
  1065.       }
  1066.     }
  1067.     ctx = 2*upper_bit+left_bit;
  1068.     //===== encode symbol =====
  1069.     biari_encode_symbol (eep_dp, (short)cbp_bit, tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
  1070.   }
  1071. }
  1072. //===== position -> ctx for MAP =====
  1073. //--- zig-zag scan ----
  1074. const int  pos2ctx_map8x8 [] = { 0,  1,  2,  3,  4,  5,  5,  4,  4,  3,  3,  4,  4,  4,  5,  5,
  1075.                                         4,  4,  4,  4,  3,  3,  6,  7,  7,  7,  8,  9, 10,  9,  8,  7,
  1076.                                         7,  6, 11, 12, 13, 11,  6,  7,  8,  9, 14, 10,  9,  8,  6, 11,
  1077.                                        12, 13, 11,  6,  9, 14, 10,  9, 11, 12, 13, 11 ,14, 10, 12, 14}; // 15 CTX
  1078. const int  pos2ctx_map8x4 [] = { 0,  1,  2,  3,  4,  5,  7,  8,  9, 10, 11,  9,  8,  6,  7,  8,
  1079.                                         9, 10, 11,  9,  8,  6, 12,  8,  9, 10, 11,  9, 13, 13, 14, 14}; // 15 CTX
  1080. const int  pos2ctx_map4x4 [] = { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 14}; // 15 CTX
  1081. const int  pos2ctx_map2x4c[] = { 0,  0,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2}; // 15 CTX
  1082. const int  pos2ctx_map4x4c[] = { 0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2}; // 15 CTX
  1083. const int* pos2ctx_map    [] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8, pos2ctx_map8x4,
  1084.                                        pos2ctx_map8x4, pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
  1085.                                        pos2ctx_map2x4c, pos2ctx_map4x4c, 
  1086.                                        pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8,pos2ctx_map8x4,
  1087.                                        pos2ctx_map8x4, pos2ctx_map4x4,  //Cb component
  1088.                                        pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8,pos2ctx_map8x4,
  1089.                                        pos2ctx_map8x4,pos2ctx_map4x4};  //Cr component
  1090. //--- interlace scan ----
  1091. //Taken from ABT
  1092. static const int  pos2ctx_map8x8i[] = { 0,  1,  1,  2,  2,  3,  3,  4,  5,  6,  7,  7,  7,  8,  4,  5,
  1093.                                         6,  9, 10, 10,  8, 11, 12, 11,  9,  9, 10, 10,  8, 11, 12, 11,
  1094.                                         9,  9, 10, 10,  8, 11, 12, 11,  9,  9, 10, 10,  8, 13, 13,  9,
  1095.                                         9, 10, 10,  8, 13, 13,  9,  9, 10, 10, 14, 14, 14, 14, 14, 14}; // 15 CTX
  1096. static const int  pos2ctx_map8x4i[] = { 0,  1,  2,  3,  4,  5,  6,  3,  4,  5,  6,  3,  4,  7,  6,  8,
  1097.                                         9,  7,  6,  8,  9, 10, 11, 12, 12, 10, 11, 13, 13, 14, 14, 14}; // 15 CTX
  1098. static const int  pos2ctx_map4x8i[] = { 0,  1,  1,  1,  2,  3,  3,  4,  4,  4,  5,  6,  2,  7,  7,  8,
  1099.                                         8,  8,  5,  6,  9, 10, 10, 11, 11, 11, 12, 13, 13, 14, 14, 14}; // 15 CTX
  1100. static const int* pos2ctx_map_int[] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
  1101.                                        pos2ctx_map4x8i,pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
  1102.                                        pos2ctx_map2x4c, pos2ctx_map4x4c,
  1103. //444_TEMP_NOTE: the followings are addded for the 4:4:4 common mode};
  1104.                                         pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
  1105.                                         pos2ctx_map8x4i,pos2ctx_map4x4, //Cb component
  1106.                                         pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
  1107.                                         pos2ctx_map8x4i,pos2ctx_map4x4};  //Cr component}
  1108. //===== position -> ctx for LAST =====
  1109. const int  pos2ctx_last8x8 [] = { 0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
  1110.                                          2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
  1111.                                          3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
  1112.                                          5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8}; //  9 CTX
  1113. const int  pos2ctx_last8x4 [] = { 0,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,
  1114.                                          3,  3,  3,  3,  4,  4,  4,  4,  5,  5,  6,  6,  7,  7,  8,  8}; //  9 CTX
  1115. const int  pos2ctx_last4x4 [] = { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15}; // 15 CTX
  1116. const int  pos2ctx_last2x4c[] = { 0,  0,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2}; // 15 CTX
  1117. const int  pos2ctx_last4x4c[] = { 0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2}; // 15 CTX
  1118. const int* pos2ctx_last    [] = {pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8, pos2ctx_last8x4,
  1119.                                         pos2ctx_last8x4, pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last4x4,
  1120.                                         pos2ctx_last2x4c, pos2ctx_last4x4c,
  1121.                                         pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8,pos2ctx_last8x4,
  1122.                                         pos2ctx_last8x4, pos2ctx_last4x4,  //Cb component
  1123.                                         pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8,pos2ctx_last8x4,
  1124.                                         pos2ctx_last8x4, pos2ctx_last4x4}; //Cr component
  1125. /*!
  1126. ****************************************************************************
  1127. * brief
  1128. *    Write Significance MAP
  1129. ****************************************************************************
  1130. */
  1131. void write_significance_map (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int coeff[], int coeff_ctr, TextureInfoContexts*  tex_ctx)
  1132. {
  1133.   int   k;
  1134.   unsigned short sig, last;
  1135.   int   k0 = 0;
  1136.   int   k1 = maxpos[type];
  1137. #if ENABLE_FIELD_CTX
  1138.   int               fld       = ( img->structure!=FRAME || currMB->mb_field );
  1139. #else
  1140.   int               fld       = 0;
  1141. #endif
  1142.   BiContextTypePtr  map_ctx   = tex_ctx->map_contexts [fld][type2ctx_map [type]];
  1143.   BiContextTypePtr  last_ctx  = tex_ctx->last_contexts[fld][type2ctx_last[type]];
  1144.   if (!c1isdc[type])
  1145.   {
  1146.     k0++; k1++; coeff--;
  1147.   }
  1148.   if (!fld)
  1149.   {
  1150.     for (k=k0; k<k1; k++) // if last coeff is reached, it has to be significant
  1151.     {
  1152.       sig   = (coeff[k] != 0);
  1153.       biari_encode_symbol  (eep_dp, sig,  map_ctx + pos2ctx_map  [type][k]);
  1154.       if (sig)
  1155.       {
  1156.         last = (--coeff_ctr == 0);
  1157.         biari_encode_symbol(eep_dp, last, last_ctx + pos2ctx_last[type][k]);
  1158.         if (last) 
  1159.           return;
  1160.       }
  1161.     }
  1162.     return;
  1163.   }
  1164.   else
  1165.   {
  1166.     for (k=k0; k<k1; k++) // if last coeff is reached, it has to be significant
  1167.     {
  1168.       sig   = (coeff[k] != 0);
  1169.       biari_encode_symbol  (eep_dp, sig,  map_ctx + pos2ctx_map_int [type][k]);
  1170.       if (sig)
  1171.       {
  1172.         last = (--coeff_ctr == 0);
  1173.         biari_encode_symbol(eep_dp, last, last_ctx + pos2ctx_last[type][k]);
  1174.         if (last) 
  1175.           return;
  1176.       }
  1177.     }
  1178.   }
  1179. }
  1180. /*!
  1181.  ****************************************************************************
  1182.  * brief
  1183.  *    Write Levels
  1184.  ****************************************************************************
  1185.  */
  1186. void write_significant_coefficients (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int coeff[], TextureInfoContexts*  tex_ctx)
  1187. {
  1188.   int   i;
  1189.   int   absLevel;
  1190.   int   ctx;
  1191.   short sign;
  1192.   short greater_one;
  1193.   int   c1 = 1;
  1194.   int   c2 = 0;
  1195.   BiContextType *one_contexts = tex_ctx->one_contexts[type2ctx_one[type]];
  1196.   BiContextType *abs_contexts = tex_ctx->abs_contexts[type2ctx_abs[type]];
  1197.   for (i=maxpos[type]; i>=0; i--)
  1198.   {
  1199.     if (coeff[i]!=0)
  1200.     {
  1201.       if (coeff[i] > 0)
  1202.       {
  1203.         absLevel =  coeff[i];  
  1204.         sign = 0;
  1205.       }
  1206.       else            
  1207.       {
  1208.         absLevel = -coeff[i];  
  1209.         sign = 1;
  1210.       }
  1211.       greater_one = (absLevel > 1);
  1212.       //--- if coefficient is one ---
  1213.       ctx = imin(c1, 4);
  1214.       biari_encode_symbol (eep_dp, greater_one, one_contexts + ctx);
  1215.       if (greater_one)
  1216.       {
  1217.         ctx = imin(c2++, max_c2[type]);
  1218.         unary_exp_golomb_level_encode(eep_dp, absLevel - 2, abs_contexts + ctx);
  1219.         c1 = 0;
  1220.       }
  1221.       else if (c1)
  1222.       {
  1223.         c1++;
  1224.       }
  1225.       biari_encode_symbol_eq_prob (eep_dp, sign);
  1226.     }
  1227.   }
  1228. }
  1229. /*!
  1230.  ****************************************************************************
  1231.  * brief
  1232.  *    Write Block-Transform Coefficients
  1233.  ****************************************************************************
  1234.  */
  1235. void writeRunLevel_CABAC (Macroblock* currMB, SyntaxElement *se, DataPartition *dp)
  1236. {
  1237.   EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
  1238.   int curr_len = arienco_bits_written(eep_dp);
  1239.   static int  coeff[64];
  1240.   static int  coeff_ctr = 0;
  1241.   static int  pos       = 0;
  1242.   //--- accumulate run-level information ---
  1243.   if (se->value1 != 0)
  1244.   {
  1245.     pos += se->value2;
  1246.     coeff[pos++] = se->value1;
  1247.     coeff_ctr++;
  1248.   }
  1249.   else
  1250.   {
  1251.     TextureInfoContexts *tex_ctx = img->currentSlice->tex_ctx;
  1252.     //===== encode CBP-BIT =====
  1253.     if (coeff_ctr > 0)
  1254.     {
  1255.       write_and_store_CBP_block_bit  (currMB, eep_dp, se->context, 1, tex_ctx);
  1256.       //===== encode significance map =====
  1257.       write_significance_map         (currMB, eep_dp, se->context, coeff, coeff_ctr, tex_ctx);
  1258.       //===== encode significant coefficients =====
  1259.       write_significant_coefficients (currMB, eep_dp, se->context, coeff, tex_ctx);
  1260.     }
  1261.     else
  1262.       write_and_store_CBP_block_bit  (currMB, eep_dp, se->context, 0, tex_ctx);
  1263.     //--- reset counters ---
  1264.     pos = coeff_ctr = 0;
  1265.     memset(coeff, 0 , 64 * sizeof(int));
  1266.   }
  1267.   dp->bitstream->write_flag = 1;
  1268.   se->len = (arienco_bits_written(eep_dp) - curr_len);
  1269.   CABAC_TRACE;
  1270. }
  1271. /*!
  1272.  ************************************************************************
  1273.  * brief
  1274.  *    Unary binarization and encoding of a symbol by using
  1275.  *    one or two distinct models for the first two and all
  1276.  *    remaining bins
  1277. *
  1278. ************************************************************************/
  1279. void unary_bin_encode(EncodingEnvironmentPtr eep_dp,
  1280.                       unsigned int symbol,
  1281.                       BiContextTypePtr ctx,
  1282.                       int ctx_offset)
  1283. {
  1284.   
  1285.   if (symbol==0)
  1286.   {
  1287.     biari_encode_symbol(eep_dp, 0, ctx );
  1288.     return;
  1289.   }
  1290.   else
  1291.   {
  1292.     biari_encode_symbol(eep_dp, 1, ctx );
  1293.     ctx += ctx_offset;
  1294.     while ((--symbol) > 0)
  1295.       biari_encode_symbol(eep_dp, 1, ctx);
  1296.     biari_encode_symbol(eep_dp, 0, ctx);
  1297.   }
  1298. }
  1299. /*!
  1300.  ************************************************************************
  1301.  * brief
  1302.  *    Unary binarization and encoding of a symbol by using
  1303.  *    one or two distinct models for the first two and all
  1304.  *    remaining bins; no terminating "0" for max_symbol
  1305.  *    (finite symbol alphabet)
  1306.  ************************************************************************
  1307.  */
  1308. void unary_bin_max_encode(EncodingEnvironmentPtr eep_dp,
  1309.                           unsigned int symbol,
  1310.                           BiContextTypePtr ctx,
  1311.                           int ctx_offset,
  1312.                           unsigned int max_symbol)
  1313. {
  1314.   if (symbol==0)
  1315.   {
  1316.     biari_encode_symbol(eep_dp, 0, ctx );
  1317.     return;
  1318.   }
  1319.   else
  1320.   {
  1321.     unsigned int l = symbol;
  1322.     biari_encode_symbol(eep_dp, 1, ctx );
  1323.     
  1324.     ctx += ctx_offset;
  1325.     while ((--l)>0)
  1326.       biari_encode_symbol(eep_dp, 1, ctx);
  1327.     if (symbol < max_symbol)
  1328.       biari_encode_symbol(eep_dp, 0, ctx);
  1329.   }
  1330. }
  1331. /*!
  1332.  ************************************************************************
  1333.  * brief
  1334.  *    Exp Golomb binarization and encoding
  1335.  ************************************************************************
  1336.  */
  1337. void exp_golomb_encode_eq_prob( EncodingEnvironmentPtr eep_dp,
  1338.                                 unsigned int symbol,
  1339.                                 int k)
  1340. {
  1341.   while(1)
  1342.   {
  1343.     if (symbol >= (unsigned int)(1<<k))
  1344.     {
  1345.       biari_encode_symbol_eq_prob(eep_dp, 1);   //first unary part
  1346.       symbol = symbol - (1<<k);
  1347.       k++;
  1348.     }
  1349.     else
  1350.     {
  1351.       biari_encode_symbol_eq_prob(eep_dp, 0);   //now terminated zero of unary part
  1352.       while (k--)                               //next binary part
  1353.         biari_encode_symbol_eq_prob(eep_dp, (signed short)((symbol>>k)&1));
  1354.       break;
  1355.     }
  1356.   }
  1357. }
  1358. /*!
  1359.  ************************************************************************
  1360.  * brief
  1361.  *    Exp-Golomb for Level Encoding
  1362. *
  1363. ************************************************************************/
  1364. void unary_exp_golomb_level_encode( EncodingEnvironmentPtr eep_dp,
  1365.                                     unsigned int symbol,
  1366.                                     BiContextTypePtr ctx)
  1367. {
  1368.   if (symbol==0)
  1369.   {
  1370.     biari_encode_symbol(eep_dp, 0, ctx );
  1371.     return;
  1372.   }
  1373.   else
  1374.   {
  1375.     unsigned int exp_start = 13; // 15-2 : 0,1 level decision always sent
  1376.     unsigned int l=symbol;
  1377.     unsigned int k = 1;
  1378.     biari_encode_symbol(eep_dp, 1, ctx );
  1379.     while (((--l)>0) && (++k <= exp_start))
  1380.       biari_encode_symbol(eep_dp, 1, ctx);
  1381.     if (symbol < exp_start) 
  1382.       biari_encode_symbol(eep_dp, 0, ctx);
  1383.     else 
  1384.       exp_golomb_encode_eq_prob(eep_dp,symbol - exp_start, 0);
  1385.   }
  1386. }
  1387. /*!
  1388.  ************************************************************************
  1389.  * brief
  1390.  *    Exp-Golomb for MV Encoding
  1391. *
  1392. ************************************************************************/
  1393. void unary_exp_golomb_mv_encode(EncodingEnvironmentPtr eep_dp,
  1394.                                 unsigned int symbol,
  1395.                                 BiContextTypePtr ctx,
  1396.                                 unsigned int max_bin)
  1397. {  
  1398.   if (symbol==0)
  1399.   {
  1400.     biari_encode_symbol(eep_dp, 0, ctx );
  1401.     return;
  1402.   }
  1403.   else
  1404.   {
  1405.     unsigned int bin=1;
  1406.     unsigned int exp_start = 8; // 9-1 : 0 mvd decision always sent
  1407.     unsigned int l = symbol, k = 1;
  1408.     biari_encode_symbol(eep_dp, 1, ctx++ );
  1409.     
  1410.     while (((--l)>0) && (++k <= exp_start))
  1411.     {
  1412.       biari_encode_symbol(eep_dp, 1, ctx  );
  1413.       if ((++bin) == 2) 
  1414.         ctx++;
  1415.       if (bin == max_bin) 
  1416.         ctx++;
  1417.     }
  1418.     if (symbol < exp_start) 
  1419.       biari_encode_symbol(eep_dp, 0, ctx);
  1420.     else 
  1421.       exp_golomb_encode_eq_prob(eep_dp, symbol - exp_start, 3);
  1422.   }
  1423. }