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
35 #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
48 * Decode LSE block with initialization parameters
50 int ff_jpegls_decode_lse(MJpegDecodeContext
*s
)
53 int tid
, wt
, maxtab
, i
, j
;
55 int len
= get_bits(&s
->gb
, 16);
56 id
= get_bits(&s
->gb
, 8);
61 return AVERROR_INVALIDDATA
;
63 s
->maxval
= get_bits(&s
->gb
, 16);
64 s
->t1
= get_bits(&s
->gb
, 16);
65 s
->t2
= get_bits(&s
->gb
, 16);
66 s
->t3
= get_bits(&s
->gb
, 16);
67 s
->reset
= get_bits(&s
->gb
, 16);
69 if(s
->avctx
->debug
& FF_DEBUG_PICT_INFO
) {
70 av_log(s
->avctx
, AV_LOG_DEBUG
, "Coding parameters maxval:%d T1:%d T2:%d T3:%d reset:%d\n",
71 s
->maxval
, s
->t1
, s
->t2
, s
->t3
, s
->reset
);
74 // ff_jpegls_reset_coding_parameters(s, 0);
80 tid
= get_bits(&s
->gb
, 8);
81 wt
= get_bits(&s
->gb
, 8);
84 return AVERROR_INVALIDDATA
;
86 if (wt
< 1 || wt
> MAX_COMPONENTS
) {
87 avpriv_request_sample(s
->avctx
, "wt %d", wt
);
88 return AVERROR_PATCHWELCOME
;
93 else if ((5 + wt
*(s
->maxval
+1)) < 65535)
96 maxtab
= 65530/wt
- 1;
98 if(s
->avctx
->debug
& FF_DEBUG_PICT_INFO
) {
99 av_log(s
->avctx
, AV_LOG_DEBUG
, "LSE palette %d tid:%d wt:%d maxtab:%d\n", id
, tid
, wt
, maxtab
);
102 avpriv_request_sample(s
->avctx
, ">8bit palette");
103 return AVERROR_PATCHWELCOME
;
105 maxtab
= FFMIN(maxtab
, (len
- 5) / wt
+ s
->palette_index
);
107 if (s
->palette_index
> maxtab
)
108 return AVERROR_INVALIDDATA
;
110 if ((s
->avctx
->pix_fmt
== AV_PIX_FMT_GRAY8
|| s
->avctx
->pix_fmt
== AV_PIX_FMT_PAL8
) &&
111 (s
->picture_ptr
->format
== AV_PIX_FMT_GRAY8
|| s
->picture_ptr
->format
== AV_PIX_FMT_PAL8
)) {
112 uint32_t *pal
= (uint32_t *)s
->picture_ptr
->data
[1];
113 s
->picture_ptr
->format
=
114 s
->avctx
->pix_fmt
= AV_PIX_FMT_PAL8
;
115 for (i
=s
->palette_index
; i
<=maxtab
; i
++) {
117 for (j
=0; j
<wt
; j
++) {
118 pal
[i
] |= get_bits(&s
->gb
, 8) << (8*(wt
-j
-1));
121 s
->palette_index
= i
;
125 avpriv_request_sample(s
->avctx
, "oversize image");
126 return AVERROR(ENOSYS
);
128 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid id %d\n", id
);
129 return AVERROR_INVALIDDATA
;
131 av_dlog(s
->avctx
, "ID=%i, T=%i,%i,%i\n", id
, s
->t1
, s
->t2
, s
->t3
);
137 * Get context-dependent Golomb code, decode it and update context
139 static inline int ls_get_code_regular(GetBitContext
*gb
, JLSState
*state
, int Q
)
143 for (k
= 0; (state
->N
[Q
] << k
) < state
->A
[Q
]; k
++)
147 if (!show_bits_long(gb
, 32))
150 ret
= get_ur_golomb_jpegls(gb
, k
, state
->limit
, state
->qbpp
);
152 /* decode mapped error */
154 ret
= -(ret
+ 1 >> 1);
158 /* for NEAR=0, k=0 and 2*B[Q] <= - N[Q] mapping is reversed */
159 if (!state
->near
&& !k
&& (2 * state
->B
[Q
] <= -state
->N
[Q
]))
162 ret
= ff_jpegls_update_state_regular(state
, Q
, ret
);
168 * Get Golomb code, decode it and update state for run termination
170 static inline int ls_get_code_runterm(GetBitContext
*gb
, JLSState
*state
,
171 int RItype
, int limit_add
)
173 int k
, ret
, temp
, map
;
174 int Q
= 365 + RItype
;
178 temp
+= state
->N
[Q
] >> 1;
180 for (k
= 0; (state
->N
[Q
] << k
) < temp
; k
++)
184 if (!show_bits_long(gb
, 32))
187 ret
= get_ur_golomb_jpegls(gb
, k
, state
->limit
- limit_add
- 1,
190 /* decode mapped error */
192 if (!k
&& (RItype
|| ret
) && (2 * state
->B
[Q
] < state
->N
[Q
]))
197 ret
= map
- (ret
+ 1 >> 1);
203 if(FFABS(ret
) > 0xFFFF)
206 state
->A
[Q
] += FFABS(ret
) - RItype
;
207 ret
*= state
->twonear
;
208 ff_jpegls_downscale_state(state
, Q
);
214 * Decode one line of image
216 static inline void ls_decode_line(JLSState
*state
, MJpegDecodeContext
*s
,
217 void *last
, void *dst
, int last2
, int w
,
218 int stride
, int comp
, int bits
)
227 /* compute gradients */
228 Ra
= x
? R(dst
, x
- stride
) : R(last
, x
);
230 Rc
= x
? R(last
, x
- stride
) : last2
;
231 Rd
= (x
>= w
- stride
) ? R(last
, x
) : R(last
, x
+ stride
);
236 if ((FFABS(D0
) <= state
->near
) &&
237 (FFABS(D1
) <= state
->near
) &&
238 (FFABS(D2
) <= state
->near
)) {
242 /* decode full runs while available */
243 while (get_bits1(&s
->gb
)) {
245 r
= 1 << ff_log2_run
[state
->run_index
[comp
]];
246 if (x
+ r
* stride
> w
)
247 r
= (w
- x
) / stride
;
248 for (i
= 0; i
< r
; i
++) {
252 /* if EOL reached, we stop decoding */
253 if (r
!= 1 << ff_log2_run
[state
->run_index
[comp
]])
255 if (state
->run_index
[comp
] < 31)
256 state
->run_index
[comp
]++;
260 /* decode aborted run */
261 r
= ff_log2_run
[state
->run_index
[comp
]];
263 r
= get_bits_long(&s
->gb
, r
);
264 if (x
+ r
* stride
> w
) {
265 r
= (w
- x
) / stride
;
267 for (i
= 0; i
< r
; i
++) {
273 av_log(NULL
, AV_LOG_ERROR
, "run overflow\n");
277 /* decode run termination value */
279 RItype
= (FFABS(Ra
- Rb
) <= state
->near
) ? 1 : 0;
280 err
= ls_get_code_runterm(&s
->gb
, state
, RItype
,
281 ff_log2_run
[state
->run_index
[comp
]]);
282 if (state
->run_index
[comp
])
283 state
->run_index
[comp
]--;
285 if (state
->near
&& RItype
) {
293 } else { /* regular mode */
296 context
= ff_jpegls_quantize(state
, D0
) * 81 +
297 ff_jpegls_quantize(state
, D1
) * 9 +
298 ff_jpegls_quantize(state
, D2
);
299 pred
= mid_pred(Ra
, Ra
+ Rb
- Rc
, Rb
);
309 pred
= av_clip(pred
- state
->C
[context
], 0, state
->maxval
);
310 err
= -ls_get_code_regular(&s
->gb
, state
, context
);
312 pred
= av_clip(pred
+ state
->C
[context
], 0, state
->maxval
);
313 err
= ls_get_code_regular(&s
->gb
, state
, context
);
316 /* we have to do something more for near-lossless coding */
320 if (pred
< -state
->near
)
321 pred
+= state
->range
* state
->twonear
;
322 else if (pred
> state
->maxval
+ state
->near
)
323 pred
-= state
->range
* state
->twonear
;
324 pred
= av_clip(pred
, 0, state
->maxval
);
327 pred
&= state
->maxval
;
333 int ff_jpegls_decode_picture(MJpegDecodeContext
*s
, int near
,
334 int point_transform
, int ilv
)
337 uint8_t *zero
, *last
, *cur
;
339 int off
= 0, stride
= 1, width
, shift
, ret
= 0;
341 zero
= av_mallocz(s
->picture_ptr
->linesize
[0]);
343 cur
= s
->picture_ptr
->data
[0];
345 state
= av_mallocz(sizeof(JLSState
));
346 /* initialize JPEG-LS state from JPEG parameters */
348 state
->bpp
= (s
->bits
< 2) ? 2 : s
->bits
;
349 state
->maxval
= s
->maxval
;
353 state
->reset
= s
->reset
;
354 ff_jpegls_reset_coding_parameters(state
, 0);
355 ff_jpegls_init_state(state
);
358 shift
= point_transform
+ (8 - s
->bits
);
360 shift
= point_transform
+ (16 - s
->bits
);
362 if (s
->avctx
->debug
& FF_DEBUG_PICT_INFO
) {
363 av_log(s
->avctx
, AV_LOG_DEBUG
,
364 "JPEG-LS params: %ix%i NEAR=%i MV=%i T(%i,%i,%i) "
365 "RESET=%i, LIMIT=%i, qbpp=%i, RANGE=%i\n",
366 s
->width
, s
->height
, state
->near
, state
->maxval
,
367 state
->T1
, state
->T2
, state
->T3
,
368 state
->reset
, state
->limit
, state
->qbpp
, state
->range
);
369 av_log(s
->avctx
, AV_LOG_DEBUG
, "JPEG params: ILV=%i Pt=%i BPP=%i, scan = %i\n",
370 ilv
, point_transform
, s
->bits
, s
->cur_scan
);
372 if (ilv
== 0) { /* separate planes */
373 if (s
->cur_scan
> s
->nb_components
) {
374 ret
= AVERROR_INVALIDDATA
;
377 stride
= (s
->nb_components
> 1) ? 3 : 1;
378 off
= av_clip(s
->cur_scan
- 1, 0, stride
- 1);
379 width
= s
->width
* stride
;
381 for (i
= 0; i
< s
->height
; i
++) {
383 ls_decode_line(state
, s
, last
, cur
, t
, width
, stride
, off
, 8);
386 ls_decode_line(state
, s
, last
, cur
, t
, width
, stride
, off
, 16);
387 t
= *((uint16_t *)last
);
390 cur
+= s
->picture_ptr
->linesize
[0];
392 if (s
->restart_interval
&& !--s
->restart_count
) {
393 align_get_bits(&s
->gb
);
394 skip_bits(&s
->gb
, 16); /* skip RSTn */
397 } else if (ilv
== 1) { /* line interleaving */
399 int Rc
[3] = { 0, 0, 0 };
400 stride
= (s
->nb_components
> 1) ? 3 : 1;
401 memset(cur
, 0, s
->picture_ptr
->linesize
[0]);
402 width
= s
->width
* stride
;
403 for (i
= 0; i
< s
->height
; i
++) {
404 for (j
= 0; j
< stride
; j
++) {
405 ls_decode_line(state
, s
, last
+ j
, cur
+ j
,
406 Rc
[j
], width
, stride
, j
, 8);
409 if (s
->restart_interval
&& !--s
->restart_count
) {
410 align_get_bits(&s
->gb
);
411 skip_bits(&s
->gb
, 16); /* skip RSTn */
415 cur
+= s
->picture_ptr
->linesize
[0];
417 } else if (ilv
== 2) { /* sample interleaving */
418 avpriv_report_missing_feature(s
->avctx
, "Sample interleaved images");
419 ret
= AVERROR_PATCHWELCOME
;
423 if (s
->xfrm
&& s
->nb_components
== 3) {
426 w
= s
->width
* s
->nb_components
;
429 uint8_t *src
= s
->picture_ptr
->data
[0];
431 for (i
= 0; i
< s
->height
; i
++) {
434 for (x
= off
; x
< w
; x
+= 3) {
435 src
[x
] += src
[x
+1] + 128;
436 src
[x
+2] += src
[x
+1] + 128;
440 for (x
= off
; x
< w
; x
+= 3) {
441 src
[x
] += src
[x
+1] + 128;
442 src
[x
+2] += ((src
[x
] + src
[x
+1])>>1) + 128;
446 for (x
= off
; x
< w
; x
+= 3) {
447 int g
= src
[x
+0] - ((src
[x
+2]+src
[x
+1])>>2) + 64;
448 src
[x
+0] = src
[x
+2] + g
+ 128;
449 src
[x
+2] = src
[x
+1] + g
+ 128;
454 for (x
= off
; x
< w
; x
+= 3) {
455 int r
= src
[x
+0] - (( 359 * (src
[x
+2]-128) + 490) >> 8);
456 int g
= src
[x
+0] - (( 88 * (src
[x
+1]-128) - 183 * (src
[x
+2]-128) + 30) >> 8);
457 int b
= src
[x
+0] + ((454 * (src
[x
+1]-128) + 574) >> 8);
458 src
[x
+0] = av_clip_uint8(r
);
459 src
[x
+1] = av_clip_uint8(g
);
460 src
[x
+2] = av_clip_uint8(b
);
464 src
+= s
->picture_ptr
->linesize
[0];
467 avpriv_report_missing_feature(s
->avctx
, "16bit xfrm");
470 if (shift
) { /* we need to do point transform or normalize samples */
473 w
= s
->width
* s
->nb_components
;
476 uint8_t *src
= s
->picture_ptr
->data
[0];
478 for (i
= 0; i
< s
->height
; i
++) {
479 for (x
= off
; x
< w
; x
+= stride
)
481 src
+= s
->picture_ptr
->linesize
[0];
484 uint16_t *src
= (uint16_t *)s
->picture_ptr
->data
[0];
486 for (i
= 0; i
< s
->height
; i
++) {
487 for (x
= 0; x
< w
; x
++)
489 src
+= s
->picture_ptr
->linesize
[0] / 2;
501 AVCodec ff_jpegls_decoder
= {
503 .long_name
= NULL_IF_CONFIG_SMALL("JPEG-LS"),
504 .type
= AVMEDIA_TYPE_VIDEO
,
505 .id
= AV_CODEC_ID_JPEGLS
,
506 .priv_data_size
= sizeof(MJpegDecodeContext
),
507 .init
= ff_mjpeg_decode_init
,
508 .close
= ff_mjpeg_decode_end
,
509 .decode
= ff_mjpeg_decode_frame
,
510 .capabilities
= CODEC_CAP_DR1
,