Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * copyright (c) 2004 Michael Niedermayer 
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 
30
#include 
31
#include 
32
 
33
#include "libavutil/bswap.h"
34
#include "libavutil/common.h"
35
#include "libavutil/intreadwrite.h"
36
#include "libavutil/log.h"
37
#include "libavutil/avassert.h"
38
#include "mathops.h"
39
#include "config.h"
40
 
41
typedef struct PutBitContext {
42
    uint32_t bit_buf;
43
    int bit_left;
44
    uint8_t *buf, *buf_ptr, *buf_end;
45
    int size_in_bits;
46
} PutBitContext;
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
 */
54
static inline void init_put_bits(PutBitContext *s, uint8_t *buffer,
55
                                 int buffer_size)
56
{
57
    if (buffer_size < 0) {
58
        buffer_size = 0;
59
        buffer      = NULL;
60
    }
61
 
62
    s->size_in_bits = 8 * buffer_size;
63
    s->buf          = buffer;
64
    s->buf_end      = s->buf + buffer_size;
65
    s->buf_ptr      = s->buf;
66
    s->bit_left     = 32;
67
    s->bit_buf      = 0;
68
}
69
 
70
/**
71
 * @return the total number of bits written to the bitstream.
72
 */
73
static inline int put_bits_count(PutBitContext *s)
74
{
75
    return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left;
76
}
77
 
78
/**
79
 * @return the number of bits available in the bitstream.
80
 */
81
static inline int put_bits_left(PutBitContext* s)
82
{
83
    return (s->buf_end - s->buf_ptr) * 8 - 32 + s->bit_left;
84
}
85
 
86
/**
87
 * Pad the end of the output stream with zeros.
88
 */
89
static inline void flush_put_bits(PutBitContext *s)
90
{
91
#ifndef BITSTREAM_WRITER_LE
92
    if (s->bit_left < 32)
93
        s->bit_buf <<= s->bit_left;
94
#endif
95
    while (s->bit_left < 32) {
96
        /* XXX: should test end of buffer */
97
#ifdef BITSTREAM_WRITER_LE
98
        *s->buf_ptr++ = s->bit_buf;
99
        s->bit_buf  >>= 8;
100
#else
101
        *s->buf_ptr++ = s->bit_buf >> 24;
102
        s->bit_buf  <<= 8;
103
#endif
104
        s->bit_left  += 8;
105
    }
106
    s->bit_left = 32;
107
    s->bit_buf  = 0;
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
 */
118
void avpriv_align_put_bits(PutBitContext *s);
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
 */
125
void avpriv_put_string(PutBitContext *pb, const char *string,
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
 */
133
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
134
#endif
135
 
136
/**
137
 * Write up to 31 bits into a bitstream.
138
 * Use put_bits32 to write 32 bits.
139
 */
140
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
141
{
142
    unsigned int bit_buf;
143
    int bit_left;
144
 
145
    av_assert2(n <= 31 && value < (1U << n));
146
 
147
    bit_buf  = s->bit_buf;
148
    bit_left = s->bit_left;
149
 
150
    /* XXX: optimize */
151
#ifdef BITSTREAM_WRITER_LE
152
    bit_buf |= value << (32 - bit_left);
153
    if (n >= bit_left) {
154
        av_assert2(s->buf_ptr+3buf_end);
155
        AV_WL32(s->buf_ptr, bit_buf);
156
        s->buf_ptr += 4;
157
        bit_buf     = (bit_left == 32) ? 0 : value >> bit_left;
158
        bit_left   += 32;
159
    }
160
    bit_left -= n;
161
#else
162
    if (n < bit_left) {
163
        bit_buf     = (bit_buf << n) | value;
164
        bit_left   -= n;
165
    } else {
166
        bit_buf   <<= bit_left;
167
        bit_buf    |= value >> (n - bit_left);
168
        av_assert2(s->buf_ptr+3buf_end);
169
        AV_WB32(s->buf_ptr, bit_buf);
170
        s->buf_ptr += 4;
171
        bit_left   += 32 - n;
172
        bit_buf     = value;
173
    }
174
#endif
175
 
176
    s->bit_buf  = bit_buf;
177
    s->bit_left = bit_left;
178
}
179
 
180
static inline void put_sbits(PutBitContext *pb, int n, int32_t value)
181
{
182
    av_assert2(n >= 0 && n <= 31);
183
 
184
    put_bits(pb, n, value & ((1 << n) - 1));
185
}
186
 
187
/**
188
 * Write exactly 32 bits into a bitstream.
189
 */
190
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
191
{
192
    int lo = value & 0xffff;
193
    int hi = value >> 16;
194
#ifdef BITSTREAM_WRITER_LE
195
    put_bits(s, 16, lo);
196
    put_bits(s, 16, hi);
197
#else
198
    put_bits(s, 16, hi);
199
    put_bits(s, 16, lo);
200
#endif
201
}
202
 
203
/**
204
 * Return the pointer to the byte where the bitstream writer will put
205
 * the next bit.
206
 */
207
static inline uint8_t *put_bits_ptr(PutBitContext *s)
208
{
209
    return s->buf_ptr;
210
}
211
 
212
/**
213
 * Skip the given number of bytes.
214
 * PutBitContext must be flushed & aligned to a byte boundary before calling this.
215
 */
216
static inline void skip_put_bytes(PutBitContext *s, int n)
217
{
218
    av_assert2((put_bits_count(s) & 7) == 0);
219
    av_assert2(s->bit_left == 32);
220
    s->buf_ptr += n;
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
 */
228
static inline void skip_put_bits(PutBitContext *s, int n)
229
{
230
    s->bit_left -= n;
231
    s->buf_ptr  -= 4 * (s->bit_left >> 5);
232
    s->bit_left &= 31;
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
 */
240
static inline void set_put_bits_buffer_size(PutBitContext *s, int size)
241
{
242
    s->buf_end = s->buf + size;
243
}
244
 
245
#endif /* AVCODEC_PUT_BITS_H */