bitgolomb.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: bitgolomb.h 292 2005-10-14 20:30:00Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #ifndef __BITGOLOMB_H
  24. #define __BITGOLOMB_H
  25. #define GL2(n) 12-n+1+12-n
  26. #define assertgolomb(p) //assert(p)
  27. static const uint8_t golomb_log2[64] =
  28. {
  29. GL2(0),
  30. GL2(1),
  31. GL2(2),GL2(2),
  32. GL2(3),GL2(3),GL2(3),GL2(3),
  33. GL2(4),GL2(4),GL2(4),GL2(4),GL2(4),GL2(4),GL2(4),GL2(4),
  34. GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),
  35. GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),GL2(5),
  36. GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),
  37. GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),
  38. GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),
  39. GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),GL2(6),
  40. };
  41. static void bitload(bitstream* p);
  42. // result: [0..8190]
  43. static NOINLINE int bitgolomb(bitstream* p) 
  44. {
  45. int n,v;
  46. bitbegin_pos2(p);
  47. bitload_pos2(p);
  48. assertgolomb(bitshow_pos2(p,13)>0);
  49. if (bitshow_pos2(p,6))
  50. n = golomb_log2[bitshow_pos2(p,6)]-12;
  51. else
  52. n = golomb_log2[bitshow_pos2(p,12)];
  53. v = bitshow_pos2(p,n);
  54. bitflush_pos2(p,n);
  55. bitend_pos2(p);
  56. return --v;
  57. }
  58. // max: [2..7]
  59. // result: [0..(1<<max)-2]+1
  60. static INLINE int bitgolomb_max1(bitstream* p,int max) 
  61. {
  62. int n;
  63. bitloadinline(p);
  64. assertgolomb(bitshow(p,max)>0);
  65. n = golomb_log2[bitshow(p,max-1)]-(13-max)*2;
  66. return bitget(p,n);
  67. }
  68. static NOINLINE int bitsgolomb(bitstream* p) 
  69. {
  70. int n,v;
  71. bitbegin_pos2(p);
  72. bitload_pos2(p);
  73. assertgolomb(bitshow_pos2(p,13)>0);
  74. if (bitshow_pos2(p,6))
  75. n = golomb_log2[bitshow_pos2(p,6)]-12;
  76. else
  77. n = golomb_log2[bitshow_pos2(p,12)];
  78. v = bitshow_pos2(p,n);
  79. bitflush_pos2(p,n);
  80. bitend_pos2(p);
  81. if (v&1)
  82. v=-(v>>1);
  83. else
  84. v=(v>>1);
  85. return v;
  86. }
  87. #define DECLARE_BITSGOLOMB_LAGER 
  88. static NOINLINE int bitsgolomb_large(bitstream* p) 
  89. int n; 
  90. uint32_t v; 
  91. bitloadinline(p); 
  92. if (bitshow(p,13)) 
  93. return bitsgolomb(p); 
  94. n = 14; 
  95. bitflush(p,13); 
  96. bitloadinline(p); 
  97. while (!bitshow(p,1)) 
  98. bitflush(p,1); 
  99. ++n; 
  100. v = bitshowlarge(p,n); 
  101. bitflush(p,n); 
  102. if (v&1) 
  103. return -(int)(v>>1); 
  104. else 
  105. return (v>>1); 
  106. }
  107. #define DECLARE_BITGOLOMB_LAGER 
  108. static NOINLINE int bitgolomb_large(bitstream* p) 
  109. int n; 
  110. uint32_t v; 
  111. bitloadinline(p); 
  112. if (bitshow(p,13)) 
  113. return bitgolomb(p); 
  114. n = 14; 
  115. bitflush(p,13); 
  116. bitloadinline(p); 
  117. while (!bitshow(p,1)) 
  118. bitflush(p,1); 
  119. ++n; 
  120. v = bitshowlarge(p,n); 
  121. bitflush(p,n); 
  122. return --v; 
  123. }
  124. #endif