1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * LZW decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2006 Konstantin Shishkov 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * @brief LZW decoding routines 26cabdff1aSopenharmony_ci * @author Fabrice Bellard 27cabdff1aSopenharmony_ci * @author modified for use in TIFF by Konstantin Shishkov 28cabdff1aSopenharmony_ci */ 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 31cabdff1aSopenharmony_ci#include "bytestream.h" 32cabdff1aSopenharmony_ci#include "lzw.h" 33cabdff1aSopenharmony_ci#include "libavutil/mem.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#define LZW_MAXBITS 12 36cabdff1aSopenharmony_ci#define LZW_SIZTABLE (1<<LZW_MAXBITS) 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_cistatic const uint16_t mask[17] = 39cabdff1aSopenharmony_ci{ 40cabdff1aSopenharmony_ci 0x0000, 0x0001, 0x0003, 0x0007, 41cabdff1aSopenharmony_ci 0x000F, 0x001F, 0x003F, 0x007F, 42cabdff1aSopenharmony_ci 0x00FF, 0x01FF, 0x03FF, 0x07FF, 43cabdff1aSopenharmony_ci 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF 44cabdff1aSopenharmony_ci}; 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_cistruct LZWState { 47cabdff1aSopenharmony_ci GetByteContext gb; 48cabdff1aSopenharmony_ci int bbits; 49cabdff1aSopenharmony_ci unsigned int bbuf; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci int mode; ///< Decoder mode 52cabdff1aSopenharmony_ci int cursize; ///< The current code size 53cabdff1aSopenharmony_ci int curmask; 54cabdff1aSopenharmony_ci int codesize; 55cabdff1aSopenharmony_ci int clear_code; 56cabdff1aSopenharmony_ci int end_code; 57cabdff1aSopenharmony_ci int newcodes; ///< First available code 58cabdff1aSopenharmony_ci int top_slot; ///< Highest code for current size 59cabdff1aSopenharmony_ci int extra_slot; 60cabdff1aSopenharmony_ci int slot; ///< Last read code 61cabdff1aSopenharmony_ci int fc, oc; 62cabdff1aSopenharmony_ci uint8_t *sp; 63cabdff1aSopenharmony_ci uint8_t stack[LZW_SIZTABLE]; 64cabdff1aSopenharmony_ci uint8_t suffix[LZW_SIZTABLE]; 65cabdff1aSopenharmony_ci uint16_t prefix[LZW_SIZTABLE]; 66cabdff1aSopenharmony_ci int bs; ///< current buffer size for GIF 67cabdff1aSopenharmony_ci}; 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci/* get one code from stream */ 70cabdff1aSopenharmony_cistatic int lzw_get_code(struct LZWState * s) 71cabdff1aSopenharmony_ci{ 72cabdff1aSopenharmony_ci int c; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci if (s->bbits < s->cursize && bytestream2_get_bytes_left(&s->gb) <= 0) 75cabdff1aSopenharmony_ci return s->end_code; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci if(s->mode == FF_LZW_GIF) { 78cabdff1aSopenharmony_ci while (s->bbits < s->cursize) { 79cabdff1aSopenharmony_ci if (!s->bs) { 80cabdff1aSopenharmony_ci s->bs = bytestream2_get_byte(&s->gb); 81cabdff1aSopenharmony_ci } 82cabdff1aSopenharmony_ci s->bbuf |= bytestream2_get_byte(&s->gb) << s->bbits; 83cabdff1aSopenharmony_ci s->bbits += 8; 84cabdff1aSopenharmony_ci s->bs--; 85cabdff1aSopenharmony_ci } 86cabdff1aSopenharmony_ci c = s->bbuf; 87cabdff1aSopenharmony_ci s->bbuf >>= s->cursize; 88cabdff1aSopenharmony_ci } else { // TIFF 89cabdff1aSopenharmony_ci while (s->bbits < s->cursize) { 90cabdff1aSopenharmony_ci s->bbuf = (s->bbuf << 8) | bytestream2_get_byte(&s->gb); 91cabdff1aSopenharmony_ci s->bbits += 8; 92cabdff1aSopenharmony_ci } 93cabdff1aSopenharmony_ci c = s->bbuf >> (s->bbits - s->cursize); 94cabdff1aSopenharmony_ci } 95cabdff1aSopenharmony_ci s->bbits -= s->cursize; 96cabdff1aSopenharmony_ci return c & s->curmask; 97cabdff1aSopenharmony_ci} 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ciint ff_lzw_decode_tail(LZWState *p) 100cabdff1aSopenharmony_ci{ 101cabdff1aSopenharmony_ci struct LZWState *s = (struct LZWState *)p; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci if(s->mode == FF_LZW_GIF) { 104cabdff1aSopenharmony_ci while (s->bs > 0 && bytestream2_get_bytes_left(&s->gb)) { 105cabdff1aSopenharmony_ci bytestream2_skip(&s->gb, s->bs); 106cabdff1aSopenharmony_ci s->bs = bytestream2_get_byte(&s->gb); 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci }else 109cabdff1aSopenharmony_ci bytestream2_skip(&s->gb, bytestream2_get_bytes_left(&s->gb)); 110cabdff1aSopenharmony_ci return bytestream2_tell(&s->gb); 111cabdff1aSopenharmony_ci} 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ciav_cold void ff_lzw_decode_open(LZWState **p) 114cabdff1aSopenharmony_ci{ 115cabdff1aSopenharmony_ci *p = av_mallocz(sizeof(struct LZWState)); 116cabdff1aSopenharmony_ci} 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ciav_cold void ff_lzw_decode_close(LZWState **p) 119cabdff1aSopenharmony_ci{ 120cabdff1aSopenharmony_ci av_freep(p); 121cabdff1aSopenharmony_ci} 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci/** 124cabdff1aSopenharmony_ci * Initialize LZW decoder 125cabdff1aSopenharmony_ci * @param p LZW context 126cabdff1aSopenharmony_ci * @param csize initial code size in bits 127cabdff1aSopenharmony_ci * @param buf input data 128cabdff1aSopenharmony_ci * @param buf_size input data size 129cabdff1aSopenharmony_ci * @param mode decoder working mode - either GIF or TIFF 130cabdff1aSopenharmony_ci */ 131cabdff1aSopenharmony_ciint ff_lzw_decode_init(LZWState *p, int csize, const uint8_t *buf, int buf_size, int mode) 132cabdff1aSopenharmony_ci{ 133cabdff1aSopenharmony_ci struct LZWState *s = (struct LZWState *)p; 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci if(csize < 1 || csize >= LZW_MAXBITS) 136cabdff1aSopenharmony_ci return -1; 137cabdff1aSopenharmony_ci /* read buffer */ 138cabdff1aSopenharmony_ci bytestream2_init(&s->gb, buf, buf_size); 139cabdff1aSopenharmony_ci s->bbuf = 0; 140cabdff1aSopenharmony_ci s->bbits = 0; 141cabdff1aSopenharmony_ci s->bs = 0; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci /* decoder */ 144cabdff1aSopenharmony_ci s->codesize = csize; 145cabdff1aSopenharmony_ci s->cursize = s->codesize + 1; 146cabdff1aSopenharmony_ci s->curmask = mask[s->cursize]; 147cabdff1aSopenharmony_ci s->top_slot = 1 << s->cursize; 148cabdff1aSopenharmony_ci s->clear_code = 1 << s->codesize; 149cabdff1aSopenharmony_ci s->end_code = s->clear_code + 1; 150cabdff1aSopenharmony_ci s->slot = s->newcodes = s->clear_code + 2; 151cabdff1aSopenharmony_ci s->oc = s->fc = -1; 152cabdff1aSopenharmony_ci s->sp = s->stack; 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci s->mode = mode; 155cabdff1aSopenharmony_ci s->extra_slot = s->mode == FF_LZW_TIFF; 156cabdff1aSopenharmony_ci return 0; 157cabdff1aSopenharmony_ci} 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci/** 160cabdff1aSopenharmony_ci * Decode given number of bytes 161cabdff1aSopenharmony_ci * NOTE: the algorithm here is inspired from the LZW GIF decoder 162cabdff1aSopenharmony_ci * written by Steven A. Bennett in 1987. 163cabdff1aSopenharmony_ci * 164cabdff1aSopenharmony_ci * @param p LZW context 165cabdff1aSopenharmony_ci * @param buf output buffer 166cabdff1aSopenharmony_ci * @param len number of bytes to decode 167cabdff1aSopenharmony_ci * @return number of bytes decoded 168cabdff1aSopenharmony_ci */ 169cabdff1aSopenharmony_ciint ff_lzw_decode(LZWState *p, uint8_t *buf, int len){ 170cabdff1aSopenharmony_ci int l, c, code, oc, fc; 171cabdff1aSopenharmony_ci uint8_t *sp; 172cabdff1aSopenharmony_ci struct LZWState *s = (struct LZWState *)p; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci if (s->end_code < 0) 175cabdff1aSopenharmony_ci return 0; 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci l = len; 178cabdff1aSopenharmony_ci sp = s->sp; 179cabdff1aSopenharmony_ci oc = s->oc; 180cabdff1aSopenharmony_ci fc = s->fc; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci for (;;) { 183cabdff1aSopenharmony_ci while (sp > s->stack) { 184cabdff1aSopenharmony_ci *buf++ = *(--sp); 185cabdff1aSopenharmony_ci if ((--l) == 0) 186cabdff1aSopenharmony_ci goto the_end; 187cabdff1aSopenharmony_ci } 188cabdff1aSopenharmony_ci c = lzw_get_code(s); 189cabdff1aSopenharmony_ci if (c == s->end_code) { 190cabdff1aSopenharmony_ci break; 191cabdff1aSopenharmony_ci } else if (c == s->clear_code) { 192cabdff1aSopenharmony_ci s->cursize = s->codesize + 1; 193cabdff1aSopenharmony_ci s->curmask = mask[s->cursize]; 194cabdff1aSopenharmony_ci s->slot = s->newcodes; 195cabdff1aSopenharmony_ci s->top_slot = 1 << s->cursize; 196cabdff1aSopenharmony_ci fc= oc= -1; 197cabdff1aSopenharmony_ci } else { 198cabdff1aSopenharmony_ci code = c; 199cabdff1aSopenharmony_ci if (code == s->slot && fc>=0) { 200cabdff1aSopenharmony_ci *sp++ = fc; 201cabdff1aSopenharmony_ci code = oc; 202cabdff1aSopenharmony_ci }else if(code >= s->slot) 203cabdff1aSopenharmony_ci break; 204cabdff1aSopenharmony_ci while (code >= s->newcodes) { 205cabdff1aSopenharmony_ci *sp++ = s->suffix[code]; 206cabdff1aSopenharmony_ci code = s->prefix[code]; 207cabdff1aSopenharmony_ci } 208cabdff1aSopenharmony_ci *sp++ = code; 209cabdff1aSopenharmony_ci if (s->slot < s->top_slot && oc>=0) { 210cabdff1aSopenharmony_ci s->suffix[s->slot] = code; 211cabdff1aSopenharmony_ci s->prefix[s->slot++] = oc; 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci fc = code; 214cabdff1aSopenharmony_ci oc = c; 215cabdff1aSopenharmony_ci if (s->slot >= s->top_slot - s->extra_slot) { 216cabdff1aSopenharmony_ci if (s->cursize < LZW_MAXBITS) { 217cabdff1aSopenharmony_ci s->top_slot <<= 1; 218cabdff1aSopenharmony_ci s->curmask = mask[++s->cursize]; 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci } 221cabdff1aSopenharmony_ci } 222cabdff1aSopenharmony_ci } 223cabdff1aSopenharmony_ci s->end_code = -1; 224cabdff1aSopenharmony_ci the_end: 225cabdff1aSopenharmony_ci s->sp = sp; 226cabdff1aSopenharmony_ci s->oc = oc; 227cabdff1aSopenharmony_ci s->fc = fc; 228cabdff1aSopenharmony_ci return len - l; 229cabdff1aSopenharmony_ci} 230