made bio more efficient, and added simulate out mode, where bio doesn't actually write bytes out to output buffer.

This commit is contained in:
Aaron Boxer 2015-11-26 22:45:19 -05:00
parent c311463900
commit 269c40c544
2 changed files with 13 additions and 9 deletions

View File

@ -48,7 +48,7 @@ Write a bit
@param bio BIO handle
@param b Bit to write (0 or 1)
*/
static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b);
static void opj_bio_putbit(opj_bio_t *bio, OPJ_BYTE b);
/**
Read a bit
@param bio BIO handle
@ -79,26 +79,27 @@ static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio);
*/
static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio) {
bio->buf = (bio->buf << 8) & 0xffff;
bio->ct = bio->buf == 0xff00 ? 7 : 8;
bio->ct = bio->buf == 0xff ? 7 : 8;
if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) {
return OPJ_FALSE;
}
*bio->bp++ = (OPJ_BYTE)(bio->buf >> 8);
if (!bio->simOut)
*bio->bp = bio->buf;
bio->bp++;
bio->buf = 0;
return OPJ_TRUE;
}
static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) {
bio->buf = (bio->buf << 8) & 0xffff;
bio->ct = bio->buf == 0xff00 ? 7 : 8;
bio->ct = bio->buf == 0xff ? 7 : 8;
if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) {
return OPJ_FALSE;
}
bio->buf |= *bio->bp++;
bio->buf = *bio->bp++;
return OPJ_TRUE;
}
static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) {
static void opj_bio_putbit(opj_bio_t *bio, OPJ_BYTE b) {
if (bio->ct == 0) {
opj_bio_byteout(bio); /* MSD: why not check the return value of this function ? */
}
@ -141,6 +142,7 @@ void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
bio->bp = bp;
bio->buf = 0;
bio->ct = 8;
bio->simOut = OPJ_FALSE;
}
void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {

View File

@ -61,9 +61,11 @@ typedef struct opj_bio {
/** pointer to the present position in the buffer */
OPJ_BYTE *bp;
/** temporary place where each byte is read or written */
OPJ_UINT32 buf;
OPJ_UINT8 buf;
/** coder : number of bits free to write. decoder : number of bits read */
OPJ_UINT32 ct;
OPJ_BOOL simOut;
} opj_bio_t;
/** @name Exported functions */