version update
[goodguy/cinelerra.git] / cinelerra-5.1 / libzmpeg3 / bits.C
1 #include "libzmpeg3.h"
2
3 zbits_t::
4 bits_t(zmpeg3_t *zsrc, demuxer_t *demux)
5 {
6   bfr = 0;
7   bfr_size = 0;
8   bit_number = 0;
9   src = zsrc;
10   demuxer = demux;
11   input_ptr = 0;
12 }
13
14 zbits_t::
15 ~bits_t()
16 {
17 }
18
19 /* Fill a buffer.  Only works if bit_number is on an 8 bit boundary */
20 int zbits_t::
21 read_buffer(uint8_t *buffer, int bytes)
22 {
23   while( bit_number > 0 ) {
24     bit_number -= 8;
25     demuxer->read_prev_char();
26   }
27
28   bit_number = 0;
29   bfr_size = 0;
30   bfr = 0;
31   int result = demuxer->read_data(buffer, bytes);
32   return result;
33 }
34
35 /* For mp3 decompression use a pointer in a buffer for get_bits. */
36 void zbits_t::
37 use_ptr(uint8_t *buffer)
38 {
39   bfr_size = bit_number = 0;
40   bfr = 0;
41   input_ptr = buffer;
42 }
43
44 /* Go back to using the demuxer for get_bits in mp3. */
45 void zbits_t::
46 use_demuxer()
47 {
48   if( input_ptr ) {
49     bfr_size = bit_number = 0;
50     input_ptr = 0;
51     bfr = 0;
52   }
53 }
54
55 /* Reconfigure for reverse operation */
56 /* Default is forward operation */
57 void zbits_t::
58 start_reverse()
59 {
60   if( input_ptr )
61     input_ptr -= (bfr_size+7)/8;
62   else for( int i=0; i<bfr_size; i+=8 )
63     demuxer->read_prev_char();
64 }
65
66 /* Reconfigure for forward operation */
67 void zbits_t::
68 start_forward()
69 {
70 // If already at the bof, the buffer is already invalid.
71   if( demuxer && bof() ) {
72     bfr_size = 0;
73     bit_number = 0;
74     bfr = 0;
75     input_ptr = 0;
76     demuxer->read_char();
77   }
78   else if( input_ptr )
79     input_ptr += (bfr_size+7)/8;
80   else for( int i=0; i<bfr_size; i+=8 )
81     demuxer->read_char();
82 }
83
84 /* Erase the buffer with the next 4 bytes in the file. */
85 int zbits_t::
86 refill_ptr()
87 {
88   bit_number = 32;
89   bfr_size = 32;
90   bfr  = (uint32_t)(*input_ptr++) << 24;
91   bfr |= (uint32_t)(*input_ptr++) << 16;
92   bfr |= (uint32_t)(*input_ptr++) << 8;
93   bfr |= (uint32_t)*input_ptr++;
94   return demuxer->eof();
95 }
96
97 int zbits_t::
98 refill_noptr()
99 {
100   bit_number = 32;
101   bfr_size = 32;
102   bfr  = (uint32_t)demuxer->read_char() << 24;
103   bfr |= (uint32_t)demuxer->read_char() << 16;
104   bfr |= (uint32_t)demuxer->read_char() << 8;
105   bfr |= (uint32_t)demuxer->read_char();
106   return demuxer->eof();
107 }
108
109 /* Erase the buffer with the previous 4 bytes in the file. */
110 int zbits_t::
111 refill_reverse()
112 {
113   bit_number = 0;
114   bfr_size = 32;
115   bfr  = (uint32_t)demuxer->read_prev_char();
116   bfr |= (uint32_t)demuxer->read_prev_char() << 8;
117   bfr |= (uint32_t)demuxer->read_prev_char() << 16;
118   bfr |= (uint32_t)demuxer->read_prev_char() << 24;
119   return demuxer->eof();
120 }
121
122 int zbits_t::
123 open_title(int title)
124 {
125   bfr_size = bit_number = 0;
126   return demuxer->open_title(title);
127 }
128
129 /*
130  * int zbits_t::
131  * seek_time(double time_position)
132  * {
133  *   bfr_size = bit_number = 0;
134  *   return demuxer->seek_time(time_position);
135  * }
136  */
137
138 int zbits_t::
139 seek_byte(int64_t position)
140 {
141   bfr_size = bit_number = 0;
142   return demuxer->seek_byte(position);
143 }
144