cabac.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:33k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. ***********************************************************************
  3. * COPYRIGHT AND WARRANTY INFORMATION
  4. *
  5. * Copyright 2001, International Telecommunications Union, Geneva
  6. *
  7. * DISCLAIMER OF WARRANTY
  8. *
  9. * These software programs are available to the user without any
  10. * license fee or royalty on an "as is" basis. The ITU disclaims
  11. * any and all warranties, whether express, implied, or
  12. * statutory, including any implied warranties of merchantability
  13. * or of fitness for a particular purpose.  In no event shall the
  14. * contributor or the ITU be liable for any incidental, punitive, or
  15. * consequential damages of any kind whatsoever arising from the
  16. * use of these programs.
  17. *
  18. * This disclaimer of warranty extends to the user of these programs
  19. * and user's customers, employees, agents, transferees, successors,
  20. * and assigns.
  21. *
  22. * The ITU does not represent or warrant that the programs furnished
  23. * hereunder are free of infringement of any third-party patents.
  24. * Commercial implementations of ITU-T Recommendations, including
  25. * shareware, may be subject to royalty fees to patent holders.
  26. * Information regarding the ITU-T patent policy is available from
  27. * the ITU Web site at http://www.itu.int.
  28. *
  29. * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
  30. ************************************************************************
  31. */
  32. /*!
  33.  *************************************************************************************
  34.  * file cabac.c
  35.  *
  36.  * brief
  37.  *    CABAC entropy coding routines
  38.  *
  39.  * author
  40.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  41.  *    - Detlev Marpe                    <marpe@hhi.de>
  42.  **************************************************************************************
  43.  */
  44. #include <stdlib.h>
  45. #include <math.h>
  46. #include <memory.h>
  47. #include "cabac.h"
  48. /*!
  49.  ************************************************************************
  50.  * brief
  51.  *    Allocation of contexts models for the motion info
  52.  *    used for arithmetic encoding
  53.  ************************************************************************
  54.  */
  55. MotionInfoContexts* create_contexts_MotionInfo(void)
  56. {
  57.   int j;
  58.   MotionInfoContexts *enco_ctx;
  59.   enco_ctx = (MotionInfoContexts*) calloc(1, sizeof(MotionInfoContexts) );
  60.   if( enco_ctx == NULL )
  61.     no_mem_exit("create_contexts_MotionInfo: enco_ctx");
  62.   for (j=0; j<2; j++)
  63.   {
  64.     enco_ctx->mb_type_contexts[j] = (BiContextTypePtr) malloc(NUM_MB_TYPE_CTX  * sizeof( BiContextType ) );
  65.     if( enco_ctx->mb_type_contexts[j] == NULL )
  66.       no_mem_exit("create_contexts_MotionInfo: enco_ctx->mb_type_contexts");
  67.     enco_ctx->mv_res_contexts[j] = (BiContextTypePtr) malloc(NUM_MV_RES_CTX  * sizeof( BiContextType ) );
  68.     if( enco_ctx->mv_res_contexts[j] == NULL )
  69.       no_mem_exit("create_contexts_MotionInfo: enco_ctx->mv_res_contexts");
  70.   }
  71.   enco_ctx->ref_no_contexts = (BiContextTypePtr) malloc(NUM_REF_NO_CTX * sizeof( BiContextType ) );
  72.   if( enco_ctx->ref_no_contexts == NULL )
  73.     no_mem_exit("create_contexts_MotionInfo: enco_ctx->ref_no_contexts");
  74.   enco_ctx->delta_qp_contexts = (BiContextTypePtr) malloc(NUM_DELTA_QP_CTX * sizeof( BiContextType ) );
  75.   if( enco_ctx->delta_qp_contexts == NULL )
  76.     no_mem_exit("create_contexts_MotionInfo: enco_ctx->delta_qp_contexts");
  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.   int j,k;
  89.   TextureInfoContexts *enco_ctx;
  90.   enco_ctx = (TextureInfoContexts*) calloc(1, sizeof(TextureInfoContexts) );
  91.   if( enco_ctx == NULL )
  92.     no_mem_exit("create_contexts_TextureInfo: enco_ctx");
  93.   for (j=0; j < 6; j++)
  94.   {
  95.     enco_ctx->ipr_contexts[j] = (BiContextTypePtr) malloc(NUM_IPR_CTX  * sizeof( BiContextType ) );
  96.     if( enco_ctx->ipr_contexts[j] == NULL )
  97.       no_mem_exit("create_contexts_TextureInfo: enco_ctx->ipr_contexts");
  98.   }
  99.   for (k=0; k<2; k++)
  100.     for (j=0; j<3; j++)
  101.     {
  102.       enco_ctx->cbp_contexts[k][j] = (BiContextTypePtr) malloc(NUM_CBP_CTX  * sizeof( BiContextType ) );
  103.       if( enco_ctx->cbp_contexts[k][j] == NULL )
  104.         no_mem_exit("create_contexts_TextureInfo: enco_ctx->cbp_contexts");
  105.     }
  106.   for (j=0; j < NUM_TRANS_TYPE; j++)
  107.   {
  108.     enco_ctx->level_context[j] = (BiContextTypePtr) malloc(NUM_LEVEL_CTX  * sizeof( BiContextType ) );
  109.     if( enco_ctx->level_context[j] == NULL )
  110.       no_mem_exit("create_contexts_TextureInfo: enco_ctx->level_context");
  111.     enco_ctx->run_context[j] = (BiContextTypePtr) malloc(NUM_RUN_CTX  * sizeof( BiContextType ) );
  112.     if( enco_ctx->run_context[j] == NULL )
  113.       no_mem_exit("create_contexts_TextureInfo: enco_ctx->run_context");
  114.   }
  115.   return enco_ctx;
  116. }
  117. /*!
  118.  ************************************************************************
  119.  * brief
  120.  *    Initializes an array of contexts models with some pre-defined
  121.  *    counts (ini_flag = 1) or with a flat histogram (ini_flag = 0)
  122.  ************************************************************************
  123.  */
  124. void init_contexts_MotionInfo(MotionInfoContexts *enco_ctx, int ini_flag)
  125. {
  126.   int i,j;
  127.   int scale_factor;
  128.   int qp_factor;
  129.   int ini[3];
  130.   if ( (img->width*img->height) <=  (IMG_WIDTH * IMG_HEIGHT) ) //  format <= QCIF
  131.     scale_factor=1;
  132.   else
  133.     scale_factor=2;
  134.   if(img->qp <= 10)
  135.     qp_factor=0;
  136.   else
  137.     qp_factor=img->qp-10;
  138.   for (j=0; j<2; j++)
  139.   {
  140.     if (ini_flag)
  141.     {
  142.       for (i=0; i < NUM_MB_TYPE_CTX; i++)
  143.       {
  144.         ini[0] = MB_TYPE_Ini[j][i][0]+(MB_TYPE_Ini[j][i][3]*qp_factor)/10;
  145.         ini[1] = MB_TYPE_Ini[j][i][1]+(MB_TYPE_Ini[j][i][4]*qp_factor)/10;
  146.         ini[2] = MB_TYPE_Ini[j][i][2]*scale_factor;
  147.         biari_init_context(enco_ctx->mb_type_contexts[j] + i,ini[0],ini[1],ini[2]);
  148.       }
  149.     }
  150.     else
  151.     {
  152.       for (i=0; i < NUM_MB_TYPE_CTX; i++)
  153.         biari_init_context(enco_ctx->mb_type_contexts[j] + i,1,1,100);
  154.     }
  155.     if (ini_flag)
  156.     {
  157.       for (i=0; i < NUM_MV_RES_CTX; i++)
  158.         biari_init_context(enco_ctx->mv_res_contexts[j] + i,MV_RES_Ini[j][i][0]*scale_factor,MV_RES_Ini[j][i][1]*scale_factor,MV_RES_Ini[j][i][2]*scale_factor);
  159.     }
  160.     else
  161.     {
  162.       for (i=0; i < NUM_MV_RES_CTX; i++)
  163.         biari_init_context(enco_ctx->mv_res_contexts[j] + i,1,1,1000);
  164.     }
  165.   }
  166.   if (ini_flag)
  167.   {
  168.     for (i=0; i < NUM_REF_NO_CTX; i++)
  169.       biari_init_context(enco_ctx->ref_no_contexts + i,REF_NO_Ini[i][0]*scale_factor,REF_NO_Ini[i][1]*scale_factor,REF_NO_Ini[i][2]*scale_factor);
  170.   }
  171.   else
  172.   {
  173.     for (i=0; i < NUM_REF_NO_CTX; i++)
  174.       biari_init_context(enco_ctx->ref_no_contexts + i,1,1,1000);
  175.   }
  176.   if (ini_flag)
  177.   {
  178.     for (i=0; i < NUM_DELTA_QP_CTX; i++)
  179.       biari_init_context(enco_ctx->delta_qp_contexts + i,DELTA_QP_Ini[i][0]*scale_factor,DELTA_QP_Ini[i][1]*scale_factor,DELTA_QP_Ini[i][2]*scale_factor);
  180.   }
  181.   else
  182.   {
  183.     for (i=0; i < NUM_DELTA_QP_CTX; i++)
  184.       biari_init_context(enco_ctx->delta_qp_contexts + i,1,1,1000);
  185.   }
  186. }
  187. /*!
  188.  ************************************************************************
  189.  * brief
  190.  *    Initializes an array of contexts models with some pre-defined
  191.  *    counts (ini_flag = 1) or with a flat histogram (ini_flag = 0)
  192.  ************************************************************************
  193.  */
  194. void init_contexts_TextureInfo(TextureInfoContexts *enco_ctx, int ini_flag)
  195. {
  196.   int i,j,k;
  197.   int scale_factor;
  198.   int qp_factor;
  199.   int ini[3];
  200.   if ( (img->width*img->height) <=  (IMG_WIDTH * IMG_HEIGHT) ) //  format <= QCIF
  201.    scale_factor=1;
  202.   else
  203.    scale_factor=2;
  204.   if(img->qp <= 10)
  205.     qp_factor=0;
  206.   else
  207.     qp_factor=img->qp-10;
  208.   for (j=0; j < 6; j++)
  209.   {
  210.     if (ini_flag)
  211.     {
  212.       for (i=0; i < NUM_IPR_CTX; i++)
  213.         biari_init_context(enco_ctx->ipr_contexts[j] + i,IPR_Ini[j][i][0]*scale_factor,IPR_Ini[j][i][1]*scale_factor,IPR_Ini[j][i][2]*scale_factor);
  214.     }
  215.     else
  216.     {
  217.       for (i=0; i < NUM_IPR_CTX; i++)
  218.         biari_init_context(enco_ctx->ipr_contexts[j] + i,2,1,50);
  219.     }
  220.   }
  221.   for (k=0; k<2; k++)
  222.     for (j=0; j<3; j++)
  223.     {
  224.       if (ini_flag)
  225.       {
  226.         for (i=0; i < NUM_CBP_CTX; i++)
  227.         {
  228.           ini[0] = CBP_Ini[k][j][i][0]+(CBP_Ini[k][j][i][3]*qp_factor)/10;
  229.           ini[1] = CBP_Ini[k][j][i][1]+(CBP_Ini[k][j][i][4]*qp_factor)/10;
  230.           ini[2] = CBP_Ini[k][j][i][2]*scale_factor;
  231.           biari_init_context(enco_ctx->cbp_contexts[k][j] + i,ini[0],ini[1],ini[2]);
  232.         }
  233.       }
  234.       else
  235.       {
  236.         for (i=0; i < NUM_CBP_CTX; i++)
  237.           biari_init_context(enco_ctx->cbp_contexts[k][j] + i,1,1,100);
  238.       }
  239.     }
  240.   for (j=0; j < NUM_TRANS_TYPE; j++)
  241.   {
  242.     if (ini_flag)
  243.     {
  244.       for (i=0; i < NUM_LEVEL_CTX; i++)
  245.       {
  246.         ini[0] = (Level_Ini[j][i][0]+(Level_Ini[j][i][3]*qp_factor)/10)*scale_factor;
  247.         ini[1] = (Level_Ini[j][i][1]+(Level_Ini[j][i][4]*qp_factor)/10)*scale_factor;
  248.         ini[2] = Level_Ini[j][i][2]*scale_factor;
  249.         biari_init_context(enco_ctx->level_context[j] + i,ini[0],ini[1],ini[2]);
  250.       }
  251.     }
  252.     else
  253.     {
  254.       for (i=0; i < NUM_LEVEL_CTX; i++)
  255.         biari_init_context(enco_ctx->level_context[j] + i,1,1,100);
  256.     }
  257.     if (ini_flag)
  258.     {
  259.       for (i=0; i < NUM_RUN_CTX; i++)
  260.       {
  261.         ini[0] = Run_Ini[j][i][0]*scale_factor;
  262.         ini[1] = Run_Ini[j][i][1]*scale_factor;
  263.         ini[2] = Run_Ini[j][i][2]*scale_factor;
  264.         biari_init_context(enco_ctx->run_context[j] + i,ini[0],ini[1],ini[2]);
  265.       }
  266.     }
  267.     else
  268.     {
  269.       for (i=0; i < NUM_RUN_CTX; i++)
  270.         biari_init_context(enco_ctx->run_context[j] + i,1,1,100);
  271.     }
  272.   }
  273. }
  274. /*!
  275.  ************************************************************************
  276.  * brief
  277.  *    Frees the memory of the contexts models
  278.  *    used for arithmetic encoding of the motion info.
  279.  ************************************************************************
  280.  */
  281. void delete_contexts_MotionInfo(MotionInfoContexts *enco_ctx)
  282. {
  283.   int j;
  284.   if( enco_ctx == NULL )
  285.     return;
  286.   for (j=0; j<2; j++)
  287.   {
  288.     if (enco_ctx->mb_type_contexts[j] != NULL)
  289.       free(enco_ctx->mb_type_contexts[j] );
  290.     if (enco_ctx->mv_res_contexts[j]  != NULL)
  291.       free(enco_ctx->mv_res_contexts[j] );
  292.   }
  293.   if (enco_ctx->ref_no_contexts != NULL)
  294.     free(enco_ctx->ref_no_contexts);
  295.   if (enco_ctx->delta_qp_contexts != NULL)
  296.     free(enco_ctx->delta_qp_contexts);
  297.   free( enco_ctx );
  298.   return;
  299. }
  300. /*!
  301.  ************************************************************************
  302.  * brief
  303.  *    Frees the memory of the contexts models
  304.  *    used for arithmetic encoding of the texture info.
  305.  ************************************************************************
  306.  */
  307. void delete_contexts_TextureInfo(TextureInfoContexts *enco_ctx)
  308. {
  309.   int j,k;
  310.   if( enco_ctx == NULL )
  311.     return;
  312.   for (j=0; j < 6; j++)
  313.   {
  314.     if (enco_ctx->ipr_contexts[j] != NULL)
  315.       free(enco_ctx->ipr_contexts[j]);
  316.   }
  317.   for (k=0; k<2; k++)
  318.     for (j=0; j<3; j++)
  319.     {
  320.       if (enco_ctx->cbp_contexts[k][j] != NULL)
  321.         free(enco_ctx->cbp_contexts[k][j]);
  322.     }
  323.   for (j=0; j < NUM_TRANS_TYPE; j++)
  324.   {
  325.     if (enco_ctx->level_context[j] != NULL)
  326.       free(enco_ctx->level_context[j]);
  327.     if (enco_ctx->run_context[j] != NULL)
  328.       free(enco_ctx->run_context[j]);
  329.   }
  330.   free( enco_ctx );
  331.   return;
  332. }
  333. /*!
  334.  **************************************************************************
  335.  * brief
  336.  *    generates arithmetic code and passes the code to the buffer
  337.  **************************************************************************
  338.  */
  339. int writeSyntaxElement_CABAC(SyntaxElement *se, DataPartition *this_dataPart)
  340. {
  341.   int curr_len;
  342.   EncodingEnvironmentPtr eep_dp = &(this_dataPart->ee_cabac);
  343.   curr_len = arienco_bits_written(eep_dp);
  344.   // perform the actual coding by calling the appropriate method
  345.   se->writing(se, eep_dp);
  346.   return (se->len = (arienco_bits_written(eep_dp) - curr_len));
  347. }
  348. /*!
  349.  ***************************************************************************
  350.  * brief
  351.  *    This function is used to arithmetically encode the macroblock
  352.  *    type info of a given MB.
  353.  ***************************************************************************
  354.  */
  355. void writeMB_typeInfo2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  356. {
  357.   int l;
  358.   int a, b;
  359.   int act_ctx;
  360.   int act_sym;
  361.   int log_sym;
  362.   int mode_sym=0;
  363.   int mask;
  364.   int mode16x16;
  365.   MotionInfoContexts *ctx = (img->currentSlice)->mot_ctx;
  366.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  367.   int curr_mb_type = se->value1;
  368.   if(img->type == INTRA_IMG)  // INTRA-frame
  369.   {
  370.     if (currMB->mb_available[0][1] == NULL)
  371.       b = 0;
  372.     else
  373.       b = (( (currMB->mb_available[0][1])->mb_type != 0) ? 1 : 0 );
  374.     if (currMB->mb_available[1][0] == NULL)
  375.       a = 0;
  376.     else
  377.       a = (( (currMB->mb_available[1][0])->mb_type != 0) ? 1 : 0 );
  378.     act_ctx = a + b;
  379.     act_sym = curr_mb_type;
  380.     se->context = act_ctx; // store context
  381.     if (act_sym==0) // 4x4 Intra
  382.       biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[0] + act_ctx );
  383.     else // 16x16 Intra
  384.     {
  385.       biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[0] + act_ctx );
  386.       mode_sym=act_sym-1; // Values in the range of 0...23
  387.       act_ctx = 4;
  388.       act_sym = mode_sym/12;
  389.       biari_encode_symbol(eep_dp, (unsigned char) act_sym, ctx->mb_type_contexts[0] + act_ctx ); // coding of AC/no AC
  390.       mode_sym = mode_sym % 12;
  391.       act_sym = mode_sym / 4; // coding of cbp: 0,1,2
  392.       act_ctx = 5;
  393.       if (act_sym==0)
  394.       {
  395.         biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[0] + act_ctx );
  396.       }
  397.       else
  398.       {
  399.         biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[0] + act_ctx );
  400.         act_ctx=6;
  401.         if (act_sym==1)
  402.         {
  403.           biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[0] + act_ctx );
  404.         }
  405.         else
  406.         {
  407.           biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[0] + act_ctx );
  408.         }
  409.       }
  410.       mode_sym = mode_sym % 4; // coding of I pred-mode: 0,1,2,3
  411.       act_sym = mode_sym/2;
  412.       act_ctx = 7;
  413.       biari_encode_symbol(eep_dp, (unsigned char) act_sym, ctx->mb_type_contexts[0] + act_ctx );
  414.       act_ctx = 8;
  415.       act_sym = mode_sym%2;
  416.       biari_encode_symbol(eep_dp, (unsigned char) act_sym, ctx->mb_type_contexts[0] + act_ctx );
  417.     }
  418.   }
  419.   else
  420.   {
  421.     if (currMB->mb_available[0][1] == NULL)
  422.       b = 0;
  423.     else
  424.       b = (( (currMB->mb_available[0][1])->mb_type != 0) ? 1 : 0 );
  425.     if (currMB->mb_available[1][0] == NULL)
  426.       a = 0;
  427.     else
  428.       a = (( (currMB->mb_available[1][0])->mb_type != 0) ? 1 : 0 );
  429.     act_sym = curr_mb_type;
  430.     if(act_sym>=(mode16x16=(8*img->type+1))) // 16x16 Intra-mode: mode16x16=9 (P-frame) mode16x16=17 (B-frame)
  431.     {
  432.       mode_sym=act_sym-mode16x16;
  433.       act_sym=mode16x16; // 16x16 mode info
  434.     }
  435.     act_sym++;
  436.     for (log_sym = 0; (1<<log_sym) <= act_sym; log_sym++);
  437.     log_sym--;
  438.     act_ctx = a + b;
  439.     se->context = act_ctx; // store context
  440.     if (log_sym==0)
  441.     {
  442.       biari_encode_symbol(eep_dp, 0, &ctx->mb_type_contexts[1][act_ctx] );
  443.     }
  444.     else
  445.     {
  446.       // code unary part
  447.       biari_encode_symbol(eep_dp, 1, &ctx->mb_type_contexts[1][act_ctx] );
  448.       act_ctx=4;
  449.       if (log_sym==1)
  450.       {
  451.         biari_encode_symbol(eep_dp, 0, &ctx->mb_type_contexts[1][act_ctx ] );
  452.       }
  453.       else
  454.       {
  455.         for(l=0;l<log_sym-1;l++)
  456.         {
  457.           biari_encode_symbol(eep_dp, 1, &ctx->mb_type_contexts[1][act_ctx] );
  458.           if (l==0) act_ctx=5;
  459.         }
  460.         if ( log_sym < (3+((img->type == B_IMG)?1:0)) ) // maximum mode no. is 9 (P-frame) or 17 (B-frame)
  461.           biari_encode_symbol(eep_dp, 0, &ctx->mb_type_contexts[1][act_ctx ] );
  462.       }
  463.       // code binary part
  464.       act_ctx=6;
  465.       if (log_sym==(3+((img->type == B_IMG)?1:0)) ) log_sym=2; // only 2 LSBs are actually set for mode 7-9 (P-frame) or 15-17 (B-frame)
  466.       mask = (1<<log_sym); // MSB
  467.       for(l=0;l<log_sym;l++)
  468.       {
  469.         mask >>=1;
  470.         biari_encode_symbol(eep_dp, (unsigned char) (act_sym & mask), &ctx->mb_type_contexts[1][act_ctx] );
  471.       }
  472.     }
  473.     if(act_sym==(mode16x16+1)) // additional info for 16x16 Intra-mode
  474.     {
  475.       act_ctx = 7;
  476.       act_sym = mode_sym/12;
  477.       biari_encode_symbol(eep_dp, (unsigned char) act_sym, ctx->mb_type_contexts[1] + act_ctx ); // coding of AC/no AC
  478.       mode_sym = mode_sym % 12;
  479.       act_sym = mode_sym / 4; // coding of cbp: 0,1,2
  480.       act_ctx = 8;
  481.       if (act_sym==0)
  482.       {
  483.         biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[1] + act_ctx );
  484.       }
  485.       else
  486.       {
  487.         biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[1] + act_ctx );
  488.         if (act_sym==1)
  489.         {
  490.           biari_encode_symbol(eep_dp, 0, ctx->mb_type_contexts[1] + act_ctx );
  491.         }
  492.         else
  493.         {
  494.           biari_encode_symbol(eep_dp, 1, ctx->mb_type_contexts[1] + act_ctx );
  495.         }
  496.       }
  497.       mode_sym = mode_sym % 4; // coding of I pred-mode: 0,1,2,3
  498.       act_ctx = 9;
  499.       act_sym = mode_sym/2;
  500.       biari_encode_symbol(eep_dp, (unsigned char) act_sym, ctx->mb_type_contexts[1] + act_ctx );
  501.       act_sym = mode_sym%2;
  502.       biari_encode_symbol(eep_dp, (unsigned char) act_sym, ctx->mb_type_contexts[1] + act_ctx );
  503.     }
  504.   }
  505. }
  506. /*!
  507.  ****************************************************************************
  508.  * brief
  509.  *    This function is used to arithmetically encode a pair of
  510.  *    intra prediction modes of a given MB.
  511.  ****************************************************************************
  512.  */
  513. void writeIntraPredMode2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  514. {
  515.   static int prev_sym = 0;
  516.   static int count = 0; // to detect a new row of intra prediction modes
  517.   TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
  518.   if (count % 2 == 0)
  519.     prev_sym = 0;
  520.   unary_bin_max_encode(eep_dp,(unsigned int) se->value1,ctx->ipr_contexts[prev_sym],1,5);
  521.   prev_sym = se->value1;
  522.   unary_bin_max_encode(eep_dp,(unsigned int) se->value2,ctx->ipr_contexts[prev_sym],1,5);
  523.   prev_sym = se->value2;
  524.   if(++count == MB_BLOCK_SIZE/2) // all modes of one MB have been processed
  525.     count=0;
  526. }
  527. /*!
  528.  ****************************************************************************
  529.  * brief
  530.  *    This function is used to arithmetically encode the reference
  531.  *    parameter of a given MB.
  532.  ****************************************************************************
  533.  */
  534. void writeRefFrame2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  535. {
  536.   MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  537.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  538.   int a, b;
  539.   int act_ctx;
  540.   int act_sym;
  541.   if (currMB->mb_available[0][1] == NULL)
  542.     b = 0;
  543.   else
  544.     b = ( ((currMB->mb_available[0][1])->ref_frame != 0) ? 1 : 0);
  545.   if (currMB->mb_available[1][0] == NULL)
  546.     a = 0;
  547.   else
  548.     a = ( ((currMB->mb_available[1][0])->ref_frame != 0) ? 1 : 0);
  549.   act_ctx = a + 2*b;
  550.   se->context = act_ctx; // store context
  551.   act_sym = se->value1;
  552.   if (act_sym==0)
  553.   {
  554.     biari_encode_symbol(eep_dp, 0, ctx->ref_no_contexts + act_ctx );
  555.   }
  556.   else
  557.   {
  558.     biari_encode_symbol(eep_dp, 1, ctx->ref_no_contexts + act_ctx);
  559.     act_sym--;
  560.     act_ctx=4;
  561.     unary_bin_encode(eep_dp, act_sym,ctx->ref_no_contexts+act_ctx,1);
  562.   }
  563. }
  564. /*!
  565.  ****************************************************************************
  566.  * brief
  567.  *    This function is used to arithmetically encode the motion
  568.  *    vector data of a given MB.
  569.  ****************************************************************************
  570.  */
  571. void writeMVD2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  572. {
  573.   int step_h, step_v;
  574.   int i = img->subblock_x;
  575.   int j = img->subblock_y;
  576.   int a, b;
  577.   int act_ctx;
  578.   int act_sym;
  579.   int mv_pred_res;
  580.   int mv_local_err;
  581.   int mv_sign;
  582.   int k = se->value2; // MVD component
  583.   MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  584.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  585.   int curr_mb_type = currMB->mb_type;
  586.   step_h=input->blc_size[curr_mb_type][0]/BLOCK_SIZE;
  587.   step_v=input->blc_size[curr_mb_type][1]/BLOCK_SIZE;
  588.   if (j==0)
  589.   {
  590.     if (currMB->mb_available[0][1] == NULL)
  591.       b = 0;
  592.     else
  593.       b = absm((currMB->mb_available[0][1])->mvd[0][BLOCK_SIZE-1][i][k]);
  594.   }
  595.   else
  596.     b = absm(currMB->mvd[0][j-step_v][i][k]);
  597.   if (i==0)
  598.   {
  599.     if (currMB->mb_available[1][0] == NULL)
  600.       a = 0;
  601.     else
  602.       a = absm((currMB->mb_available[1][0])->mvd[0][j][BLOCK_SIZE-1][k]);
  603.   }
  604.   else
  605.     a = absm(currMB->mvd[0][j][i-step_h][k]);
  606.   if ((mv_local_err=a+b)<3)
  607.     act_ctx = 5*k;
  608.   else
  609.   {
  610.     if (mv_local_err>32)
  611.       act_ctx=5*k+3;
  612.     else
  613.       act_ctx=5*k+2;
  614.   }
  615.   mv_pred_res = se->value1;
  616.   se->context = act_ctx;
  617.   act_sym = absm(mv_pred_res);
  618.   if (act_sym == 0)
  619.     biari_encode_symbol(eep_dp, 0, &ctx->mv_res_contexts[0][act_ctx] );
  620.   else
  621.   {
  622.     biari_encode_symbol(eep_dp, 1, &ctx->mv_res_contexts[0][act_ctx] );
  623.     mv_sign = (mv_pred_res<0) ? 1: 0;
  624.     act_ctx=5*k+4;
  625.     biari_encode_symbol(eep_dp, (unsigned char) mv_sign, &ctx->mv_res_contexts[1][act_ctx] );
  626.     act_sym--;
  627.     act_ctx=5*k;
  628.     unary_mv_encode(eep_dp,act_sym,ctx->mv_res_contexts[1]+act_ctx,3);
  629.   }
  630. }
  631. /*!
  632.  ****************************************************************************
  633.  * brief
  634.  *    This function is used to arithmetically encode the coded
  635.  *    block pattern of a given delta quant.
  636.  ****************************************************************************
  637.  */
  638. void writeDquant_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  639. {
  640.   MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  641.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  642.   int act_ctx;
  643.   int act_sym;
  644.   int dquant = se->value1;
  645.   int sign=0;
  646.   if (dquant <= 0)
  647.     sign = 1;
  648.   act_sym = abs(dquant) << 1;
  649.   act_sym += sign;
  650.   act_sym --;
  651.   if (currMB->mb_available[1][0] == NULL)
  652.     act_ctx = 0;
  653.   else
  654.     act_ctx = ( ((currMB->mb_available[1][0])->delta_qp != 0) ? 1 : 0);
  655.   if (act_sym==0)
  656.   {
  657.     biari_encode_symbol(eep_dp, 0, ctx->delta_qp_contexts + act_ctx );
  658.   }
  659.   else
  660.   {
  661.     biari_encode_symbol(eep_dp, 1, ctx->delta_qp_contexts + act_ctx);
  662.     act_ctx=2;
  663.     act_sym--;
  664.     unary_bin_encode(eep_dp, act_sym,ctx->delta_qp_contexts+act_ctx,1);
  665.   }
  666. }
  667. /*!
  668.  ****************************************************************************
  669.  * brief
  670.  *    This function is used to arithmetically encode the motion
  671.  *    vector data of a B-frame MB.
  672.  ****************************************************************************
  673.  */
  674. void writeBiMVD2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  675. {
  676.   int step_h, step_v;
  677.   int i = img->subblock_x;
  678.   int j = img->subblock_y;
  679.   int a, b;
  680.   int act_ctx;
  681.   int act_sym;
  682.   int mv_pred_res;
  683.   int mv_local_err;
  684.   int mv_sign;
  685.   int backward = se->value2 & 0x01;
  686.   int k = (se->value2>>1); // MVD component
  687.   MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  688.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  689.   if(backward == 0)
  690.   {
  691.     step_h=img->fw_blc_size_h/BLOCK_SIZE;  // horizontal stepsize
  692.     step_v=img->fw_blc_size_v/BLOCK_SIZE;  // vertical stepsize
  693.   }
  694.   else
  695.   {
  696.     step_h=img->bw_blc_size_h/BLOCK_SIZE;  // horizontal stepsize
  697.     step_v=img->bw_blc_size_v/BLOCK_SIZE;  // vertical stepsize
  698.   }
  699.   if (j==0)
  700.   {
  701.     if (currMB->mb_available[0][1] == NULL)
  702.       b = 0;
  703.     else
  704.       b = absm((currMB->mb_available[0][1])->mvd[backward][BLOCK_SIZE-1][i][k]);
  705.   }
  706.   else
  707.     b = absm(currMB->mvd[backward][j-step_v][i][k]);
  708.   if (i==0)
  709.   {
  710.     if (currMB->mb_available[1][0] == NULL)
  711.       a = 0;
  712.     else
  713.       a = absm((currMB->mb_available[1][0])->mvd[backward][j][BLOCK_SIZE-1][k]);
  714.   }
  715.   else
  716.     a = absm(currMB->mvd[backward][j][i-step_h][k]);
  717.   if ((mv_local_err=a+b)<3)
  718.     act_ctx = 5*k;
  719.   else
  720.   {
  721.     if (mv_local_err>32)
  722.       act_ctx=5*k+3;
  723.     else
  724.       act_ctx=5*k+2;
  725.   }
  726.   mv_pred_res = se->value1;
  727.   se->context = act_ctx;
  728.   act_sym = absm(mv_pred_res);
  729.   if (act_sym == 0)
  730.     biari_encode_symbol(eep_dp, 0, &ctx->mv_res_contexts[0][act_ctx] );
  731.   else
  732.   {
  733.     biari_encode_symbol(eep_dp, 1, &ctx->mv_res_contexts[0][act_ctx] );
  734.     mv_sign = (mv_pred_res<0) ? 1: 0;
  735.     act_ctx=5*k+4;
  736.     biari_encode_symbol(eep_dp, (unsigned char) mv_sign, &ctx->mv_res_contexts[1][act_ctx] );
  737.     act_sym--;
  738.     act_ctx=5*k;
  739.     unary_mv_encode(eep_dp,act_sym,ctx->mv_res_contexts[1]+act_ctx,3);
  740.   }
  741. }
  742. /*!
  743.  ****************************************************************************
  744.  * brief
  745.  *    This function is used to arithmetically encode the forward
  746.  *    or backward bidirectional blocksize (for B frames only)
  747.  ****************************************************************************
  748.  */
  749. void writeBiDirBlkSize2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  750. {
  751.   int act_ctx;
  752.   int act_sym;
  753.   MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
  754.   act_sym = se->value1; // maximum is 6
  755.   act_ctx=4;
  756.   // using the context models of mb_type
  757.   unary_bin_max_encode(eep_dp,(unsigned int) act_sym,ctx->mb_type_contexts[1]+act_ctx,1,6);
  758. }
  759. /*!
  760.  ****************************************************************************
  761.  * brief
  762.  *    This function is used to arithmetically encode the coded
  763.  *    block pattern of a given MB.
  764.  ****************************************************************************
  765.  */
  766. void writeCBP2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  767. {
  768.   TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
  769.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  770.   int mb_x, mb_y;
  771.   int a, b;
  772.   int curr_cbp_ctx, curr_cbp_idx;
  773.   int cbp = se->value1; // symbol to encode
  774.   int mask;
  775.   int cbp_bit;
  776.   if ( se->type == SE_CBP_INTRA )
  777.     curr_cbp_idx = 0;
  778.   else
  779.     curr_cbp_idx = 1;
  780.   //  coding of luma part (bit by bit)
  781.   for (mb_y=0; mb_y < 4; mb_y += 2)
  782.   {
  783.     for (mb_x=0; mb_x < 4; mb_x += 2)
  784.     {
  785.       if (mb_y == 0)
  786.       {
  787.         if (currMB->mb_available[0][1] == NULL)
  788.           b = 0;
  789.         else
  790.           b = (( ((currMB->mb_available[0][1])->cbp & (1<<(2+mb_x/2))) == 0) ? 1 : 0);
  791.       }
  792.       else
  793.         b = ( ((cbp & (1<<(mb_x/2))) == 0) ? 1: 0);
  794.       if (mb_x == 0)
  795.       {
  796.         if (currMB->mb_available[1][0] == NULL)
  797.           a = 0;
  798.         else
  799.           a = (( ((currMB->mb_available[1][0])->cbp & (1<<(mb_y+1))) == 0) ? 1 : 0);
  800.       }
  801.       else
  802.         a = ( ((cbp & (1<<mb_y)) == 0) ? 1: 0);
  803.       curr_cbp_ctx = a+2*b;
  804.       mask = (1<<(mb_y+mb_x/2));
  805.       cbp_bit = cbp & mask;
  806.       biari_encode_symbol(eep_dp, (unsigned char) cbp_bit, ctx->cbp_contexts[curr_cbp_idx][0] + curr_cbp_ctx );
  807.     }
  808.   }
  809.   // coding of chroma part
  810.   b = 0;
  811.   if (currMB->mb_available[0][1] != NULL)
  812.     b = ((currMB->mb_available[0][1])->cbp > 15) ? 1 : 0;
  813.   a = 0;
  814.   if (currMB->mb_available[1][0] != NULL)
  815.     a = ((currMB->mb_available[1][0])->cbp > 15) ? 1 : 0;
  816.   curr_cbp_ctx = a+2*b;
  817.   cbp_bit = (cbp > 15 ) ? 1 : 0;
  818.   biari_encode_symbol(eep_dp, (unsigned char) cbp_bit, ctx->cbp_contexts[curr_cbp_idx][1] + curr_cbp_ctx );
  819.   if (cbp > 15)
  820.   {
  821.     b = 0;
  822.     if (currMB->mb_available[0][1] != NULL)
  823.       if ((currMB->mb_available[0][1])->cbp > 15)
  824.         b = (( ((currMB->mb_available[0][1])->cbp >> 4) == 2) ? 1 : 0);
  825.     a = 0;
  826.     if (currMB->mb_available[1][0] != NULL)
  827.       if ((currMB->mb_available[1][0])->cbp > 15)
  828.         a = (( ((currMB->mb_available[1][0])->cbp >> 4) == 2) ? 1 : 0);
  829.     curr_cbp_ctx = a+2*b;
  830.     cbp_bit = ((cbp>>4) == 2) ? 1 : 0;
  831.     biari_encode_symbol(eep_dp, (unsigned char) cbp_bit, ctx->cbp_contexts[curr_cbp_idx][2] + curr_cbp_ctx );
  832.   }
  833. }
  834. /*!
  835.  ****************************************************************************
  836.  * brief
  837.  *    This function is used to arithmetically encode level and
  838.  *    run of a given MB.
  839.  ****************************************************************************
  840.  */
  841. void writeRunLevel2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
  842. {
  843.   const int level = se->value1;
  844.   const int run = se->value2;
  845.   const int curr_ctx_idx = se->context;
  846.   int curr_level_ctx;
  847.   int sign_of_level;
  848.   int max_run;
  849.   TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
  850.   unary_level_encode(eep_dp,(unsigned int) absm(level),ctx->level_context[curr_ctx_idx]);
  851.   if (level!=0)
  852.   {
  853.     sign_of_level = ((level < 0) ? 1 : 0);
  854.     curr_level_ctx = 3;
  855.     biari_encode_symbol(eep_dp, (unsigned char) sign_of_level, ctx->level_context[curr_ctx_idx] + curr_level_ctx );
  856.     if (curr_ctx_idx != 0 && curr_ctx_idx != 6 && curr_ctx_idx != 5) // not double scan and not DC-chroma
  857.         unary_bin_encode(eep_dp,(unsigned int) run,ctx->run_context[curr_ctx_idx],1);
  858.     else
  859.     {
  860.       max_run =  (curr_ctx_idx == 0) ? 7 : 3;  // if double scan max_run = 7; if DC-chroma max_run = 3;
  861.       unary_bin_max_encode(eep_dp,(unsigned int) run,ctx->run_context[curr_ctx_idx],1,max_run);
  862.     }
  863.   }
  864. }
  865. /*!
  866.  ************************************************************************
  867.  * brief
  868.  *    Unary binarization and encoding of a symbol by using
  869.  *    one or two distinct models for the first two and all
  870.  *    remaining bins
  871. *
  872. ************************************************************************/
  873. void unary_bin_encode(EncodingEnvironmentPtr eep_dp,
  874.                       unsigned int symbol,
  875.                       BiContextTypePtr ctx,
  876.                       int ctx_offset)
  877. {
  878.   unsigned int l;
  879.   BiContextTypePtr ictx;
  880.   if (symbol==0)
  881.   {
  882.     biari_encode_symbol(eep_dp, 0, ctx );
  883.     return;
  884.   }
  885.   else
  886.   {
  887.     biari_encode_symbol(eep_dp, 1, ctx );
  888.     l=symbol;
  889.     ictx=ctx+ctx_offset;
  890.     while ((--l)>0)
  891.       biari_encode_symbol(eep_dp, 1, ictx);
  892.     biari_encode_symbol(eep_dp, 0, ictx);
  893.   }
  894.   return;
  895. }
  896. /*!
  897.  ************************************************************************
  898.  * brief
  899.  *    Unary binarization and encoding of a symbol by using
  900.  *    one or two distinct models for the first two and all
  901.  *    remaining bins; no terminating "0" for max_symbol
  902.  *    (finite symbol alphabet)
  903.  ************************************************************************
  904.  */
  905. void unary_bin_max_encode(EncodingEnvironmentPtr eep_dp,
  906.                           unsigned int symbol,
  907.                           BiContextTypePtr ctx,
  908.                           int ctx_offset,
  909.                           unsigned int max_symbol)
  910. {
  911.   unsigned int l;
  912.   BiContextTypePtr ictx;
  913.   if (symbol==0)
  914.   {
  915.     biari_encode_symbol(eep_dp, 0, ctx );
  916.     return;
  917.   }
  918.   else
  919.   {
  920.     biari_encode_symbol(eep_dp, 1, ctx );
  921.     l=symbol;
  922.     ictx=ctx+ctx_offset;
  923.     while ((--l)>0)
  924.       biari_encode_symbol(eep_dp, 1, ictx);
  925.     if (symbol<max_symbol)
  926.         biari_encode_symbol(eep_dp, 0, ictx);
  927.   }
  928.   return;
  929. }
  930. /*!
  931.  ************************************************************************
  932.  * brief
  933.  *    Unary binarization and encoding of a symbol by using
  934.  *    three distinct models for the first, the second and all
  935.  *    remaining bins
  936.  ************************************************************************
  937.  */
  938. void unary_level_encode(EncodingEnvironmentPtr eep_dp,
  939.                         unsigned int symbol,
  940.                         BiContextTypePtr ctx)
  941. {
  942.   unsigned int l;
  943.   int bin=1;
  944.   BiContextTypePtr ictx=ctx;
  945.   if (symbol==0)
  946.   {
  947.     biari_encode_symbol(eep_dp, 0, ictx );
  948.     return;
  949.   }
  950.   else
  951.   {
  952.     biari_encode_symbol(eep_dp, 1, ictx );
  953.     l=symbol;
  954.     ictx++;
  955.     while ((--l)>0)
  956.     {
  957.       biari_encode_symbol(eep_dp, 1, ictx  );
  958.       if ((++bin)==2) ictx++;
  959.     }
  960.     biari_encode_symbol(eep_dp, 0, ictx  );
  961.   }
  962.   return;
  963. }
  964. /*!
  965.  ************************************************************************
  966.  * brief
  967.  *    Unary binarization and encoding of a symbol by using
  968.  *    four distinct models for the first, the second, intermediate
  969.  *    and all remaining bins
  970.  ************************************************************************
  971.  */
  972. void unary_mv_encode(EncodingEnvironmentPtr eep_dp,
  973.                         unsigned int symbol,
  974.                         BiContextTypePtr ctx,
  975.                         unsigned int max_bin)
  976. {
  977.   unsigned int l;
  978.   unsigned int bin=1;
  979.   BiContextTypePtr ictx=ctx;
  980.   if (symbol==0)
  981.   {
  982.     biari_encode_symbol(eep_dp, 0, ictx );
  983.     return;
  984.   }
  985.   else
  986.   {
  987.     biari_encode_symbol(eep_dp, 1, ictx );
  988.     l=symbol;
  989.     ictx++;
  990.     while ((--l)>0)
  991.     {
  992.       biari_encode_symbol(eep_dp, 1, ictx  );
  993.       if ((++bin)==2) ictx++;
  994.       if (bin==max_bin) ictx++;
  995.     }
  996.     biari_encode_symbol(eep_dp, 0, ictx  );
  997.   }
  998.   return;
  999. }