1 /*
2 * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * bitstream writer API
24 */
25
26 #ifndef AVCODEC_PUT_BITS_H
27 #define AVCODEC_PUT_BITS_H
28
29 #include <stdint.h>
30 #include <stdlib.h>
31 #include <assert.h>
32
39 #include "config.h"
40
47
48 /**
49 * Initialize the PutBitContext s.
50 *
51 * @param buffer the buffer where to put bits
52 * @param buffer_size the size in bytes of buffer
53 */
55 int buffer_size)
56 {
57 if (buffer_size < 0) {
58 buffer_size = 0;
59 buffer = NULL;
60 }
61
68 }
69
70 /**
71 * @return the total number of bits written to the bitstream.
72 */
74 {
76 }
77
78 /**
79 * @return the number of bits available in the bitstream.
80 */
82 {
84 }
85
86 /**
87 * Pad the end of the output stream with zeros.
88 */
90 {
91 #ifndef BITSTREAM_WRITER_LE
94 #endif
96 /* XXX: should test end of buffer */
97 #ifdef BITSTREAM_WRITER_LE
100 #else
103 #endif
105 }
108 }
109
110 #ifdef BITSTREAM_WRITER_LE
111 #define avpriv_align_put_bits align_put_bits_unsupported_here
112 #define avpriv_put_string ff_put_string_unsupported_here
113 #define avpriv_copy_bits avpriv_copy_bits_unsupported_here
114 #else
115 /**
116 * Pad the bitstream with zeros up to the next byte boundary.
117 */
119
120 /**
121 * Put the string string in the bitstream.
122 *
123 * @param terminate_string 0-terminates the written string if value is 1
124 */
126 int terminate_string);
127
128 /**
129 * Copy the content of src to the bitstream.
130 *
131 * @param length the number of bits of src to copy
132 */
134 #endif
135
136 /**
137 * Write up to 31 bits into a bitstream.
138 * Use put_bits32 to write 32 bits.
139 */
141 {
142 unsigned int bit_buf;
143 int bit_left;
144
146
149
150 /* XXX: optimize */
151 #ifdef BITSTREAM_WRITER_LE
152 bit_buf |= value << (32 - bit_left);
153 if (n >= bit_left) {
157 bit_buf = (bit_left == 32) ? 0 : value >> bit_left;
158 bit_left += 32;
159 }
161 #else
162 if (n < bit_left) {
163 bit_buf = (bit_buf <<
n) | value;
165 } else {
166 bit_buf <<= bit_left;
167 bit_buf |= value >> (n - bit_left);
173 }
174 #endif
175
178 }
179
181 {
183
184 put_bits(pb, n, value & ((1 << n) - 1));
185 }
186
187 /**
188 * Write exactly 32 bits into a bitstream.
189 */
191 {
192 int lo = value & 0xffff;
193 int hi = value >> 16;
194 #ifdef BITSTREAM_WRITER_LE
197 #else
200 #endif
201 }
202
203 /**
204 * Return the pointer to the byte where the bitstream writer will put
205 * the next bit.
206 */
208 {
210 }
211
212 /**
213 * Skip the given number of bytes.
214 * PutBitContext must be flushed & aligned to a byte boundary before calling this.
215 */
217 {
221 }
222
223 /**
224 * Skip the given number of bits.
225 * Must only be used if the actual values in the bitstream do not matter.
226 * If n is 0 the behavior is undefined.
227 */
229 {
233 }
234
235 /**
236 * Change the end of the buffer.
237 *
238 * @param size the new size in bytes of the buffer where to put bits
239 */
241 {
243 }
244
245 #endif /* AVCODEC_PUT_BITS_H */