blob: c8997c786185c9654cd53767ada349ee4e2aaa9f
1 | /* |
2 | * JPEG-LS common code |
3 | * Copyright (c) 2003 Michael Niedermayer |
4 | * Copyright (c) 2006 Konstantin Shishkov |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either |
11 | * version 2.1 of the License, or (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with FFmpeg; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | */ |
22 | |
23 | /** |
24 | * @file |
25 | * JPEG-LS common code. |
26 | */ |
27 | |
28 | #ifndef AVCODEC_JPEGLS_H |
29 | #define AVCODEC_JPEGLS_H |
30 | |
31 | #include "libavutil/common.h" |
32 | #include "avcodec.h" |
33 | #include "internal.h" |
34 | |
35 | typedef struct JpeglsContext { |
36 | AVCodecContext *avctx; |
37 | } JpeglsContext; |
38 | |
39 | typedef struct JLSState { |
40 | int T1, T2, T3; |
41 | int A[367], B[367], C[365], N[367]; |
42 | int limit, reset, bpp, qbpp, maxval, range; |
43 | int near, twonear; |
44 | int run_index[4]; |
45 | } JLSState; |
46 | |
47 | /** |
48 | * Calculate initial JPEG-LS parameters |
49 | */ |
50 | void ff_jpegls_init_state(JLSState *state); |
51 | |
52 | /** |
53 | * Calculate quantized gradient value, used for context determination |
54 | */ |
55 | static inline int ff_jpegls_quantize(JLSState *s, int v) |
56 | { |
57 | if (v == 0) |
58 | return 0; |
59 | if (v < 0) { |
60 | if (v <= -s->T3) |
61 | return -4; |
62 | if (v <= -s->T2) |
63 | return -3; |
64 | if (v <= -s->T1) |
65 | return -2; |
66 | if (v < -s->near) |
67 | return -1; |
68 | return 0; |
69 | } else { |
70 | if (v <= s->near) |
71 | return 0; |
72 | if (v < s->T1) |
73 | return 1; |
74 | if (v < s->T2) |
75 | return 2; |
76 | if (v < s->T3) |
77 | return 3; |
78 | return 4; |
79 | } |
80 | } |
81 | |
82 | /** |
83 | * Calculate JPEG-LS codec values |
84 | */ |
85 | void ff_jpegls_reset_coding_parameters(JLSState *s, int reset_all); |
86 | |
87 | static inline void ff_jpegls_downscale_state(JLSState *state, int Q) |
88 | { |
89 | if (state->N[Q] == state->reset) { |
90 | state->A[Q] >>= 1; |
91 | state->B[Q] >>= 1; |
92 | state->N[Q] >>= 1; |
93 | } |
94 | state->N[Q]++; |
95 | } |
96 | |
97 | static inline int ff_jpegls_update_state_regular(JLSState *state, |
98 | int Q, int err) |
99 | { |
100 | if(FFABS(err) > 0xFFFF) |
101 | return -0x10000; |
102 | state->A[Q] += FFABS(err); |
103 | err *= state->twonear; |
104 | state->B[Q] += err; |
105 | |
106 | ff_jpegls_downscale_state(state, Q); |
107 | |
108 | if (state->B[Q] <= -state->N[Q]) { |
109 | state->B[Q] = FFMAX(state->B[Q] + state->N[Q], 1 - state->N[Q]); |
110 | if (state->C[Q] > -128) |
111 | state->C[Q]--; |
112 | } else if (state->B[Q] > 0) { |
113 | state->B[Q] = FFMIN(state->B[Q] - state->N[Q], 0); |
114 | if (state->C[Q] < 127) |
115 | state->C[Q]++; |
116 | } |
117 | |
118 | return err; |
119 | } |
120 | |
121 | #define R(a, i) (bits == 8 ? ((uint8_t *)(a))[i] : ((uint16_t *)(a))[i]) |
122 | #define W(a, i, v) (bits == 8 ? (((uint8_t *)(a))[i] = v) : (((uint16_t *)(a))[i] = v)) |
123 | |
124 | #endif /* AVCODEC_JPEGLS_H */ |
125 |