#include "smk_bitstream.h"
#include "smk_malloc.h"
struct smk_bit_t
{
const unsigned char* buffer;
unsigned long size;
unsigned long byte_num;
char bit_num;
};
struct smk_bit_t* smk_bs_init(const unsigned char* b, const unsigned long size)
{
struct smk_bit_t* ret = NULL;
smk_assert(b);
smk_malloc(ret, sizeof(struct smk_bit_t));
ret->buffer = b;
ret->size = size;
error:
return ret;
}
char _smk_bs_read_1(struct smk_bit_t* bs)
{
unsigned char ret = -1;
smk_assert(bs);
if (bs->byte_num >= bs->size)
{
fprintf(stderr, "libsmacker::_smk_bs_read_1(bs): ERROR: bitstream (length=%lu) exhausted.\n", bs->size);
goto error;
}
ret = (((bs->buffer[bs->byte_num]) & (1 << bs->bit_num)) != 0);
bs->bit_num ++;
if (bs->bit_num > 7)
{
bs->byte_num ++;
bs->bit_num = 0;
}
error:
return ret;
}
short _smk_bs_read_8(struct smk_bit_t* bs)
{
unsigned char ret = -1;
smk_assert(bs);
if (bs->byte_num + (bs->bit_num > 0) >= bs->size)
{
fprintf(stderr, "libsmacker::_smk_bs_read_8(bs): ERROR: bitstream (length=%lu) exhausted.\n", bs->size);
goto error;
}
if (bs->bit_num)
{
ret = bs->buffer[bs->byte_num] >> bs->bit_num;
bs->byte_num ++;
ret |= (bs->buffer[bs->byte_num] << (8 - bs->bit_num));
} else {
ret = bs->buffer[bs->byte_num ++];
}
error:
return ret;
}