⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdopt_coding_state.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
字号:
/************************************************************************* COPYRIGHT AND WARRANTY INFORMATION** Copyright 2001, International Telecommunications Union, Geneva** DISCLAIMER OF WARRANTY** These software programs are available to the user without any* license fee or royalty on an "as is" basis. The ITU disclaims* any and all warranties, whether express, implied, or* statutory, including any implied warranties of merchantability* or of fitness for a particular purpose.  In no event shall the* contributor or the ITU be liable for any incidental, punitive, or* consequential damages of any kind whatsoever arising from the* use of these programs.** This disclaimer of warranty extends to the user of these programs* and user's customers, employees, agents, transferees, successors,* and assigns.** The ITU does not represent or warrant that the programs furnished* hereunder are free of infringement of any third-party patents.* Commercial implementations of ITU-T Recommendations, including* shareware, may be subject to royalty fees to patent holders.* Information regarding the ITU-T patent policy is available from* the ITU Web site at http://www.itu.int.** THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.*************************************************************************//*! *************************************************************************** * \file rdopt_coding_state.c * * \brief *    Storing/restoring coding state for *    Rate-Distortion optimized mode decision * * \author *    Heiko Schwarz * * \date *    17. April 2001 **************************************************************************/#include <stdlib.h>#include <math.h>#include <memory.h>#include "rdopt_coding_state.h"//===== static variable: structure for storing the coding state =====RDCodingState  *cs = 0;/*! ************************************************************************ * \brief *    delete structure for storing coding state ************************************************************************ */voidclear_coding_state (){  if (cs != NULL)    {      //=== structures of data partition array ===      if (cs->encenv    != NULL)   free (cs->encenv);      if (cs->bitstream != NULL)   free (cs->bitstream);      //=== contexts for binary arithmetic coding ===      delete_contexts_MotionInfo  (cs->mot_ctx);      delete_contexts_TextureInfo (cs->tex_ctx);      //=== coding state structure ===      free (cs);      cs=NULL;    }}/*! ************************************************************************ * \brief *    create structure for storing coding state ************************************************************************ */voidinit_coding_state (){  //=== coding state structure ===  if ((cs = (RDCodingState*) calloc (1, sizeof(RDCodingState))) == NULL)    no_mem_exit("init_coding_state: cs");  //=== important variables of data partition array ===  cs->no_part = img->currentSlice->max_part_nr;  if (input->symbol_mode == CABAC)  {    if ((cs->encenv = (EncodingEnvironment*) calloc (cs->no_part, sizeof(EncodingEnvironment))) == NULL)      no_mem_exit("init_coding_state: cs->encenv");  }  else  {    cs->encenv = NULL;  }  if ((cs->bitstream = (Bitstream*) calloc (cs->no_part, sizeof(Bitstream))) == NULL)    no_mem_exit("init_coding_state: cs->bitstream");  //=== context for binary arithmetic coding ===  cs->symbol_mode = input->symbol_mode;  if (cs->symbol_mode == CABAC)  {    cs->mot_ctx = create_contexts_MotionInfo ();    cs->tex_ctx = create_contexts_TextureInfo();  }  else  {    cs->mot_ctx = NULL;    cs->tex_ctx = NULL;  }}/*! ************************************************************************ * \brief *    store coding state (for rd-optimized mode decision) ************************************************************************ */voidstore_coding_state (){  int  i, j, k;  EncodingEnvironment  *ee_src, *ee_dest;  Bitstream            *bs_src, *bs_dest;  MotionInfoContexts   *mc_src  = img->currentSlice->mot_ctx;  TextureInfoContexts  *tc_src  = img->currentSlice->tex_ctx;  MotionInfoContexts   *mc_dest = cs->mot_ctx;  TextureInfoContexts  *tc_dest = cs->tex_ctx;  Macroblock           *currMB  = &(img->mb_data [img->current_mb_nr]);  //=== important variables of data partition array ===  for (i = 0; i < cs->no_part; i++)  {    ee_src  = &(img->currentSlice->partArr[i].ee_cabac);    bs_src  =   img->currentSlice->partArr[i].bitstream;    ee_dest = &(cs->encenv   [i]);    bs_dest = &(cs->bitstream[i]);    //--- parameters of encoding environments ---    if (cs->symbol_mode == CABAC)    {      ee_dest->Elow            = ee_src->Elow;      ee_dest->Ehigh           = ee_src->Ehigh;      ee_dest->Ebuffer         = ee_src->Ebuffer;      ee_dest->Ebits_to_go     = ee_src->Ebits_to_go;      ee_dest->Ebits_to_follow = ee_src->Ebits_to_follow;    }    //--- bitstream parameters ---    bs_dest->byte_pos          = bs_src->byte_pos;    bs_dest->bits_to_go        = bs_src->bits_to_go;    bs_dest->byte_buf          = bs_src->byte_buf;    bs_dest->stored_byte_pos   = bs_src->stored_byte_pos;    bs_dest->stored_bits_to_go = bs_src->stored_bits_to_go;    bs_dest->stored_byte_buf   = bs_src->stored_byte_buf;  }  //=== contexts for binary arithmetic coding ===  if (cs->symbol_mode == CABAC)  {    //--- motion coding contexts ---    for (i = 0; i < 2; i++)    {      for (j = 0; j < NUM_MB_TYPE_CTX; j++)        biari_copy_context (&(mc_src->mb_type_contexts[i][j]), &(mc_dest->mb_type_contexts[i][j]));      for (j = 0; j < NUM_MV_RES_CTX; j++)        biari_copy_context (&(mc_src->mv_res_contexts[i][j]), &(mc_dest->mv_res_contexts[i][j]));    }    for (i = 0; i < NUM_REF_NO_CTX; i++)      biari_copy_context (&(mc_src->ref_no_contexts[i]), &(mc_dest->ref_no_contexts[i]));    //--- texture coding contexts ---    for (i = 0; i < 6; i++)      for (j = 0; j < NUM_IPR_CTX; j++)        biari_copy_context (&(tc_src->ipr_contexts[i][j]), &(tc_dest->ipr_contexts[i][j]));    for (i = 0; i < 2; i++)      for (j = 0; j < 3; j++)        for (k = 0; k < NUM_CBP_CTX; k++)          biari_copy_context (&(tc_src->cbp_contexts[i][j][k]), &(tc_dest->cbp_contexts[i][j][k]));    for (i = 0; i < NUM_TRANS_TYPE; i++)    {      for (j = 0; j < NUM_LEVEL_CTX; j++)        biari_copy_context (&(tc_src->level_context[i][j]), &(tc_dest->level_context[i][j]));      for (j = 0; j < NUM_RUN_CTX; j++)        biari_copy_context (&(tc_src->run_context[i][j]), &(tc_dest->run_context[i][j]));    }  }  //=== syntax element number and bitcounters ===  cs->currSEnr = currMB->currSEnr;  for (i = 0; i < MAX_BITCOUNTER_MB; i++)    cs->bitcounter[i] = currMB->bitcounter[i];  //=== elements of current macroblock ===  memcpy (cs->mvd, currMB->mvd, 2*2*BLOCK_MULTIPLE*BLOCK_MULTIPLE*sizeof(int));}/*! ************************************************************************ * \brief *    restore coding state (for rd-optimized mode decision) ************************************************************************ */voidrestore_coding_state (){  int  i, j, k;  EncodingEnvironment  *ee_src, *ee_dest;  Bitstream            *bs_src, *bs_dest;  MotionInfoContexts   *mc_dest = img->currentSlice->mot_ctx;  TextureInfoContexts  *tc_dest = img->currentSlice->tex_ctx;  MotionInfoContexts   *mc_src  = cs->mot_ctx;  TextureInfoContexts  *tc_src  = cs->tex_ctx;  Macroblock           *currMB  = &(img->mb_data [img->current_mb_nr]);  //=== important variables of data partition array ===  for (i = 0; i < cs->no_part; i++)  {    ee_dest = &(img->currentSlice->partArr[i].ee_cabac);    bs_dest =   img->currentSlice->partArr[i].bitstream;    ee_src  = &(cs->encenv   [i]);    bs_src  = &(cs->bitstream[i]);    //--- parameters of encoding environments ---    if (cs->symbol_mode == CABAC)    {      ee_dest->Elow            = ee_src->Elow;      ee_dest->Ehigh           = ee_src->Ehigh;      ee_dest->Ebuffer         = ee_src->Ebuffer;      ee_dest->Ebits_to_go     = ee_src->Ebits_to_go;      ee_dest->Ebits_to_follow = ee_src->Ebits_to_follow;    }    //--- bitstream parameters ---    bs_dest->byte_pos          = bs_src->byte_pos;    bs_dest->bits_to_go        = bs_src->bits_to_go;    bs_dest->byte_buf          = bs_src->byte_buf;    bs_dest->stored_byte_pos   = bs_src->stored_byte_pos;    bs_dest->stored_bits_to_go = bs_src->stored_bits_to_go;    bs_dest->stored_byte_buf   = bs_src->stored_byte_buf;  }  //=== contexts for binary arithmetic coding ===  if (cs->symbol_mode == CABAC)  {    //--- motion coding contexts ---    for (i = 0; i < 2; i++)    {      for (j = 0; j < NUM_MB_TYPE_CTX; j++)        biari_copy_context (&(mc_src->mb_type_contexts[i][j]), &(mc_dest->mb_type_contexts[i][j]));      for (j = 0; j < NUM_MV_RES_CTX; j++)        biari_copy_context (&(mc_src->mv_res_contexts[i][j]), &(mc_dest->mv_res_contexts[i][j]));    }    for (i = 0; i < NUM_REF_NO_CTX; i++)      biari_copy_context (&(mc_src->ref_no_contexts[i]), &(mc_dest->ref_no_contexts[i]));    //--- texture coding contexts ---    for (i = 0; i < 6; i++)      for (j = 0; j < NUM_IPR_CTX; j++)        biari_copy_context (&(tc_src->ipr_contexts[i][j]), &(tc_dest->ipr_contexts[i][j]));      for (i = 0; i < 2; i++)        for (j = 0; j < 3; j++)          for (k = 0; k < NUM_CBP_CTX; k++)            biari_copy_context (&(tc_src->cbp_contexts[i][j][k]), &(tc_dest->cbp_contexts[i][j][k]));      for (i = 0; i < NUM_TRANS_TYPE; i++)      {        for (j = 0; j < NUM_LEVEL_CTX; j++)          biari_copy_context (&(tc_src->level_context[i][j]), &(tc_dest->level_context[i][j]));        for (j = 0; j < NUM_RUN_CTX; j++)          biari_copy_context (&(tc_src->run_context[i][j]), &(tc_dest->run_context[i][j]));      }  }  //=== syntax element number and bitcounters ===  currMB->currSEnr = cs->currSEnr;  for (i = 0; i < MAX_BITCOUNTER_MB; i++)    currMB->bitcounter[i] = cs->bitcounter[i];  //=== elements of current macroblock ===  memcpy (currMB->mvd, cs->mvd, 2*2*BLOCK_MULTIPLE*BLOCK_MULTIPLE*sizeof(int));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -