bitstream.h
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:14k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  *
  3.  *  T264 AVC CODEC
  4.  *
  5.  *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
  6.  *               2004-2005 visionany <visionany@yahoo.com.cn>
  7.  *  Ported to TI DSP Platform By YouXiaoQuan, HFUT-TI UNITED LAB,China      
  8.  *               2004-2005 You Xiaoquan <YouXiaoquan@126.com>   
  9.  *
  10.  *  This program is free software ; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation ; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program ; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  23.  *
  24.  ****************************************************************************/
  25. /*****************************************************************************
  26.  *
  27.  *  XVID MPEG-4 VIDEO CODEC
  28.  *  - Bitstream reader/writer inlined functions and constants-
  29.  *
  30.  *  Copyright (C) 2001-2003 Peter Ross <pross@xvid.org>
  31.  *
  32.  *  This program is free software ; you can redistribute it and/or modify
  33.  *  it under the terms of the GNU General Public License as published by
  34.  *  the Free Software Foundation ; either version 2 of the License, or
  35.  *  (at your option) any later version.
  36.  *
  37.  *  This program is distributed in the hope that it will be useful,
  38.  *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  39.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  40.  *  GNU General Public License for more details.
  41.  *
  42.  *  You should have received a copy of the GNU General Public License
  43.  *  along with this program ; if not, write to the Free Software
  44.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  45.  *
  46.  * $Id: bitstream.h,v 1.8 2005/03/30 02:28:02 youxiaoquan Exp $
  47.  *
  48.  ****************************************************************************/
  49. #ifndef _BITSTREAM_H_
  50. #define _BITSTREAM_H_
  51. /*****************************************************************************
  52.  * Constants
  53.  ****************************************************************************/
  54. /* comment any #defs we dont use */
  55. #define VIDOBJ_START_CODE 0x00000100 /* ..0x0000011f  */
  56. #define VIDOBJLAY_START_CODE 0x00000120 /* ..0x0000012f */
  57. #define VISOBJSEQ_START_CODE 0x000001b0
  58. #define VISOBJSEQ_STOP_CODE 0x000001b1 /* ??? */
  59. #define USERDATA_START_CODE 0x000001b2
  60. #define GRPOFVOP_START_CODE 0x000001b3
  61. /*#define VIDSESERR_ERROR_CODE  0x000001b4 */
  62. #define VISOBJ_START_CODE 0x000001b5
  63. #define VOP_START_CODE 0x000001b6
  64. /*#define STUFFING_START_CODE 0x000001c3 */
  65. #define VISOBJ_TYPE_VIDEO 1
  66. /*#define VISOBJ_TYPE_STILLTEXTURE      2 */
  67. /*#define VISOBJ_TYPE_MESH              3 */
  68. /*#define VISOBJ_TYPE_FBA               4 */
  69. /*#define VISOBJ_TYPE_3DMESH            5 */
  70. #define VIDOBJLAY_TYPE_SIMPLE 1
  71. /*#define VIDOBJLAY_TYPE_SIMPLE_SCALABLE    2 */
  72. /*#define VIDOBJLAY_TYPE_CORE 3 */
  73. /*#define VIDOBJLAY_TYPE_MAIN 4 */
  74. /*#define VIDOBJLAY_TYPE_NBIT 5 */
  75. /*#define VIDOBJLAY_TYPE_ANIM_TEXT 6 */
  76. /*#define VIDOBJLAY_TYPE_ANIM_MESH 7 */
  77. /*#define VIDOBJLAY_TYPE_SIMPLE_FACE 8 */
  78. /*#define VIDOBJLAY_TYPE_STILL_SCALABLE 9 */
  79. #define VIDOBJLAY_TYPE_ART_SIMPLE 10
  80. /*#define VIDOBJLAY_TYPE_CORE_SCALABLE 11 */
  81. /*#define VIDOBJLAY_TYPE_ACE 12 */
  82. /*#define VIDOBJLAY_TYPE_ADVANCED_SCALABLE_TEXTURE 13 */
  83. /*#define VIDOBJLAY_TYPE_SIMPLE_FBA 14 */
  84. /*#define VIDEOJLAY_TYPE_SIMPLE_STUDIO    15*/
  85. /*#define VIDEOJLAY_TYPE_CORE_STUDIO      16*/
  86. #define VIDOBJLAY_TYPE_ASP              17
  87. /*#define VIDOBJLAY_TYPE_FGS              18*/
  88. /*#define VIDOBJLAY_AR_SQUARE           1 */
  89. /*#define VIDOBJLAY_AR_625TYPE_43       2 */
  90. /*#define VIDOBJLAY_AR_525TYPE_43       3 */
  91. /*#define VIDOBJLAY_AR_625TYPE_169      8 */
  92. /*#define VIDOBJLAY_AR_525TYPE_169      9 */
  93. #define VIDOBJLAY_AR_EXTPAR 15
  94. #define VIDOBJLAY_SHAPE_RECTANGULAR 0
  95. #define VIDOBJLAY_SHAPE_BINARY 1
  96. #define VIDOBJLAY_SHAPE_BINARY_ONLY 2
  97. #define VIDOBJLAY_SHAPE_GRAYSCALE 3
  98. #define SPRITE_NONE 0
  99. #define SPRITE_STATIC 1
  100. #define SPRITE_GMC 2
  101. #define READ_MARKER() BitstreamSkip(bs, 1)
  102. #define WRITE_MARKER() BitstreamPutBit(bs, 1)
  103. /* vop coding types  */
  104. /* intra, prediction, backward, sprite, not_coded */
  105. #define I_VOP 0
  106. #define P_VOP 1
  107. #define B_VOP 2
  108. #define S_VOP 3
  109. #define N_VOP 4
  110. /* resync-specific */
  111. #define NUMBITS_VP_RESYNC_MARKER  17
  112. #define RESYNC_MARKER 1
  113. typedef struct
  114. {
  115.     uint32_t bufa;
  116.     uint32_t bufb;
  117.     uint32_t buf;
  118.     uint32_t pos;
  119.     uint32_t *tail;
  120.     uint32_t *start;
  121.     uint32_t length;
  122.     uint32_t initpos;
  123. }
  124. Bitstream;
  125. /* initialise bitstream structure */
  126. static void __inline
  127. BitstreamInit(Bitstream * const bs,
  128.   void *const bitstream,
  129.   uint32_t length)
  130. {
  131. uint32_t tmp;
  132. size_t bitpos;
  133. ptr_t adjbitstream = (ptr_t)bitstream;
  134. /*
  135.  * Start the stream on a uint32_t boundary, by rounding down to the
  136.  * previous uint32_t and skipping the intervening bytes.
  137.  */
  138. bitpos = ((sizeof(uint32_t)-1) & (size_t)bitstream);
  139. adjbitstream = adjbitstream - bitpos;
  140. bs->start = bs->tail = (uint32_t *) adjbitstream;
  141. tmp = *bs->start;
  142. #ifndef ARCH_IS_BIG_ENDIAN
  143. BSWAP(tmp);
  144. #endif
  145. bs->bufa = tmp;
  146. tmp = *(bs->start + 1);
  147. #ifndef ARCH_IS_BIG_ENDIAN
  148. BSWAP(tmp);
  149. #endif
  150. bs->bufb = tmp;
  151. bs->buf = 0;
  152. bs->pos = bs->initpos = bitpos*8;
  153. bs->length = length;
  154. }
  155. /* reset bitstream state */
  156. static void __inline
  157. BitstreamReset(Bitstream * const bs)
  158. {
  159. uint32_t tmp;
  160. bs->tail = bs->start;
  161. tmp = *bs->start;
  162. #ifndef ARCH_IS_BIG_ENDIAN
  163. BSWAP(tmp);
  164. #endif
  165. bs->bufa = tmp;
  166. tmp = *(bs->start + 1);
  167. #ifndef ARCH_IS_BIG_ENDIAN
  168. BSWAP(tmp);
  169. #endif
  170. bs->bufb = tmp;
  171. bs->buf = 0;
  172. bs->pos = bs->initpos;
  173. }
  174. /* reads n bits from bitstream without changing the stream pos */
  175. static uint32_t __inline
  176. BitstreamShowBits(Bitstream * const bs,
  177.   const uint32_t bits)
  178. {
  179. int nbit = (bits + bs->pos) - 32;
  180. if (nbit > 0) {
  181. return ((bs->bufa & (0xffffffff >> bs->pos)) << nbit) | (bs->
  182.  bufb >> (32 -
  183.   nbit));
  184. } else {
  185. return (bs->bufa & (0xffffffff >> bs->pos)) >> (32 - bs->pos - bits);
  186. }
  187. }
  188. /* skip n bits forward in bitstream */
  189. static __inline void
  190. BitstreamSkip(Bitstream * const bs,
  191.   const uint32_t bits)
  192. {
  193. bs->pos += bits;
  194. if (bs->pos >= 32) {
  195. uint32_t tmp;
  196. bs->bufa = bs->bufb;
  197. tmp = *((uint32_t *) bs->tail + 2);
  198. #ifndef ARCH_IS_BIG_ENDIAN
  199. BSWAP(tmp);
  200. #endif
  201. bs->bufb = tmp;
  202. bs->tail++;
  203. bs->pos -= 32;
  204. }
  205. }
  206. /* number of bits to next byte alignment */
  207. static __inline uint32_t
  208. BitstreamNumBitsToByteAlign(Bitstream *bs)
  209. {
  210. uint32_t n = (32 - bs->pos) % 8;
  211. return n == 0 ? 8 : n;
  212. }
  213. /* show nbits from next byte alignment */
  214. static __inline uint32_t
  215. BitstreamShowBitsFromByteAlign(Bitstream *bs, int bits)
  216. {
  217. int bspos = bs->pos + BitstreamNumBitsToByteAlign(bs);
  218. int nbit = (bits + bspos) - 32;
  219. if (bspos >= 32) {
  220. return bs->bufb >> (32 - nbit);
  221. } else if (nbit > 0) {
  222. return ((bs->bufa & (0xffffffff >> bspos)) << nbit) | (bs->
  223.  bufb >> (32 -
  224.   nbit));
  225. } else {
  226. return (bs->bufa & (0xffffffff >> bspos)) >> (32 - bspos - bits);
  227. }
  228. }
  229. /* move forward to the next byte boundary */
  230. static __inline void
  231. BitstreamByteAlign(Bitstream * const bs)
  232. {
  233. uint32_t remainder = bs->pos % 8;
  234. if (remainder) {
  235. BitstreamSkip(bs, 8 - remainder);
  236. }
  237. }
  238. /* bitstream length (unit bits) */
  239. static uint32_t __inline
  240. BitstreamPos(const Bitstream * const bs)
  241. {
  242. return((uint32_t)(8*((ptr_t)bs->tail - (ptr_t)bs->start) + bs->pos - bs->initpos));
  243. }
  244. static void __inline
  245. BitstreamFlush(Bitstream* const bs)
  246. {
  247.     if (bs->pos) {
  248.         uint32_t b = bs->buf;
  249. #ifndef ARCH_IS_BIG_ENDIAN
  250.         BSWAP(b);
  251. #endif
  252.         *bs->tail = b;
  253.     }
  254. }
  255. /*
  256.  * flush the bitstream & return length (unit bytes)
  257.  * NOTE: assumes no futher bitstream functions will be called.
  258.  */
  259. static uint32_t __inline
  260. BitstreamLength(Bitstream * const bs)
  261. {
  262. uint32_t len = (uint32_t)((ptr_t)bs->tail - (ptr_t)bs->start);
  263.     if (bs->pos)
  264.         len += (bs->pos + 7) / 8;
  265. /* initpos is always on a byte boundary */
  266. if (bs->initpos)
  267. len -= bs->initpos/8;
  268. return len;
  269. }
  270. /* move bitstream position forward by n bits and write out buffer if needed */
  271. static void __inline
  272. BitstreamForward(Bitstream * const bs,
  273.  const uint32_t bits)
  274. {
  275. bs->pos += bits;
  276. if (bs->pos >= 32) {
  277. uint32_t b = bs->buf;
  278. #ifndef ARCH_IS_BIG_ENDIAN
  279. BSWAP(b);
  280. #endif
  281. *bs->tail++ = b;
  282. bs->buf = 0;
  283. bs->pos -= 32;
  284. }
  285. }
  286. /* read n bits from bitstream */
  287. static uint32_t __inline
  288. BitstreamGetBits(Bitstream * const bs,
  289.  const uint32_t n)
  290. {
  291. uint32_t ret = BitstreamShowBits(bs, n);
  292. BitstreamSkip(bs, n);
  293. return ret;
  294. }
  295. /* read single bit from bitstream */
  296. static uint32_t __inline
  297. BitstreamGetBit(Bitstream * const bs)
  298. {
  299. return BitstreamGetBits(bs, 1);
  300. }
  301. /* write single bit to bitstream */
  302. static void __inline
  303. BitstreamPutBit(Bitstream * const bs,
  304. const uint32_t bit)
  305. {
  306. if (bit)
  307. bs->buf |= (0x80000000 >> bs->pos);
  308. BitstreamForward(bs, 1);
  309. }
  310. /* write n bits to bitstream */
  311. static void __inline
  312. BitstreamPutBits(Bitstream * const bs,
  313.  const uint32_t value,
  314.  const uint32_t size)
  315. {
  316. uint32_t shift = 32 - bs->pos - size;
  317. if (shift <= 32) {
  318. bs->buf |= value << shift;
  319. BitstreamForward(bs, size);
  320. } else {
  321. uint32_t remainder;
  322. shift = size - (32 - bs->pos);
  323. bs->buf |= value >> shift;
  324. BitstreamForward(bs, size - shift);
  325. remainder = shift;
  326. shift = 32 - shift;
  327. bs->buf |= value << shift;
  328. BitstreamForward(bs, remainder);
  329. }
  330. }
  331. static const int stuffing_codes[8] =
  332. {
  333.         /* nbits     stuffing code */
  334. 0, /* 1          0 */
  335. 1, /* 2          01 */
  336. 3, /* 3          011 */
  337. 7, /* 4          0111 */
  338. 0xf, /* 5          01111 */
  339. 0x1f, /* 6          011111 */
  340. 0x3f,   /* 7          0111111 */
  341. 0x7f, /* 8          01111111 */
  342. };
  343. /* pad bitstream to the next byte boundary */
  344. static void __inline
  345. BitstreamPad(Bitstream * const bs)
  346. {
  347. int bits = 8 - (bs->pos % 8);
  348. if (bits < 8)
  349. BitstreamPutBits(bs, stuffing_codes[bits - 1], bits);
  350. }
  351. /*
  352.  * pad bitstream to the next byte boundary
  353.  * alway pad: even if currently at the byte boundary
  354.  */
  355. static void __inline
  356. BitstreamPadAlways(Bitstream * const bs)
  357. {
  358. int bits = 8 - (bs->pos % 8);
  359. BitstreamPutBits(bs, stuffing_codes[bits - 1], bits);
  360. }
  361. static void __inline
  362. BitstreamPadZero(Bitstream * const bs)
  363. {
  364.     int bits = 8 - (bs->pos % 8);
  365.     if (bits < 8)
  366.         BitstreamPutBits(bs, 0, bits);
  367. }
  368. //for CABAC
  369. static void __inline
  370. BitstreamPadOneA(Bitstream * const bs)
  371. {
  372. int bits = 8 - (bs->pos % 8);
  373. if (bits<=8 && bits>0)
  374. BitstreamPutBits(bs, 1<<(bits-1), bits);
  375. }
  376. static void __inline
  377. BitstreamPadOne(Bitstream * const bs)
  378. {
  379. int bits = 8 - (bs->pos % 8);
  380. if (bits<8 && bits>0)
  381. BitstreamPutBits(bs, 1<<(bits-1), bits);
  382. }
  383. ////////////////////////////////////////////////////////////
  384. // exp-golomb
  385. static void __inline
  386. eg_write(Bitstream* const bs, int32_t code_num)
  387. {
  388.     int32_t tmp = code_num + 1;
  389.     int32_t m, info;
  390.   
  391.     if (code_num != 0)
  392.     {
  393.         m = 0;
  394.        
  395.         while (tmp)
  396.         {
  397.          tmp >>= 1;
  398.          m ++;
  399.         }
  400.         m --;
  401.         
  402.         info = code_num + 1 - (1 << m);
  403.         BitstreamPutBits(bs, 1, m + 1);
  404.         BitstreamPutBits(bs, info, m);
  405.     }
  406.     else
  407.     {
  408.         BitstreamPutBits(bs, 1, 1);
  409.     }
  410. }
  411. static int32_t __inline
  412. eg_read(Bitstream* const bs)
  413. {
  414.     int32_t m, info;
  415.     
  416.     m = 0;
  417.     
  418.     while (!BitstreamGetBit(bs))
  419.     {
  420.         m ++;
  421.     }
  422.     
  423.     if (m == 0)
  424.         return 0;
  425.     info = BitstreamGetBits(bs, m);
  426.     
  427.     return (1 << m) + info - 1;
  428. }
  429. #define eg_write_ue eg_write
  430. #define eg_read_ue eg_read
  431. #define eg_write_direct BitstreamPutBits
  432. #define eg_write_direct1 BitstreamPutBit
  433. #define eg_read_direct BitstreamGetBits
  434. #define eg_read_direct1 BitstreamGetBit
  435. #define eg_read_skip BitstreamSkip
  436. #define eg_show BitstreamShowBits
  437. #define eg_init BitstreamInit
  438. #define eg_align BitstreamPadZero
  439. #define bs_t Bitstream
  440. #define eg_len BitstreamLength
  441. #define eg_flush BitstreamFlush
  442. static void __inline
  443. eg_write_se(Bitstream* const bs, int32_t k)
  444. {
  445.     int32_t code_num;
  446.     code_num = (k > 0) ? (k << 1) - 1 : (-k) << 1;
  447.     eg_write_ue(bs, code_num);    
  448. }
  449. static int32_t __inline
  450. eg_read_se(Bitstream* const bs)
  451. {
  452.     int32_t k;
  453.     int32_t code_num = eg_read_ue(bs);
  454.     
  455.     k = (code_num & 1) ? (code_num + 1) >> 1 : -(code_num >> 1);
  456.     
  457.     return k;
  458. }
  459. static void __inline
  460. eg_write_te(Bitstream* const bs, int32_t x, int32_t code_num)
  461. {
  462.     x == 1 ? BitstreamPutBit(bs, !code_num) : eg_write_ue(bs, code_num);
  463. }
  464. static int32_t __inline
  465. eg_read_te(Bitstream* const bs, int32_t x)
  466. {
  467.     return x == 1 ? (!BitstreamGetBit(bs)) : eg_read_ue(bs);
  468. }
  469. static uint32_t __inline
  470. eg_size_ue(Bitstream* const bs, int32_t code_num)
  471. {
  472.     int32_t tmp = code_num + 1;
  473.     int32_t m;
  474.     if (code_num != 0)
  475.     {
  476.         m = 0;
  477.         while (tmp)
  478.         {
  479.             tmp >>= 1;
  480.             m ++;
  481.         }
  482.         m --;
  483.         return m + m + 1;
  484.     }
  485.     else
  486.     {
  487.         return 1;
  488.     }
  489. }
  490. static uint32_t __inline
  491. eg_size_se(Bitstream* const bs, int32_t k)
  492. {
  493.     int32_t code_num;
  494.     code_num = (k > 0) ? (k << 1) - 1 : (-k) << 1;
  495.     return eg_size_ue(bs, code_num);    
  496. }
  497. static uint32_t __inline
  498. eg_size_te(Bitstream* const bs, int32_t x, int32_t k)
  499. {
  500.     if (x > 0)
  501.     {
  502.         if (x == 1)
  503.             return 1;
  504.         return eg_size_ue(bs, k);
  505.     }
  506.     
  507.     return 0;
  508. }
  509. /*
  510. static void __inline
  511. eg_write_me(Bitstream* const bs, int32_t cbp)
  512. {
  513. }
  514. static int32_t __inline
  515. eg_read_me(Bitstream* const bs)
  516. {
  517. }
  518. */
  519. #endif /* _BITSTREAM_H_ */