/src/FreeImage/Source/LibOpenJPEG/bio.c
C | 187 lines | 100 code | 21 blank | 66 comment | 18 complexity | c967ce421846b4aba5d14b6241b2dc00 MD5 | raw file
1/* 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 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 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. 18 * 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. 30 */ 31 32#include "opj_includes.h" 33 34/** @defgroup BIO BIO - Individual bit input-output stream */ 35/*@{*/ 36 37/** @name Local static functions */ 38/*@{*/ 39 40/** 41Write a bit 42@param bio BIO handle 43@param b Bit to write (0 or 1) 44*/ 45static void bio_putbit(opj_bio_t *bio, int b); 46/** 47Read a bit 48@param bio BIO handle 49@return Returns the read bit 50*/ 51static int bio_getbit(opj_bio_t *bio); 52/** 53Write a byte 54@param bio BIO handle 55@return Returns 0 if successful, returns 1 otherwise 56*/ 57static int bio_byteout(opj_bio_t *bio); 58/** 59Read a byte 60@param bio BIO handle 61@return Returns 0 if successful, returns 1 otherwise 62*/ 63static int bio_bytein(opj_bio_t *bio); 64 65/*@}*/ 66 67/*@}*/ 68 69/* 70========================================================== 71 local functions 72========================================================== 73*/ 74 75static 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) { 79 return 1; 80 } 81 *bio->bp++ = bio->buf >> 8; 82 return 0; 83} 84 85static 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) { 89 return 1; 90 } 91 bio->buf |= *bio->bp++; 92 return 0; 93} 94 95static void bio_putbit(opj_bio_t *bio, int b) { 96 if (bio->ct == 0) { 97 bio_byteout(bio); 98 } 99 bio->ct--; 100 bio->buf |= b << bio->ct; 101} 102 103static int bio_getbit(opj_bio_t *bio) { 104 if (bio->ct == 0) { 105 bio_bytein(bio); 106 } 107 bio->ct--; 108 return (bio->buf >> bio->ct) & 1; 109} 110 111/* 112========================================================== 113 Bit Input/Output interface 114========================================================== 115*/ 116 117opj_bio_t* bio_create(void) { 118 opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); 119 return bio; 120} 121 122void bio_destroy(opj_bio_t *bio) { 123 if(bio) { 124 opj_free(bio); 125 } 126} 127 128int bio_numbytes(opj_bio_t *bio) { 129 return (bio->bp - bio->start); 130} 131 132void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { 133 bio->start = bp; 134 bio->end = bp + len; 135 bio->bp = bp; 136 bio->buf = 0; 137 bio->ct = 8; 138} 139 140void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) { 141 bio->start = bp; 142 bio->end = bp + len; 143 bio->bp = bp; 144 bio->buf = 0; 145 bio->ct = 0; 146} 147 148void bio_write(opj_bio_t *bio, int v, int n) { 149 int i; 150 for (i = n - 1; i >= 0; i--) { 151 bio_putbit(bio, (v >> i) & 1); 152 } 153} 154 155int bio_read(opj_bio_t *bio, int n) { 156 int i, v; 157 v = 0; 158 for (i = n - 1; i >= 0; i--) { 159 v += bio_getbit(bio) << i; 160 } 161 return v; 162} 163 164int bio_flush(opj_bio_t *bio) { 165 bio->ct = 0; 166 if (bio_byteout(bio)) { 167 return 1; 168 } 169 if (bio->ct == 7) { 170 bio->ct = 0; 171 if (bio_byteout(bio)) { 172 return 1; 173 } 174 } 175 return 0; 176} 177 178int bio_inalign(opj_bio_t *bio) { 179 bio->ct = 0; 180 if ((bio->buf & 0xff) == 0xff) { 181 if (bio_bytein(bio)) { 182 return 1; 183 } 184 bio->ct = 0; 185 } 186 return 0; 187}