mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-08 18:39:54 +00:00
83 lines
1.7 KiB
C++
83 lines
1.7 KiB
C++
|
#ifndef __BITS_H__
|
||
|
#define __BITS_H__
|
||
|
|
||
|
#include <config.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
typedef uint64_t bitcount_t;
|
||
|
|
||
|
|
||
|
class BitStreamUndo
|
||
|
{
|
||
|
//protected:
|
||
|
public:
|
||
|
uint8_t outbyte;
|
||
|
unsigned int byteidx;
|
||
|
int bitidx;
|
||
|
unsigned int bufcount;
|
||
|
fpos_t actpos;
|
||
|
bitcount_t totbits;
|
||
|
bitcount_t buffer_start;
|
||
|
bitcount_t readpos;
|
||
|
uint8_t *bfr;
|
||
|
unsigned int bfr_size;
|
||
|
public:
|
||
|
bool eobs;
|
||
|
};
|
||
|
|
||
|
typedef class BitStream _BitStream;
|
||
|
|
||
|
typedef size_t (*ReadCallback) (_BitStream *bs, uint8_t *dest, size_t size, void *user_data);
|
||
|
|
||
|
class BitStream : public BitStreamUndo
|
||
|
{
|
||
|
public:
|
||
|
void *user_data;
|
||
|
static const unsigned int BUFFER_SIZE = 4 * 1024;
|
||
|
public:
|
||
|
BitStream ();
|
||
|
~BitStream ();
|
||
|
inline bitcount_t bitcount ()
|
||
|
{
|
||
|
return totbits;
|
||
|
}
|
||
|
inline bool eos ()
|
||
|
{
|
||
|
return eobs;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Input bit stream class. Supports the "scanning" of a stream
|
||
|
// into a large buffer which is flushed once it has been read.
|
||
|
// N.b. if you scan ahead a long way and don't read its your
|
||
|
// responsibility to flush manually...
|
||
|
//
|
||
|
|
||
|
class IBitStream:public BitStream
|
||
|
{
|
||
|
public:
|
||
|
void open (ReadCallback read_callback, void *user_data, unsigned int buf_size = BUFFER_SIZE);
|
||
|
void SetBufSize (unsigned int buf_size);
|
||
|
void close ();
|
||
|
uint32_t get1bit ();
|
||
|
uint32_t getbits (int N);
|
||
|
void prepareundo (BitStreamUndo & undobuf);
|
||
|
void undochanges (BitStreamUndo & undobuf);
|
||
|
bool seek_sync (unsigned int sync, int N, int lim);
|
||
|
void flush (bitcount_t bitposition);
|
||
|
inline unsigned int buffered_bytes ()
|
||
|
{
|
||
|
return (buffer_start + bufcount - readpos);
|
||
|
}
|
||
|
unsigned int read_buffered_bytes (uint8_t * dst, unsigned int length_bytes);
|
||
|
|
||
|
private:
|
||
|
bool refill_buffer ();
|
||
|
static uint8_t masks[8];
|
||
|
ReadCallback read_callback;
|
||
|
};
|
||
|
|
||
|
#endif // __BITS_H__
|