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 *(uint32_t*)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 *(uint32_t*)s->p = s->cur_bits >> (32 - s->i_left);
107 *(uint32_t*)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 *(uint32_t*)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 *(uint32_t*)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 );
164 /* golomb functions */
166 static const uint8_t x264_ue_size_tab[256] =
168 1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
169 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
170 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
171 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
172 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
173 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
174 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
175 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
176 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
177 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
178 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
179 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
180 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
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,
186 static inline void bs_write_ue_big( bs_t *s, unsigned int val )
200 size += x264_ue_size_tab[tmp];
201 bs_write( s, size>>1, 0 );
202 bs_write( s, (size>>1)+1, val );
205 /* Only works on values under 255. */
206 static inline void bs_write_ue( bs_t *s, int val )
208 bs_write( s, x264_ue_size_tab[val+1], val+1 );
211 static inline void bs_write_se( bs_t *s, int val )
214 /* Faster than (val <= 0 ? -val*2+1 : val*2) */
215 /* 4 instructions on x86, 3 on ARM */
217 if( tmp < 0 ) tmp = val*2;
225 size += x264_ue_size_tab[tmp];
226 bs_write( s, size, val );
229 static inline void bs_write_te( bs_t *s, int x, int val )
232 bs_write1( s, 1^val );
234 bs_write_ue( s, val );
237 static inline void bs_rbsp_trailing( bs_t *s )
240 bs_write( s, s->i_left&7, 0 );
243 static inline int bs_size_ue( unsigned int val )
245 return x264_ue_size_tab[val+1];
248 static inline int bs_size_ue_big( unsigned int val )
251 return x264_ue_size_tab[val+1];
253 return x264_ue_size_tab[(val+1)>>8] + 16;
256 static inline int bs_size_se( int val )
259 if( tmp < 0 ) tmp = val*2;
261 return x264_ue_size_tab[tmp];
263 return x264_ue_size_tab[tmp>>8]+16;
266 static inline int bs_size_te( int x, int val )
271 return x264_ue_size_tab[val+1];