mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-04 05:22:30 +00:00
added bitcoder.h from w3d CVS, needed to compile
Original commit message from CVS: added bitcoder.h from w3d CVS, needed to compile
This commit is contained in:
parent
4b157fdec5
commit
6d87f6954d
1 changed files with 148 additions and 0 deletions
148
ext/tarkin/bitcoder.h
Normal file
148
ext/tarkin/bitcoder.h
Normal file
|
@ -0,0 +1,148 @@
|
|||
#ifndef __BITCODER_H
|
||||
#define __BITCODER_H
|
||||
|
||||
#include "mem.h"
|
||||
|
||||
#if defined(BITCODER)
|
||||
|
||||
#define OUTPUT_BIT(coder,bit) bitcoder_write_bit(coder,bit)
|
||||
#define INPUT_BIT(coder) bitcoder_read_bit(coder)
|
||||
#define OUTPUT_BIT_DIRECT(coder,bit) bitcoder_write_bit(coder,bit)
|
||||
#define INPUT_BIT_DIRECT(coder) bitcoder_read_bit(coder)
|
||||
#define ENTROPY_CODER BitCoderState
|
||||
#define ENTROPY_ENCODER_init(coder,limit) bitcoder_coder_init(coder,limit)
|
||||
#define ENTROPY_ENCODER_DONE(coder) bitcoder_encoder_done(coder)
|
||||
#define ENTROPY_ENCODER_FLUSH(coder) bitcoder_flush(coder)
|
||||
#define ENTROPY_DECODER_INIT(coder,bitstream,limit) \
|
||||
bitcoder_decoder_init(coder,bitstream,limit)
|
||||
#define ENTROPY_DECODER_DONE(coder) /* nothing to do ... */
|
||||
#define ENTROPY_CODER_BITSTREAM(coder) (coder)->bitstream
|
||||
|
||||
#define ENTROPY_CODER_SYMBOL(coder) 1
|
||||
#define ENTROPY_CODER_RUNLENGTH(coder) 0
|
||||
#define ENTROPY_CODER_SKIP(coder,skip)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t bit_count; /* number of valid bits in byte */
|
||||
uint8_t byte; /* buffer to save bits */
|
||||
uint32_t byte_count; /* number of bytes written */
|
||||
uint8_t *bitstream;
|
||||
uint32_t limit; /* don't write more bytes to bitstream ... */
|
||||
int eos; /* end of stream reached */
|
||||
} BitCoderState;
|
||||
|
||||
|
||||
|
||||
static inline
|
||||
void bitcoder_encoder_init (BitCoderState *s, uint32_t limit)
|
||||
{
|
||||
s->bit_count = 0;
|
||||
s->byte = 0;
|
||||
s->byte_count = 0;
|
||||
s->bitstream = (uint8_t*) MALLOC (limit);
|
||||
s->limit = limit;
|
||||
s->eos = 0;
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
void bitcoder_encoder_done (BitCoderState *s)
|
||||
{
|
||||
FREE (s->bitstream);
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
void bitcoder_decoder_init (BitCoderState *s, uint8_t *bitstream, uint32_t limit)
|
||||
{
|
||||
s->bit_count = -1;
|
||||
s->byte = 0;
|
||||
s->byte_count = 0;
|
||||
s->bitstream = bitstream;
|
||||
s->limit = limit;
|
||||
s->eos = 0;
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
uint32_t bitcoder_flush (BitCoderState *s)
|
||||
{
|
||||
if (s->bit_count > 0 && s->byte_count < s->limit)
|
||||
s->bitstream [s->byte_count++] = s->byte << (8 - s->bit_count);
|
||||
|
||||
//printf ("%s: %i bytes written.\n", __FUNCTION__, s->byte_count);
|
||||
//printf ("%s: last bit %i\n", __FUNCTION__, s->bit_count);
|
||||
return s->byte_count;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline
|
||||
void bitcoder_write_bit (BitCoderState *s, int bit)
|
||||
{
|
||||
s->byte <<= 1;
|
||||
s->byte |= bit & 1;
|
||||
|
||||
s->bit_count++;
|
||||
|
||||
if (s->bit_count == 8) {
|
||||
if (s->byte_count < s->limit) {
|
||||
s->bitstream [s->byte_count++] = s->byte;
|
||||
s->bit_count = 0;
|
||||
} else {
|
||||
s->eos = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
int bitcoder_read_bit (BitCoderState *s)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (s->bit_count <= 0) {
|
||||
if (!s->bitstream) {
|
||||
s->eos = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (s->byte_count < s->limit) {
|
||||
s->byte = s->bitstream [s->byte_count++];
|
||||
} else {
|
||||
s->eos = 1;
|
||||
s->byte = 0;
|
||||
}
|
||||
|
||||
s->bit_count = 8;
|
||||
}
|
||||
|
||||
ret = s->byte >> 7;
|
||||
s->byte <<= 1;
|
||||
s->bit_count--;
|
||||
|
||||
return ret & 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static inline
|
||||
void bit_print (TYPE byte)
|
||||
{
|
||||
int bit = 8*sizeof(TYPE);
|
||||
|
||||
do {
|
||||
bit--;
|
||||
printf ((byte & (1 << bit)) ? "1" : "0");
|
||||
} while (bit);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in a new issue