1 /*****************************************************************************
2 * bitstream.h: h264 encoder library
3 *****************************************************************************
4 * Copyright (C) 2003-2008 x264 project
6 * Authors: Loren Merritt <lorenm@u.washington.edu>
7 * Fiona Glaser <fiona@x264.com>
8 * Laurent Aimar <fenrir@via.ecp.fr>
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.
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.
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 *****************************************************************************/
38 /* Next level table to use */
49 int i_left; /* i_count number of available bits */
50 int i_bits_encoded; /* RD only */
60 extern const vlc_t x264_coeff0_token[5];
61 extern const vlc_t x264_coeff_token[5][16][4];
62 extern const vlc_t x264_total_zeros[15][16];
63 extern const vlc_t x264_total_zeros_dc[3][4];
64 extern const vlc_t x264_run_before[7][16];
68 uint8_t *(*nal_escape) ( uint8_t *dst, uint8_t *src, uint8_t *end );
69 } x264_bitstream_function_t;
71 int x264_nal_encode( x264_t *h, uint8_t *dst, x264_nal_t *nal, int b_long_startcode );
72 void x264_bitstream_init( int cpu, x264_bitstream_function_t *pf );
74 /* A larger level table size theoretically could help a bit at extremely
75 * high bitrates, but the cost in cache is usually too high for it to be
77 * This size appears to be optimal for QP18 encoding on a Nehalem CPU.
78 * FIXME: Do further testing? */
79 #define LEVEL_TABLE_SIZE 128
80 extern vlc_large_t x264_level_token[7][LEVEL_TABLE_SIZE];
82 static inline void bs_init( bs_t *s, void *p_data, int i_data )
84 int offset = ((intptr_t)p_data & 3);
85 s->p = s->p_start = (uint8_t*)p_data - offset;
86 s->p_end = (uint8_t*)p_data + i_data;
87 s->i_left = (WORD_SIZE - offset)*8;
88 s->cur_bits = endian_fix32( M32(s->p) );
89 s->cur_bits >>= (4-offset)*8;
91 static inline int bs_pos( bs_t *s )
93 return( 8 * (s->p - s->p_start) + (WORD_SIZE*8) - s->i_left );
96 /* Write the rest of cur_bits to the bitstream; results in a bitstream no longer 32-bit aligned. */
97 static inline void bs_flush( bs_t *s )
99 M32( s->p ) = endian_fix32( s->cur_bits << (s->i_left&31) );
100 s->p += WORD_SIZE - s->i_left / 8;
101 s->i_left = WORD_SIZE*8;
103 /* The inverse of bs_flush: prepare the bitstream to be written to again. */
104 static inline void bs_realign( bs_t *s )
106 int offset = ((intptr_t)s->p & 3);
109 s->p = (uint8_t*)s->p - offset;
110 s->i_left = (WORD_SIZE - offset)*8;
111 s->cur_bits = endian_fix32( M32(s->p) );
112 s->cur_bits >>= (4-offset)*8;
116 static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits )
120 s->cur_bits = (s->cur_bits << i_count) | i_bits;
121 s->i_left -= i_count;
122 if( s->i_left <= 32 )
124 #ifdef WORDS_BIGENDIAN
125 M32( s->p ) = s->cur_bits >> (32 - s->i_left);
127 M32( s->p ) = endian_fix( s->cur_bits << s->i_left );
135 if( i_count < s->i_left )
137 s->cur_bits = (s->cur_bits << i_count) | i_bits;
138 s->i_left -= i_count;
142 i_count -= s->i_left;
143 s->cur_bits = (s->cur_bits << s->i_left) | (i_bits >> i_count);
144 M32( s->p ) = endian_fix( s->cur_bits );
146 s->cur_bits = i_bits;
147 s->i_left = 32 - i_count;
152 /* Special case to eliminate branch in normal bs_write. */
153 /* Golomb never writes an even-size code, so this is only used in slice headers. */
154 static inline void bs_write32( bs_t *s, uint32_t i_bits )
156 bs_write( s, 16, i_bits >> 16 );
157 bs_write( s, 16, i_bits );
160 static inline void bs_write1( bs_t *s, uint32_t i_bit )
163 s->cur_bits |= i_bit;
165 if( s->i_left == WORD_SIZE*8-32 )
167 M32( s->p ) = endian_fix32( s->cur_bits );
169 s->i_left = WORD_SIZE*8;
173 static inline void bs_align_0( bs_t *s )
175 bs_write( s, s->i_left&7, 0 );
178 static inline void bs_align_1( bs_t *s )
180 bs_write( s, s->i_left&7, (1 << (s->i_left&7)) - 1 );
183 static inline void bs_align_10( bs_t *s )
186 bs_write( s, s->i_left&7, 1 << ( (s->i_left&7) - 1 ) );
189 /* golomb functions */
191 static const uint8_t x264_ue_size_tab[256] =
193 1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
194 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
195 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
196 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
197 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
198 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
199 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
200 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
201 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
202 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
203 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
204 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
205 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
206 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
207 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
208 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
211 static inline void bs_write_ue_big( bs_t *s, unsigned int val )
225 size += x264_ue_size_tab[tmp];
226 bs_write( s, size>>1, 0 );
227 bs_write( s, (size>>1)+1, val );
230 /* Only works on values under 255. */
231 static inline void bs_write_ue( bs_t *s, int val )
233 bs_write( s, x264_ue_size_tab[val+1], val+1 );
236 static inline void bs_write_se( bs_t *s, int val )
239 /* Faster than (val <= 0 ? -val*2+1 : val*2) */
240 /* 4 instructions on x86, 3 on ARM */
242 if( tmp < 0 ) tmp = val*2;
250 size += x264_ue_size_tab[tmp];
251 bs_write( s, size, val );
254 static inline void bs_write_te( bs_t *s, int x, int val )
257 bs_write1( s, 1^val );
259 bs_write_ue( s, val );
262 static inline void bs_rbsp_trailing( bs_t *s )
265 bs_write( s, s->i_left&7, 0 );
268 static ALWAYS_INLINE int bs_size_ue( unsigned int val )
270 return x264_ue_size_tab[val+1];
273 static ALWAYS_INLINE int bs_size_ue_big( unsigned int val )
276 return x264_ue_size_tab[val+1];
278 return x264_ue_size_tab[(val+1)>>8] + 16;
281 static ALWAYS_INLINE int bs_size_se( int val )
284 if( tmp < 0 ) tmp = val*2;
286 return x264_ue_size_tab[tmp];
288 return x264_ue_size_tab[tmp>>8]+16;
291 static ALWAYS_INLINE int bs_size_te( int x, int val )
296 return x264_ue_size_tab[val+1];