bs.h
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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
  32. {
  33.     uint16_t i_bits;
  34.     uint8_t  i_size;
  35.     /* Next level table to use */
  36.     uint8_t  i_next;
  37. } vlc_large_t;
  38. typedef struct bs_s
  39. {
  40.     uint8_t *p_start;
  41.     uint8_t *p;
  42.     uint8_t *p_end;
  43.     intptr_t cur_bits;
  44.     int     i_left;    /* i_count number of available bits */
  45.     int     i_bits_encoded; /* RD only */
  46. } bs_t;
  47. typedef struct
  48. {
  49.     int     last;
  50.     int16_t level[16];
  51.     uint8_t run[16];
  52. } x264_run_level_t;
  53. extern const vlc_t x264_coeff0_token[5];
  54. extern const vlc_t x264_coeff_token[5][16*4];
  55. extern const vlc_t x264_total_zeros[15][16];
  56. extern const vlc_t x264_total_zeros_dc[3][4];
  57. extern const vlc_t x264_run_before[7][16];
  58. /* A larger level table size theoretically could help a bit at extremely
  59.  * high bitrates, but the cost in cache is usually too high for it to be
  60.  * useful.
  61.  * This size appears to be optimal for QP18 encoding on a Nehalem CPU.
  62.  * FIXME: Do further testing? */
  63. #define LEVEL_TABLE_SIZE 128
  64. extern vlc_large_t x264_level_token[7][LEVEL_TABLE_SIZE];
  65. static inline void bs_init( bs_t *s, void *p_data, int i_data )
  66. {
  67.     int offset = ((intptr_t)p_data & 3);
  68.     s->p       = s->p_start = (uint8_t*)p_data - offset;
  69.     s->p_end   = (uint8_t*)p_data + i_data;
  70.     s->i_left  = (WORD_SIZE - offset)*8;
  71.     s->cur_bits = endian_fix32(*(uint32_t *)(s->p));
  72.     s->cur_bits >>= (4-offset)*8;
  73. }
  74. static inline int bs_pos( bs_t *s )
  75. {
  76.     return( 8 * (s->p - s->p_start) + (WORD_SIZE*8) - s->i_left );
  77. }
  78. /* Write the rest of cur_bits to the bitstream; results in a bitstream no longer 32-bit aligned. */
  79. static inline void bs_flush( bs_t *s )
  80. {
  81.     *(uint32_t*)s->p = endian_fix32( s->cur_bits << (s->i_left&31) );
  82.     s->p += WORD_SIZE - s->i_left / 8;
  83.     s->i_left = WORD_SIZE*8;
  84. }
  85. static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits )
  86. {
  87.     if( WORD_SIZE == 8 )
  88.     {
  89.         s->cur_bits = (s->cur_bits << i_count) | i_bits;
  90.         s->i_left -= i_count;
  91.         if( s->i_left <= 32 )
  92.         {
  93. #ifdef WORDS_BIGENDIAN
  94.             *(uint32_t*)s->p = s->cur_bits >> (32 - s->i_left);
  95. #else
  96.             *(uint32_t*)s->p = endian_fix( s->cur_bits << s->i_left );
  97. #endif
  98.             s->i_left += 32;
  99.             s->p += 4;
  100.         }
  101.     }
  102.     else
  103.     {
  104.         if( i_count < s->i_left )
  105.         {
  106.             s->cur_bits = (s->cur_bits << i_count) | i_bits;
  107.             s->i_left -= i_count;
  108.         }
  109.         else
  110.         {
  111.             i_count -= s->i_left;
  112.             s->cur_bits = (s->cur_bits << s->i_left) | (i_bits >> i_count);
  113.             *(uint32_t*)s->p = endian_fix( s->cur_bits );
  114.             s->p += 4;
  115.             s->cur_bits = i_bits;
  116.             s->i_left = 32 - i_count;
  117.         }
  118.     }
  119. }
  120. /* Special case to eliminate branch in normal bs_write. */
  121. /* Golomb never writes an even-size code, so this is only used in slice headers. */
  122. static inline void bs_write32( bs_t *s, uint32_t i_bits )
  123. {
  124.     bs_write( s, 16, i_bits >> 16 );
  125.     bs_write( s, 16, i_bits );
  126. }
  127. static inline void bs_write1( bs_t *s, uint32_t i_bit )
  128. {
  129.     s->cur_bits <<= 1;
  130.     s->cur_bits |= i_bit;
  131.     s->i_left--;
  132.     if( s->i_left == WORD_SIZE*8-32 )
  133.     {
  134.         *(uint32_t*)s->p = endian_fix32( s->cur_bits );
  135.         s->p += 4;
  136.         s->i_left = WORD_SIZE*8;
  137.     }
  138. }
  139. static inline void bs_align_0( bs_t *s )
  140. {
  141.     bs_write( s, s->i_left&7, 0 );
  142.     bs_flush( s );
  143. }
  144. static inline void bs_align_1( bs_t *s )
  145. {
  146.     bs_write( s, s->i_left&7, (1 << (s->i_left&7)) - 1 );
  147.     bs_flush( s );
  148. }
  149. /* golomb functions */
  150. static const uint8_t x264_ue_size_tab[256] =
  151. {
  152.      1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
  153.      9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
  154.     11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
  155.     11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
  156.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  157.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  158.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  159.     13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
  160.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  161.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  162.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  163.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  164.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  165.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  166.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  167.     15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  168. };
  169. static inline void bs_write_ue_big( bs_t *s, unsigned int val )
  170. {
  171.     int size = 0;
  172.     int tmp = ++val;
  173.     if( tmp >= 0x10000 )
  174.     {
  175.         size = 32;
  176.         tmp >>= 16;
  177.     }
  178.     if( tmp >= 0x100 )
  179.     {
  180.         size += 16;
  181.         tmp >>= 8;
  182.     }
  183.     size += x264_ue_size_tab[tmp];
  184.     bs_write( s, size>>1, 0 );
  185.     bs_write( s, (size>>1)+1, val );
  186. }
  187. /* Only works on values under 255. */
  188. static inline void bs_write_ue( bs_t *s, int val )
  189. {
  190.     bs_write( s, x264_ue_size_tab[val+1], val+1 );
  191. }
  192. static inline void bs_write_se( bs_t *s, int val )
  193. {
  194.     int size = 0;
  195.     /* Faster than (val <= 0 ? -val*2+1 : val*2) */
  196.     /* 4 instructions on x86, 3 on ARM */
  197.     int tmp = 1 - val*2;
  198.     if( tmp < 0 ) tmp = val*2;
  199.     val = tmp;
  200.     if( tmp >= 0x100 )
  201.     {
  202.         size = 16;
  203.         tmp >>= 8;
  204.     }
  205.     size += x264_ue_size_tab[tmp];
  206.     bs_write( s, size, val );
  207. }
  208. static inline void bs_write_te( bs_t *s, int x, int val )
  209. {
  210.     if( x == 1 )
  211.         bs_write1( s, 1^val );
  212.     else //if( x > 1 )
  213.         bs_write_ue( s, val );
  214. }
  215. static inline void bs_rbsp_trailing( bs_t *s )
  216. {
  217.     bs_write1( s, 1 );
  218.     bs_write( s, s->i_left&7, 0  );
  219. }
  220. static inline int bs_size_ue( unsigned int val )
  221. {
  222.     return x264_ue_size_tab[val+1];
  223. }
  224. static inline int bs_size_ue_big( unsigned int val )
  225. {
  226.     if( val < 255 )
  227.         return x264_ue_size_tab[val+1];
  228.     else
  229.         return x264_ue_size_tab[(val+1)>>8] + 16;
  230. }
  231. static inline int bs_size_se( int val )
  232. {
  233.     int tmp = 1 - val*2;
  234.     if( tmp < 0 ) tmp = val*2;
  235.     if( tmp < 256 )
  236.         return x264_ue_size_tab[tmp];
  237.     else
  238.         return x264_ue_size_tab[tmp>>8]+16;
  239. }
  240. static inline int bs_size_te( int x, int val )
  241. {
  242.     if( x == 1 )
  243.         return 1;
  244.     else //if( x > 1 )
  245.         return x264_ue_size_tab[val+1];
  246. }
  247. #endif