bs.h
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:6k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * bs.h :
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2008 x264 project
  5.  *
  6.  * Authors: Loren Merritt <lorenm@u.washington.edu>
  7.  *          Jason Garrett-Glaser <darkshikari@gmail.com>
  8.  *          Laurent Aimar <fenrir@via.ecp.fr>
  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., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #ifndef X264_BS_H
  25. #define X264_BS_H
  26. typedef struct
  27. {
  28.     uint8_t i_bits;
  29.     uint8_t i_size;
  30. } vlc_t;
  31. typedef struct bs_s
  32. {
  33.     uint8_t *p_start;
  34.     uint8_t *p;
  35.     uint8_t *p_end;
  36.     intptr_t cur_bits;
  37.     int     i_left;    /* i_count number of available bits */
  38.     int     i_bits_encoded; /* RD only */
  39. } bs_t;
  40. extern const vlc_t x264_coeff_token[5][17*4];
  41. extern const vlc_t x264_total_zeros[15][16];
  42. extern const vlc_t x264_total_zeros_dc[3][4];
  43. extern const vlc_t x264_run_before[7][15];
  44. static inline void bs_init( bs_t *s, void *p_data, int i_data )
  45. {
  46.     int offset = ((intptr_t)p_data & (WORD_SIZE-1));
  47.     s->p       = s->p_start = (uint8_t*)p_data - offset;
  48.     s->p_end   = (uint8_t*)p_data + i_data;
  49.     s->i_left  = offset ? 8*offset : (WORD_SIZE*8);
  50.     s->cur_bits = endian_fix( *(intptr_t*)s->p );
  51. }
  52. static inline int bs_pos( bs_t *s )
  53. {
  54.     return( 8 * (s->p - s->p_start) + (WORD_SIZE*8) - s->i_left );
  55. }
  56. /* Write the rest of cur_bits to the bitstream; results in a bitstream no longer 32/64-bit aligned. */
  57. static inline void bs_flush( bs_t *s )
  58. {
  59.     *(intptr_t*)s->p = endian_fix( s->cur_bits << s->i_left );
  60.     s->p += WORD_SIZE - s->i_left / 8;
  61.     s->i_left = WORD_SIZE*8;
  62. }
  63. static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits )
  64. {
  65.     if( WORD_SIZE == 8 )
  66.     {
  67.         s->cur_bits = (s->cur_bits << i_count) | i_bits;
  68.         s->i_left -= i_count;
  69.         if( s->i_left <= 32 )
  70.         {
  71.             *(uint32_t*)s->p = endian_fix( s->cur_bits << s->i_left );
  72.             s->i_left += 32;
  73.             s->p += 4;
  74.         }
  75.     }
  76.     else
  77.     {
  78.         if( i_count < s->i_left )
  79.         {
  80.             s->cur_bits = (s->cur_bits << i_count) | i_bits;
  81.             s->i_left -= i_count;
  82.         }
  83.         else
  84.         {
  85.             i_count -= s->i_left;
  86.             s->cur_bits = (s->cur_bits << s->i_left) | (i_bits >> i_count);
  87.             *(uint32_t*)s->p = endian_fix( s->cur_bits );
  88.             s->p += 4;
  89.             s->cur_bits = i_bits;
  90.             s->i_left = 32 - i_count;
  91.         }
  92.     }
  93. }
  94. /* Special case to eliminate branch in normal bs_write. */
  95. /* Golomb never writes an even-size code, so this is only used in slice headers. */
  96. static inline void bs_write32( bs_t *s, uint32_t i_bits )
  97. {
  98.     bs_write( s, 16, i_bits >> 16 );
  99.     bs_write( s, 16, i_bits );
  100. }
  101. static inline void bs_write1( bs_t *s, uint32_t i_bit )
  102. {
  103.     s->cur_bits <<= 1;
  104.     s->cur_bits |= i_bit;
  105.     s->i_left--;
  106.     if( s->i_left == WORD_SIZE*8-32 )
  107.     {
  108.         *(uint32_t*)s->p = endian_fix32( s->cur_bits );
  109.         s->p += 4;
  110.         s->i_left = WORD_SIZE*8;
  111.     }
  112. }
  113. static inline void bs_align_0( bs_t *s )
  114. {
  115.     if( s->i_left&7 )
  116.     {
  117.         s->cur_bits <<= s->i_left&7;
  118.         s->i_left &= ~7;
  119.     }
  120.     bs_flush( s );
  121. }
  122. static inline void bs_align_1( bs_t *s )
  123. {
  124.     if( s->i_left&7 )
  125.     {
  126.         s->cur_bits <<= s->i_left&7;
  127.         s->cur_bits |= (1 << (s->i_left&7)) - 1;
  128.         s->i_left &= ~7;
  129.     }
  130.     bs_flush( s );
  131. }
  132. /* golomb functions */
  133. static const uint8_t x264_ue_size_tab[256] =
  134. {
  135.      1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
  136.      9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
  137.     11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
  138.     11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
  139.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  140.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  141.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  142.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  143.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  144.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  145.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  146.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  147.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  148.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  149.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  150.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  151. };
  152. static inline void bs_write_ue_big( bs_t *s, unsigned int val )
  153. {
  154.     int size = 0;
  155.     int tmp = ++val;
  156.     if( tmp >= 0x10000 )
  157.     {
  158.         size = 32;
  159.         tmp >>= 16;
  160.     }
  161.     if( tmp >= 0x100 )
  162.     {
  163.         size += 16;
  164.         tmp >>= 8;
  165.     }
  166.     size += x264_ue_size_tab[tmp];
  167.     bs_write( s, size>>1, 0 );
  168.     bs_write( s, (size>>1)+1, val );
  169. }
  170. /* Only works on values under 255. */
  171. static inline void bs_write_ue( bs_t *s, int val )
  172. {
  173.     bs_write( s, x264_ue_size_tab[val+1], val+1 );
  174. }
  175. static inline void bs_write_se( bs_t *s, int val )
  176. {
  177.     int size = 0;
  178.     int tmp = val = val <= 0 ? -val*2+1 : val*2;
  179.     if( tmp >= 0x100 )
  180.     {
  181.         size = 16;
  182.         tmp >>= 8;
  183.     }
  184.     size += x264_ue_size_tab[tmp];
  185.     bs_write( s, size, val );
  186. }
  187. static inline void bs_write_te( bs_t *s, int x, int val )
  188. {
  189.     if( x == 1 )
  190.         bs_write1( s, 1^val );
  191.     else if( x > 1 )
  192.         bs_write_ue( s, val );
  193. }
  194. static inline void bs_rbsp_trailing( bs_t *s )
  195. {
  196.     bs_write1( s, 1 );
  197.     bs_flush( s );
  198. }
  199. static inline int bs_size_ue( unsigned int val )
  200. {
  201.     return x264_ue_size_tab[val+1];
  202. }
  203. static inline int bs_size_ue_big( unsigned int val )
  204. {
  205.     if( val < 255 )
  206.         return x264_ue_size_tab[val+1];
  207.     else
  208.         return x264_ue_size_tab[(val+1)>>8] + 16;
  209. }
  210. static inline int bs_size_se( int val )
  211. {
  212.     return bs_size_ue_big( val <= 0 ? -val*2 : val*2-1 );
  213. }
  214. static inline int bs_size_te( int x, int val )
  215. {
  216.     if( x == 1 )
  217.         return 1;
  218.     else if( x > 1 )
  219.         return x264_ue_size_tab[val+1];
  220.     else
  221.         return 0;
  222. }
  223. #endif