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 |
|
|
#undef near /* This file uses struct member 'near' which in windows.h is defined as empty. */ |
36 |
|
|
|
37 |
|
|
typedef struct JLSState { |
38 |
|
|
int T1, T2, T3; |
39 |
|
|
int A[367], B[367], C[365], N[367]; |
40 |
|
|
int limit, reset, bpp, qbpp, maxval, range; |
41 |
|
|
int near, twonear; |
42 |
|
|
int run_index[4]; |
43 |
|
|
} JLSState; |
44 |
|
|
|
45 |
|
|
/** |
46 |
|
|
* Calculate initial JPEG-LS parameters |
47 |
|
|
*/ |
48 |
|
|
void ff_jpegls_init_state(JLSState *state); |
49 |
|
|
|
50 |
|
|
/** |
51 |
|
|
* Calculate quantized gradient value, used for context determination |
52 |
|
|
*/ |
53 |
|
261946935 |
static inline int ff_jpegls_quantize(JLSState *s, int v) |
54 |
|
|
{ |
55 |
✓✓ |
261946935 |
if (v == 0) |
56 |
|
22609799 |
return 0; |
57 |
✓✓ |
239337136 |
if (v < 0) { |
58 |
✓✓ |
110161910 |
if (v <= -s->T3) |
59 |
|
20088936 |
return -4; |
60 |
✓✓ |
90072974 |
if (v <= -s->T2) |
61 |
|
42203615 |
return -3; |
62 |
✓✓ |
47869359 |
if (v <= -s->T1) |
63 |
|
24863312 |
return -2; |
64 |
✓✗ |
23006047 |
if (v < -s->near) |
65 |
|
23006047 |
return -1; |
66 |
|
|
return 0; |
67 |
|
|
} else { |
68 |
✗✓ |
129175226 |
if (v <= s->near) |
69 |
|
|
return 0; |
70 |
✓✓ |
129175226 |
if (v < s->T1) |
71 |
|
24267848 |
return 1; |
72 |
✓✓ |
104907378 |
if (v < s->T2) |
73 |
|
34074282 |
return 2; |
74 |
✓✓ |
70833096 |
if (v < s->T3) |
75 |
|
52267563 |
return 3; |
76 |
|
18565533 |
return 4; |
77 |
|
|
} |
78 |
|
|
} |
79 |
|
|
|
80 |
|
|
/** |
81 |
|
|
* Calculate JPEG-LS codec values |
82 |
|
|
*/ |
83 |
|
|
void ff_jpegls_reset_coding_parameters(JLSState *s, int reset_all); |
84 |
|
|
|
85 |
|
88349902 |
static inline void ff_jpegls_downscale_state(JLSState *state, int Q) |
86 |
|
|
{ |
87 |
✓✓ |
88349902 |
if (state->N[Q] == state->reset) { |
88 |
|
2597000 |
state->A[Q] >>= 1; |
89 |
|
2597000 |
state->B[Q] >>= 1; |
90 |
|
2597000 |
state->N[Q] >>= 1; |
91 |
|
|
} |
92 |
|
88349902 |
state->N[Q]++; |
93 |
|
88349902 |
} |
94 |
|
|
|
95 |
|
87315645 |
static inline int ff_jpegls_update_state_regular(JLSState *state, |
96 |
|
|
int Q, int err) |
97 |
|
|
{ |
98 |
✓✗✗✓
|
87315645 |
if(FFABS(err) > 0xFFFF || FFABS(err) > INT_MAX - state->A[Q]) |
99 |
|
|
return -0x10000; |
100 |
|
87315645 |
state->A[Q] += FFABS(err); |
101 |
|
87315645 |
err *= state->twonear; |
102 |
|
87315645 |
state->B[Q] += err; |
103 |
|
|
|
104 |
|
87315645 |
ff_jpegls_downscale_state(state, Q); |
105 |
|
|
|
106 |
✓✓ |
87315645 |
if (state->B[Q] <= -state->N[Q]) { |
107 |
|
6507442 |
state->B[Q] = FFMAX(state->B[Q] + state->N[Q], 1 - state->N[Q]); |
108 |
✓✓ |
6507442 |
if (state->C[Q] > -128) |
109 |
|
6494287 |
state->C[Q]--; |
110 |
✓✓ |
80808203 |
} else if (state->B[Q] > 0) { |
111 |
|
6741036 |
state->B[Q] = FFMIN(state->B[Q] - state->N[Q], 0); |
112 |
✓✓ |
6741036 |
if (state->C[Q] < 127) |
113 |
|
6740978 |
state->C[Q]++; |
114 |
|
|
} |
115 |
|
|
|
116 |
|
87315645 |
return err; |
117 |
|
|
} |
118 |
|
|
|
119 |
|
|
#define R(a, i) (bits == 8 ? ((uint8_t *)(a))[i] : ((uint16_t *)(a))[i]) |
120 |
|
|
#define W(a, i, v) (bits == 8 ? (((uint8_t *)(a))[i] = v) : (((uint16_t *)(a))[i] = v)) |
121 |
|
|
|
122 |
|
|
#endif /* AVCODEC_JPEGLS_H */ |