3 * Copyright (c) 2003 Michael Niedermayer
4 * Copyright (c) 2006 Konstantin Shishkov
6 * This file is part of FFmpeg.
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.
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.
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
29 #include "bitstream.h"
34 #include "jpeglsdec.h"
38 * Uncomment this to significantly speed up decoding of broken JPEG-LS
39 * (or test broken JPEG-LS decoder) and slow down ordinary decoding a bit.
41 * There is no Golomb code with length >= 32 bits possible, so check and
42 * avoid situation of 32 zeros, FFmpeg Golomb decoder is painfully slow
49 * Decode LSE block with initialization parameters
51 int ff_jpegls_decode_lse(MJpegDecodeContext
*s
)
55 /* XXX: verify len field validity */
56 len
= get_bits(&s
->gb
, 16);
57 id
= get_bits(&s
->gb
, 8);
61 s
->maxval
= get_bits(&s
->gb
, 16);
62 s
->t1
= get_bits(&s
->gb
, 16);
63 s
->t2
= get_bits(&s
->gb
, 16);
64 s
->t3
= get_bits(&s
->gb
, 16);
65 s
->reset
= get_bits(&s
->gb
, 16);
67 // ff_jpegls_reset_coding_parameters(s, 0);
72 av_log(s
->avctx
, AV_LOG_ERROR
, "palette not supported\n");
75 av_log(s
->avctx
, AV_LOG_ERROR
, "oversize image not supported\n");
78 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid id %d\n", id
);
81 // av_log(s->avctx, AV_LOG_DEBUG, "ID=%i, T=%i,%i,%i\n", id, s->t1, s->t2, s->t3);
87 * Get context-dependent Golomb code, decode it and update context
89 static inline int ls_get_code_regular(GetBitContext
*gb
, JLSState
*state
, int Q
){
92 for(k
= 0; (state
->N
[Q
] << k
) < state
->A
[Q
]; k
++);
95 if(!show_bits_long(gb
, 32))return -1;
97 ret
= get_ur_golomb_jpegls(gb
, k
, state
->limit
, state
->qbpp
);
99 /* decode mapped error */
101 ret
= -((ret
+ 1) >> 1);
105 /* for NEAR=0, k=0 and 2*B[Q] <= - N[Q] mapping is reversed */
106 if(!state
->near
&& !k
&& (2 * state
->B
[Q
] <= -state
->N
[Q
]))
109 ret
= ff_jpegls_update_state_regular(state
, Q
, ret
);
115 * Get Golomb code, decode it and update state for run termination
117 static inline int ls_get_code_runterm(GetBitContext
*gb
, JLSState
*state
, int RItype
, int limit_add
){
118 int k
, ret
, temp
, map
;
119 int Q
= 365 + RItype
;
123 temp
+= state
->N
[Q
] >> 1;
125 for(k
= 0; (state
->N
[Q
] << k
) < temp
; k
++);
128 if(!show_bits_long(gb
, 32))return -1;
130 ret
= get_ur_golomb_jpegls(gb
, k
, state
->limit
- limit_add
- 1, state
->qbpp
);
132 /* decode mapped error */
134 if(!k
&& (RItype
|| ret
) && (2 * state
->B
[Q
] < state
->N
[Q
]))
139 ret
= map
- ((ret
+ 1) >> 1);
146 state
->A
[Q
] += FFABS(ret
) - RItype
;
147 ret
*= state
->twonear
;
148 ff_jpegls_downscale_state(state
, Q
);
154 * Decode one line of image
156 static inline void ls_decode_line(JLSState
*state
, MJpegDecodeContext
*s
, void *last
, void *dst
, int last2
, int w
, int stride
, int comp
, int bits
){
164 /* compute gradients */
165 Ra
= x
? R(dst
, x
- stride
) : R(last
, x
);
167 Rc
= x
? R(last
, x
- stride
) : last2
;
168 Rd
= (x
>= w
- stride
) ? R(last
, x
) : R(last
, x
+ stride
);
173 if((FFABS(D0
) <= state
->near
) && (FFABS(D1
) <= state
->near
) && (FFABS(D2
) <= state
->near
)) {
177 /* decode full runs while available */
178 while(get_bits1(&s
->gb
)) {
180 r
= 1 << ff_log2_run
[state
->run_index
[comp
]];
181 if(x
+ r
* stride
> w
) {
182 r
= (w
- x
) / stride
;
184 for(i
= 0; i
< r
; i
++) {
188 /* if EOL reached, we stop decoding */
189 if(r
!= (1 << ff_log2_run
[state
->run_index
[comp
]]))
191 if(state
->run_index
[comp
] < 31)
192 state
->run_index
[comp
]++;
196 /* decode aborted run */
197 r
= ff_log2_run
[state
->run_index
[comp
]];
199 r
= get_bits_long(&s
->gb
, r
);
200 for(i
= 0; i
< r
; i
++) {
205 /* decode run termination value */
207 RItype
= (FFABS(Ra
- Rb
) <= state
->near
) ? 1 : 0;
208 err
= ls_get_code_runterm(&s
->gb
, state
, RItype
, ff_log2_run
[state
->run_index
[comp
]]);
209 if(state
->run_index
[comp
])
210 state
->run_index
[comp
]--;
212 if(state
->near
&& RItype
){
220 } else { /* regular mode */
223 context
= ff_jpegls_quantize(state
, D0
) * 81 + ff_jpegls_quantize(state
, D1
) * 9 + ff_jpegls_quantize(state
, D2
);
224 pred
= mid_pred(Ra
, Ra
+ Rb
- Rc
, Rb
);
234 pred
= av_clip(pred
- state
->C
[context
], 0, state
->maxval
);
235 err
= -ls_get_code_regular(&s
->gb
, state
, context
);
237 pred
= av_clip(pred
+ state
->C
[context
], 0, state
->maxval
);
238 err
= ls_get_code_regular(&s
->gb
, state
, context
);
241 /* we have to do something more for near-lossless coding */
245 if(pred
< -state
->near
)
246 pred
+= state
->range
* state
->twonear
;
247 else if(pred
> state
->maxval
+ state
->near
)
248 pred
-= state
->range
* state
->twonear
;
249 pred
= av_clip(pred
, 0, state
->maxval
);
252 pred
&= state
->maxval
;
258 int ff_jpegls_decode_picture(MJpegDecodeContext
*s
, int near
, int point_transform
, int ilv
){
260 uint8_t *zero
, *last
, *cur
;
262 int off
= 0, stride
= 1, width
, shift
;
264 zero
= av_mallocz(s
->picture
.linesize
[0]);
266 cur
= s
->picture
.data
[0];
268 state
= av_mallocz(sizeof(JLSState
));
269 /* initialize JPEG-LS state from JPEG parameters */
271 state
->bpp
= (s
->bits
< 2) ? 2 : s
->bits
;
272 state
->maxval
= s
->maxval
;
276 state
->reset
= s
->reset
;
277 ff_jpegls_reset_coding_parameters(state
, 0);
278 ff_jpegls_init_state(state
);
281 shift
= point_transform
+ (8 - s
->bits
);
283 shift
= point_transform
+ (16 - s
->bits
);
285 // av_log(s->avctx, AV_LOG_DEBUG, "JPEG-LS params: %ix%i NEAR=%i MV=%i T(%i,%i,%i) RESET=%i, LIMIT=%i, qbpp=%i, RANGE=%i\n",s->width,s->height,state->near,state->maxval,state->T1,state->T2,state->T3,state->reset,state->limit,state->qbpp, state->range);
286 // av_log(s->avctx, AV_LOG_DEBUG, "JPEG params: ILV=%i Pt=%i BPP=%i, scan = %i\n", ilv, point_transform, s->bits, s->cur_scan);
287 if(ilv
== 0) { /* separate planes */
288 off
= s
->cur_scan
- 1;
289 stride
= (s
->nb_components
> 1) ? 3 : 1;
290 width
= s
->width
* stride
;
292 for(i
= 0; i
< s
->height
; i
++) {
294 ls_decode_line(state
, s
, last
, cur
, t
, width
, stride
, off
, 8);
297 ls_decode_line(state
, s
, last
, cur
, t
, width
, stride
, off
, 16);
298 t
= *((uint16_t*)last
);
301 cur
+= s
->picture
.linesize
[0];
303 if (s
->restart_interval
&& !--s
->restart_count
) {
304 align_get_bits(&s
->gb
);
305 skip_bits(&s
->gb
, 16); /* skip RSTn */
308 } else if(ilv
== 1) { /* line interleaving */
310 int Rc
[3] = {0, 0, 0};
311 memset(cur
, 0, s
->picture
.linesize
[0]);
312 width
= s
->width
* 3;
313 for(i
= 0; i
< s
->height
; i
++) {
314 for(j
= 0; j
< 3; j
++) {
315 ls_decode_line(state
, s
, last
+ j
, cur
+ j
, Rc
[j
], width
, 3, j
, 8);
318 if (s
->restart_interval
&& !--s
->restart_count
) {
319 align_get_bits(&s
->gb
);
320 skip_bits(&s
->gb
, 16); /* skip RSTn */
324 cur
+= s
->picture
.linesize
[0];
326 } else if(ilv
== 2) { /* sample interleaving */
327 av_log(s
->avctx
, AV_LOG_ERROR
, "Sample interleaved images are not supported.\n");
333 if(shift
){ /* we need to do point transform or normalize samples */
336 w
= s
->width
* s
->nb_components
;
339 uint8_t *src
= s
->picture
.data
[0];
341 for(i
= 0; i
< s
->height
; i
++){
342 for(x
= off
; x
< w
; x
+= stride
){
345 src
+= s
->picture
.linesize
[0];
348 uint16_t *src
= (uint16_t*) s
->picture
.data
[0];
350 for(i
= 0; i
< s
->height
; i
++){
351 for(x
= 0; x
< w
; x
++){
354 src
+= s
->picture
.linesize
[0]/2;
365 AVCodec jpegls_decoder
= {
369 sizeof(MJpegDecodeContext
),
370 ff_mjpeg_decode_init
,
373 ff_mjpeg_decode_frame
,
375 .long_name
= NULL_IF_CONFIG_SMALL("JPEG-LS"),