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

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: golomb.cpp,v 1.2 2005/01/30 05:11:40 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)
  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_common/golomb.h>
  38. #include <libdirac_common/bit_manager.h>
  39. using namespace dirac;
  40. #include <cmath>
  41. #include <cstdlib>
  42. #include <iostream>
  43. using std::vector;
  44. namespace dirac
  45. {
  46. void UnsignedGolombCode(BasicOutputManager& bitman, const unsigned int val)
  47. {
  48.     unsigned int M = 0;
  49.     unsigned int info;
  50.     unsigned int val2 = val;
  51.     val2++;
  52.     while (val2>1)
  53.         {//get the log base 2 of val.
  54.         val2 >>= 1;
  55.         M++;        
  56.     }
  57.     info = val - (1<<M) + 1;
  58.     //add length M+1 prefix
  59.     for ( unsigned int i=1 ; i<=M ; ++i)
  60.         bitman.OutputBit(0);
  61.     
  62.     bitman.OutputBit(1);
  63.     //add info bits
  64.     for (unsigned int i=0 ; i<M ;++i)
  65.         bitman.OutputBit( info & (1<<i) );        
  66.     
  67. }
  68. void UnsignedGolombCode(std::vector<bool>& bitvec, const unsigned int val)
  69. {
  70.     unsigned int M = 0;
  71.     unsigned int info;
  72.     unsigned int val2 = val;
  73.     bitvec.clear();
  74.     val2++;
  75.     while ( val2>1 )
  76.     {//get the log base 2 of val.
  77.         val2 >>= 1;
  78.         M++;        
  79.     }
  80.     info = val - (1<<M) + 1;
  81.     //add length M+1 prefix
  82.     for ( unsigned int i=1 ; i<=M ; ++i)
  83.         bitvec.push_back(0);
  84.     
  85.     bitvec.push_back(1);
  86.     //add info bits
  87.     for ( unsigned int i=0 ; i<M ; ++i)
  88.         bitvec.push_back( info & (1<<i) );
  89. }
  90. void GolombCode(BasicOutputManager& bitman, const int val)
  91. {
  92.     //code the magnitude
  93.     UnsignedGolombCode(bitman,(unsigned int) abs(val));
  94.     //do sign
  95.     if (val>0) bitman.OutputBit(1);
  96.     else if (val<0) bitman.OutputBit(0);
  97. }
  98. void GolombCode(vector<bool>& bitvec, const int val)
  99. {
  100.     //code the magnitude
  101.     UnsignedGolombCode(bitvec,(unsigned int) abs(val));
  102.     //do sign
  103.     if (val>0) bitvec.push_back(1);
  104.     else if (val<0) bitvec.push_back(0);
  105. }
  106. unsigned int UnsignedGolombDecode(BitInputManager& bitman)
  107. {    
  108.     unsigned int M = 0;
  109.     unsigned int info = 0;
  110.     bool bit = 0;
  111.     unsigned int val = 0;
  112.     do
  113.     {
  114.         bit = bitman.InputBit();
  115.         if ( !bit )
  116.             M++;
  117.     }
  118.     while( !bit && M<64 );//terminate if the number is too big!
  119.     //now get the M info bits    
  120.     for ( unsigned int i=0 ; i<M ; ++i)
  121.     {
  122.         bit = bitman.InputBit();
  123.         if ( bit )
  124.             info |= (1<<i);
  125.     }// i    
  126.     val = (1<<M) -1 + info;
  127.     return val;
  128. }
  129. unsigned int UnsignedGolombDecode(const std::vector<bool>& bitvec)
  130. {
  131.     unsigned int M = 0;
  132.     unsigned int info = 0;
  133.     bool bit = 0;
  134.     unsigned int val = 0;
  135.     unsigned int index = 0;//index into bitvec
  136.     do
  137.     {
  138.         bit = bitvec[++index];
  139.         if (!bit)
  140.             M++;
  141.     }
  142.     while( !bit && M<64 );//terminate if the number is too big!
  143.     //now get the M info bits    
  144.     for ( unsigned int i=0 ;i<M ; ++i)
  145.     {
  146.         bit = bitvec[++index];
  147.         if (bit)
  148.             info |= (1<<i);
  149.     }    
  150.     val = (1<<M) - 1 + info;
  151.     return val;
  152. }
  153. int GolombDecode(BitInputManager& bitman)
  154. {
  155.     int val = int(UnsignedGolombDecode(bitman));
  156.     bool bit;
  157.      //get the sign
  158.     if (val != 0)
  159.     {
  160.         bit = bitman.InputBit();
  161.         if ( !bit )
  162.             val = -val;
  163.     }
  164.     return val;        
  165. }
  166. int GolombDecode(const vector<bool>& bitvec)
  167. {
  168.     int val = int(UnsignedGolombDecode(bitvec));
  169.     bool bit;
  170.      //get sign
  171.     if (val != 0)
  172.     {
  173.         bit = bitvec[bitvec.size()-1];
  174.         if (!bit)
  175.             val = -val;
  176.     }
  177.     return val;        
  178. }
  179. } // namespace dirac