1 /*****************************************************************************
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];
66 /* A larger level table size theoretically could help a bit at extremely
67 * high bitrates, but the cost in cache is usually too high for it to be
69 * This size appears to be optimal for QP18 encoding on a Nehalem CPU.
70 * FIXME: Do further testing? */
71 #define LEVEL_TABLE_SIZE 128
72 extern vlc_large_t x264_level_token[7][LEVEL_TABLE_SIZE];
74 static inline void bs_init( bs_t *s, void *p_data, int i_data )
76 int offset = ((intptr_t)p_data & 3);
77 s->p = s->p_start = (uint8_t*)p_data - offset;
78 s->p_end = (uint8_t*)p_data + i_data;
79 s->i_left = (WORD_SIZE - offset)*8;
80 s->cur_bits = endian_fix32(*(uint32_t *)(s->p));
81 s->cur_bits >>= (4-offset)*8;
83 static inline int bs_pos( bs_t *s )
85 return( 8 * (s->p - s->p_start) + (WORD_SIZE*8) - s->i_left );
88 /* Write the rest of cur_bits to the bitstream; results in a bitstream no longer 32-bit aligned. */
89 static inline void bs_flush( bs_t *s )
91 M32( s->p ) = endian_fix32( s->cur_bits << (s->i_left&31) );
92 s->p += WORD_SIZE - s->i_left / 8;
93 s->i_left = WORD_SIZE*8;
96 static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits )
100 s->cur_bits = (s->cur_bits << i_count) | i_bits;
101 s->i_left -= i_count;
102 if( s->i_left <= 32 )
104 #ifdef WORDS_BIGENDIAN
105 M32( s->p ) = s->cur_bits >> (32 - s->i_left);
107 M32( s->p ) = endian_fix( s->cur_bits << s->i_left );
115 if( i_count < s->i_left )
117 s->cur_bits = (s->cur_bits << i_count) | i_bits;
118 s->i_left -= i_count;
122 i_count -= s->i_left;
123 s->cur_bits = (s->cur_bits << s->i_left) | (i_bits >> i_count);
124 M32( s->p ) = endian_fix( s->cur_bits );
126 s->cur_bits = i_bits;
127 s->i_left = 32 - i_count;
132 /* Special case to eliminate branch in normal bs_write. */
133 /* Golomb never writes an even-size code, so this is only used in slice headers. */
134 static inline void bs_write32( bs_t *s, uint32_t i_bits )
136 bs_write( s, 16, i_bits >> 16 );
137 bs_write( s, 16, i_bits );
140 static inline void bs_write1( bs_t *s, uint32_t i_bit )
143 s->cur_bits |= i_bit;
145 if( s->i_left == WORD_SIZE*8-32 )
147 M32( s->p ) = endian_fix32( s->cur_bits );
149 s->i_left = WORD_SIZE*8;
153 static inline void bs_align_0( bs_t *s )
155 bs_write( s, s->i_left&7, 0 );
158 static inline void bs_align_1( bs_t *s )
160 bs_write( s, s->i_left&7, (1 << (s->i_left&7)) - 1 );
163 static inline void bs_align_10( bs_t *s )
166 bs_write( s, s->i_left&7, 1 << ( (s->i_left&7) - 1 ) );
169 /* golomb functions */
171 static const uint8_t x264_ue_size_tab[256] =
173 1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
174 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
175 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
176 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
177 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
178 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
179 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
180 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
181 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
182 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
183 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
184 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
185 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
186 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
187 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
188 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
191 static inline void bs_write_ue_big( bs_t *s, unsigned int val )
205 size += x264_ue_size_tab[tmp];
206 bs_write( s, size>>1, 0 );
207 bs_write( s, (size>>1)+1, val );
210 /* Only works on values under 255. */
211 static inline void bs_write_ue( bs_t *s, int val )
213 bs_write( s, x264_ue_size_tab[val+1], val+1 );
216 static inline void bs_write_se( bs_t *s, int val )
219 /* Faster than (val <= 0 ? -val*2+1 : val*2) */
220 /* 4 instructions on x86, 3 on ARM */
222 if( tmp < 0 ) tmp = val*2;
230 size += x264_ue_size_tab[tmp];
231 bs_write( s, size, val );
234 static inline void bs_write_te( bs_t *s, int x, int val )
237 bs_write1( s, 1^val );
239 bs_write_ue( s, val );
242 static inline void bs_rbsp_trailing( bs_t *s )
245 bs_write( s, s->i_left&7, 0 );
248 static inline int bs_size_ue( unsigned int val )
250 return x264_ue_size_tab[val+1];
253 static inline int bs_size_ue_big( unsigned int val )
256 return x264_ue_size_tab[val+1];
258 return x264_ue_size_tab[(val+1)>>8] + 16;
261 static inline int bs_size_se( int val )
264 if( tmp < 0 ) tmp = val*2;
266 return x264_ue_size_tab[tmp];
268 return x264_ue_size_tab[tmp>>8]+16;
271 static inline int bs_size_te( int x, int val )
276 return x264_ue_size_tab[val+1];