summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/bitstream.c
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/bitstream.c') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/bitstream.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/bitstream.c b/core/multimedia/opieplayer/libmpeg3/bitstream.c
new file mode 100644
index 0000000..b4f46e3
--- a/dev/null
+++ b/core/multimedia/opieplayer/libmpeg3/bitstream.c
@@ -0,0 +1,167 @@
1#include "mpeg3private.h"
2#include "mpeg3protos.h"
3
4#include <stdlib.h>
5
6mpeg3_bits_t* mpeg3bits_new_stream(mpeg3_t *file, mpeg3_demuxer_t *demuxer)
7{
8 mpeg3_bits_t *stream = (mpeg3_bits_t*)malloc(sizeof(mpeg3_bits_t));
9 stream->bfr = 0;
10 stream->bfr_size = 0;
11 stream->bit_number = 0;
12 stream->file = file;
13 stream->demuxer = demuxer;
14 stream->input_ptr = 0;
15 return stream;
16}
17
18int mpeg3bits_delete_stream(mpeg3_bits_t* stream)
19{
20 free(stream);
21 return 0;
22}
23
24
25/* Fill a buffer. Only works if bit_number is on an 8 bit boundary */
26int mpeg3bits_read_buffer(mpeg3_bits_t* stream, unsigned char *buffer, int bytes)
27{
28 int result, i = 0;
29 while(stream->bit_number > 0)
30 {
31 stream->bit_number -= 8;
32 mpeg3demux_read_prev_char(stream->demuxer);
33 }
34
35 stream->bit_number = 0;
36 stream->bfr_size = 0;
37 stream->bfr = 0;
38 result = mpeg3demux_read_data(stream->demuxer, buffer, bytes);
39 return result;
40}
41
42/* For mp3 decompression use a pointer in a buffer for getbits. */
43int mpeg3bits_use_ptr(mpeg3_bits_t* stream, unsigned char *buffer)
44{
45 stream->bfr_size = stream->bit_number = 0;
46 stream->bfr = 0;
47 stream->input_ptr = buffer;
48 return 0;
49}
50
51/* Go back to using the demuxer for getbits in mp3. */
52int mpeg3bits_use_demuxer(mpeg3_bits_t* stream)
53{
54 if(stream->input_ptr)
55 {
56 stream->bfr_size = stream->bit_number = 0;
57 stream->input_ptr = 0;
58 stream->bfr = 0;
59 }
60
61 return 0;
62}
63
64/* Reconfigure for reverse operation */
65/* Default is forward operation */
66void mpeg3bits_start_reverse(mpeg3_bits_t* stream)
67{
68 int i;
69 for(i = 0; i < stream->bfr_size; i += 8)
70 if(stream->input_ptr)
71 stream->input_ptr--;
72 else
73 mpeg3demux_read_prev_char(stream->demuxer);
74}
75
76/* Reconfigure for forward operation */
77void mpeg3bits_start_forward(mpeg3_bits_t* stream)
78{
79 int i;
80 for(i = 0; i < stream->bfr_size; i += 8)
81 if(stream->input_ptr)
82 stream->input_ptr++;
83 else
84 mpeg3demux_read_char(stream->demuxer);
85}
86
87/* Erase the buffer with the next 4 bytes in the file. */
88int mpeg3bits_refill(mpeg3_bits_t* stream)
89{
90 stream->bit_number = 32;
91 stream->bfr_size = 32;
92
93 if(stream->input_ptr)
94 {
95 stream->bfr = (unsigned int)(*stream->input_ptr++) << 24;
96 stream->bfr |= (unsigned int)(*stream->input_ptr++) << 16;
97 stream->bfr |= (unsigned int)(*stream->input_ptr++) << 8;
98 stream->bfr |= *stream->input_ptr++;
99 }
100 else
101 {
102 stream->bfr = mpeg3demux_read_char(stream->demuxer) << 24;
103 stream->bfr |= mpeg3demux_read_char(stream->demuxer) << 16;
104 stream->bfr |= mpeg3demux_read_char(stream->demuxer) << 8;
105 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
106 }
107 return mpeg3demux_eof(stream->demuxer);
108}
109
110/* Erase the buffer with the previous 4 bytes in the file. */
111int mpeg3bits_refill_backwards(mpeg3_bits_t* stream)
112{
113 stream->bit_number = 0;
114 stream->bfr_size = 32;
115 stream->bfr = mpeg3demux_read_prev_char(stream->demuxer);
116 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << 8;
117 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << 16;
118 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << 24;
119 return mpeg3demux_eof(stream->demuxer);
120}
121
122int mpeg3bits_byte_align(mpeg3_bits_t *stream)
123{
124 stream->bit_number = (stream->bit_number + 7) & 0xf8;
125 return 0;
126}
127
128int mpeg3bits_seek_end(mpeg3_bits_t* stream)
129{
130 stream->bfr_size = stream->bit_number = 0;
131 return mpeg3demux_seek_byte(stream->demuxer, mpeg3demuxer_total_bytes(stream->demuxer));
132}
133
134int mpeg3bits_seek_start(mpeg3_bits_t* stream)
135{
136 stream->bfr_size = stream->bit_number = 0;
137 return mpeg3demux_seek_byte(stream->demuxer, 0);
138}
139
140int mpeg3bits_seek_time(mpeg3_bits_t* stream, double time_position)
141{
142 stream->bfr_size = stream->bit_number = 0;
143 return mpeg3demux_seek_time(stream->demuxer, time_position);
144}
145
146int mpeg3bits_seek_byte(mpeg3_bits_t* stream, long position)
147{
148 stream->bfr_size = stream->bit_number = 0;
149 return mpeg3demux_seek_byte(stream->demuxer, position);
150}
151
152int mpeg3bits_seek_percentage(mpeg3_bits_t* stream, double percentage)
153{
154 stream->bfr_size = stream->bit_number = 0;
155 return mpeg3demux_seek_percentage(stream->demuxer, percentage);
156}
157
158int mpeg3bits_tell(mpeg3_bits_t* stream)
159{
160 return mpeg3demux_tell(stream->demuxer);
161}
162
163int mpeg3bits_getbitoffset(mpeg3_bits_t *stream)
164{
165 return stream->bit_number & 7;
166}
167