rvlcdec.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  4. Takeshi Nagai (TOSHIBA CORPORATION)
  5.     and edited by:
  6. Toshiaki Watanabe (TOSHIBA CORPORATION)
  7.   in the course of development of the <MPEG-4 Video(ISO/IEC 14496-2)>. This
  8.   software module is an implementation of a part of one or more <MPEG-4 Video
  9.   (ISO/IEC 14496-2)> tools as specified by the <MPEG-4 Video(ISO/IEC 14496-2)
  10.   >. ISO/IEC gives users of the <MPEG-4 Video(ISO/IEC 14496-2)> free license
  11.   to this software module or modifications thereof for use in hardware or
  12.   software products claiming conformance to the <MPEG-4 Video(ISO/IEC 14496-2
  13.   )>. Those intending to use this software module in hardware or software
  14.   products are advised that its use may infringe existing patents. The
  15.   original developer of this software module and his/her company, the
  16.   subsequent editors and their companies, and ISO/IEC have no liability for
  17.   use of this software module or modifications thereof in an implementation.
  18.   Copyright is not released for non <MPEG-4 Video(ISO/IEC 14496-2)>
  19.   conforming products. TOSHIBA CORPORATION retains full right to use the code
  20.   for his/her own purpose, assign or donate the code to a third party and to
  21.   inhibit third parties from using the code for non <MPEG-4 Video(ISO/IEC
  22.   14496-2)> conforming products. This copyright notice must be included in
  23.   all copies or derivative works.
  24.   Copyright (c)1997.
  25. *************************************************************************/
  26. //#include <stdlib.h>
  27. #include <math.h>
  28. #include "typeapi.h"
  29. #include "codehead.h"
  30. #include "mode.hpp"
  31. #include "global.hpp"
  32. #include "entropy/bitstrm.hpp"
  33. #include "entropy/entropy.hpp"
  34. #include "entropy/huffman.hpp"
  35. #include "dct.hpp"
  36. #include "vopses.hpp"
  37. #include "vopsedec.hpp"
  38. #ifdef __MFC_
  39. #ifdef _DEBUG
  40. #undef THIS_FILE
  41. static char BASED_CODE THIS_FILE[] = __FILE__;
  42. #endif
  43. #define new DEBUG_NEW    
  44. #endif // __MFC_
  45. Void CVideoObjectDecoder::decodeIntraRVLCTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag)
  46. {
  47. Bool bIsLastRun = FALSE;
  48. Int  iRun = 0;
  49. Int  iLevel = 0;
  50. Int  iCoef = iCoefStart;
  51. Long lIndex;
  52. while (!bIsLastRun) {
  53. lIndex = m_pentrdecSet->m_pentrdecDCTIntraRVLC->decodeSymbol();
  54. if (lIndex != TCOEF_RVLC_ESCAPE) { // if Huffman
  55. decodeIntraRVLCtableIndex (lIndex, iLevel, iRun, bIsLastRun);
  56. }
  57. else {
  58. decodeRVLCEscape (iLevel, iRun, bIsLastRun, g_rgiLMAXintra, g_rgiRMAXintra, 
  59.   m_pentrdecSet->m_pentrdecDCTIntraRVLC, &CVideoObjectDecoder::decodeIntraRVLCtableIndex);
  60. }
  61. for (Int i = 0; i < iRun; i++) {
  62. rgiCoefQ [rgiZigzag [iCoef]] = 0;
  63. iCoef++;
  64. }
  65. rgiCoefQ [rgiZigzag [iCoef]] = iLevel;
  66. iCoef++;
  67. }
  68. for (Int i = iCoef; i < BLOCK_SQUARE_SIZE; i++) // fill the rest w/ zero
  69. rgiCoefQ [rgiZigzag [i]]  = 0;
  70. }
  71. Void CVideoObjectDecoder::decodeRVLCEscape (Int& iLevel, Int& iRun, Int& bIsLastRun, const Int* rgiLMAX, const Int* rgiRMAX, 
  72.    CEntropyDecoder* pentrdec, DECODE_TABLE_INDEX decodeVLCtableIndex)
  73. {
  74. // for error resilience the code should check to see if escape coded tcoef can be
  75. // encoded using non-escape mode. if so, then it is an error case.
  76. Bool bFlagEscape = (Bool) m_pbitstrmIn->getBits (1);
  77. assert(bFlagEscape == TRUE);
  78. bIsLastRun = (Bool) m_pbitstrmIn->getBits (1);
  79. iRun = (Int) m_pbitstrmIn->getBits (NUMBITS_RVLC_ESC_RUN);
  80. assert (iRun < BLOCK_SQUARE_SIZE);
  81. Int iLevelBits = 12; // = m_volmd.nBits;
  82. Int iMarker = m_pbitstrmIn->getBits (1);
  83. assert(iMarker == 1);
  84. iLevel = (Int) m_pbitstrmIn->getBits (iLevelBits - 1);
  85. iMarker = m_pbitstrmIn->getBits (1);
  86. assert(iMarker == 1);
  87. Long lIndex = m_pentrdecSet->m_pentrdecDCTIntraRVLC->decodeSymbol();
  88. assert (lIndex == TCOEF_RVLC_ESCAPE);
  89. if((Bool) m_pbitstrmIn->getBits (1) == TRUE){
  90. iLevel = - iLevel;
  91. }
  92. assert (iLevel != 0);
  93. }
  94. Void CVideoObjectDecoder::decodeInterRVLCTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag)
  95. {
  96. Bool bIsLastRun = FALSE;
  97. Int  iRun = 0;
  98. Int  iLevel = 0;
  99. Int  iCoef = iCoefStart;
  100. Long lIndex;
  101. while (!bIsLastRun) {
  102. lIndex = m_pentrdecSet->m_pentrdecDCTRVLC->decodeSymbol();
  103. if (lIndex != TCOEF_RVLC_ESCAPE) { // if Huffman
  104. decodeInterRVLCtableIndex (lIndex, iLevel, iRun, bIsLastRun);
  105. assert (iRun < BLOCK_SQUARE_SIZE);
  106. }
  107. else
  108. decodeRVLCEscape (iLevel, iRun, bIsLastRun, g_rgiLMAXinter, g_rgiRMAXinter, 
  109.   m_pentrdecSet->m_pentrdecDCTRVLC, &CVideoObjectDecoder::decodeInterRVLCtableIndex);
  110. for (Int i = 0; i < iRun; i++) {
  111. rgiCoefQ [rgiZigzag [iCoef]] = 0;
  112. iCoef++;
  113. }
  114. rgiCoefQ [rgiZigzag [iCoef]] = iLevel;
  115. iCoef++;
  116. }
  117. for (Int i = iCoef; i < BLOCK_SQUARE_SIZE; i++) // fill the rest w/ zero
  118. rgiCoefQ [rgiZigzag [i]]  = 0;
  119. }
  120. Void CVideoObjectDecoder::decodeIntraRVLCtableIndex  (Int iIndex, Int& iLevel, Int& iRun, Int& bIsLastRun)
  121. {
  122. static Int iLevelMask = 0x0000001F;
  123. static Int iRunMask = 0x000007E0;
  124. static Int iLastRunMask = 0x00000800;
  125. iLevel = iLevelMask & grgiIntraRVLCYAVCLHashingTable [iIndex];
  126. iRun = (iRunMask & grgiIntraRVLCYAVCLHashingTable [iIndex]) >> 5;
  127. bIsLastRun = (iLastRunMask  & grgiIntraRVLCYAVCLHashingTable [iIndex]) >> 11;
  128. if (m_pentrdecSet->m_pentrdecDCTIntraRVLC->bitstream()->getBits (1) == TRUE) // get signbit
  129. iLevel = -iLevel;
  130. assert (iRun < BLOCK_SQUARE_SIZE);
  131. }
  132. Void CVideoObjectDecoder::decodeInterRVLCtableIndex (Int   iIndex, Int& iLevel, // return islastrun, run and level  
  133. Int&  iRun, Bool& bIsLastRun)
  134. {
  135. static Int iLevelMask = 0x0000001F;
  136. static Int iRunMask = 0x000007E0;
  137. static Int iLastRunMask = 0x00000800;
  138. iLevel = iLevelMask & grgiInterRVLCYAVCLHashingTable [iIndex];
  139. iRun = (iRunMask & grgiInterRVLCYAVCLHashingTable [iIndex]) >> 5;
  140. bIsLastRun = (iLastRunMask  & grgiInterRVLCYAVCLHashingTable [iIndex]) >> 11;
  141. if (m_pentrdecSet->m_pentrdecDCTRVLC->bitstream()->getBits (1) == TRUE) // get signbit
  142. iLevel = -iLevel;
  143. assert (iRun < BLOCK_SQUARE_SIZE);
  144. }