2
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3
* Copyright (c) 2002-2007, Professor Benoit Macq
4
* Copyright (c) 2001-2003, David Janssens
5
* Copyright (c) 2002-2003, Yannick Verschueren
6
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7
* Copyright (c) 2005, Herve Drolon, FreeImage Team
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
19
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
* POSSIBILITY OF SUCH DAMAGE.
32
#include "opj_includes.h"
34
/** @defgroup BIO BIO - Individual bit input-output stream */
37
/** @name Local static functions */
43
@param b Bit to write (0 or 1)
45
static void bio_putbit(opj_bio_t *bio, int b);
49
@return Returns the read bit
51
static int bio_getbit(opj_bio_t *bio);
55
@return Returns 0 if successful, returns 1 otherwise
57
static int bio_byteout(opj_bio_t *bio);
61
@return Returns 0 if successful, returns 1 otherwise
63
static int bio_bytein(opj_bio_t *bio);
70
==========================================================
72
==========================================================
75
static int bio_byteout(opj_bio_t *bio) {
76
bio->buf = (bio->buf << 8) & 0xffff;
77
bio->ct = bio->buf == 0xff00 ? 7 : 8;
78
if (bio->bp >= bio->end) {
81
*bio->bp++ = bio->buf >> 8;
85
static int bio_bytein(opj_bio_t *bio) {
86
bio->buf = (bio->buf << 8) & 0xffff;
87
bio->ct = bio->buf == 0xff00 ? 7 : 8;
88
if (bio->bp >= bio->end) {
91
bio->buf |= *bio->bp++;
95
static void bio_putbit(opj_bio_t *bio, int b) {
100
bio->buf |= b << bio->ct;
103
static int bio_getbit(opj_bio_t *bio) {
108
return (bio->buf >> bio->ct) & 1;
112
==========================================================
113
Bit Input/Output interface
114
==========================================================
117
opj_bio_t* bio_create(void) {
118
opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
122
void bio_destroy(opj_bio_t *bio) {
128
int bio_numbytes(opj_bio_t *bio) {
129
return (bio->bp - bio->start);
132
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
140
void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
148
void bio_write(opj_bio_t *bio, int v, int n) {
150
for (i = n - 1; i >= 0; i--) {
151
bio_putbit(bio, (v >> i) & 1);
155
int bio_read(opj_bio_t *bio, int n) {
158
for (i = n - 1; i >= 0; i--) {
159
v += bio_getbit(bio) << i;
164
int bio_flush(opj_bio_t *bio) {
166
if (bio_byteout(bio)) {
171
if (bio_byteout(bio)) {
178
int bio_inalign(opj_bio_t *bio) {
180
if ((bio->buf & 0xff) == 0xff) {
181
if (bio_bytein(bio)) {