# HG changeset patch # User nicodvb # Date 1209662016 0 # Node ID a5319a5c34f4aea41f7ca969e997a1d0fe85795e # Parent e14f453bb208142d7a3044a158c6c9d379836f6c split bitstream reader functions in 2 separate files for reuse diff -r e14f453bb208 -r a5319a5c34f4 dvdread/Makefile.am --- a/dvdread/Makefile.am Sun Apr 27 09:53:45 2008 +0000 +++ b/dvdread/Makefile.am Thu May 01 17:13:36 2008 +0000 @@ -7,8 +7,8 @@ lib_LTLIBRARIES = libdvdread.la libdvdread_la_SOURCES = dvd_reader.c nav_read.c ifo_read.c \ - dvd_input.c dvd_udf.c md5.c nav_print.c ifo_print.c \ - bswap.h dvd_input.h dvdread_internal.h dvd_udf.h md5.h + dvd_input.c dvd_udf.c md5.c nav_print.c ifo_print.c bitreader.c \ + bswap.h dvd_input.h dvdread_internal.h dvd_udf.h md5.h bitreader.h libdvdread_la_LIBADD = $(DYNAMIC_LD_LIBS) @@ -16,4 +16,4 @@ -export-symbols-regex "(^dvd.*|^nav.*|^ifo.*|^DVD.*|^UDF.*)" include_HEADERS = dvd_reader.h nav_read.h ifo_read.h \ - nav_print.h ifo_print.h ifo_types.h nav_types.h dvd_udf.h + nav_print.h ifo_print.h ifo_types.h nav_types.h dvd_udf.h bitreader.h diff -r e14f453bb208 -r a5319a5c34f4 dvdread/bitreader.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvdread/bitreader.c Thu May 01 17:13:36 2008 +0000 @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2000, 2001, 2002, 2003 Håkan Hjort + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "bswap.h" +#include "bitreader.h" + +int dvdread_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. */ +uint32_t dvdread_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(); + } + + 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. + */ +uint16_t dvdread_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. + */ +uint32_t dvdread_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 diff -r e14f453bb208 -r a5319a5c34f4 dvdread/bitreader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvdread/bitreader.h Thu May 01 17:13:36 2008 +0000 @@ -0,0 +1,40 @@ +#ifndef BITREADER_H_INCLUDED +#define BITREADER_H_INCLUDED + +/* + * Copyright (C) 2000, 2001, 2002 Håkan Hjort . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint8_t *start; + uint32_t byte_position; + uint32_t bit_position; + uint8_t byte; +} getbits_state_t; + +int dvdread_getbits_init(getbits_state_t *state, uint8_t *start); +uint32_t dvdread_getbits(getbits_state_t *state, uint32_t number_of_bits); + +#ifdef __cplusplus +}; +#endif +#endif /* BITREADER_H_INCLUDED */ diff -r e14f453bb208 -r a5319a5c34f4 dvdread/nav_read.c --- 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;