comp_decompress.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: comp_decompress.cpp,v 1.2 2005/01/30 05:11:41 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Thomas Davies (Original Author), Scott R Ladd
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #include <libdirac_decoder/comp_decompress.h>
  38. #include <libdirac_common/wavelet_utils.h>
  39. #include <libdirac_common/band_codec.h>
  40. #include <libdirac_common/golomb.h>
  41. using namespace dirac;
  42. #include <vector>
  43. #include <ctime>
  44. using std::vector;
  45. //Constructor
  46. CompDecompressor::CompDecompressor( DecoderParams& decp, const FrameParams& fp)
  47. :
  48. m_qflist(60),
  49. m_decparams(decp),
  50. m_fparams(fp)
  51. {}
  52. void CompDecompressor::Decompress(PicArray& pic_data)
  53. {
  54. const FrameSort& fsort=m_fparams.FSort();
  55. const int depth=4;
  56. BandCodec* bdecoder;
  57.     const size_t CONTEXTS_REQUIRED = 24;
  58. Subband node;
  59. unsigned int max_bits;
  60. int qf_idx;
  61. WaveletTransform wtransform(depth);
  62. SubbandList& bands=wtransform.BandList();
  63. bands.Init(depth , pic_data.LengthX() , pic_data.LengthY());
  64. GenQuantList();
  65. for (int I=bands.Length();I>=1;--I)
  66. {
  67. //read the header data first
  68. qf_idx=GolombDecode( m_decparams.BitsIn() );
  69. if (qf_idx!=-1){
  70. bands(I).SetQf(0,m_qflist[qf_idx]);
  71. max_bits=UnsignedGolombDecode( m_decparams.BitsIn() );
  72. m_decparams.BitsIn().FlushInput();
  73. if (I>=bands.Length()){
  74. if (fsort==I_frame && I==bands.Length())
  75. bdecoder=new IntraDCBandCodec( &m_decparams.BitsIn() , CONTEXTS_REQUIRED ,bands);
  76. else
  77. bdecoder=new LFBandCodec( &m_decparams.BitsIn() , CONTEXTS_REQUIRED ,bands , I);
  78. }
  79. else
  80. bdecoder=new BandCodec( &m_decparams.BitsIn() , CONTEXTS_REQUIRED , bands , I);
  81. bdecoder->InitContexts();
  82. bdecoder->Decompress(pic_data,max_bits);
  83. delete bdecoder;
  84. }
  85. else{
  86. m_decparams.BitsIn().FlushInput();
  87. if (I==bands.Length() && fsort==I_frame)
  88. SetToVal(pic_data,bands(I),2692);
  89. else
  90. SetToVal(pic_data,bands(I),0);
  91. }
  92. }
  93. wtransform.Transform(BACKWARD,pic_data);
  94. }
  95. void CompDecompressor::SetToVal(PicArray& pic_data,const Subband& node,ValueType val){
  96. for (int J=node.Yp();J<node.Yp()+node.Yl();++J)
  97. {
  98. for (int I=node.Xp();I<node.Xp()+node.Xl();++I)
  99. {
  100. pic_data[J][I]=val;
  101. }
  102. }
  103. }
  104. void CompDecompressor::GenQuantList(){//generates the list of quantisers and inverse quantisers
  105. //there is some repetition in this list but at the moment this is easiest from the perspective of SelectQuant
  106. //Need to remove this repetition later TJD 29 March 04.
  107. m_qflist[0]=1;
  108. m_qflist[1]=1;
  109. m_qflist[2]=1;
  110. m_qflist[3]=1;
  111. m_qflist[4]=2;
  112. m_qflist[5]=2;
  113. m_qflist[6]=2;
  114. m_qflist[7]=3;
  115. m_qflist[8]=4;
  116. m_qflist[9]=4;
  117. m_qflist[10]=5;
  118. m_qflist[11]=6;
  119. m_qflist[12]=8;
  120. m_qflist[13]=9;
  121. m_qflist[14]=11;
  122. m_qflist[15]=13;
  123. m_qflist[16]=16;
  124. m_qflist[17]=19;
  125. m_qflist[18]=22;
  126. m_qflist[19]=26;
  127. m_qflist[20]=32;
  128. m_qflist[21]=38;
  129. m_qflist[22]=45;
  130. m_qflist[23]=53;
  131. m_qflist[24]=64;
  132. m_qflist[25]=76;
  133. m_qflist[26]=90;
  134. m_qflist[27]=107;
  135. m_qflist[28]=128;
  136. m_qflist[29]=152;
  137. m_qflist[30]=181;
  138. m_qflist[31]=215;
  139. m_qflist[32]=256;
  140. m_qflist[33]=304;
  141. m_qflist[34]=362;
  142. m_qflist[35]=430;
  143. m_qflist[36]=512;
  144. m_qflist[37]=608;
  145. m_qflist[38]=724;
  146. m_qflist[39]=861;
  147. m_qflist[40]=1024;
  148. m_qflist[41]=1217;
  149. m_qflist[42]=1448;
  150. m_qflist[43]=1722;
  151. m_qflist[44]=2048;
  152. m_qflist[45]=2435;
  153. m_qflist[46]=2896;
  154. m_qflist[47]=3444;
  155. m_qflist[48]=4096;
  156. m_qflist[49]=4870;
  157. m_qflist[50]=5792;
  158. m_qflist[51]=6888;
  159. m_qflist[52]=8192;
  160. m_qflist[53]=9741;
  161. m_qflist[54]=11585;
  162. m_qflist[55]=13777;
  163. m_qflist[56]=16384;
  164. m_qflist[57]=19483;
  165. m_qflist[58]=23170;
  166. m_qflist[59]=27554;
  167. }