mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 01:45:33 +00:00
configure.ac: Remove getbits library. Nothing uses it, and it should be in something like liboil if someone did want...
Original commit message from CVS: * configure.ac: Remove getbits library. Nothing uses it, and it should be in something like liboil if someone did want to use it. * libs/gst/Makefile.am: * libs/gst/getbits/Makefile.am: * libs/gst/getbits/gbtest.c: * libs/gst/getbits/getbits.c: * libs/gst/getbits/getbits.h: * libs/gst/getbits/gstgetbits_generic.c: * libs/gst/getbits/gstgetbits_i386.s: * libs/gst/getbits/gstgetbits_inl.h:
This commit is contained in:
parent
e245175fa3
commit
1f27d90839
10 changed files with 15 additions and 1044 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2005-09-14 David Schleef <ds@schleef.org>
|
||||||
|
|
||||||
|
* configure.ac: Remove getbits library. Nothing uses it, and
|
||||||
|
it should be in something like liboil if someone did want
|
||||||
|
to use it.
|
||||||
|
* libs/gst/Makefile.am:
|
||||||
|
* libs/gst/getbits/Makefile.am:
|
||||||
|
* libs/gst/getbits/gbtest.c:
|
||||||
|
* libs/gst/getbits/getbits.c:
|
||||||
|
* libs/gst/getbits/getbits.h:
|
||||||
|
* libs/gst/getbits/gstgetbits_generic.c:
|
||||||
|
* libs/gst/getbits/gstgetbits_i386.s:
|
||||||
|
* libs/gst/getbits/gstgetbits_inl.h:
|
||||||
|
|
||||||
2005-09-14 David Schleef <ds@schleef.org>
|
2005-09-14 David Schleef <ds@schleef.org>
|
||||||
|
|
||||||
* gst/Makefile.am: Dist glib-compat.h
|
* gst/Makefile.am: Dist glib-compat.h
|
||||||
|
|
|
@ -643,7 +643,6 @@ libs/Makefile
|
||||||
libs/gst/Makefile
|
libs/gst/Makefile
|
||||||
libs/gst/controller/Makefile
|
libs/gst/controller/Makefile
|
||||||
libs/gst/dataprotocol/Makefile
|
libs/gst/dataprotocol/Makefile
|
||||||
libs/gst/getbits/Makefile
|
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
check/Makefile
|
check/Makefile
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
SUBDIRS = controller dataprotocol getbits
|
SUBDIRS = controller dataprotocol
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
plugin_LTLIBRARIES = libgstgetbits.la
|
|
||||||
|
|
||||||
if HAVE_CPU_I386
|
|
||||||
GSTARCH_SRCS = gstgetbits_i386.s
|
|
||||||
else
|
|
||||||
GSTARCH_SRCS =
|
|
||||||
endif
|
|
||||||
|
|
||||||
libgstgetbitsincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/getbits
|
|
||||||
libgstgetbitsinclude_HEADERS = getbits.h
|
|
||||||
noinst_HEADERS = gstgetbits_inl.h
|
|
||||||
|
|
||||||
libgstgetbits_la_SOURCES = getbits.c gstgetbits_inl.h gstgetbits_generic.c $(GSTARCH_SRCS)
|
|
||||||
EXTRA_libgstgetbits_la_SOURCES = gstgetbits_i386.s
|
|
||||||
|
|
||||||
libgstgetbits_la_CFLAGS = $(GST_OBJ_CFLAGS) -funroll-all-loops -finline-functions -ffast-math
|
|
||||||
libgstgetbits_la_LDFLAGS = $(GST_OBJ_LIBS) $(GST_PLUGIN_LDFLAGS)
|
|
||||||
|
|
||||||
# check_PROGRAMS = gbtest
|
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include "gstgetbits.h"
|
|
||||||
|
|
||||||
char *
|
|
||||||
print_bits (unsigned long bits, int size)
|
|
||||||
{
|
|
||||||
char *ret = (char *) malloc (size + 1);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
ret[size] = 0;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
if (bits & (1 << i))
|
|
||||||
ret[(size - 1) - i] = '1';
|
|
||||||
else
|
|
||||||
ret[(size - 1) - i] = '0';
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned char testbuffer[] = {
|
|
||||||
0x11, 0x22, 0x44, 0x88, 0xCC, 0xEE, 0xFF, 0x11
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
empty (gst_getbits_t * gb, void *data)
|
|
||||||
{
|
|
||||||
printf ("buffer empty\n");
|
|
||||||
|
|
||||||
gst_getbits_newbuf (gb, (unsigned char *) testbuffer, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
gst_getbits_t gb;
|
|
||||||
int i, j;
|
|
||||||
int bits;
|
|
||||||
|
|
||||||
gst_getbits_init (&gb, NULL, NULL);
|
|
||||||
gst_getbits_newbuf (&gb, (unsigned char *) testbuffer, 7);
|
|
||||||
|
|
||||||
for (i = 0; i < 7; i++) {
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
printf ("%lu", gst_getbits2 (&gb));
|
|
||||||
gst_backbitsn (&gb, 1);
|
|
||||||
}
|
|
||||||
printf (" = %01x\n", testbuffer[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_getbits_newbuf (&gb, (unsigned char *) testbuffer, 7);
|
|
||||||
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000011 %lu\n", bits, gb.bits);
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000022 %lu\n", bits, gb.bits);
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000044 %lu\n", bits, gb.bits);
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000088 %lu\n", bits, gb.bits);
|
|
||||||
bits = gst_getbits6 (&gb);
|
|
||||||
printf ("%08x <-> 00000033 %lu\n", bits, gb.bits);
|
|
||||||
|
|
||||||
gst_backbitsn (&gb, 16);
|
|
||||||
|
|
||||||
bits = gst_getbits10 (&gb);
|
|
||||||
printf ("%08x <-> 00000088 \n", bits);
|
|
||||||
|
|
||||||
gst_getbits_newbuf (&gb, (unsigned char *) testbuffer, 7);
|
|
||||||
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000011 \n", bits);
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000022 \n", bits);
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000044 \n", bits);
|
|
||||||
|
|
||||||
bits = gst_getbits6 (&gb);
|
|
||||||
printf ("%08x <-> 00000022 \n", bits);
|
|
||||||
|
|
||||||
gst_backbitsn (&gb, 19);
|
|
||||||
|
|
||||||
bits = gst_getbits19 (&gb);
|
|
||||||
printf ("%08x <-> 00009122 \n", bits);
|
|
||||||
|
|
||||||
bits = gst_getbits10 (&gb);
|
|
||||||
printf ("%08x <-> 000000cc \n", bits);
|
|
||||||
|
|
||||||
gst_backbitsn (&gb, 8);
|
|
||||||
|
|
||||||
gst_backbitsn (&gb, 19);
|
|
||||||
|
|
||||||
gst_backbitsn (&gb, 8);
|
|
||||||
|
|
||||||
bits = gst_getbits19 (&gb);
|
|
||||||
printf ("%08x <-> 00012244 \n", bits);
|
|
||||||
bits = gst_getbits8 (&gb);
|
|
||||||
printf ("%08x <-> 00000088 \n", bits);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,242 +0,0 @@
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "getbits.h"
|
|
||||||
|
|
||||||
/* Defined in gstgetbits_i386.s */
|
|
||||||
extern unsigned long _gst_get1bit_i386 (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern unsigned long _gst_getbits_i386 (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern unsigned long _gst_getbits_fast_i386 (gst_getbits_t * gb,
|
|
||||||
unsigned long bits);
|
|
||||||
extern unsigned long _gst_showbits_i386 (gst_getbits_t * gb,
|
|
||||||
unsigned long bits);
|
|
||||||
extern void _gst_flushbits_i386 (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern void _gst_getbits_back_i386 (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
|
|
||||||
/* Defined in gstgetbits_generic.c */
|
|
||||||
extern unsigned long _gst_getbits_int_cb (gst_getbits_t * gb,
|
|
||||||
unsigned long bits);
|
|
||||||
extern unsigned long _gst_get1bit_int (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern unsigned long _gst_getbits_int (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern unsigned long _gst_getbits_fast_int (gst_getbits_t * gb,
|
|
||||||
unsigned long bits);
|
|
||||||
extern unsigned long _gst_showbits_int (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern void _gst_flushbits_int (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
extern void _gst_getbits_back_int (gst_getbits_t * gb, unsigned long bits);
|
|
||||||
|
|
||||||
|
|
||||||
unsigned long gst_getbits_nBitMask[] = {
|
|
||||||
0x00000000, 0x80000000, 0xc0000000, 0xe0000000,
|
|
||||||
0xf0000000, 0xf8000000, 0xfc000000, 0xfe000000,
|
|
||||||
0xff000000, 0xff800000, 0xffc00000, 0xffe00000,
|
|
||||||
0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000,
|
|
||||||
0xffff0000, 0xffff8000, 0xffffc000, 0xffffe000,
|
|
||||||
0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00,
|
|
||||||
0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0,
|
|
||||||
0xfffffff0, 0xfffffff8, 0xfffffffc, 0xfffffffe
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned long _getbits_masks[] = {
|
|
||||||
0x00000000,
|
|
||||||
0x00000001, 0x00000003, 0x00000007, 0x0000000f,
|
|
||||||
0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
|
|
||||||
0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
|
|
||||||
0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
|
|
||||||
0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
|
|
||||||
0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
|
|
||||||
0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
|
|
||||||
0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef unused
|
|
||||||
unsigned long _getbits_64_minus_index[] = {
|
|
||||||
64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46,
|
|
||||||
45, 44, 43, 42, 41,
|
|
||||||
40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22,
|
|
||||||
21, 20, 19, 18, 17,
|
|
||||||
16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* this routine taken from Intel AppNote AP-527:
|
|
||||||
"Using MMX[tm] Instructions to Get Bits From a Data Stream"
|
|
||||||
written in C with libmmx to *closely* mimic Intel's ASM implementation
|
|
||||||
|
|
||||||
this isn't as cycle-efficient, due to the simple fact that I must call
|
|
||||||
emms() at the end. all state must be kept in *gb, not in registers */
|
|
||||||
unsigned long
|
|
||||||
_gst_getbits_mmx (gst_getbits_t * gb, unsigned long bits)
|
|
||||||
{
|
|
||||||
signed long remaining;
|
|
||||||
unsigned long result;
|
|
||||||
|
|
||||||
/* NOTE: this is a code-size optimization Intel seems to have missed!
|
|
||||||
according to the MMX Programmer's Reference Manual, Chapter 5,
|
|
||||||
neither movd nor movq have any effect on the flags. that means you
|
|
||||||
can put them before the sub and jl in their code, which I've done
|
|
||||||
symbolically in this C code. gcc is probably going to lose horribly,
|
|
||||||
I'll do an inline asm version later. I've a point to prove ;-) */
|
|
||||||
/* find the right shift value, put it in mm3 */
|
|
||||||
movd_m2r (_getbits_64_minus_index[bits], mm3);
|
|
||||||
/* load the current quadword into mm0 */
|
|
||||||
movq_m2r (gb->qword, mm0);
|
|
||||||
/* copy it to mm2 */
|
|
||||||
movq_r2r (mm0, mm2);
|
|
||||||
|
|
||||||
remaining = gb->bits - bits;
|
|
||||||
|
|
||||||
if (remaining <= 0) {
|
|
||||||
unsigned long dword1, dword2;
|
|
||||||
|
|
||||||
/* shift the pointer by 64 bits (8 bytes) */
|
|
||||||
gb->ptr += 8;
|
|
||||||
/* add 64 to bits remaining, to bring it positive */
|
|
||||||
remaining += 64;
|
|
||||||
|
|
||||||
/* grab the first 32 bits from the buffer and swap them around */
|
|
||||||
dword1 = swab32 (*(gb->ptr - 8));
|
|
||||||
/* grab the second 32 bits, swap */
|
|
||||||
dword2 = swab32 (*(gb->ptr - 4));
|
|
||||||
|
|
||||||
/* put second dword in mm4 */
|
|
||||||
movd_m2r (dword2, mm4);
|
|
||||||
/* shift mm2 over to make room for new bits */
|
|
||||||
psrlq_r2r (mm3, mm2);
|
|
||||||
|
|
||||||
/* put first dword in mm1 */
|
|
||||||
movd_m2r (dword1, mm1);
|
|
||||||
/* shift second dword up 32 bits */
|
|
||||||
psrlq_i2r (32, mm4);
|
|
||||||
|
|
||||||
/* put the shift counter in mm3 */
|
|
||||||
movd_m2r (remaining, mm3);
|
|
||||||
/* combine the swapped data in mm4 */
|
|
||||||
por_r2r (mm1, mm4);
|
|
||||||
|
|
||||||
/* save off the bits in mm4 to mm0 */
|
|
||||||
movq_r2r (mm4, mm0);
|
|
||||||
/* get the new low-order bits in mm4, shifted by 'mm3' */
|
|
||||||
psrlq_r2r (mm3, mm4);
|
|
||||||
|
|
||||||
/* save off new remaining bits */
|
|
||||||
gb->bits = remaining;
|
|
||||||
/* combine bits into mm2 */
|
|
||||||
por_r2r (mm2, mm4);
|
|
||||||
|
|
||||||
/* save off the result */
|
|
||||||
movd_r2m (mm2, result);
|
|
||||||
/* get rid of the bits we just read */
|
|
||||||
psllq_r2r (mm1, mm0);
|
|
||||||
|
|
||||||
/* save off mm0 */
|
|
||||||
movq_r2m (mm0, gb->qword);
|
|
||||||
|
|
||||||
/* finished with MMX */
|
|
||||||
emms ();
|
|
||||||
|
|
||||||
/* we have what we came for */
|
|
||||||
return (result);
|
|
||||||
} else {
|
|
||||||
/* load the number of bits requested into mm1 */
|
|
||||||
movd_m2r (bits, mm1);
|
|
||||||
/* shift the quadword in mm2 by 'mm3' bits */
|
|
||||||
psrlq_r2r (mm3, mm2);
|
|
||||||
|
|
||||||
/* update the number of valid bits */
|
|
||||||
gb->bits = remaining;
|
|
||||||
|
|
||||||
/* save off the remaining bits */
|
|
||||||
movd_r2m (mm2, result);
|
|
||||||
/* discard those bits in mm0 */
|
|
||||||
psllq_r2r (mm1, mm0);
|
|
||||||
|
|
||||||
/* save off mm0 */
|
|
||||||
movq_r2m (mm0, gb->qword);
|
|
||||||
/* finished with MMX */
|
|
||||||
emms ();
|
|
||||||
|
|
||||||
/* we have what we came for */
|
|
||||||
return (result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LIBMMX */
|
|
||||||
|
|
||||||
unsigned long
|
|
||||||
_gst_getbyte (gst_getbits_t * gb, unsigned long bits)
|
|
||||||
{
|
|
||||||
return *gb->ptr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize the getbits structure with the proper getbits func */
|
|
||||||
void
|
|
||||||
gst_getbits_init (gst_getbits_t * gb, GstGetbitsCallback callback, void *data)
|
|
||||||
{
|
|
||||||
gb->ptr = NULL;
|
|
||||||
gb->bits = 0;
|
|
||||||
gb->callback = callback;
|
|
||||||
gb->data = data;
|
|
||||||
|
|
||||||
#ifdef unused
|
|
||||||
if (1) {
|
|
||||||
gb->getbits = _gst_getbits_mmx;
|
|
||||||
/* gb->backbits = _gst_getbits_back_mmx; */
|
|
||||||
/* gb->backbytes = _gst_getbits_byteback_mmx; */
|
|
||||||
/* printf("gstgetbits: using MMX optimized versions\n"); */
|
|
||||||
} else
|
|
||||||
#endif /* HAVE_LIBMMX */
|
|
||||||
{
|
|
||||||
if (gb->callback) {
|
|
||||||
gb->getbits = _gst_getbits_int_cb;
|
|
||||||
gb->showbits = _gst_showbits_int;
|
|
||||||
gb->flushbits = _gst_flushbits_int;
|
|
||||||
gb->backbits = _gst_getbits_back_int;
|
|
||||||
/* printf("gstgetbits: using callback versions\n"); */
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_CPU_I386
|
|
||||||
gb->get1bit = _gst_get1bit_i386;
|
|
||||||
gb->getbits = _gst_getbits_i386;
|
|
||||||
gb->getbits_fast = _gst_getbits_fast_i386;
|
|
||||||
gb->getbyte = _gst_getbyte;
|
|
||||||
gb->show1bit = _gst_showbits_i386;
|
|
||||||
gb->showbits = _gst_showbits_i386;
|
|
||||||
gb->flushbits = _gst_flushbits_i386;
|
|
||||||
gb->backbits = _gst_getbits_back_i386;
|
|
||||||
/* printf("gstgetbits: using i386 optimized versions\n"); */
|
|
||||||
#else
|
|
||||||
gb->get1bit = _gst_get1bit_int;
|
|
||||||
gb->getbits = _gst_getbits_int;
|
|
||||||
gb->getbits_fast = _gst_getbits_fast_int;
|
|
||||||
gb->getbyte = _gst_getbyte;
|
|
||||||
gb->show1bit = _gst_showbits_int;
|
|
||||||
gb->showbits = _gst_showbits_int;
|
|
||||||
gb->flushbits = _gst_flushbits_int;
|
|
||||||
gb->backbits = _gst_getbits_back_int;
|
|
||||||
/* printf("gstgetbits: using normal versions\n"); */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set up the getbits structure with a new buffer */
|
|
||||||
void
|
|
||||||
gst_getbits_newbuf (gst_getbits_t * gb, unsigned char *buffer,
|
|
||||||
unsigned long len)
|
|
||||||
{
|
|
||||||
gb->ptr = buffer;
|
|
||||||
gb->endptr = buffer + len;
|
|
||||||
gb->bits = 0;
|
|
||||||
#ifdef unused
|
|
||||||
/* gb->qword = 0; */
|
|
||||||
#endif /* HAVE_LIBMMX */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"gstgetbits",
|
|
||||||
"Accelerated routines for getting bits from a data stream",
|
|
||||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)
|
|
|
@ -1,131 +0,0 @@
|
||||||
#ifndef __GST_GETBITS_H__
|
|
||||||
#define __GST_GETBITS_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* getbits is critical, we need to forcibly disable DEBUG */
|
|
||||||
#define GST_DEBUG_FORCE_DISABLE
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
#define swab32(x) GUINT32_FROM_BE(x)
|
|
||||||
|
|
||||||
typedef struct _gst_getbits_t gst_getbits_t;
|
|
||||||
typedef void (*GstGetbitsCallback) (gst_getbits_t *gb, void *data);
|
|
||||||
|
|
||||||
/* breaks in structure show alignment on quadword boundaries */
|
|
||||||
/* FIXME: need to find out how to force GCC to align this to octwords */
|
|
||||||
struct _gst_getbits_t {
|
|
||||||
unsigned char *ptr;
|
|
||||||
unsigned long *longptr;
|
|
||||||
unsigned char *endptr;
|
|
||||||
unsigned long length;
|
|
||||||
long bits;
|
|
||||||
unsigned long dword;
|
|
||||||
unsigned long temp;
|
|
||||||
|
|
||||||
GstGetbitsCallback callback;
|
|
||||||
void *data;
|
|
||||||
|
|
||||||
unsigned long (*get1bit)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
unsigned long (*getbits)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
unsigned long (*getbits_fast)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
unsigned long (*getbyte)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
unsigned long (*show1bit)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
unsigned long (*showbits)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
void (*flushbits)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
void (*backbits)(gst_getbits_t *gb, unsigned long bits);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef GST_GETBITS_INLINE
|
|
||||||
#include "gstgetbits_inl.h"
|
|
||||||
#else
|
|
||||||
|
|
||||||
void gst_getbits_init(gst_getbits_t *gb, GstGetbitsCallback callback, void *data);
|
|
||||||
void gst_getbits_newbuf(gst_getbits_t *gb, unsigned char *buffer, unsigned long len);
|
|
||||||
|
|
||||||
#define gst_getbits_bitoffset(gb) \
|
|
||||||
( \
|
|
||||||
(-(gb)->bits)&0x7 \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_getbits_align_byte(gb)
|
|
||||||
|
|
||||||
#define gst_getbits_bufferpos(gb) ((gb)->ptr)
|
|
||||||
|
|
||||||
#define gst_getbits_bytesleft(gb) ((gb)->endptr - (gb)->ptr)
|
|
||||||
|
|
||||||
#define gst_getbits_bitsleft(gb) (((gb)->endptr - (gb)->ptr)*8 - ((-(gb)->bits)&0x7))
|
|
||||||
|
|
||||||
#define gst_get1bit(gb) (((gb)->get1bit)(gb, 1))
|
|
||||||
#define gst_getbitsX(gb,bits) (((gb)->getbits)(gb,bits))
|
|
||||||
#define gst_getbits_fastX(gb,bits) (((gb)->getbits_fast)(gb,bits))
|
|
||||||
#define gst_show1bit(gb,bits) (((gb)->show1bit)(gb,bits))
|
|
||||||
#define gst_showbitsX(gb,bits) (((gb)->showbits)(gb,bits))
|
|
||||||
#define gst_flushbitsX(gb,bits) (((gb)->flushbits)(gb,bits))
|
|
||||||
#define gst_backbitsX(gb,bits) (((gb)->backbits)(gb,bits))
|
|
||||||
|
|
||||||
#define gst_getbyte(gb) (((gb)->getbyte)(gb,8))
|
|
||||||
|
|
||||||
#define gst_getbits_fastn(gb,n) gst_getbits_fastX(gb, n)
|
|
||||||
|
|
||||||
#define gst_getbitsn(gb,n) gst_getbitsX(gb, n)
|
|
||||||
#define gst_getbits1(gb) gst_get1bit(gb)
|
|
||||||
#define gst_getbits2(gb) gst_getbits_fastX(gb, 2)
|
|
||||||
#define gst_getbits3(gb) gst_getbits_fastX(gb, 3)
|
|
||||||
#define gst_getbits4(gb) gst_getbits_fastX(gb, 4)
|
|
||||||
#define gst_getbits5(gb) gst_getbits_fastX(gb, 5)
|
|
||||||
#define gst_getbits6(gb) gst_getbits_fastX(gb, 6)
|
|
||||||
#define gst_getbits7(gb) gst_getbits_fastX(gb, 7)
|
|
||||||
#define gst_getbits8(gb) gst_getbits_fastX(gb, 8)
|
|
||||||
#define gst_getbits9(gb) gst_getbits_fastX(gb, 9)
|
|
||||||
#define gst_getbits10(gb) gst_getbitsX(gb, 10)
|
|
||||||
#define gst_getbits11(gb) gst_getbitsX(gb, 11)
|
|
||||||
#define gst_getbits12(gb) gst_getbitsX(gb, 12)
|
|
||||||
#define gst_getbits13(gb) gst_getbitsX(gb, 13)
|
|
||||||
#define gst_getbits14(gb) gst_getbitsX(gb, 14)
|
|
||||||
#define gst_getbits15(gb) gst_getbitsX(gb, 15)
|
|
||||||
#define gst_getbits16(gb) gst_getbitsX(gb, 16)
|
|
||||||
#define gst_getbits17(gb) gst_getbitsX(gb, 17)
|
|
||||||
#define gst_getbits18(gb) gst_getbitsX(gb, 18)
|
|
||||||
#define gst_getbits19(gb) gst_getbitsX(gb, 19)
|
|
||||||
#define gst_getbits20(gb) gst_getbitsX(gb, 20)
|
|
||||||
#define gst_getbits21(gb) gst_getbitsX(gb, 21)
|
|
||||||
#define gst_getbits22(gb) gst_getbitsX(gb, 22)
|
|
||||||
#define gst_getbits23(gb) gst_getbitsX(gb, 23)
|
|
||||||
|
|
||||||
#define gst_showbitsn(gb,n) gst_showbitsX(gb, n)
|
|
||||||
#define gst_showbits1(gb) gst_show1bit(gb, 1)
|
|
||||||
#define gst_showbits2(gb) gst_showbitsX(gb, 2)
|
|
||||||
#define gst_showbits3(gb) gst_showbitsX(gb, 3)
|
|
||||||
#define gst_showbits4(gb) gst_showbitsX(gb, 4)
|
|
||||||
#define gst_showbits5(gb) gst_showbitsX(gb, 5)
|
|
||||||
#define gst_showbits6(gb) gst_showbitsX(gb, 6)
|
|
||||||
#define gst_showbits7(gb) gst_showbitsX(gb, 7)
|
|
||||||
#define gst_showbits8(gb) gst_showbitsX(gb, 8)
|
|
||||||
#define gst_showbits9(gb) gst_showbitsX(gb, 9)
|
|
||||||
#define gst_showbits10(gb) gst_showbitsX(gb, 10)
|
|
||||||
#define gst_showbits11(gb) gst_showbitsX(gb, 11)
|
|
||||||
#define gst_showbits12(gb) gst_showbitsX(gb, 12)
|
|
||||||
#define gst_showbits13(gb) gst_showbitsX(gb, 13)
|
|
||||||
#define gst_showbits14(gb) gst_showbitsX(gb, 14)
|
|
||||||
#define gst_showbits15(gb) gst_showbitsX(gb, 15)
|
|
||||||
#define gst_showbits16(gb) gst_showbitsX(gb, 16)
|
|
||||||
#define gst_showbits17(gb) gst_showbitsX(gb, 17)
|
|
||||||
#define gst_showbits18(gb) gst_showbitsX(gb, 18)
|
|
||||||
#define gst_showbits19(gb) gst_showbitsX(gb, 19)
|
|
||||||
#define gst_showbits20(gb) gst_showbitsX(gb, 20)
|
|
||||||
#define gst_showbits21(gb) gst_showbitsX(gb, 21)
|
|
||||||
#define gst_showbits22(gb) gst_showbitsX(gb, 22)
|
|
||||||
#define gst_showbits23(gb) gst_showbitsX(gb, 23)
|
|
||||||
#define gst_showbits24(gb) gst_showbitsX(gb, 24)
|
|
||||||
#define gst_showbits32(gb) gst_showbitsX(gb, 32)
|
|
||||||
|
|
||||||
#define gst_flushbitsn(gb,n) gst_flushbitsX(gb, n)
|
|
||||||
#define gst_flushbits32(gb) gst_flushbitsX(gb, 32)
|
|
||||||
|
|
||||||
#define gst_backbitsn(gb,n) gst_backbitsX(gb, n)
|
|
||||||
#define gst_backbits24(gb) gst_backbitsX(gb, 24)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __GST_GETBITS_H__ */
|
|
|
@ -1,132 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
.align 16
|
|
||||||
.globl _gst_getbits_i386
|
|
||||||
.type _gst_getbits_i386,@function
|
|
||||||
_gst_getbits_i386:
|
|
||||||
cmpl $0,8(%esp)
|
|
||||||
jne .L39
|
|
||||||
xorl %eax,%eax
|
|
||||||
ret
|
|
||||||
.L39:
|
|
||||||
movl 4(%esp),%edx
|
|
||||||
movl (%edx),%ecx
|
|
||||||
movl (%ecx),%eax
|
|
||||||
bswap %eax
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
shll %cl, %eax
|
|
||||||
movl 8(%esp),%ecx
|
|
||||||
addl %ecx, 16(%edx)
|
|
||||||
negl %ecx
|
|
||||||
addl $32,%ecx
|
|
||||||
shrl %cl, %eax
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
sarl $3,%ecx
|
|
||||||
addl %ecx,(%edx)
|
|
||||||
andl $7,16(%edx)
|
|
||||||
ret
|
|
||||||
|
|
||||||
.align 16
|
|
||||||
.globl _gst_getbits_fast_i386
|
|
||||||
.type _gst_getbits_fast_i386,@function
|
|
||||||
_gst_getbits_fast_i386:
|
|
||||||
movl 4(%esp),%edx
|
|
||||||
movl (%edx),%ecx
|
|
||||||
movzbl 1(%ecx),%eax
|
|
||||||
movb (%ecx), %ah
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
shlw %cl, %ax
|
|
||||||
movl 8(%esp),%ecx
|
|
||||||
addl %ecx, 16(%edx)
|
|
||||||
negl %ecx
|
|
||||||
addl $16,%ecx
|
|
||||||
shrl %cl, %eax
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
sarl $3,%ecx
|
|
||||||
addl %ecx,(%edx)
|
|
||||||
andl $7,16(%edx)
|
|
||||||
ret
|
|
||||||
|
|
||||||
.align 16
|
|
||||||
.globl _gst_get1bit_i386
|
|
||||||
.type _gst_get1bit_i386,@function
|
|
||||||
_gst_get1bit_i386:
|
|
||||||
movl 4(%esp),%edx
|
|
||||||
movl (%edx),%ecx
|
|
||||||
movzbl (%ecx),%eax
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
incl %ecx
|
|
||||||
rolb %cl, %al
|
|
||||||
andb $1, %al
|
|
||||||
movl %ecx, 16(%edx)
|
|
||||||
andl $7,16(%edx)
|
|
||||||
sarl $3,%ecx
|
|
||||||
addl %ecx,(%edx)
|
|
||||||
ret
|
|
||||||
|
|
||||||
.align 16
|
|
||||||
.globl _gst_showbits_i386
|
|
||||||
.type _gst_showbits_i386,@function
|
|
||||||
_gst_showbits_i386:
|
|
||||||
cmpl $0,8(%esp)
|
|
||||||
jne .L40
|
|
||||||
xorl %eax,%eax
|
|
||||||
ret
|
|
||||||
.L40:
|
|
||||||
movl 4(%esp),%edx
|
|
||||||
movl (%edx),%ecx
|
|
||||||
movl (%ecx), %eax
|
|
||||||
bswap %eax
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
shll %cl, %eax
|
|
||||||
movl 8(%esp),%ecx
|
|
||||||
negl %ecx
|
|
||||||
addl $32,%ecx
|
|
||||||
shrl %cl, %eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
.align 16
|
|
||||||
.globl _gst_flushbits_i386
|
|
||||||
.type _gst_flushbits_i386,@function
|
|
||||||
_gst_flushbits_i386:
|
|
||||||
movl 4(%esp),%ecx
|
|
||||||
movl 16(%ecx),%eax
|
|
||||||
addl 8(%esp),%eax
|
|
||||||
movl %eax, %edx
|
|
||||||
sarl $3,%eax
|
|
||||||
addl %eax,(%ecx)
|
|
||||||
andl $7, %edx
|
|
||||||
movl %edx, 16(%ecx)
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
.align 16
|
|
||||||
.globl _gst_getbits_back_i386
|
|
||||||
.type _gst_getbits_back_i386,@function
|
|
||||||
_gst_getbits_back_i386:
|
|
||||||
movl 4(%esp),%edx
|
|
||||||
movl 16(%edx),%ecx
|
|
||||||
subl 8(%esp),%ecx
|
|
||||||
movl %ecx, %eax
|
|
||||||
sarl $3,%ecx
|
|
||||||
addl %ecx,(%edx)
|
|
||||||
andl $7,%eax
|
|
||||||
movl %eax, 16(%edx)
|
|
||||||
ret
|
|
||||||
|
|
|
@ -1,302 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 1995 The Regents of the University of California.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
|
||||||
* documentation for any purpose, without fee, and without written agreement is
|
|
||||||
* hereby granted, provided that the above copyright notice and the following
|
|
||||||
* two paragraphs appear in all copies of this software.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
|
||||||
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
|
||||||
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
|
||||||
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
|
||||||
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
|
|
||||||
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Portions of this software Copyright (c) 1995 Brown University.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
|
||||||
* documentation for any purpose, without fee, and without written agreement
|
|
||||||
* is hereby granted, provided that the above copyright notice and the
|
|
||||||
* following two paragraphs appear in all copies of this software.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL BROWN UNIVERSITY BE LIABLE TO ANY PARTY FOR
|
|
||||||
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
|
||||||
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF BROWN
|
|
||||||
* UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* BROWN UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
|
|
||||||
* BASIS, AND BROWN UNIVERSITY HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
|
|
||||||
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Changes to make the code reentrant:
|
|
||||||
deglobalized: curBits, curVidStream
|
|
||||||
deglobalized: bitOffset, bitLength, bitBuffer in vid_stream, not used
|
|
||||||
here
|
|
||||||
Additional changes:
|
|
||||||
-lsh@cs.brown.edu (Loring Holden)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __GST_GETBITS_INL_H__
|
|
||||||
#define __GST_GETBITS_INL_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
/*#define GETBITS_DEBUG_ENABLED */
|
|
||||||
/*#define GETBITS_OVERRUN_ENABLED */
|
|
||||||
|
|
||||||
#ifdef GETBITS_DEBUG_ENABLED
|
|
||||||
#define debug2(format,args...) g_print(format,##args)
|
|
||||||
#define debug(format,args...) g_print(format,##args),
|
|
||||||
#else
|
|
||||||
#define debug(format,args...)
|
|
||||||
#define debug2(format,args...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GETBITS_OVERRUN_ENABLED
|
|
||||||
#define checklength2(src, dst) (((unsigned char*)src)<(dst)?0:printf("overrun !! %p>=%p %ld %s %d\n", (src), (dst), (gb)->bits, __PRETTY_FUNCTION__, __LINE__))
|
|
||||||
#define checklength(src, dst) (((unsigned char*)src)<(dst)?0:printf("overrun !! %p>=%p %ld %s %d\n", (src), (dst), (gb)->bits, __PRETTY_FUNCTION__, __LINE__)),
|
|
||||||
#else
|
|
||||||
#define checklength(src, dst)
|
|
||||||
#define checklength2(src, dst)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define swab32(x) GUINT32_FROM_BE(x)
|
|
||||||
|
|
||||||
/* External declarations for bitstream i/o operations. */
|
|
||||||
extern unsigned long gst_getbits_nBitMask[];
|
|
||||||
|
|
||||||
#define gst_getbits_init(gb, callback, data)
|
|
||||||
|
|
||||||
#define gst_getbits_newbuf(gb, buffer, len) \
|
|
||||||
{ \
|
|
||||||
(gb)->longptr = (unsigned long *)(buffer); \
|
|
||||||
(gb)->endptr = (unsigned char *)buffer+len; \
|
|
||||||
(gb)->length = len; \
|
|
||||||
(gb)->bits = 0; \
|
|
||||||
(gb)->dword = swab32(*(gb)->longptr); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gst_getbits_bitoffset(gb) \
|
|
||||||
( \
|
|
||||||
debug("bitoffset: %ld %p\n", (gb)->bits, (gb)->longptr) \
|
|
||||||
(gb)->bits \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_getbits_bufferpos(gb) ((gb)->longptr)
|
|
||||||
|
|
||||||
#define gst_getbits_bytesleft(gb) ((gb)->endptr - (unsigned char*)(gb)->longptr)
|
|
||||||
|
|
||||||
#define gst_getbits_bitsleft(gb) (((gb)->endptr - (unsigned char*)(gb)->longptr)*8 - (gb)->bits)
|
|
||||||
|
|
||||||
#define gst_getbits1(gb) \
|
|
||||||
( \
|
|
||||||
((gb)->temp = (((gb)->dword & 0x80000000) != 0)), \
|
|
||||||
(gb)->dword <<= 1, \
|
|
||||||
(gb)->bits++, \
|
|
||||||
\
|
|
||||||
((gb)->bits & 0x20 ? ( \
|
|
||||||
(gb)->bits = 0, \
|
|
||||||
(gb)->longptr++, \
|
|
||||||
checklength((gb)->longptr, (gb)->endptr) \
|
|
||||||
((gb)->dword = swab32(*(gb)->longptr)) \
|
|
||||||
) \
|
|
||||||
:0), \
|
|
||||||
debug("getbits1 : %04lx %08lx %p\n", (gb)->temp, (gb)->dword, (gb)->longptr) \
|
|
||||||
(gb)->temp \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_getbits2(gb) \
|
|
||||||
( \
|
|
||||||
(gb)->bits += 2, \
|
|
||||||
\
|
|
||||||
((gb)->bits & 0x20 ? ( \
|
|
||||||
(gb)->bits -= 32, \
|
|
||||||
(gb)->longptr++, \
|
|
||||||
checklength((gb)->longptr, (gb)->endptr) \
|
|
||||||
((gb)->bits ? ( \
|
|
||||||
((gb)->dword |= \
|
|
||||||
(swab32(*(gb)->longptr) >> (2 - (gb)->bits))) \
|
|
||||||
) \
|
|
||||||
: 0 \
|
|
||||||
),( \
|
|
||||||
((gb)->temp = (((gb)->dword & 0xc0000000) >> 30)), \
|
|
||||||
((gb)->dword = swab32(*(gb)->longptr) << (gb)->bits)) \
|
|
||||||
) \
|
|
||||||
: ( \
|
|
||||||
((gb)->temp = (((gb)->dword & 0xc0000000) >> 30)), \
|
|
||||||
((gb)->dword <<= 2) \
|
|
||||||
) \
|
|
||||||
), \
|
|
||||||
debug("getbits2 : %04lx %08lx %p\n", (gb)->temp, (gb)->dword, (gb)->longptr) \
|
|
||||||
(gb)->temp \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_getbitsX(gb, num, mask, shift) \
|
|
||||||
( \
|
|
||||||
(gb)->bits += (num), \
|
|
||||||
\
|
|
||||||
((gb)->bits & 0x20 ? ( \
|
|
||||||
(gb)->bits -= 32, \
|
|
||||||
(gb)->longptr++, \
|
|
||||||
checklength((gb)->longptr, (gb)->endptr) \
|
|
||||||
((gb)->bits ? ( \
|
|
||||||
((gb)->dword |= (swab32(*(gb)->longptr) >> \
|
|
||||||
((num) - (gb)->bits))) \
|
|
||||||
) \
|
|
||||||
:0 \
|
|
||||||
), \
|
|
||||||
((gb)->temp = (((gb)->dword & (mask)) >> (shift))), \
|
|
||||||
((gb)->dword = swab32(*(gb)->longptr) << (gb)->bits) \
|
|
||||||
) \
|
|
||||||
: ( \
|
|
||||||
((gb)->temp = (((gb)->dword & mask) >> shift)), \
|
|
||||||
((gb)->dword <<= (num)) \
|
|
||||||
) \
|
|
||||||
), \
|
|
||||||
debug("getbits%-2d: %04lx %08lx %lu %p\n", num, (gb)->temp, (gb)->dword, mask, (gb)->longptr) \
|
|
||||||
(gb)->temp \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_getbits3(gb) gst_getbitsX(gb, 3, 0xe0000000UL, 29)
|
|
||||||
#define gst_getbits4(gb) gst_getbitsX(gb, 4, 0xf0000000UL, 28)
|
|
||||||
#define gst_getbits5(gb) gst_getbitsX(gb, 5, 0xf8000000UL, 27)
|
|
||||||
#define gst_getbits6(gb) gst_getbitsX(gb, 6, 0xfc000000UL, 26)
|
|
||||||
#define gst_getbits7(gb) gst_getbitsX(gb, 7, 0xfe000000UL, 25)
|
|
||||||
#define gst_getbits8(gb) gst_getbitsX(gb, 8, 0xff000000UL, 24)
|
|
||||||
#define gst_getbits9(gb) gst_getbitsX(gb, 9, 0xff800000UL, 23)
|
|
||||||
#define gst_getbits10(gb) gst_getbitsX(gb, 10, 0xffc00000UL, 22)
|
|
||||||
#define gst_getbits11(gb) gst_getbitsX(gb, 11, 0xffe00000UL, 21)
|
|
||||||
#define gst_getbits12(gb) gst_getbitsX(gb, 12, 0xfff00000UL, 20)
|
|
||||||
#define gst_getbits13(gb) gst_getbitsX(gb, 13, 0xfff80000UL, 19)
|
|
||||||
#define gst_getbits14(gb) gst_getbitsX(gb, 14, 0xfffc0000UL, 18)
|
|
||||||
#define gst_getbits15(gb) gst_getbitsX(gb, 15, 0xfffe0000UL, 17)
|
|
||||||
#define gst_getbits16(gb) gst_getbitsX(gb, 16, 0xffff0000UL, 16)
|
|
||||||
#define gst_getbits17(gb) gst_getbitsX(gb, 17, 0xffff8000UL, 15)
|
|
||||||
#define gst_getbits18(gb) gst_getbitsX(gb, 18, 0xffffc000UL, 14)
|
|
||||||
#define gst_getbits19(gb) gst_getbitsX(gb, 19, 0xffffe000UL, 13)
|
|
||||||
#define gst_getbits20(gb) gst_getbitsX(gb, 20, 0xfffff000UL, 12)
|
|
||||||
#define gst_getbits21(gb) gst_getbitsX(gb, 21, 0xfffff800UL, 11)
|
|
||||||
#define gst_getbits22(gb) gst_getbitsX(gb, 22, 0xfffffc00UL, 10)
|
|
||||||
#define gst_getbits32(gb) gst_getbitsX(gb, 32, 0xffffffffUL, 0)
|
|
||||||
|
|
||||||
#define gst_getbitsn(gb,num) gst_getbitsX(gb, (num), ((num) ? ((0xffffffffUL) << (32-(num))):0), (32-(num)))
|
|
||||||
|
|
||||||
#define gst_showbits32(gb) \
|
|
||||||
( \
|
|
||||||
((gb)->bits ? ( \
|
|
||||||
(gb)->dword | (swab32(*((gb)->longptr+1)) >> \
|
|
||||||
(32 - (gb)->bits)) \
|
|
||||||
) \
|
|
||||||
: ( \
|
|
||||||
(gb)->dword \
|
|
||||||
) \
|
|
||||||
) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_showbitsX(gb, num, mask, shift) \
|
|
||||||
( \
|
|
||||||
((gb)->temp = (gb)->bits + num), \
|
|
||||||
((gb)->temp > 32 ? ( \
|
|
||||||
(gb)->temp -= 32, \
|
|
||||||
(((gb)->dword & mask) >> shift) | \
|
|
||||||
(swab32(*((gb)->longptr+1)) >> (shift + (num - (gb)->temp))) \
|
|
||||||
) \
|
|
||||||
: ( \
|
|
||||||
(((gb)->dword & mask) >> shift) \
|
|
||||||
) \
|
|
||||||
) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define gst_showbits1(gb) gst_showbitsX(gb, 1, 0x80000000, 31)
|
|
||||||
#define gst_showbits2(gb) gst_showbitsX(gb, 2, 0xc0000000, 30)
|
|
||||||
#define gst_showbits3(gb) gst_showbitsX(gb, 3, 0xe0000000, 29)
|
|
||||||
#define gst_showbits4(gb) gst_showbitsX(gb, 4, 0xf0000000, 28)
|
|
||||||
#define gst_showbits5(gb) gst_showbitsX(gb, 5, 0xf8000000, 27)
|
|
||||||
#define gst_showbits6(gb) gst_showbitsX(gb, 6, 0xfc000000, 26)
|
|
||||||
#define gst_showbits7(gb) gst_showbitsX(gb, 7, 0xfe000000, 25)
|
|
||||||
#define gst_showbits8(gb) gst_showbitsX(gb, 8, 0xff000000, 24)
|
|
||||||
#define gst_showbits9(gb) gst_showbitsX(gb, 9, 0xff800000, 23)
|
|
||||||
#define gst_showbits10(gb) gst_showbitsX(gb, 10, 0xffc00000, 22)
|
|
||||||
#define gst_showbits11(gb) gst_showbitsX(gb, 11, 0xffe00000, 21)
|
|
||||||
#define gst_showbits12(gb) gst_showbitsX(gb, 12, 0xfff00000, 20)
|
|
||||||
#define gst_showbits13(gb) gst_showbitsX(gb, 13, 0xfff80000, 19)
|
|
||||||
#define gst_showbits14(gb) gst_showbitsX(gb, 14, 0xfffc0000, 18)
|
|
||||||
#define gst_showbits15(gb) gst_showbitsX(gb, 15, 0xfffe0000, 17)
|
|
||||||
#define gst_showbits16(gb) gst_showbitsX(gb, 16, 0xffff0000, 16)
|
|
||||||
#define gst_showbits17(gb) gst_showbitsX(gb, 17, 0xffff8000, 15)
|
|
||||||
#define gst_showbits18(gb) gst_showbitsX(gb, 18, 0xffffc000, 14)
|
|
||||||
#define gst_showbits19(gb) gst_showbitsX(gb, 19, 0xffffe000, 13)
|
|
||||||
#define gst_showbits20(gb) gst_showbitsX(gb, 20, 0xfffff000, 12)
|
|
||||||
#define gst_showbits21(gb) gst_showbitsX(gb, 21, 0xfffff800, 11)
|
|
||||||
#define gst_showbits22(gb) gst_showbitsX(gb, 22, 0xfffffc00, 10)
|
|
||||||
#define gst_showbits23(gb) gst_showbitsX(gb, 23, 0xfffffe00, 9)
|
|
||||||
#define gst_showbits24(gb) gst_showbitsX(gb, 24, 0xffffff00, 8)
|
|
||||||
#define gst_showbits25(gb) gst_showbitsX(gb, 25, 0xffffff80, 7)
|
|
||||||
#define gst_showbits26(gb) gst_showbitsX(gb, 26, 0xffffffc0, 6)
|
|
||||||
#define gst_showbits27(gb) gst_showbitsX(gb, 27, 0xffffffe0, 5)
|
|
||||||
#define gst_showbits28(gb) gst_showbitsX(gb, 28, 0xfffffff0, 4)
|
|
||||||
#define gst_showbits29(gb) gst_showbitsX(gb, 29, 0xfffffff8, 3)
|
|
||||||
#define gst_showbits30(gb) gst_showbitsX(gb, 30, 0xfffffffc, 2)
|
|
||||||
#define gst_showbits31(gb) gst_showbitsX(gb, 31, 0xfffffffe, 1)
|
|
||||||
|
|
||||||
#define gst_showbitsn(gb,num) gst_showbitsX(gb, (num), ((0xffffffff) << (32-num)), (32-(num)))
|
|
||||||
|
|
||||||
#define gst_flushbits32(gb) \
|
|
||||||
{ \
|
|
||||||
(gb)->longptr++; \
|
|
||||||
checklength2((gb)->longptr, (gb)->endptr); \
|
|
||||||
(gb)->dword = swab32(*(gb)->longptr) << (gb)->bits; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define gst_flushbitsn(gb, num) \
|
|
||||||
{ \
|
|
||||||
(gb)->bits += num; \
|
|
||||||
\
|
|
||||||
if ((gb)->bits & 0x20) { \
|
|
||||||
(gb)->bits -= 32; \
|
|
||||||
(gb)->longptr++; \
|
|
||||||
checklength2((gb)->longptr, (gb)->endptr); \
|
|
||||||
(gb)->dword = swab32(*(gb)->longptr) << (gb)->bits; \
|
|
||||||
} \
|
|
||||||
else { \
|
|
||||||
(gb)->dword <<= num; \
|
|
||||||
} \
|
|
||||||
debug2("flushbits%-2d: %08lx %p\n", num, (gb)->dword, (gb)->longptr); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gst_backbits24(gb) \
|
|
||||||
{ \
|
|
||||||
(gb)->bits -= 24; \
|
|
||||||
if ((gb)->bits < 0) { \
|
|
||||||
(gb)->bits += 32; \
|
|
||||||
(gb)->longptr--; \
|
|
||||||
} \
|
|
||||||
(gb)->dword = swab32(*(gb)->longptr) << (gb)->bits; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define gst_backbitsn(gb, num) \
|
|
||||||
{ \
|
|
||||||
(gb)->bits -= num; \
|
|
||||||
while ((gb)->bits < 0) { \
|
|
||||||
(gb)->bits += 32; \
|
|
||||||
(gb)->longptr--; \
|
|
||||||
} \
|
|
||||||
(gb)->dword = swab32(*(gb)->longptr) << (gb)->bits; \
|
|
||||||
debug2("backbits%-2d: %08lx %p\n", num, (gb)->dword, (gb)->longptr); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __GST_GETBITS_INL_H__ */
|
|
Loading…
Reference in a new issue