/* * Copyright (c) 2001-2002, David Janssens * Copyright (c) 2003, Yannick Verschueren * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "bio.h" #include static unsigned char *bio_start, *bio_end, *bio_bp; static unsigned int bio_buf; static int bio_ct; extern jmp_buf j2k_error; /// /// Number of bytes written. /// int bio_numbytes() { return bio_bp-bio_start; } /// /// Init encoder. /// /// Output buffer /// Output buffer length void bio_init_enc(unsigned char *bp, int len) { bio_start=bp; bio_end=bp+len; bio_bp=bp; bio_buf=0; bio_ct=8; } /// /// Init decoder. /// /// Input buffer /// Input buffer length void bio_init_dec(unsigned char *bp, int len) { bio_start=bp; bio_end=bp+len; bio_bp=bp; bio_buf=0; bio_ct=0; } /// /// Write byte. /// int bio_byteout() { bio_buf=(bio_buf<<8)&0xffff; bio_ct=bio_buf==0xff00?7:8; if (bio_bp>=bio_end) return 1; //longjmp(j2k_error, 1); *bio_bp++=bio_buf>>8; return 0; } /// /// Read byte. /// int bio_bytein() { bio_buf=(bio_buf<<8)&0xffff; bio_ct=bio_buf==0xff00?7:8; if (bio_bp>=bio_end) return 1; //longjmp(j2k_error, 1); bio_buf|=*bio_bp++; return 0; } /// /// Write bit. /// /// Bit to write (0 or 1) void bio_putbit(int b) { if (bio_ct==0) { bio_byteout(); } bio_ct--; bio_buf|=b< /// Read bit. /// int bio_getbit() { if (bio_ct==0) { bio_bytein(); } bio_ct--; return (bio_buf>>bio_ct)&1; } /// /// Write bits. /// /// Value of bits /// Number of bits to write void bio_write(int v, int n) { int i; for (i=n-1; i>=0; i--) { bio_putbit((v>>i)&1); } } /// /// Read bits. /// /// Number of bits to read int bio_read(int n) { int i, v; v=0; for (i=n-1; i>=0; i--) { v+=bio_getbit()< /// Flush bits. /// int bio_flush() { bio_ct=0; bio_byteout(); if (bio_ct==7) { bio_ct=0; if ( bio_byteout()) return 1;; } return 0; } /// /// int bio_inalign() { bio_ct=0; if ((bio_buf&0xff)==0xff) { if( bio_bytein()) return 1; bio_ct=0; } return 0; }