1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * JPEG-LS common code 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer 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 * JPEG-LS common code. 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include <stddef.h> 29cabdff1aSopenharmony_ci#include "libavutil/internal.h" 30cabdff1aSopenharmony_ci#include "libavutil/intmath.h" 31cabdff1aSopenharmony_ci#include "jpegls.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_civoid ff_jpegls_init_state(JLSState *state) 34cabdff1aSopenharmony_ci{ 35cabdff1aSopenharmony_ci int i; 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci state->twonear = state->near * 2 + 1; 38cabdff1aSopenharmony_ci state->range = (state->maxval + state->twonear - 1) / state->twonear + 1; 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci // QBPP = ceil(log2(RANGE)) 41cabdff1aSopenharmony_ci for (state->qbpp = 0; (1 << state->qbpp) < state->range; state->qbpp++) 42cabdff1aSopenharmony_ci ; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci state->bpp = FFMAX(av_log2(state->maxval) + 1, 2); 45cabdff1aSopenharmony_ci state->limit = 2*(state->bpp + FFMAX(state->bpp, 8)) - state->qbpp; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci for (i = 0; i < 367; i++) { 48cabdff1aSopenharmony_ci state->A[i] = FFMAX(state->range + 32 >> 6, 2); 49cabdff1aSopenharmony_ci state->N[i] = 1; 50cabdff1aSopenharmony_ci } 51cabdff1aSopenharmony_ci} 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci/** 54cabdff1aSopenharmony_ci * Custom value clipping function used in T1, T2, T3 calculation 55cabdff1aSopenharmony_ci */ 56cabdff1aSopenharmony_cistatic inline int iso_clip(int v, int vmin, int vmax) 57cabdff1aSopenharmony_ci{ 58cabdff1aSopenharmony_ci if (v > vmax || v < vmin) 59cabdff1aSopenharmony_ci return vmin; 60cabdff1aSopenharmony_ci else 61cabdff1aSopenharmony_ci return v; 62cabdff1aSopenharmony_ci} 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_civoid ff_jpegls_reset_coding_parameters(JLSState *s, int reset_all) 65cabdff1aSopenharmony_ci{ 66cabdff1aSopenharmony_ci const int basic_t1 = 3; 67cabdff1aSopenharmony_ci const int basic_t2 = 7; 68cabdff1aSopenharmony_ci const int basic_t3 = 21; 69cabdff1aSopenharmony_ci int factor; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci if (s->maxval == 0 || reset_all) 72cabdff1aSopenharmony_ci s->maxval = (1 << s->bpp) - 1; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci if (s->maxval >= 128) { 75cabdff1aSopenharmony_ci factor = FFMIN(s->maxval, 4095) + 128 >> 8; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci if (s->T1 == 0 || reset_all) 78cabdff1aSopenharmony_ci s->T1 = iso_clip(factor * (basic_t1 - 2) + 2 + 3 * s->near, 79cabdff1aSopenharmony_ci s->near + 1, s->maxval); 80cabdff1aSopenharmony_ci if (s->T2 == 0 || reset_all) 81cabdff1aSopenharmony_ci s->T2 = iso_clip(factor * (basic_t2 - 3) + 3 + 5 * s->near, 82cabdff1aSopenharmony_ci s->T1, s->maxval); 83cabdff1aSopenharmony_ci if (s->T3 == 0 || reset_all) 84cabdff1aSopenharmony_ci s->T3 = iso_clip(factor * (basic_t3 - 4) + 4 + 7 * s->near, 85cabdff1aSopenharmony_ci s->T2, s->maxval); 86cabdff1aSopenharmony_ci } else { 87cabdff1aSopenharmony_ci factor = 256 / (s->maxval + 1); 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci if (s->T1 == 0 || reset_all) 90cabdff1aSopenharmony_ci s->T1 = iso_clip(FFMAX(2, basic_t1 / factor + 3 * s->near), 91cabdff1aSopenharmony_ci s->near + 1, s->maxval); 92cabdff1aSopenharmony_ci if (s->T2 == 0 || reset_all) 93cabdff1aSopenharmony_ci s->T2 = iso_clip(FFMAX(3, basic_t2 / factor + 5 * s->near), 94cabdff1aSopenharmony_ci s->T1, s->maxval); 95cabdff1aSopenharmony_ci if (s->T3 == 0 || reset_all) 96cabdff1aSopenharmony_ci s->T3 = iso_clip(FFMAX(4, basic_t3 / factor + 7 * s->near), 97cabdff1aSopenharmony_ci s->T2, s->maxval); 98cabdff1aSopenharmony_ci } 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci if (s->reset == 0 || reset_all) 101cabdff1aSopenharmony_ci s->reset = 64; 102cabdff1aSopenharmony_ci ff_dlog(NULL, "[JPEG-LS RESET] T=%i,%i,%i\n", s->T1, s->T2, s->T3); 103cabdff1aSopenharmony_ci} 104