00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #include "jpegls.h"
00029
00030 const uint8_t ff_log2_run[32]={
00031 0, 0, 0, 0, 1, 1, 1, 1,
00032 2, 2, 2, 2, 3, 3, 3, 3,
00033 4, 4, 5, 5, 6, 6, 7, 7,
00034 8, 9,10,11,12,13,14,15
00035 };
00036
00037 void ff_jpegls_init_state(JLSState *state){
00038 int i;
00039
00040 state->twonear = state->near * 2 + 1;
00041 state->range = ((state->maxval + state->twonear - 1) / state->twonear) + 1;
00042
00043
00044 for(state->qbpp = 0; (1 << state->qbpp) < state->range; state->qbpp++);
00045
00046 if(state->bpp < 8)
00047 state->limit = 16 + 2 * state->bpp - state->qbpp;
00048 else
00049 state->limit = (4 * state->bpp) - state->qbpp;
00050
00051 for(i = 0; i < 367; i++) {
00052 state->A[i] = FFMAX((state->range + 32) >> 6, 2);
00053 state->N[i] = 1;
00054 }
00055
00056 }
00057
00061 static inline int iso_clip(int v, int vmin, int vmax){
00062 if(v > vmax || v < vmin) return vmin;
00063 else return v;
00064 }
00065
00066 void ff_jpegls_reset_coding_parameters(JLSState *s, int reset_all){
00067 const int basic_t1= 3;
00068 const int basic_t2= 7;
00069 const int basic_t3= 21;
00070 int factor;
00071
00072 if(s->maxval==0 || reset_all) s->maxval= (1 << s->bpp) - 1;
00073
00074 if(s->maxval >=128){
00075 factor= (FFMIN(s->maxval, 4095) + 128)>>8;
00076
00077 if(s->T1==0 || reset_all)
00078 s->T1= iso_clip(factor*(basic_t1-2) + 2 + 3*s->near, s->near+1, s->maxval);
00079 if(s->T2==0 || reset_all)
00080 s->T2= iso_clip(factor*(basic_t2-3) + 3 + 5*s->near, s->T1, s->maxval);
00081 if(s->T3==0 || reset_all)
00082 s->T3= iso_clip(factor*(basic_t3-4) + 4 + 7*s->near, s->T2, s->maxval);
00083 }else{
00084 factor= 256 / (s->maxval + 1);
00085
00086 if(s->T1==0 || reset_all)
00087 s->T1= iso_clip(FFMAX(2, basic_t1/factor + 3*s->near), s->near+1, s->maxval);
00088 if(s->T2==0 || reset_all)
00089 s->T2= iso_clip(FFMAX(3, basic_t2/factor + 5*s->near), s->T1, s->maxval);
00090 if(s->T3==0 || reset_all)
00091 s->T3= iso_clip(FFMAX(4, basic_t3/factor + 6*s->near), s->T2, s->maxval);
00092 }
00093
00094 if(s->reset==0 || reset_all) s->reset= 64;
00095
00096 }