annotate put_bits.h @ 9830:bd0879f752e6 libavcodec

Express the H.264 parser dependency on the golomb code in configure instead of in the Makefile as it is done for all other parts that depend on golomb.
author diego
date Tue, 09 Jun 2009 20:29:52 +0000
parents 2887f410011f
children 2b8a327189cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
1 /*
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
2 * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
3 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
4 * This file is part of FFmpeg.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
5 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
10 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
14 * Lesser General Public License for more details.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
15 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
19 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
20
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
21 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
22 * @file libavcodec/put_bits.h
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
23 * bitstream writer API
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
24 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
25
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
26 #ifndef AVCODEC_PUT_BITS_H
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
27 #define AVCODEC_PUT_BITS_H
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
28
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
29 #include <stdint.h>
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
30 #include <stdlib.h>
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
31 #include <assert.h>
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
32 #include "libavutil/bswap.h"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
33 #include "libavutil/common.h"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
34 #include "libavutil/intreadwrite.h"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
35 #include "libavutil/log.h"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
36 #include "mathops.h"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
37
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
38 //#define ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
39 //#define ALIGNED_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
40
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
41 /* buf and buf_end must be present and used by every alternative writer. */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
42 typedef struct PutBitContext {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
43 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
44 uint8_t *buf, *buf_end;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
45 int index;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
46 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
47 uint32_t bit_buf;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
48 int bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
49 uint8_t *buf, *buf_ptr, *buf_end;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
50 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
51 int size_in_bits;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
52 } PutBitContext;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
53
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
54 /**
9822
2887f410011f Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents: 9433
diff changeset
55 * Initializes the PutBitContext s.
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
56 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
57 * @param buffer the buffer where to put bits
9822
2887f410011f Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents: 9433
diff changeset
58 * @param buffer_size the size in bytes of buffer
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
59 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
60 static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
61 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
62 if(buffer_size < 0) {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
63 buffer_size = 0;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
64 buffer = NULL;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
65 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
66
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
67 s->size_in_bits= 8*buffer_size;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
68 s->buf = buffer;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
69 s->buf_end = s->buf + buffer_size;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
70 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
71 s->index=0;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
72 ((uint32_t*)(s->buf))[0]=0;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
73 // memset(buffer, 0, buffer_size);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
74 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
75 s->buf_ptr = s->buf;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
76 s->bit_left=32;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
77 s->bit_buf=0;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
78 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
79 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
80
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
81 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
82 * Returns the total number of bits written to the bitstream.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
83 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
84 static inline int put_bits_count(PutBitContext *s)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
85 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
86 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
87 return s->index;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
88 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
89 return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
90 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
91 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
92
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
93 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
94 * Pads the end of the output stream with zeros.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
95 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
96 static inline void flush_put_bits(PutBitContext *s)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
97 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
98 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
99 align_put_bits(s);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
100 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
101 #ifndef BITSTREAM_WRITER_LE
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
102 s->bit_buf<<= s->bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
103 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
104 while (s->bit_left < 32) {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
105 /* XXX: should test end of buffer */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
106 #ifdef BITSTREAM_WRITER_LE
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
107 *s->buf_ptr++=s->bit_buf;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
108 s->bit_buf>>=8;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
109 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
110 *s->buf_ptr++=s->bit_buf >> 24;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
111 s->bit_buf<<=8;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
112 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
113 s->bit_left+=8;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
114 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
115 s->bit_left=32;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
116 s->bit_buf=0;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
117 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
118 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
119
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
120 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
121 * Pads the bitstream with zeros up to the next byte boundary.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
122 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
123 void align_put_bits(PutBitContext *s);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
124
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
125 /**
9822
2887f410011f Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents: 9433
diff changeset
126 * Puts the string s in the bitstream.
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
127 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
128 * @param terminate_string 0-terminates the written string if value is 1
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
129 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
130 void ff_put_string(PutBitContext * pbc, const char *s, int terminate_string);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
131
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
132 /**
9822
2887f410011f Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents: 9433
diff changeset
133 * Copies the content of src to the bitstream.
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
134 *
9822
2887f410011f Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents: 9433
diff changeset
135 * @param length the number of bits of src to copy
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
136 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
137 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
138
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
139 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
140 #ifndef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
141 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
142 unsigned int bit_buf;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
143 int bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
144
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
145 // printf("put_bits=%d %x\n", n, value);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
146 assert(n == 32 || value < (1U << n));
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
147
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
148 bit_buf = s->bit_buf;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
149 bit_left = s->bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
150
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
151 // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
152 /* XXX: optimize */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
153 #ifdef BITSTREAM_WRITER_LE
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
154 bit_buf |= value << (32 - bit_left);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
155 if (n >= bit_left) {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
156 #if !HAVE_FAST_UNALIGNED
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
157 if (3 & (intptr_t) s->buf_ptr) {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
158 AV_WL32(s->buf_ptr, bit_buf);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
159 } else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
160 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
161 *(uint32_t *)s->buf_ptr = le2me_32(bit_buf);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
162 s->buf_ptr+=4;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
163 bit_buf = (bit_left==32)?0:value >> bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
164 bit_left+=32;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
165 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
166 bit_left-=n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
167 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
168 if (n < bit_left) {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
169 bit_buf = (bit_buf<<n) | value;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
170 bit_left-=n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
171 } else {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
172 bit_buf<<=bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
173 bit_buf |= value >> (n - bit_left);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
174 #if !HAVE_FAST_UNALIGNED
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
175 if (3 & (intptr_t) s->buf_ptr) {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
176 AV_WB32(s->buf_ptr, bit_buf);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
177 } else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
178 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
179 *(uint32_t *)s->buf_ptr = be2me_32(bit_buf);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
180 //printf("bitbuf = %08x\n", bit_buf);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
181 s->buf_ptr+=4;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
182 bit_left+=32 - n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
183 bit_buf = value;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
184 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
185 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
186
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
187 s->bit_buf = bit_buf;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
188 s->bit_left = bit_left;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
189 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
190 #else /* ALT_BITSTREAM_WRITER defined */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
191 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
192 # ifdef ALIGNED_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
193 # if ARCH_X86
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
194 __asm__ volatile(
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
195 "movl %0, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
196 "xorl %%eax, %%eax \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
197 "shrdl %%cl, %1, %%eax \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
198 "shrl %%cl, %1 \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
199 "movl %0, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
200 "shrl $3, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
201 "andl $0xFFFFFFFC, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
202 "bswapl %1 \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
203 "orl %1, (%2, %%ecx) \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
204 "bswapl %%eax \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
205 "addl %3, %0 \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
206 "movl %%eax, 4(%2, %%ecx) \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
207 : "=&r" (s->index), "=&r" (value)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
208 : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n))
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
209 : "%eax", "%ecx"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
210 );
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
211 # else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
212 int index= s->index;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
213 uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
214
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
215 value<<= 32-n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
216
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
217 ptr[0] |= be2me_32(value>>(index&31));
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
218 ptr[1] = be2me_32(value<<(32-(index&31)));
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
219 //if(n>24) printf("%d %d\n", n, value);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
220 index+= n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
221 s->index= index;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
222 # endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
223 # else //ALIGNED_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
224 # if ARCH_X86
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
225 __asm__ volatile(
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
226 "movl $7, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
227 "andl %0, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
228 "addl %3, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
229 "negl %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
230 "shll %%cl, %1 \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
231 "bswapl %1 \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
232 "movl %0, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
233 "shrl $3, %%ecx \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
234 "orl %1, (%%ecx, %2) \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
235 "addl %3, %0 \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
236 "movl $0, 4(%%ecx, %2) \n\t"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
237 : "=&r" (s->index), "=&r" (value)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
238 : "r" (s->buf), "r" (n), "0" (s->index), "1" (value)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
239 : "%ecx"
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
240 );
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
241 # else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
242 int index= s->index;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
243 uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
244
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
245 ptr[0] |= be2me_32(value<<(32-n-(index&7) ));
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
246 ptr[1] = 0;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
247 //if(n>24) printf("%d %d\n", n, value);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
248 index+= n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
249 s->index= index;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
250 # endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
251 # endif //!ALIGNED_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
252 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
253 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
254
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
255 static inline void put_sbits(PutBitContext *pb, int bits, int32_t val)
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
256 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
257 assert(bits >= 0 && bits <= 31);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
258
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
259 put_bits(pb, bits, val & ((1<<bits)-1));
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
260 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
261
9412
a61f0c7f40a8 Document pbBufPtr().
stefano
parents: 9411
diff changeset
262 /**
a61f0c7f40a8 Document pbBufPtr().
stefano
parents: 9411
diff changeset
263 * Returns the pointer to the byte where the bitstream writer will put
a61f0c7f40a8 Document pbBufPtr().
stefano
parents: 9411
diff changeset
264 * the next bit.
a61f0c7f40a8 Document pbBufPtr().
stefano
parents: 9411
diff changeset
265 */
9431
932543edc1d2 Rename pbBufPtr() to put_bits_ptr().
stefano
parents: 9412
diff changeset
266 static inline uint8_t* put_bits_ptr(PutBitContext *s)
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
267 {
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
268 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
269 return s->buf + (s->index>>3);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
270 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
271 return s->buf_ptr;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
272 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
273 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
274
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
275 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
276 * Skips the given number of bytes.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
277 * PutBitContext must be flushed & aligned to a byte boundary before calling this.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
278 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
279 static inline void skip_put_bytes(PutBitContext *s, int n){
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
280 assert((put_bits_count(s)&7)==0);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
281 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
282 FIXME may need some cleaning of the buffer
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
283 s->index += n<<3;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
284 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
285 assert(s->bit_left==32);
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
286 s->buf_ptr += n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
287 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
288 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
289
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
290 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
291 * Skips the given number of bits.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
292 * Must only be used if the actual values in the bitstream do not matter.
9822
2887f410011f Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents: 9433
diff changeset
293 * If n is 0 the behavior is undefined.
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
294 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
295 static inline void skip_put_bits(PutBitContext *s, int n){
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
296 #ifdef ALT_BITSTREAM_WRITER
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
297 s->index += n;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
298 #else
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
299 s->bit_left -= n;
9433
70afd9081b3f Fix skip_put_bits() buf_ptr increment.
stefano
parents: 9431
diff changeset
300 s->buf_ptr-= 4*(s->bit_left>>5);
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
301 s->bit_left &= 31;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
302 #endif
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
303 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
304
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
305 /**
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
306 * Changes the end of the buffer.
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
307 *
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
308 * @param size the new size in bytes of the buffer where to put bits
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
309 */
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
310 static inline void set_put_bits_buffer_size(PutBitContext *s, int size){
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
311 s->buf_end= s->buf + size;
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
312 }
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
313
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
diff changeset
314 #endif /* AVCODEC_PUT_BITS_H */