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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file rdopt_coding_state.c
  4.  *
  5.  * brief
  6.  *    Storing/restoring coding state for
  7.  *    Rate-Distortion optimized mode decision
  8.  *
  9.  * author
  10.  *    Heiko Schwarz
  11.  *
  12.  * date
  13.  *    17. April 2001
  14.  **************************************************************************/
  15. #include "global.h"
  16. #include "rdopt_coding_state.h"
  17. #include "cabac.h"
  18. /*!
  19.  ************************************************************************
  20.  * brief
  21.  *    delete structure for storing coding state
  22.  ************************************************************************
  23.  */
  24. void delete_coding_state (CSptr cs)
  25. {
  26.   if (cs != NULL)
  27.   {
  28.     //=== structures of data partition array ===
  29.     if (cs->encenv    != NULL)   free (cs->encenv);
  30.     if (cs->bitstream != NULL)   free (cs->bitstream);
  31.     //=== contexts for binary arithmetic coding ===
  32.     delete_contexts_MotionInfo  (cs->mot_ctx);
  33.     delete_contexts_TextureInfo (cs->tex_ctx);
  34.     //=== coding state structure ===
  35.     free (cs);
  36.     cs=NULL;
  37.   }
  38. }
  39. /*!
  40.  ************************************************************************
  41.  * brief
  42.  *    create structure for storing coding state
  43.  ************************************************************************
  44.  */
  45. CSptr create_coding_state ()
  46. {
  47.   CSptr cs;
  48.   //=== coding state structure ===
  49.   if ((cs = (CSptr) calloc (1, sizeof(CSobj))) == NULL)
  50.     no_mem_exit("init_coding_state: cs");
  51.   //=== important variables of data partition array ===
  52.   cs->no_part = params->partition_mode==0?1:3;
  53.   if (params->symbol_mode == CABAC)
  54.   {
  55.     if ((cs->encenv = (EncodingEnvironment*) calloc (cs->no_part, sizeof(EncodingEnvironment))) == NULL)
  56.       no_mem_exit("init_coding_state: cs->encenv");
  57.   }
  58.   else
  59.   {
  60.     cs->encenv = NULL;
  61.   }
  62.   if ((cs->bitstream = (Bitstream*) calloc (cs->no_part, sizeof(Bitstream))) == NULL)
  63.     no_mem_exit("init_coding_state: cs->bitstream");
  64.   //=== context for binary arithmetic coding ===
  65.   cs->symbol_mode = params->symbol_mode;
  66.   if (cs->symbol_mode == CABAC)
  67.   {
  68.     cs->mot_ctx = create_contexts_MotionInfo ();
  69.     cs->tex_ctx = create_contexts_TextureInfo();
  70.   }
  71.   else
  72.   {
  73.     cs->mot_ctx = NULL;
  74.     cs->tex_ctx = NULL;
  75.   }
  76.   return cs;
  77. }
  78. /*!
  79.  ************************************************************************
  80.  * brief
  81.  *    store coding state (for rd-optimized mode decision)
  82.  ************************************************************************
  83.  */
  84. void store_coding_state (Macroblock *currMB, CSptr cs)
  85. {
  86.   int  i;
  87.   int  i_last = img->currentPicture->idr_flag? 1:cs->no_part;
  88.   Slice *currSlice = img->currentSlice;
  89.   if (!params->rdopt)  return;
  90.   if (cs->symbol_mode==CABAC)
  91.   {
  92.     //=== important variables of data partition array ===
  93.     //only one partition for IDR img
  94.     for (i = 0; i < i_last; i++)
  95.     {
  96.       cs->encenv[i] = currSlice->partArr[i].ee_cabac;
  97.       cs->bitstream[i] = *currSlice->partArr[i].bitstream;
  98.     }
  99.     //=== contexts for binary arithmetic coding ===
  100.     *cs->mot_ctx = *currSlice->mot_ctx;
  101.     *cs->tex_ctx = *currSlice->tex_ctx;
  102.   }
  103.   else
  104.   {
  105.     //=== important variables of data partition array ===
  106.     for (i = 0; i < i_last; i++)
  107.     {
  108.       cs->bitstream[i] = *currSlice->partArr[i].bitstream;
  109.     }
  110.   }
  111.   //=== syntax element number and bitcounters ===
  112.   memcpy (cs->bitcounter, currMB->bitcounter, MAX_BITCOUNTER_MB * sizeof(int));
  113.   //=== elements of current macroblock ===
  114.   memcpy (cs->mvd, currMB->mvd, BLOCK_CONTEXT * sizeof(short));
  115.   memcpy (cs->cbp_bits, currMB->cbp_bits, 3 * sizeof(int64));
  116.   
  117.   if (img->P444_joined)
  118.   memcpy (cs->cbp_bits_8x8, currMB->cbp_bits_8x8, 3 * sizeof(int64));
  119. }
  120. /*!
  121.  ************************************************************************
  122.  * brief
  123.  *    restore coding state (for rd-optimized mode decision)
  124.  ************************************************************************
  125.  */
  126. void reset_coding_state (Macroblock *currMB, CSptr cs)
  127. {
  128.   int  i;
  129.   int  i_last = img->currentPicture->idr_flag? 1:cs->no_part;
  130.   Slice *currSlice = img->currentSlice;
  131.   if (!params->rdopt)  return;
  132.   if (cs->symbol_mode==CABAC)
  133.   {
  134.     //=== important variables of data partition array ===
  135.     //only one partition for IDR img
  136.     for (i = 0; i < i_last; i++)
  137.     {
  138.       //--- parameters of encoding environments ---
  139.       currSlice->partArr[i].ee_cabac = cs->encenv[i];
  140.       *currSlice->partArr[i].bitstream = cs->bitstream[i];
  141.     }
  142.     //=== contexts for binary arithmetic coding ===
  143.     *currSlice->mot_ctx = *cs->mot_ctx;
  144.     *currSlice->tex_ctx = *cs->tex_ctx;
  145.   }
  146.   else
  147.   {
  148.     //=== important variables of data partition array ===
  149.     //only one partition for IDR img
  150.     for (i = 0; i < i_last; i++)
  151.     {
  152.       //--- parameters of encoding environments ---
  153.       *currSlice->partArr[i].bitstream = cs->bitstream[i];
  154.     }
  155.   }
  156.   //=== syntax element number and bit counters ===
  157.   memcpy (currMB->bitcounter, cs->bitcounter, MAX_BITCOUNTER_MB * sizeof(int));
  158.   //=== elements of current macroblock ===
  159.   memcpy (currMB->mvd, cs->mvd, BLOCK_CONTEXT * sizeof(short));
  160.   memcpy (currMB->cbp_bits, cs->cbp_bits, 3 * sizeof(int64));
  161.   if(img->P444_joined)
  162.     memcpy (currMB->cbp_bits_8x8, cs->cbp_bits_8x8, 3 * sizeof(int64));
  163. }