Mercurial > libdvdnav.hg
diff dvdread/nav_read.c @ 347:a5319a5c34f4 src
split bitstream reader functions in 2 separate files for reuse
author | nicodvb |
---|---|
date | Thu, 01 May 2008 17:13:36 +0000 |
parents | e75c52894630 |
children |
line wrap: on
line diff
--- a/dvdread/nav_read.c Sun Apr 27 09:53:45 2008 +0000 +++ b/dvdread/nav_read.c Thu May 01 17:13:36 2008 +0000 @@ -27,103 +27,10 @@ #include "nav_types.h" #include "nav_read.h" #include "dvdread_internal.h" - -typedef struct { - uint8_t *start; - uint32_t byte_position; - uint32_t bit_position; - uint8_t byte; -} getbits_state_t; - -static int getbits_init(getbits_state_t *state, uint8_t *start) { - if ((state == NULL) || (start == NULL)) return 0; - state->start = start; - state->bit_position = 0; - state->byte_position = 0; - state->byte = start[0]; - return 1; -} - -/* Non-optimized getbits. */ -/* This can easily be optimized for particular platforms. */ -static uint32_t getbits(getbits_state_t *state, uint32_t number_of_bits) { - uint32_t result=0; - uint8_t byte=0; - if (number_of_bits > 32) { - printf("Number of bits > 32 in getbits\n"); - abort(); - } +#include "bitreader.h" - if ((state->bit_position) > 0) { /* Last getbits left us in the middle of a byte. */ - if (number_of_bits > (8-state->bit_position)) { /* this getbits will span 2 or more bytes. */ - byte = state->byte; - byte = byte >> (state->bit_position); - result = byte; - number_of_bits -= (8-state->bit_position); - state->bit_position = 0; - state->byte_position++; - state->byte = state->start[state->byte_position]; - } else { - byte=state->byte; - state->byte = state->byte << number_of_bits; - byte = byte >> (8 - number_of_bits); - result = byte; - state->bit_position += number_of_bits; /* Here it is impossible for bit_position > 8 */ - if (state->bit_position == 8) { - state->bit_position = 0; - state->byte_position++; - state->byte = state->start[state->byte_position]; - } - number_of_bits = 0; - } - } - if ((state->bit_position) == 0) { - while (number_of_bits > 7) { - result = (result << 8) + state->byte; - state->byte_position++; - state->byte = state->start[state->byte_position]; - number_of_bits -= 8; - } - if (number_of_bits > 0) { /* number_of_bits < 8 */ - byte = state->byte; - state->byte = state->byte << number_of_bits; - state->bit_position += number_of_bits; /* Here it is impossible for bit_position > 7 */ - byte = byte >> (8 - number_of_bits); - result = (result << number_of_bits) + byte; - number_of_bits = 0; - } - } - - return result; -} - -#if 0 /* TODO: optimized versions not yet used */ - -/* WARNING: This function can only be used on a byte boundary. - No checks are made that we are in fact on a byte boundary. - */ -static uint16_t get16bits(getbits_state_t *state) { - uint16_t result; - state->byte_position++; - result = (state->byte << 8) + state->start[state->byte_position++]; - state->byte = state->start[state->byte_position]; - return result; -} - -/* WARNING: This function can only be used on a byte boundary. - No checks are made that we are in fact on a byte boundary. - */ -static uint32_t get32bits(getbits_state_t *state) { - uint32_t result; - state->byte_position++; - result = (state->byte << 8) + state->start[state->byte_position++]; - result = (result << 8) + state->start[state->byte_position++]; - result = (result << 8) + state->start[state->byte_position++]; - state->byte = state->start[state->byte_position]; - return result; -} - -#endif +#define getbits_init dvdread_getbits_init +#define getbits dvdread_getbits void navRead_PCI(pci_t *pci, unsigned char *buffer) { int32_t i, j;