summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/bitstream.h
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/bitstream.h') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/bitstream.h207
1 files changed, 207 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/bitstream.h b/core/multimedia/opieplayer/libmpeg3/bitstream.h
new file mode 100644
index 0000000..2f6dcf9
--- a/dev/null
+++ b/core/multimedia/opieplayer/libmpeg3/bitstream.h
@@ -0,0 +1,207 @@
1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3**
4** This file is part of Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#ifndef BITSTREAM_H
21#define BITSTREAM_H
22
23#include "mpeg3demux.h"
24
25#if defined(__cplusplus)
26extern "C" {
27#endif
28
29// next bit in forward direction
30// next bit in reverse direction |
31// v v
32// | | | | | | | | | | | | | | | | | | | | | | | | | | |1|1|1|1|1|1| */
33// ^ ^
34// | bit_number = 1
35// bfr_size = 6
36
37typedef struct
38{
39 unsigned MPEG3_INT32 bfr; /* bfr = buffer for bits */
40 int bit_number; /* position of pointer in bfr */
41 int bfr_size; /* number of bits in bfr. Should always be a multiple of 8 */
42 struct mpeg3_rec *file; /* Mpeg2 file */
43 mpeg3_demuxer_t *demuxer; /* Mpeg2 demuxer */
44/* If the input ptr is true, data is read from it instead of the demuxer. */
45 unsigned char *input_ptr;
46} mpeg3_bits_t;
47
48LIBMPEG_EXPORT unsigned int mpeg3demux_read_char_packet(mpeg3_demuxer_t *demuxer);
49LIBMPEG_EXPORT unsigned int mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t *demuxer);
50
51/* ======================================================================== */
52/* Entry Points */
53/* ======================================================================== */
54
55#define mpeg3bits_tell_percentage(stream) mpeg3demux_tell_percentage((stream)->demuxer)
56
57#define mpeg3bits_packet_time(stream) mpeg3demux_current_time((stream)->demuxer)
58
59#define mpeg3bits_time_offset(stream) mepg2demux_time_offset((stream)->demuxer)
60
61#define mpeg3bits_error(stream) mpeg3demux_error((stream)->demuxer)
62
63#define mpeg3bits_eof(stream) mpeg3demux_eof((stream)->demuxer)
64
65#define mpeg3bits_bof(stream) mpeg3demux_bof((stream)->demuxer)
66
67/* Read bytes backward from the file until the reverse_bits is full. */
68static inline void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits)
69{
70// Right justify
71 while(stream->bit_number > 7)
72 {
73 stream->bfr >>= 8;
74 stream->bfr_size -= 8;
75 stream->bit_number -= 8;
76 }
77
78// Insert bytes before bfr_size
79 while(stream->bfr_size - stream->bit_number < bits)
80 {
81 if(stream->input_ptr)
82 stream->bfr |= (unsigned int)(*--stream->input_ptr) << stream->bfr_size;
83 else
84 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << stream->bfr_size;
85 stream->bfr_size += 8;
86 }
87}
88
89/* Read bytes forward from the file until the forward_bits is full. */
90extern inline void mpeg3bits_fill_bits(mpeg3_bits_t* stream, int bits)
91{
92 while(stream->bit_number < bits)
93 {
94 stream->bfr <<= 8;
95 if(stream->input_ptr)
96 {
97 stream->bfr |= *stream->input_ptr++;
98 }
99 else
100 {
101 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
102 }
103 stream->bit_number += 8;
104 stream->bfr_size += 8;
105 if(stream->bfr_size > 32) stream->bfr_size = 32;
106 }
107}
108
109/* Return 8 bits, advancing the file position. */
110extern inline unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t* stream)
111{
112 if(stream->bit_number < 8)
113 {
114 stream->bfr <<= 8;
115 if(stream->input_ptr)
116 stream->bfr |= *stream->input_ptr++;
117 else
118 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
119
120 stream->bfr_size += 8;
121 if(stream->bfr_size > 32) stream->bfr_size = 32;
122
123 return (stream->bfr >> stream->bit_number) & 0xff;
124 }
125 return (stream->bfr >> (stream->bit_number -= 8)) & 0xff;
126}
127
128extern inline unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t* stream)
129{
130 if(!stream->bit_number)
131 {
132 stream->bfr <<= 8;
133 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
134
135 stream->bfr_size += 8;
136 if(stream->bfr_size > 32) stream->bfr_size = 32;
137
138 stream->bit_number = 7;
139
140 return (stream->bfr >> 7) & 0x1;
141 }
142 return (stream->bfr >> (--stream->bit_number)) & (0x1);
143}
144
145/* Return n number of bits, advancing the file position. */
146/* Use in place of flushbits */
147extern inline unsigned int mpeg3bits_getbits(mpeg3_bits_t* stream, int bits)
148{
149 if(bits <= 0) return 0;
150 mpeg3bits_fill_bits(stream, bits);
151 return (stream->bfr >> (stream->bit_number -= bits)) & (0xffffffff >> (32 - bits));
152}
153
154extern inline unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t* stream)
155{
156 while(stream->bit_number < 24)
157 {
158 stream->bfr <<= 8;
159 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
160 stream->bit_number += 8;
161 stream->bfr_size += 8;
162 if(stream->bfr_size > 32) stream->bfr_size = 32;
163 }
164 return (stream->bfr >> (stream->bit_number - 24)) & 0xffffff;
165}
166
167extern inline unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t* stream)
168{
169 while(stream->bit_number < 32)
170 {
171 stream->bfr <<= 8;
172 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
173 stream->bit_number += 8;
174 stream->bfr_size += 8;
175 if(stream->bfr_size > 32) stream->bfr_size = 32;
176 }
177 return stream->bfr;
178}
179
180extern inline unsigned int mpeg3bits_showbits(mpeg3_bits_t* stream, int bits)
181{
182 mpeg3bits_fill_bits(stream, bits);
183 return (stream->bfr >> (stream->bit_number - bits)) & (0xffffffff >> (32 - bits));
184}
185
186extern inline unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t* stream, int bits)
187{
188 unsigned int result;
189 mpeg3bits_fill_reverse_bits(stream, bits);
190 result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
191 stream->bit_number += bits;
192 return result;
193}
194
195extern inline unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t* stream, int bits)
196{
197 unsigned int result;
198 mpeg3bits_fill_reverse_bits(stream, bits);
199 result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
200 return result;
201}
202
203#if defined(__cplusplus)
204}
205#endif
206
207#endif