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

流媒体/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 rdopt_coding_state.c
  35.  *
  36.  * brief
  37.  *    Storing/restoring coding state for
  38.  *    Rate-Distortion optimized mode decision
  39.  *
  40.  * author
  41.  *    Heiko Schwarz
  42.  *
  43.  * date
  44.  *    17. April 2001
  45.  **************************************************************************/
  46. #include <stdlib.h>
  47. #include <math.h>
  48. #include <memory.h>
  49. #include "rdopt_coding_state.h"
  50. //===== static variable: structure for storing the coding state =====
  51. RDCodingState  *cs = 0;
  52. /*!
  53.  ************************************************************************
  54.  * brief
  55.  *    delete structure for storing coding state
  56.  ************************************************************************
  57.  */
  58. void
  59. clear_coding_state ()
  60. {
  61.   if (cs != NULL)
  62.     {
  63.       //=== structures of data partition array ===
  64.       if (cs->encenv    != NULL)   free (cs->encenv);
  65.       if (cs->bitstream != NULL)   free (cs->bitstream);
  66.       //=== contexts for binary arithmetic coding ===
  67.       delete_contexts_MotionInfo  (cs->mot_ctx);
  68.       delete_contexts_TextureInfo (cs->tex_ctx);
  69.       //=== coding state structure ===
  70.       free (cs);
  71.       cs=NULL;
  72.     }
  73. }
  74. /*!
  75.  ************************************************************************
  76.  * brief
  77.  *    create structure for storing coding state
  78.  ************************************************************************
  79.  */
  80. void
  81. init_coding_state ()
  82. {
  83.   //=== coding state structure ===
  84.   if ((cs = (RDCodingState*) calloc (1, sizeof(RDCodingState))) == NULL)
  85.     no_mem_exit("init_coding_state: cs");
  86.   //=== important variables of data partition array ===
  87.   cs->no_part = img->currentSlice->max_part_nr;
  88.   if (input->symbol_mode == CABAC)
  89.   {
  90.     if ((cs->encenv = (EncodingEnvironment*) calloc (cs->no_part, sizeof(EncodingEnvironment))) == NULL)
  91.       no_mem_exit("init_coding_state: cs->encenv");
  92.   }
  93.   else
  94.   {
  95.     cs->encenv = NULL;
  96.   }
  97.   if ((cs->bitstream = (Bitstream*) calloc (cs->no_part, sizeof(Bitstream))) == NULL)
  98.     no_mem_exit("init_coding_state: cs->bitstream");
  99.   //=== context for binary arithmetic coding ===
  100.   cs->symbol_mode = input->symbol_mode;
  101.   if (cs->symbol_mode == CABAC)
  102.   {
  103.     cs->mot_ctx = create_contexts_MotionInfo ();
  104.     cs->tex_ctx = create_contexts_TextureInfo();
  105.   }
  106.   else
  107.   {
  108.     cs->mot_ctx = NULL;
  109.     cs->tex_ctx = NULL;
  110.   }
  111. }
  112. /*!
  113.  ************************************************************************
  114.  * brief
  115.  *    store coding state (for rd-optimized mode decision)
  116.  ************************************************************************
  117.  */
  118. void
  119. store_coding_state ()
  120. {
  121.   int  i, j, k;
  122.   EncodingEnvironment  *ee_src, *ee_dest;
  123.   Bitstream            *bs_src, *bs_dest;
  124.   MotionInfoContexts   *mc_src  = img->currentSlice->mot_ctx;
  125.   TextureInfoContexts  *tc_src  = img->currentSlice->tex_ctx;
  126.   MotionInfoContexts   *mc_dest = cs->mot_ctx;
  127.   TextureInfoContexts  *tc_dest = cs->tex_ctx;
  128.   Macroblock           *currMB  = &(img->mb_data [img->current_mb_nr]);
  129.   //=== important variables of data partition array ===
  130.   for (i = 0; i < cs->no_part; i++)
  131.   {
  132.     ee_src  = &(img->currentSlice->partArr[i].ee_cabac);
  133.     bs_src  =   img->currentSlice->partArr[i].bitstream;
  134.     ee_dest = &(cs->encenv   [i]);
  135.     bs_dest = &(cs->bitstream[i]);
  136.     //--- parameters of encoding environments ---
  137.     if (cs->symbol_mode == CABAC)
  138.     {
  139.       ee_dest->Elow            = ee_src->Elow;
  140.       ee_dest->Ehigh           = ee_src->Ehigh;
  141.       ee_dest->Ebuffer         = ee_src->Ebuffer;
  142.       ee_dest->Ebits_to_go     = ee_src->Ebits_to_go;
  143.       ee_dest->Ebits_to_follow = ee_src->Ebits_to_follow;
  144.     }
  145.     //--- bitstream parameters ---
  146.     bs_dest->byte_pos          = bs_src->byte_pos;
  147.     bs_dest->bits_to_go        = bs_src->bits_to_go;
  148.     bs_dest->byte_buf          = bs_src->byte_buf;
  149.     bs_dest->stored_byte_pos   = bs_src->stored_byte_pos;
  150.     bs_dest->stored_bits_to_go = bs_src->stored_bits_to_go;
  151.     bs_dest->stored_byte_buf   = bs_src->stored_byte_buf;
  152.   }
  153.   //=== contexts for binary arithmetic coding ===
  154.   if (cs->symbol_mode == CABAC)
  155.   {
  156.     //--- motion coding contexts ---
  157.     for (i = 0; i < 2; i++)
  158.     {
  159.       for (j = 0; j < NUM_MB_TYPE_CTX; j++)
  160.         biari_copy_context (&(mc_src->mb_type_contexts[i][j]), &(mc_dest->mb_type_contexts[i][j]));
  161.       for (j = 0; j < NUM_MV_RES_CTX; j++)
  162.         biari_copy_context (&(mc_src->mv_res_contexts[i][j]), &(mc_dest->mv_res_contexts[i][j]));
  163.     }
  164.     for (i = 0; i < NUM_REF_NO_CTX; i++)
  165.       biari_copy_context (&(mc_src->ref_no_contexts[i]), &(mc_dest->ref_no_contexts[i]));
  166.     //--- texture coding contexts ---
  167.     for (i = 0; i < 6; i++)
  168.       for (j = 0; j < NUM_IPR_CTX; j++)
  169.         biari_copy_context (&(tc_src->ipr_contexts[i][j]), &(tc_dest->ipr_contexts[i][j]));
  170.     for (i = 0; i < 2; i++)
  171.       for (j = 0; j < 3; j++)
  172.         for (k = 0; k < NUM_CBP_CTX; k++)
  173.           biari_copy_context (&(tc_src->cbp_contexts[i][j][k]), &(tc_dest->cbp_contexts[i][j][k]));
  174.     for (i = 0; i < NUM_TRANS_TYPE; i++)
  175.     {
  176.       for (j = 0; j < NUM_LEVEL_CTX; j++)
  177.         biari_copy_context (&(tc_src->level_context[i][j]), &(tc_dest->level_context[i][j]));
  178.       for (j = 0; j < NUM_RUN_CTX; j++)
  179.         biari_copy_context (&(tc_src->run_context[i][j]), &(tc_dest->run_context[i][j]));
  180.     }
  181.   }
  182.   //=== syntax element number and bitcounters ===
  183.   cs->currSEnr = currMB->currSEnr;
  184.   for (i = 0; i < MAX_BITCOUNTER_MB; i++)
  185.     cs->bitcounter[i] = currMB->bitcounter[i];
  186.   //=== elements of current macroblock ===
  187.   memcpy (cs->mvd, currMB->mvd, 2*2*BLOCK_MULTIPLE*BLOCK_MULTIPLE*sizeof(int));
  188. }
  189. /*!
  190.  ************************************************************************
  191.  * brief
  192.  *    restore coding state (for rd-optimized mode decision)
  193.  ************************************************************************
  194.  */
  195. void
  196. restore_coding_state ()
  197. {
  198.   int  i, j, k;
  199.   EncodingEnvironment  *ee_src, *ee_dest;
  200.   Bitstream            *bs_src, *bs_dest;
  201.   MotionInfoContexts   *mc_dest = img->currentSlice->mot_ctx;
  202.   TextureInfoContexts  *tc_dest = img->currentSlice->tex_ctx;
  203.   MotionInfoContexts   *mc_src  = cs->mot_ctx;
  204.   TextureInfoContexts  *tc_src  = cs->tex_ctx;
  205.   Macroblock           *currMB  = &(img->mb_data [img->current_mb_nr]);
  206.   //=== important variables of data partition array ===
  207.   for (i = 0; i < cs->no_part; i++)
  208.   {
  209.     ee_dest = &(img->currentSlice->partArr[i].ee_cabac);
  210.     bs_dest =   img->currentSlice->partArr[i].bitstream;
  211.     ee_src  = &(cs->encenv   [i]);
  212.     bs_src  = &(cs->bitstream[i]);
  213.     //--- parameters of encoding environments ---
  214.     if (cs->symbol_mode == CABAC)
  215.     {
  216.       ee_dest->Elow            = ee_src->Elow;
  217.       ee_dest->Ehigh           = ee_src->Ehigh;
  218.       ee_dest->Ebuffer         = ee_src->Ebuffer;
  219.       ee_dest->Ebits_to_go     = ee_src->Ebits_to_go;
  220.       ee_dest->Ebits_to_follow = ee_src->Ebits_to_follow;
  221.     }
  222.     //--- bitstream parameters ---
  223.     bs_dest->byte_pos          = bs_src->byte_pos;
  224.     bs_dest->bits_to_go        = bs_src->bits_to_go;
  225.     bs_dest->byte_buf          = bs_src->byte_buf;
  226.     bs_dest->stored_byte_pos   = bs_src->stored_byte_pos;
  227.     bs_dest->stored_bits_to_go = bs_src->stored_bits_to_go;
  228.     bs_dest->stored_byte_buf   = bs_src->stored_byte_buf;
  229.   }
  230.   //=== contexts for binary arithmetic coding ===
  231.   if (cs->symbol_mode == CABAC)
  232.   {
  233.     //--- motion coding contexts ---
  234.     for (i = 0; i < 2; i++)
  235.     {
  236.       for (j = 0; j < NUM_MB_TYPE_CTX; j++)
  237.         biari_copy_context (&(mc_src->mb_type_contexts[i][j]), &(mc_dest->mb_type_contexts[i][j]));
  238.       for (j = 0; j < NUM_MV_RES_CTX; j++)
  239.         biari_copy_context (&(mc_src->mv_res_contexts[i][j]), &(mc_dest->mv_res_contexts[i][j]));
  240.     }
  241.     for (i = 0; i < NUM_REF_NO_CTX; i++)
  242.       biari_copy_context (&(mc_src->ref_no_contexts[i]), &(mc_dest->ref_no_contexts[i]));
  243.     //--- texture coding contexts ---
  244.     for (i = 0; i < 6; i++)
  245.       for (j = 0; j < NUM_IPR_CTX; j++)
  246.         biari_copy_context (&(tc_src->ipr_contexts[i][j]), &(tc_dest->ipr_contexts[i][j]));
  247.       for (i = 0; i < 2; i++)
  248.         for (j = 0; j < 3; j++)
  249.           for (k = 0; k < NUM_CBP_CTX; k++)
  250.             biari_copy_context (&(tc_src->cbp_contexts[i][j][k]), &(tc_dest->cbp_contexts[i][j][k]));
  251.       for (i = 0; i < NUM_TRANS_TYPE; i++)
  252.       {
  253.         for (j = 0; j < NUM_LEVEL_CTX; j++)
  254.           biari_copy_context (&(tc_src->level_context[i][j]), &(tc_dest->level_context[i][j]));
  255.         for (j = 0; j < NUM_RUN_CTX; j++)
  256.           biari_copy_context (&(tc_src->run_context[i][j]), &(tc_dest->run_context[i][j]));
  257.       }
  258.   }
  259.   //=== syntax element number and bitcounters ===
  260.   currMB->currSEnr = cs->currSEnr;
  261.   for (i = 0; i < MAX_BITCOUNTER_MB; i++)
  262.     currMB->bitcounter[i] = cs->bitcounter[i];
  263.   //=== elements of current macroblock ===
  264.   memcpy (currMB->mvd, cs->mvd, 2*2*BLOCK_MULTIPLE*BLOCK_MULTIPLE*sizeof(int));
  265. }