#include "getbits.h" unsigned long _gst_getbits_int_cb (gst_getbits_t * gb, unsigned long bits); unsigned long _gst_get1bit_int (gst_getbits_t * gb, unsigned long bits); unsigned long _gst_getbits_int (gst_getbits_t * gb, unsigned long bits); unsigned long _gst_getbits_fast_int (gst_getbits_t * gb, unsigned long bits); unsigned long _gst_showbits_int (gst_getbits_t * gb, unsigned long bits); void _gst_flushbits_int (gst_getbits_t * gb, unsigned long bits); void _gst_getbits_back_int (gst_getbits_t * gb, unsigned long bits); unsigned long _gst_getbits_int_cb (gst_getbits_t * gb, unsigned long bits) { int result; int bitsleft; /*printf("gst_getbits%lu %ld %p %08x\n", bits, gb->bits, gb->ptr, gb->dword); */ if (!bits) return 0; gb->bits -= bits; result = gb->dword >> (32 - bits); if (gb->bits < 0) { gb->ptr += 4; bitsleft = (gb->endptr - gb->ptr) * 8; bits = -gb->bits; gb->bits += (bitsleft > 32 ? 32 : bitsleft); if (gb->endptr <= gb->ptr) { (gb->callback) (gb, gb->data); gb->bits -= bits; } gb->dword = swab32 (*((unsigned long *) (gb->ptr))); result |= (gb->dword >> (32 - bits)); } gb->dword <<= bits; return result; } unsigned long _gst_get1bit_int (gst_getbits_t * gb, unsigned long bits) { unsigned char rval; rval = *gb->ptr << gb->bits; gb->bits++; gb->ptr += (gb->bits >> 3); gb->bits &= 0x7; GST_DEBUG ("getbits%ld, %08x", bits, rval); return rval >> 7; } unsigned long _gst_getbits_int (gst_getbits_t * gb, unsigned long bits) { unsigned long rval; if (bits == 0) return 0; rval = swab32 (*((unsigned long *) (gb->ptr))); rval <<= gb->bits; gb->bits += bits; rval >>= (32 - bits); gb->ptr += (gb->bits >> 3); gb->bits &= 0x7; GST_DEBUG ("getbits%ld, %08lx", bits, rval); return rval; } unsigned long _gst_getbits_fast_int (gst_getbits_t * gb, unsigned long bits) { unsigned long rval; rval = (unsigned char) (gb->ptr[0] << gb->bits); rval |= ((unsigned int) gb->ptr[1] << gb->bits) >> 8; rval <<= bits; rval >>= 8; gb->bits += bits; gb->ptr += (gb->bits >> 3); gb->bits &= 0x7; GST_DEBUG ("getbits%ld, %08lx", bits, rval); return rval; } unsigned long _gst_showbits_int (gst_getbits_t * gb, unsigned long bits) { unsigned long rval; if (bits == 0) return 0; rval = swab32 (*((unsigned long *) (gb->ptr))); rval <<= gb->bits; rval >>= (32 - bits); GST_DEBUG ("showbits%ld, %08lx", bits, rval); return rval; } void _gst_flushbits_int (gst_getbits_t * gb, unsigned long bits) { gb->bits += bits; gb->ptr += (gb->bits >> 3); gb->bits &= 0x7; GST_DEBUG ("flushbits%ld", bits); } void _gst_getbits_back_int (gst_getbits_t * gb, unsigned long bits) { gb->bits -= bits; gb->ptr += (gb->bits >> 3); gb->bits &= 0x7; }