annotate bitreader.c @ 64:70c34d162e6e src

Replaces the hard-coded values The parental management structure has ratings levels. The size of the bit mask is constant but magic values were being used instead of named constants. This commit changes them to named constants. This is based on a patch submitted by Frederic Marchal, fmarchal at perso dot be. Thanks for this tidy cleanup.
author erik
date Sun, 30 Jan 2011 23:44:13 +0000
parents 9f1804080f76
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1 /*
22
447c5319a522 Convert all ISO8859-1 sequences to proper UTF-8.
diego
parents: 21
diff changeset
2 * Copyright (C) 2000, 2001, 2002, 2003 HÃ¥kan Hjort <d95hjort@dtek.chalmers.se>
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
3 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
4 * This file is part of libdvdread.
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
5 *
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
6 * libdvdread is free software; you can redistribute it and/or modify
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
9 * (at your option) any later version.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
10 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
11 * libdvdread is distributed in the hope that it will be useful,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
14 * GNU General Public License for more details.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
15 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
16 * You should have received a copy of the GNU General Public License along
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
17 * with libdvdread; if not, write to the Free Software Foundation, Inc.,
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 3
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
19 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
20
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
21 #include <stdio.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
22 #include <stdlib.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
23 #include <string.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
24 #include <inttypes.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
25
33
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 22
diff changeset
26 #include "dvdread/bitreader.h"
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
27
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
28 int dvdread_getbits_init(getbits_state_t *state, uint8_t *start) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
29 if ((state == NULL) || (start == NULL)) return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
30 state->start = start;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
31 state->bit_position = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
32 state->byte_position = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
33 state->byte = start[0];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
34 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
35 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
36
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
37 /* Non-optimized getbits. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
38 /* This can easily be optimized for particular platforms. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
39 uint32_t dvdread_getbits(getbits_state_t *state, uint32_t number_of_bits) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
40 uint32_t result=0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
41 uint8_t byte=0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
42 if (number_of_bits > 32) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
43 printf("Number of bits > 32 in getbits\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
44 abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
45 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
46
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
47 if ((state->bit_position) > 0) { /* Last getbits left us in the middle of a byte. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
48 if (number_of_bits > (8-state->bit_position)) { /* this getbits will span 2 or more bytes. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
49 byte = state->byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
50 byte = byte >> (state->bit_position);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
51 result = byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
52 number_of_bits -= (8-state->bit_position);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
53 state->bit_position = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
54 state->byte_position++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
55 state->byte = state->start[state->byte_position];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
56 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
57 byte=state->byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
58 state->byte = state->byte << number_of_bits;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
59 byte = byte >> (8 - number_of_bits);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
60 result = byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
61 state->bit_position += number_of_bits; /* Here it is impossible for bit_position > 8 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
62 if (state->bit_position == 8) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
63 state->bit_position = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
64 state->byte_position++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
65 state->byte = state->start[state->byte_position];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
66 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
67 number_of_bits = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
68 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
69 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
70 if ((state->bit_position) == 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
71 while (number_of_bits > 7) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
72 result = (result << 8) + state->byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
73 state->byte_position++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
74 state->byte = state->start[state->byte_position];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
75 number_of_bits -= 8;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
76 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
77 if (number_of_bits > 0) { /* number_of_bits < 8 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
78 byte = state->byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
79 state->byte = state->byte << number_of_bits;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
80 state->bit_position += number_of_bits; /* Here it is impossible for bit_position > 7 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
81 byte = byte >> (8 - number_of_bits);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
82 result = (result << number_of_bits) + byte;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
83 number_of_bits = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
84 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
85 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
86
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
87 return result;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
88 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
89
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
90 #if 0 /* TODO: optimized versions not yet used */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
91
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
92 /* WARNING: This function can only be used on a byte boundary.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
93 No checks are made that we are in fact on a byte boundary.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
94 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
95 uint16_t dvdread_get16bits(getbits_state_t *state) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
96 uint16_t result;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
97 state->byte_position++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
98 result = (state->byte << 8) + state->start[state->byte_position++];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
99 state->byte = state->start[state->byte_position];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
100 return result;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
101 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
102
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
103 /* WARNING: This function can only be used on a byte boundary.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
104 No checks are made that we are in fact on a byte boundary.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
105 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
106 uint32_t dvdread_get32bits(getbits_state_t *state) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
107 uint32_t result;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
108 state->byte_position++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
109 result = (state->byte << 8) + state->start[state->byte_position++];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
110 result = (result << 8) + state->start[state->byte_position++];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
111 result = (result << 8) + state->start[state->byte_position++];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
112 state->byte = state->start[state->byte_position];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
113 return result;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
114 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
115
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
116 #endif