2 * Copyright (C) 2000, 2001, 2002, 2003 HÃ¥kan Hjort <d95hjort@dtek.chalmers.se>
4 * This file is part of libdvdread.
6 * libdvdread is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * libdvdread 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
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with libdvdread; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "dvdread/bitreader.h"
28 int dvdread_getbits_init(getbits_state_t
*state
, uint8_t *start
) {
29 if ((state
== NULL
) || (start
== NULL
)) return 0;
31 state
->bit_position
= 0;
32 state
->byte_position
= 0;
33 state
->byte
= start
[0];
37 /* Non-optimized getbits. */
38 /* This can easily be optimized for particular platforms. */
39 uint32_t dvdread_getbits(getbits_state_t
*state
, uint32_t number_of_bits
) {
42 if (number_of_bits
> 32) {
43 printf("Number of bits > 32 in getbits\n");
47 if ((state
->bit_position
) > 0) { /* Last getbits left us in the middle of a byte. */
48 if (number_of_bits
> (8-state
->bit_position
)) { /* this getbits will span 2 or more bytes. */
50 byte
= byte
>> (state
->bit_position
);
52 number_of_bits
-= (8-state
->bit_position
);
53 state
->bit_position
= 0;
54 state
->byte_position
++;
55 state
->byte
= state
->start
[state
->byte_position
];
58 state
->byte
= state
->byte
<< number_of_bits
;
59 byte
= byte
>> (8 - number_of_bits
);
61 state
->bit_position
+= number_of_bits
; /* Here it is impossible for bit_position > 8 */
62 if (state
->bit_position
== 8) {
63 state
->bit_position
= 0;
64 state
->byte_position
++;
65 state
->byte
= state
->start
[state
->byte_position
];
70 if ((state
->bit_position
) == 0) {
71 while (number_of_bits
> 7) {
72 result
= (result
<< 8) + state
->byte
;
73 state
->byte_position
++;
74 state
->byte
= state
->start
[state
->byte_position
];
77 if (number_of_bits
> 0) { /* number_of_bits < 8 */
79 state
->byte
= state
->byte
<< number_of_bits
;
80 state
->bit_position
+= number_of_bits
; /* Here it is impossible for bit_position > 7 */
81 byte
= byte
>> (8 - number_of_bits
);
82 result
= (result
<< number_of_bits
) + byte
;
90 #if 0 /* TODO: optimized versions not yet used */
92 /* WARNING: This function can only be used on a byte boundary.
93 No checks are made that we are in fact on a byte boundary.
95 uint16_t dvdread_get16bits(getbits_state_t
*state
) {
97 state
->byte_position
++;
98 result
= (state
->byte
<< 8) + state
->start
[state
->byte_position
++];
99 state
->byte
= state
->start
[state
->byte_position
];
103 /* WARNING: This function can only be used on a byte boundary.
104 No checks are made that we are in fact on a byte boundary.
106 uint32_t dvdread_get32bits(getbits_state_t
*state
) {
108 state
->byte_position
++;
109 result
= (state
->byte
<< 8) + state
->start
[state
->byte_position
++];
110 result
= (result
<< 8) + state
->start
[state
->byte_position
++];
111 result
= (result
<< 8) + state
->start
[state
->byte_position
++];
112 state
->byte
= state
->start
[state
->byte_position
];