3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2003 Alex Beregszaszi
5 * Copyright (c) 2003-2004 Michael Niedermayer
7 * Support for external huffman table, various fixes (AVID workaround),
8 * aspecting, new decode_frame mechanism and apple mjpeg-b support
11 * This file is part of FFmpeg.
13 * FFmpeg is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
18 * FFmpeg is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with FFmpeg; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 #include "libavutil/imgutils.h"
34 #include "libavutil/avassert.h"
35 #include "libavutil/opt.h"
38 #include "copy_block.h"
42 #include "jpegtables.h"
45 #include "jpeglsdec.h"
50 #include "bytestream.h"
53 static void build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
54 const uint8_t *bits_table)
56 for (int i = 1, code = 0, k = 0; i <= 16; i++) {
57 int nb = bits_table[i];
58 for (int j = 0; j < nb;j++) {
68 static int build_vlc(VLC *vlc, const uint8_t *bits_table,
69 const uint8_t *val_table, int nb_codes,
70 int use_static, int is_ac)
72 uint8_t huff_size[256] = { 0 };
73 uint16_t huff_code[256];
74 uint16_t huff_sym[256];
77 av_assert0(nb_codes <= 256);
79 build_huffman_codes(huff_size, huff_code, bits_table);
81 for (i = 0; i < nb_codes; i++) {
82 huff_sym[i] = val_table[i] + 16 * is_ac;
84 if (is_ac && !val_table[i])
85 huff_sym[i] = 16 * 256;
88 return ff_init_vlc_sparse(vlc, 9, nb_codes, huff_size, 1, 1,
89 huff_code, 2, 2, huff_sym, 2, 2, use_static);
92 static int init_default_huffman_tables(MJpegDecodeContext *s)
98 const uint8_t *values;
102 { 0, 0, avpriv_mjpeg_bits_dc_luminance,
103 avpriv_mjpeg_val_dc, 12, 12 },
104 { 0, 1, avpriv_mjpeg_bits_dc_chrominance,
105 avpriv_mjpeg_val_dc, 12, 12 },
106 { 1, 0, avpriv_mjpeg_bits_ac_luminance,
107 avpriv_mjpeg_val_ac_luminance, 251, 162 },
108 { 1, 1, avpriv_mjpeg_bits_ac_chrominance,
109 avpriv_mjpeg_val_ac_chrominance, 251, 162 },
110 { 2, 0, avpriv_mjpeg_bits_ac_luminance,
111 avpriv_mjpeg_val_ac_luminance, 251, 162 },
112 { 2, 1, avpriv_mjpeg_bits_ac_chrominance,
113 avpriv_mjpeg_val_ac_chrominance, 251, 162 },
117 for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
118 ret = build_vlc(&s->vlcs[ht[i].class][ht[i].index],
119 ht[i].bits, ht[i].values, ht[i].codes,
120 0, ht[i].class == 1);
124 if (ht[i].class < 2) {
125 memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
127 memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
128 ht[i].values, ht[i].length);
135 static void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
138 if (len > 14 && buf[12] == 1) /* 1 - NTSC */
139 s->interlace_polarity = 1;
140 if (len > 14 && buf[12] == 2) /* 2 - PAL */
141 s->interlace_polarity = 0;
142 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
143 av_log(s->avctx, AV_LOG_INFO, "AVID: len:%d %d\n", len, len > 14 ? buf[12] : -1);
146 static void init_idct(AVCodecContext *avctx)
148 MJpegDecodeContext *s = avctx->priv_data;
150 ff_idctdsp_init(&s->idsp, avctx);
151 ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
155 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
157 MJpegDecodeContext *s = avctx->priv_data;
160 if (!s->picture_ptr) {
161 s->picture = av_frame_alloc();
163 return AVERROR(ENOMEM);
164 s->picture_ptr = s->picture;
168 ff_blockdsp_init(&s->bdsp, avctx);
169 ff_hpeldsp_init(&s->hdsp, avctx->flags);
174 s->first_picture = 1;
176 s->org_height = avctx->coded_height;
177 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
178 avctx->colorspace = AVCOL_SPC_BT470BG;
179 s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
181 if ((ret = init_default_huffman_tables(s)) < 0)
184 if (s->extern_huff) {
185 av_log(avctx, AV_LOG_INFO, "using external huffman table\n");
186 if ((ret = init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8)) < 0)
188 if (ff_mjpeg_decode_dht(s)) {
189 av_log(avctx, AV_LOG_ERROR,
190 "error using external huffman table, switching back to internal\n");
191 init_default_huffman_tables(s);
194 if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
195 s->interlace_polarity = 1; /* bottom field first */
196 av_log(avctx, AV_LOG_DEBUG, "bottom field first\n");
197 } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
198 if (avctx->codec_tag == AV_RL32("MJPG"))
199 s->interlace_polarity = 1;
202 if ( avctx->extradata_size > 8
203 && AV_RL32(avctx->extradata) == 0x2C
204 && AV_RL32(avctx->extradata+4) == 0x18) {
205 parse_avid(s, avctx->extradata, avctx->extradata_size);
208 if (avctx->codec->id == AV_CODEC_ID_AMV)
215 /* quantize tables */
216 int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
220 len = get_bits(&s->gb, 16) - 2;
222 if (8*len > get_bits_left(&s->gb)) {
223 av_log(s->avctx, AV_LOG_ERROR, "dqt: len %d is too large\n", len);
224 return AVERROR_INVALIDDATA;
228 int pr = get_bits(&s->gb, 4);
230 av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n");
231 return AVERROR_INVALIDDATA;
233 index = get_bits(&s->gb, 4);
236 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
237 /* read quant table */
238 for (i = 0; i < 64; i++) {
239 s->quant_matrixes[index][i] = get_bits(&s->gb, pr ? 16 : 8);
240 if (s->quant_matrixes[index][i] == 0) {
241 av_log(s->avctx, AV_LOG_ERROR, "dqt: 0 quant value\n");
242 return AVERROR_INVALIDDATA;
246 // XXX FIXME fine-tune, and perhaps add dc too
247 s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
248 s->quant_matrixes[index][8]) >> 1;
249 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
250 index, s->qscale[index]);
251 len -= 1 + 64 * (1+pr);
256 /* decode huffman tables and build VLC decoders */
257 int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
259 int len, index, i, class, n, v;
260 uint8_t bits_table[17];
261 uint8_t val_table[256];
264 len = get_bits(&s->gb, 16) - 2;
266 if (8*len > get_bits_left(&s->gb)) {
267 av_log(s->avctx, AV_LOG_ERROR, "dht: len %d is too large\n", len);
268 return AVERROR_INVALIDDATA;
273 return AVERROR_INVALIDDATA;
274 class = get_bits(&s->gb, 4);
276 return AVERROR_INVALIDDATA;
277 index = get_bits(&s->gb, 4);
279 return AVERROR_INVALIDDATA;
281 for (i = 1; i <= 16; i++) {
282 bits_table[i] = get_bits(&s->gb, 8);
286 if (len < n || n > 256)
287 return AVERROR_INVALIDDATA;
289 for (i = 0; i < n; i++) {
290 v = get_bits(&s->gb, 8);
295 /* build VLC and flush previous vlc if present */
296 ff_free_vlc(&s->vlcs[class][index]);
297 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
299 if ((ret = build_vlc(&s->vlcs[class][index], bits_table, val_table,
300 n, 0, class > 0)) < 0)
304 ff_free_vlc(&s->vlcs[2][index]);
305 if ((ret = build_vlc(&s->vlcs[2][index], bits_table, val_table,
310 for (i = 0; i < 16; i++)
311 s->raw_huffman_lengths[class][index][i] = bits_table[i + 1];
312 for (i = 0; i < 256; i++)
313 s->raw_huffman_values[class][index][i] = val_table[i];
318 int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
320 int len, nb_components, i, width, height, bits, ret, size_change;
322 int h_count[MAX_COMPONENTS] = { 0 };
323 int v_count[MAX_COMPONENTS] = { 0 };
326 memset(s->upscale_h, 0, sizeof(s->upscale_h));
327 memset(s->upscale_v, 0, sizeof(s->upscale_v));
329 len = get_bits(&s->gb, 16);
330 bits = get_bits(&s->gb, 8);
332 if (bits > 16 || bits < 1) {
333 av_log(s->avctx, AV_LOG_ERROR, "bits %d is invalid\n", bits);
334 return AVERROR_INVALIDDATA;
337 if (s->avctx->bits_per_raw_sample != bits) {
338 av_log(s->avctx, s->avctx->bits_per_raw_sample > 0 ? AV_LOG_INFO : AV_LOG_DEBUG, "Changing bps from %d to %d\n", s->avctx->bits_per_raw_sample, bits);
339 s->avctx->bits_per_raw_sample = bits;
344 if (bits == 9 && !s->pegasus_rct)
345 s->rct = 1; // FIXME ugly
347 if(s->lossless && s->avctx->lowres){
348 av_log(s->avctx, AV_LOG_ERROR, "lowres is not possible with lossless jpeg\n");
352 height = get_bits(&s->gb, 16);
353 width = get_bits(&s->gb, 16);
355 // HACK for odd_height.mov
356 if (s->interlaced && s->width == width && s->height == height + 1)
359 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
360 if (av_image_check_size(width, height, 0, s->avctx) < 0)
361 return AVERROR_INVALIDDATA;
362 if (s->buf_size && (width + 7) / 8 * ((height + 7) / 8) > s->buf_size * 4LL)
363 return AVERROR_INVALIDDATA;
365 nb_components = get_bits(&s->gb, 8);
366 if (nb_components <= 0 ||
367 nb_components > MAX_COMPONENTS)
369 if (s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
370 if (nb_components != s->nb_components) {
371 av_log(s->avctx, AV_LOG_ERROR,
372 "nb_components changing in interlaced picture\n");
373 return AVERROR_INVALIDDATA;
376 if (s->ls && !(bits <= 8 || nb_components == 1)) {
377 avpriv_report_missing_feature(s->avctx,
378 "JPEG-LS that is not <= 8 "
379 "bits/component or 16-bit gray");
380 return AVERROR_PATCHWELCOME;
382 if (len != 8 + 3 * nb_components) {
383 av_log(s->avctx, AV_LOG_ERROR, "decode_sof0: error, len(%d) mismatch %d components\n", len, nb_components);
384 return AVERROR_INVALIDDATA;
387 s->nb_components = nb_components;
390 for (i = 0; i < nb_components; i++) {
392 s->component_id[i] = get_bits(&s->gb, 8) - 1;
393 h_count[i] = get_bits(&s->gb, 4);
394 v_count[i] = get_bits(&s->gb, 4);
395 /* compute hmax and vmax (only used in interleaved case) */
396 if (h_count[i] > s->h_max)
397 s->h_max = h_count[i];
398 if (v_count[i] > s->v_max)
399 s->v_max = v_count[i];
400 s->quant_index[i] = get_bits(&s->gb, 8);
401 if (s->quant_index[i] >= 4) {
402 av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n");
403 return AVERROR_INVALIDDATA;
405 if (!h_count[i] || !v_count[i]) {
406 av_log(s->avctx, AV_LOG_ERROR,
407 "Invalid sampling factor in component %d %d:%d\n",
408 i, h_count[i], v_count[i]);
409 return AVERROR_INVALIDDATA;
412 av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
413 i, h_count[i], v_count[i],
414 s->component_id[i], s->quant_index[i]);
416 if ( nb_components == 4
417 && s->component_id[0] == 'C' - 1
418 && s->component_id[1] == 'M' - 1
419 && s->component_id[2] == 'Y' - 1
420 && s->component_id[3] == 'K' - 1)
421 s->adobe_transform = 0;
423 if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
424 avpriv_report_missing_feature(s->avctx, "Subsampling in JPEG-LS");
425 return AVERROR_PATCHWELCOME;
429 if (nb_components == 2) {
430 /* Bayer images embedded in DNGs can contain 2 interleaved components and the
431 width stored in their SOF3 markers is the width of each one. We only output
432 a single component, therefore we need to adjust the output image width. We
433 handle the deinterleaving (but not the debayering) in this file. */
436 /* They can also contain 1 component, which is double the width and half the height
437 of the final image (rows are interleaved). We don't handle the decoding in this
438 file, but leave that to the TIFF/DNG decoder. */
441 /* if different size, realloc/alloc picture */
442 if (width != s->width || height != s->height || bits != s->bits ||
443 memcmp(s->h_count, h_count, sizeof(h_count)) ||
444 memcmp(s->v_count, v_count, sizeof(v_count))) {
450 memcpy(s->h_count, h_count, sizeof(h_count));
451 memcpy(s->v_count, v_count, sizeof(v_count));
455 /* test interlaced mode */
456 if (s->first_picture &&
457 (s->multiscope != 2 || s->avctx->time_base.den >= 25 * s->avctx->time_base.num) &&
458 s->org_height != 0 &&
459 s->height < ((s->org_height * 3) / 4)) {
461 s->bottom_field = s->interlace_polarity;
462 s->picture_ptr->interlaced_frame = 1;
463 s->picture_ptr->top_field_first = !s->interlace_polarity;
467 ret = ff_set_dimensions(s->avctx, width, height);
471 s->first_picture = 0;
476 if (s->got_picture && s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
477 if (s->progressive) {
478 avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
479 return AVERROR_INVALIDDATA;
482 if (s->v_max == 1 && s->h_max == 1 && s->lossless==1 && (nb_components==3 || nb_components==4))
484 else if (!s->lossless)
486 /* XXX: not complete test ! */
487 pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
488 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
489 (s->h_count[2] << 12) | (s->v_count[2] << 8) |
490 (s->h_count[3] << 4) | s->v_count[3];
491 av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
492 /* NOTE we do not allocate pictures large enough for the possible
493 * padding of h/v_count being 4 */
494 if (!(pix_fmt_id & 0xD0D0D0D0))
495 pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
496 if (!(pix_fmt_id & 0x0D0D0D0D))
497 pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
499 for (i = 0; i < 8; i++) {
500 int j = 6 + (i&1) - (i&6);
501 int is = (pix_fmt_id >> (4*i)) & 0xF;
502 int js = (pix_fmt_id >> (4*j)) & 0xF;
504 if (is == 1 && js != 2 && (i < 2 || i > 5))
505 js = (pix_fmt_id >> ( 8 + 4*(i&1))) & 0xF;
506 if (is == 1 && js != 2 && (i < 2 || i > 5))
507 js = (pix_fmt_id >> (16 + 4*(i&1))) & 0xF;
509 if (is == 1 && js == 2) {
510 if (i & 1) s->upscale_h[j/2] = 1;
511 else s->upscale_v[j/2] = 1;
516 if (pix_fmt_id != 0x11110000 && pix_fmt_id != 0x11000000)
520 switch (pix_fmt_id) {
521 case 0x11110000: /* for bayer-encoded huffman lossless JPEGs embedded in DNGs */
524 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
528 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
530 if ( s->adobe_transform == 0
531 || s->component_id[0] == 'R' - 1 && s->component_id[1] == 'G' - 1 && s->component_id[2] == 'B' - 1) {
532 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
534 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
535 else s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
536 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
539 av_assert0(s->nb_components == 3);
543 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
545 if (s->adobe_transform == 0 && s->bits <= 8) {
546 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
548 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
549 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
552 av_assert0(s->nb_components == 4);
556 if (s->adobe_transform == 0 && s->bits <= 8) {
557 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
558 s->upscale_v[1] = s->upscale_v[2] = 1;
559 s->upscale_h[1] = s->upscale_h[2] = 1;
560 } else if (s->adobe_transform == 2 && s->bits <= 8) {
561 s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
562 s->upscale_v[1] = s->upscale_v[2] = 1;
563 s->upscale_h[1] = s->upscale_h[2] = 1;
564 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
566 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
567 else s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
568 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
570 av_assert0(s->nb_components == 4);
579 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
582 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
594 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
596 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
603 if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
604 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
607 s->upscale_v[0] = s->upscale_v[1] = 1;
609 if (pix_fmt_id == 0x14111100)
610 s->upscale_v[1] = s->upscale_v[2] = 1;
611 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
614 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
618 if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
619 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
622 s->upscale_h[0] = s->upscale_h[1] = 1;
624 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
625 else s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
626 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
632 s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
633 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
634 s->upscale_h[1] = s->upscale_h[2] = 2;
638 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
641 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
647 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
648 else s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
649 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
650 if (pix_fmt_id == 0x42111100) {
653 s->upscale_h[1] = s->upscale_h[2] = 1;
654 } else if (pix_fmt_id == 0x24111100) {
657 s->upscale_v[1] = s->upscale_v[2] = 1;
658 } else if (pix_fmt_id == 0x23111100) {
661 s->upscale_v[1] = s->upscale_v[2] = 2;
665 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
668 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
672 avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
673 memset(s->upscale_h, 0, sizeof(s->upscale_h));
674 memset(s->upscale_v, 0, sizeof(s->upscale_v));
675 return AVERROR_PATCHWELCOME;
677 if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
678 avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
679 return AVERROR_PATCHWELCOME;
681 if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->progressive && s->avctx->pix_fmt == AV_PIX_FMT_GBRP) {
682 avpriv_report_missing_feature(s->avctx, "progressive for weird subsampling");
683 return AVERROR_PATCHWELCOME;
686 memset(s->upscale_h, 0, sizeof(s->upscale_h));
687 memset(s->upscale_v, 0, sizeof(s->upscale_v));
688 if (s->nb_components == 3) {
689 s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
690 } else if (s->nb_components != 1) {
691 av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
692 return AVERROR_PATCHWELCOME;
693 } else if (s->palette_index && s->bits <= 8)
694 s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
695 else if (s->bits <= 8)
696 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
698 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
701 s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
703 av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
707 if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
708 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
710 enum AVPixelFormat pix_fmts[] = {
711 #if CONFIG_MJPEG_NVDEC_HWACCEL
714 #if CONFIG_MJPEG_VAAPI_HWACCEL
720 s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
721 if (s->hwaccel_pix_fmt < 0)
722 return AVERROR(EINVAL);
724 s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
725 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
728 if (s->avctx->skip_frame == AVDISCARD_ALL) {
729 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
730 s->picture_ptr->key_frame = 1;
735 av_frame_unref(s->picture_ptr);
736 if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0)
738 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
739 s->picture_ptr->key_frame = 1;
742 for (i = 0; i < 4; i++)
743 s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
745 ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
746 s->width, s->height, s->linesize[0], s->linesize[1],
747 s->interlaced, s->avctx->height);
751 if ((s->rgb && !s->lossless && !s->ls) ||
752 (!s->rgb && s->ls && s->nb_components > 1) ||
753 (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 && !s->ls)
755 av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
756 return AVERROR_PATCHWELCOME;
759 /* totally blank picture as progressive JPEG will only add details to it */
760 if (s->progressive) {
761 int bw = (width + s->h_max * 8 - 1) / (s->h_max * 8);
762 int bh = (height + s->v_max * 8 - 1) / (s->v_max * 8);
763 for (i = 0; i < s->nb_components; i++) {
764 int size = bw * bh * s->h_count[i] * s->v_count[i];
765 av_freep(&s->blocks[i]);
766 av_freep(&s->last_nnz[i]);
767 s->blocks[i] = av_mallocz_array(size, sizeof(**s->blocks));
768 s->last_nnz[i] = av_mallocz_array(size, sizeof(**s->last_nnz));
769 if (!s->blocks[i] || !s->last_nnz[i])
770 return AVERROR(ENOMEM);
771 s->block_stride[i] = bw * s->h_count[i];
773 memset(s->coefs_finished, 0, sizeof(s->coefs_finished));
776 if (s->avctx->hwaccel) {
777 s->hwaccel_picture_private =
778 av_mallocz(s->avctx->hwaccel->frame_priv_data_size);
779 if (!s->hwaccel_picture_private)
780 return AVERROR(ENOMEM);
782 ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_image_buffer,
783 s->raw_image_buffer_size);
791 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
794 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
795 if (code < 0 || code > 16) {
796 av_log(s->avctx, AV_LOG_WARNING,
797 "mjpeg_decode_dc: bad vlc: %d:%d (%p)\n",
798 0, dc_index, &s->vlcs[0][dc_index]);
803 return get_xbits(&s->gb, code);
808 /* decode block and dequantize */
809 static int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
810 int dc_index, int ac_index, uint16_t *quant_matrix)
812 int code, i, j, level, val;
815 val = mjpeg_decode_dc(s, dc_index);
816 if (val == 0xfffff) {
817 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
818 return AVERROR_INVALIDDATA;
820 val = val * (unsigned)quant_matrix[0] + s->last_dc[component];
821 val = av_clip_int16(val);
822 s->last_dc[component] = val;
826 {OPEN_READER(re, &s->gb);
828 UPDATE_CACHE(re, &s->gb);
829 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
831 i += ((unsigned)code) >> 4;
834 if (code > MIN_CACHE_BITS - 16)
835 UPDATE_CACHE(re, &s->gb);
838 int cache = GET_CACHE(re, &s->gb);
839 int sign = (~cache) >> 31;
840 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
843 LAST_SKIP_BITS(re, &s->gb, code);
846 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
847 return AVERROR_INVALIDDATA;
849 j = s->scantable.permutated[i];
850 block[j] = level * quant_matrix[i];
853 CLOSE_READER(re, &s->gb);}
858 static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block,
859 int component, int dc_index,
860 uint16_t *quant_matrix, int Al)
863 s->bdsp.clear_block(block);
864 val = mjpeg_decode_dc(s, dc_index);
865 if (val == 0xfffff) {
866 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
867 return AVERROR_INVALIDDATA;
869 val = (val * (quant_matrix[0] << Al)) + s->last_dc[component];
870 s->last_dc[component] = val;
875 /* decode block and dequantize - progressive JPEG version */
876 static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
877 uint8_t *last_nnz, int ac_index,
878 uint16_t *quant_matrix,
879 int ss, int se, int Al, int *EOBRUN)
881 int code, i, j, val, run;
890 OPEN_READER(re, &s->gb);
891 for (i = ss; ; i++) {
892 UPDATE_CACHE(re, &s->gb);
893 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
895 run = ((unsigned) code) >> 4;
899 if (code > MIN_CACHE_BITS - 16)
900 UPDATE_CACHE(re, &s->gb);
903 int cache = GET_CACHE(re, &s->gb);
904 int sign = (~cache) >> 31;
905 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
908 LAST_SKIP_BITS(re, &s->gb, code);
912 j = s->scantable.permutated[se];
913 block[j] = level * (quant_matrix[se] << Al);
916 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
917 return AVERROR_INVALIDDATA;
919 j = s->scantable.permutated[i];
920 block[j] = level * (quant_matrix[i] << Al);
922 if (run == 0xF) {// ZRL - skip 15 coefficients
925 av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
926 return AVERROR_INVALIDDATA;
931 UPDATE_CACHE(re, &s->gb);
932 val += NEG_USR32(GET_CACHE(re, &s->gb), run);
933 LAST_SKIP_BITS(re, &s->gb, run);
940 CLOSE_READER(re, &s->gb);
949 #define REFINE_BIT(j) { \
950 UPDATE_CACHE(re, &s->gb); \
951 sign = block[j] >> 15; \
952 block[j] += SHOW_UBITS(re, &s->gb, 1) * \
953 ((quant_matrix[i] ^ sign) - sign) << Al; \
954 LAST_SKIP_BITS(re, &s->gb, 1); \
962 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
967 j = s->scantable.permutated[i]; \
970 else if (run-- == 0) \
974 /* decode block and dequantize - progressive JPEG refinement pass */
975 static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
977 int ac_index, uint16_t *quant_matrix,
978 int ss, int se, int Al, int *EOBRUN)
980 int code, i = ss, j, sign, val, run;
981 int last = FFMIN(se, *last_nnz);
983 OPEN_READER(re, &s->gb);
988 UPDATE_CACHE(re, &s->gb);
989 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
992 run = ((unsigned) code) >> 4;
993 UPDATE_CACHE(re, &s->gb);
994 val = SHOW_UBITS(re, &s->gb, 1);
995 LAST_SKIP_BITS(re, &s->gb, 1);
997 j = s->scantable.permutated[i];
999 block[j] = ((quant_matrix[i] << Al) ^ val) - val;
1003 CLOSE_READER(re, &s->gb);
1007 run = ((unsigned) code) >> 4;
1014 UPDATE_CACHE(re, &s->gb);
1015 run += SHOW_UBITS(re, &s->gb, val);
1016 LAST_SKIP_BITS(re, &s->gb, val);
1028 for (; i <= last; i++) {
1029 j = s->scantable.permutated[i];
1033 CLOSE_READER(re, &s->gb);
1040 static int handle_rstn(MJpegDecodeContext *s, int nb_components)
1045 if (s->restart_interval) {
1047 if(s->restart_count == 0 && s->avctx->codec_id == AV_CODEC_ID_THP){
1048 align_get_bits(&s->gb);
1049 for (i = 0; i < nb_components; i++) /* reset dc */
1050 s->last_dc[i] = (4 << s->bits);
1053 i = 8 + ((-get_bits_count(&s->gb)) & 7);
1055 if (s->restart_count == 0) {
1056 if( show_bits(&s->gb, i) == (1 << i) - 1
1057 || show_bits(&s->gb, i) == 0xFF) {
1058 int pos = get_bits_count(&s->gb);
1059 align_get_bits(&s->gb);
1060 while (get_bits_left(&s->gb) >= 8 && show_bits(&s->gb, 8) == 0xFF)
1061 skip_bits(&s->gb, 8);
1062 if (get_bits_left(&s->gb) >= 8 && (get_bits(&s->gb, 8) & 0xF8) == 0xD0) {
1063 for (i = 0; i < nb_components; i++) /* reset dc */
1064 s->last_dc[i] = (4 << s->bits);
1067 skip_bits_long(&s->gb, pos - get_bits_count(&s->gb));
1074 /* Handles 1 to 4 components */
1075 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform)
1079 uint16_t (*buffer)[4];
1080 int left[4], top[4], topleft[4];
1081 const int linesize = s->linesize[0];
1082 const int mask = ((1 << s->bits) - 1) << point_transform;
1083 int resync_mb_y = 0;
1084 int resync_mb_x = 0;
1087 if (!s->bayer && s->nb_components < 3)
1088 return AVERROR_INVALIDDATA;
1089 if (s->bayer && s->nb_components > 2)
1090 return AVERROR_INVALIDDATA;
1091 if (s->nb_components <= 0 || s->nb_components > 4)
1092 return AVERROR_INVALIDDATA;
1093 if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
1094 return AVERROR_INVALIDDATA;
1097 s->restart_count = s->restart_interval;
1099 if (s->restart_interval == 0)
1100 s->restart_interval = INT_MAX;
1103 width = s->mb_width / nb_components; /* Interleaved, width stored is the total so need to divide */
1105 width = s->mb_width;
1107 av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, width * 4 * sizeof(s->ljpeg_buffer[0][0]));
1108 if (!s->ljpeg_buffer)
1109 return AVERROR(ENOMEM);
1111 buffer = s->ljpeg_buffer;
1113 for (i = 0; i < 4; i++)
1114 buffer[0][i] = 1 << (s->bits - 1);
1116 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1117 uint8_t *ptr = s->picture_ptr->data[0] + (linesize * mb_y);
1119 if (s->interlaced && s->bottom_field)
1120 ptr += linesize >> 1;
1122 for (i = 0; i < 4; i++)
1123 top[i] = left[i] = topleft[i] = buffer[0][i];
1125 if ((mb_y * s->width) % s->restart_interval == 0) {
1126 for (i = 0; i < 6; i++)
1127 vpred[i] = 1 << (s->bits-1);
1130 for (mb_x = 0; mb_x < width; mb_x++) {
1131 int modified_predictor = predictor;
1133 if (get_bits_left(&s->gb) < 1) {
1134 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in rgb_scan\n");
1135 return AVERROR_INVALIDDATA;
1138 if (s->restart_interval && !s->restart_count){
1139 s->restart_count = s->restart_interval;
1143 top[i] = left[i]= topleft[i]= 1 << (s->bits - 1);
1145 if (mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || !mb_x)
1146 modified_predictor = 1;
1148 for (i=0;i<nb_components;i++) {
1151 topleft[i] = top[i];
1152 top[i] = buffer[mb_x][i];
1154 dc = mjpeg_decode_dc(s, s->dc_index[i]);
1158 if (!s->bayer || mb_x) {
1160 } else { /* This path runs only for the first line in bayer images */
1162 pred = vpred[i] - dc;
1165 PREDICT(pred, topleft[i], top[i], pred, modified_predictor);
1167 left[i] = buffer[mb_x][i] =
1168 mask & (pred + (unsigned)(dc * (1 << point_transform)));
1171 if (s->restart_interval && !--s->restart_count) {
1172 align_get_bits(&s->gb);
1173 skip_bits(&s->gb, 16); /* skip RSTn */
1176 if (s->rct && s->nb_components == 4) {
1177 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1178 ptr[4*mb_x + 2] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1179 ptr[4*mb_x + 1] = buffer[mb_x][1] + ptr[4*mb_x + 2];
1180 ptr[4*mb_x + 3] = buffer[mb_x][2] + ptr[4*mb_x + 2];
1181 ptr[4*mb_x + 0] = buffer[mb_x][3];
1183 } else if (s->nb_components == 4) {
1184 for(i=0; i<nb_components; i++) {
1185 int c= s->comp_index[i];
1187 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1188 ptr[4*mb_x+3-c] = buffer[mb_x][i];
1190 } else if(s->bits == 9) {
1191 return AVERROR_PATCHWELCOME;
1193 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1194 ((uint16_t*)ptr)[4*mb_x+c] = buffer[mb_x][i];
1198 } else if (s->rct) {
1199 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1200 ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1201 ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
1202 ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
1204 } else if (s->pegasus_rct) {
1205 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1206 ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2]) >> 2);
1207 ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
1208 ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
1210 } else if (s->bayer) {
1211 if (nb_components == 1) {
1212 /* Leave decoding to the TIFF/DNG decoder (see comment in ff_mjpeg_decode_sof) */
1213 for (mb_x = 0; mb_x < width; mb_x++)
1214 ((uint16_t*)ptr)[mb_x] = buffer[mb_x][0];
1215 } else if (nb_components == 2) {
1216 for (mb_x = 0; mb_x < width; mb_x++) {
1217 ((uint16_t*)ptr)[2*mb_x + 0] = buffer[mb_x][0];
1218 ((uint16_t*)ptr)[2*mb_x + 1] = buffer[mb_x][1];
1222 for(i=0; i<nb_components; i++) {
1223 int c= s->comp_index[i];
1225 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1226 ptr[3*mb_x+2-c] = buffer[mb_x][i];
1228 } else if(s->bits == 9) {
1229 return AVERROR_PATCHWELCOME;
1231 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1232 ((uint16_t*)ptr)[3*mb_x+2-c] = buffer[mb_x][i];
1241 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor,
1242 int point_transform, int nb_components)
1244 int i, mb_x, mb_y, mask;
1245 int bits= (s->bits+7)&~7;
1246 int resync_mb_y = 0;
1247 int resync_mb_x = 0;
1249 point_transform += bits - s->bits;
1250 mask = ((1 << s->bits) - 1) << point_transform;
1252 av_assert0(nb_components>=1 && nb_components<=4);
1254 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1255 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1256 if (get_bits_left(&s->gb) < 1) {
1257 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in yuv_scan\n");
1258 return AVERROR_INVALIDDATA;
1260 if (s->restart_interval && !s->restart_count){
1261 s->restart_count = s->restart_interval;
1266 if(!mb_x || mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || s->interlaced){
1267 int toprow = mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x;
1268 int leftcol = !mb_x || mb_y == resync_mb_y && mb_x == resync_mb_x;
1269 for (i = 0; i < nb_components; i++) {
1272 int n, h, v, x, y, c, j, linesize;
1273 n = s->nb_blocks[i];
1274 c = s->comp_index[i];
1279 linesize= s->linesize[c];
1281 if(bits>8) linesize /= 2;
1283 for(j=0; j<n; j++) {
1286 dc = mjpeg_decode_dc(s, s->dc_index[i]);
1289 if ( h * mb_x + x >= s->width
1290 || v * mb_y + y >= s->height) {
1292 } else if (bits<=8) {
1293 ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1295 if(x==0 && leftcol){
1296 pred= 1 << (bits - 1);
1301 if(x==0 && leftcol){
1302 pred= ptr[-linesize];
1304 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1308 if (s->interlaced && s->bottom_field)
1309 ptr += linesize >> 1;
1311 *ptr= pred + ((unsigned)dc << point_transform);
1313 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1315 if(x==0 && leftcol){
1316 pred= 1 << (bits - 1);
1321 if(x==0 && leftcol){
1322 pred= ptr16[-linesize];
1324 PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
1328 if (s->interlaced && s->bottom_field)
1329 ptr16 += linesize >> 1;
1331 *ptr16= pred + ((unsigned)dc << point_transform);
1340 for (i = 0; i < nb_components; i++) {
1343 int n, h, v, x, y, c, j, linesize, dc;
1344 n = s->nb_blocks[i];
1345 c = s->comp_index[i];
1350 linesize = s->linesize[c];
1352 if(bits>8) linesize /= 2;
1354 for (j = 0; j < n; j++) {
1357 dc = mjpeg_decode_dc(s, s->dc_index[i]);
1360 if ( h * mb_x + x >= s->width
1361 || v * mb_y + y >= s->height) {
1363 } else if (bits<=8) {
1364 ptr = s->picture_ptr->data[c] +
1365 (linesize * (v * mb_y + y)) +
1366 (h * mb_x + x); //FIXME optimize this crap
1367 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1370 *ptr = pred + ((unsigned)dc << point_transform);
1372 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1373 PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
1376 *ptr16= pred + ((unsigned)dc << point_transform);
1386 if (s->restart_interval && !--s->restart_count) {
1387 align_get_bits(&s->gb);
1388 skip_bits(&s->gb, 16); /* skip RSTn */
1395 static av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s,
1396 uint8_t *dst, const uint8_t *src,
1397 int linesize, int lowres)
1400 case 0: s->hdsp.put_pixels_tab[1][0](dst, src, linesize, 8);
1402 case 1: copy_block4(dst, src, linesize, linesize, 4);
1404 case 2: copy_block2(dst, src, linesize, linesize, 2);
1406 case 3: *dst = *src;
1411 static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
1413 int block_x, block_y;
1414 int size = 8 >> s->avctx->lowres;
1416 for (block_y=0; block_y<size; block_y++)
1417 for (block_x=0; block_x<size; block_x++)
1418 *(uint16_t*)(ptr + 2*block_x + block_y*linesize) <<= 16 - s->bits;
1420 for (block_y=0; block_y<size; block_y++)
1421 for (block_x=0; block_x<size; block_x++)
1422 *(ptr + block_x + block_y*linesize) <<= 8 - s->bits;
1426 static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
1427 int Al, const uint8_t *mb_bitmask,
1428 int mb_bitmask_size,
1429 const AVFrame *reference)
1431 int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height;
1432 uint8_t *data[MAX_COMPONENTS];
1433 const uint8_t *reference_data[MAX_COMPONENTS];
1434 int linesize[MAX_COMPONENTS];
1435 GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1436 int bytes_per_pixel = 1 + (s->bits > 8);
1439 if (mb_bitmask_size != (s->mb_width * s->mb_height + 7)>>3) {
1440 av_log(s->avctx, AV_LOG_ERROR, "mb_bitmask_size mismatches\n");
1441 return AVERROR_INVALIDDATA;
1443 init_get_bits(&mb_bitmask_gb, mb_bitmask, s->mb_width * s->mb_height);
1446 s->restart_count = 0;
1448 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &chroma_h_shift,
1450 chroma_width = AV_CEIL_RSHIFT(s->width, chroma_h_shift);
1451 chroma_height = AV_CEIL_RSHIFT(s->height, chroma_v_shift);
1453 for (i = 0; i < nb_components; i++) {
1454 int c = s->comp_index[i];
1455 data[c] = s->picture_ptr->data[c];
1456 reference_data[c] = reference ? reference->data[c] : NULL;
1457 linesize[c] = s->linesize[c];
1458 s->coefs_finished[c] |= 1;
1461 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1462 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1463 const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);
1465 if (s->restart_interval && !s->restart_count)
1466 s->restart_count = s->restart_interval;
1468 if (get_bits_left(&s->gb) < 0) {
1469 av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1470 -get_bits_left(&s->gb));
1471 return AVERROR_INVALIDDATA;
1473 for (i = 0; i < nb_components; i++) {
1475 int n, h, v, x, y, c, j;
1477 n = s->nb_blocks[i];
1478 c = s->comp_index[i];
1483 for (j = 0; j < n; j++) {
1484 block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1485 (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1487 if (s->interlaced && s->bottom_field)
1488 block_offset += linesize[c] >> 1;
1489 if ( 8*(h * mb_x + x) < ((c == 1) || (c == 2) ? chroma_width : s->width)
1490 && 8*(v * mb_y + y) < ((c == 1) || (c == 2) ? chroma_height : s->height)) {
1491 ptr = data[c] + block_offset;
1494 if (!s->progressive) {
1497 mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1498 linesize[c], s->avctx->lowres);
1501 s->bdsp.clear_block(s->block);
1502 if (decode_block(s, s->block, i,
1503 s->dc_index[i], s->ac_index[i],
1504 s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1505 av_log(s->avctx, AV_LOG_ERROR,
1506 "error y=%d x=%d\n", mb_y, mb_x);
1507 return AVERROR_INVALIDDATA;
1510 s->idsp.idct_put(ptr, linesize[c], s->block);
1512 shift_output(s, ptr, linesize[c]);
1516 int block_idx = s->block_stride[c] * (v * mb_y + y) +
1518 int16_t *block = s->blocks[c][block_idx];
1520 block[0] += get_bits1(&s->gb) *
1521 s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1522 else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1523 s->quant_matrixes[s->quant_sindex[i]],
1525 av_log(s->avctx, AV_LOG_ERROR,
1526 "error y=%d x=%d\n", mb_y, mb_x);
1527 return AVERROR_INVALIDDATA;
1530 ff_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
1531 ff_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
1532 mb_x, mb_y, x, y, c, s->bottom_field,
1533 (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1541 handle_rstn(s, nb_components);
1547 static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
1548 int se, int Ah, int Al)
1552 int c = s->comp_index[0];
1553 uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1555 av_assert0(ss>=0 && Ah>=0 && Al>=0);
1556 if (se < ss || se > 63) {
1557 av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", ss, se);
1558 return AVERROR_INVALIDDATA;
1561 // s->coefs_finished is a bitmask for coefficients coded
1562 // ss and se are parameters telling start and end coefficients
1563 s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss);
1565 s->restart_count = 0;
1567 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1568 int block_idx = mb_y * s->block_stride[c];
1569 int16_t (*block)[64] = &s->blocks[c][block_idx];
1570 uint8_t *last_nnz = &s->last_nnz[c][block_idx];
1571 if (get_bits_left(&s->gb) <= 0) {
1572 av_log(s->avctx, AV_LOG_ERROR, "bitstream truncated in mjpeg_decode_scan_progressive_ac\n");
1573 return AVERROR_INVALIDDATA;
1575 for (mb_x = 0; mb_x < s->mb_width; mb_x++, block++, last_nnz++) {
1577 if (s->restart_interval && !s->restart_count)
1578 s->restart_count = s->restart_interval;
1581 ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
1582 quant_matrix, ss, se, Al, &EOBRUN);
1584 ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
1585 quant_matrix, ss, se, Al, &EOBRUN);
1587 av_log(s->avctx, AV_LOG_ERROR,
1588 "error y=%d x=%d\n", mb_y, mb_x);
1589 return AVERROR_INVALIDDATA;
1592 if (handle_rstn(s, 0))
1599 static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
1603 const int bytes_per_pixel = 1 + (s->bits > 8);
1604 const int block_size = s->lossless ? 1 : 8;
1606 for (c = 0; c < s->nb_components; c++) {
1607 uint8_t *data = s->picture_ptr->data[c];
1608 int linesize = s->linesize[c];
1609 int h = s->h_max / s->h_count[c];
1610 int v = s->v_max / s->v_count[c];
1611 int mb_width = (s->width + h * block_size - 1) / (h * block_size);
1612 int mb_height = (s->height + v * block_size - 1) / (v * block_size);
1614 if (~s->coefs_finished[c])
1615 av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
1617 if (s->interlaced && s->bottom_field)
1618 data += linesize >> 1;
1620 for (mb_y = 0; mb_y < mb_height; mb_y++) {
1621 uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
1622 int block_idx = mb_y * s->block_stride[c];
1623 int16_t (*block)[64] = &s->blocks[c][block_idx];
1624 for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
1625 s->idsp.idct_put(ptr, linesize, *block);
1627 shift_output(s, ptr, linesize);
1628 ptr += bytes_per_pixel*8 >> s->avctx->lowres;
1634 int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
1635 int mb_bitmask_size, const AVFrame *reference)
1637 int len, nb_components, i, h, v, predictor, point_transform;
1639 const int block_size = s->lossless ? 1 : 8;
1640 int ilv, prev_shift;
1642 if (!s->got_picture) {
1643 av_log(s->avctx, AV_LOG_WARNING,
1644 "Can not process SOS before SOF, skipping\n");
1649 if (reference->width != s->picture_ptr->width ||
1650 reference->height != s->picture_ptr->height ||
1651 reference->format != s->picture_ptr->format) {
1652 av_log(s->avctx, AV_LOG_ERROR, "Reference mismatching\n");
1653 return AVERROR_INVALIDDATA;
1657 /* XXX: verify len field validity */
1658 len = get_bits(&s->gb, 16);
1659 nb_components = get_bits(&s->gb, 8);
1660 if (nb_components == 0 || nb_components > MAX_COMPONENTS) {
1661 avpriv_report_missing_feature(s->avctx,
1662 "decode_sos: nb_components (%d)",
1664 return AVERROR_PATCHWELCOME;
1666 if (len != 6 + 2 * nb_components) {
1667 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1668 return AVERROR_INVALIDDATA;
1670 for (i = 0; i < nb_components; i++) {
1671 id = get_bits(&s->gb, 8) - 1;
1672 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1673 /* find component index */
1674 for (index = 0; index < s->nb_components; index++)
1675 if (id == s->component_id[index])
1677 if (index == s->nb_components) {
1678 av_log(s->avctx, AV_LOG_ERROR,
1679 "decode_sos: index(%d) out of components\n", index);
1680 return AVERROR_INVALIDDATA;
1682 /* Metasoft MJPEG codec has Cb and Cr swapped */
1683 if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1684 && nb_components == 3 && s->nb_components == 3 && i)
1687 s->quant_sindex[i] = s->quant_index[index];
1688 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1689 s->h_scount[i] = s->h_count[index];
1690 s->v_scount[i] = s->v_count[index];
1692 if((nb_components == 1 || nb_components == 3) && s->nb_components == 3 && s->avctx->pix_fmt == AV_PIX_FMT_GBR24P)
1693 index = (index+2)%3;
1695 s->comp_index[i] = index;
1697 s->dc_index[i] = get_bits(&s->gb, 4);
1698 s->ac_index[i] = get_bits(&s->gb, 4);
1700 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1701 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1703 if (!s->vlcs[0][s->dc_index[i]].table || !(s->progressive ? s->vlcs[2][s->ac_index[0]].table : s->vlcs[1][s->ac_index[i]].table))
1707 predictor = get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
1708 ilv = get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */
1709 if(s->avctx->codec_tag != AV_RL32("CJPG")){
1710 prev_shift = get_bits(&s->gb, 4); /* Ah */
1711 point_transform = get_bits(&s->gb, 4); /* Al */
1713 prev_shift = point_transform = 0;
1715 if (nb_components > 1) {
1716 /* interleaved stream */
1717 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1718 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1719 } else if (!s->ls) { /* skip this for JPEG-LS */
1720 h = s->h_max / s->h_scount[0];
1721 v = s->v_max / s->v_scount[0];
1722 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1723 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1724 s->nb_blocks[0] = 1;
1729 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1730 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
1731 s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1732 predictor, point_transform, ilv, s->bits, s->mjpb_skiptosod,
1733 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), nb_components);
1736 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1737 for (i = s->mjpb_skiptosod; i > 0; i--)
1738 skip_bits(&s->gb, 8);
1741 for (i = 0; i < nb_components; i++)
1742 s->last_dc[i] = (4 << s->bits);
1744 if (s->avctx->hwaccel) {
1745 int bytes_to_start = get_bits_count(&s->gb) / 8;
1746 av_assert0(bytes_to_start >= 0 &&
1747 s->raw_scan_buffer_size >= bytes_to_start);
1749 ret = s->avctx->hwaccel->decode_slice(s->avctx,
1750 s->raw_scan_buffer + bytes_to_start,
1751 s->raw_scan_buffer_size - bytes_to_start);
1755 } else if (s->lossless) {
1756 av_assert0(s->picture_ptr == s->picture);
1757 if (CONFIG_JPEGLS_DECODER && s->ls) {
1759 // reset_ls_coding_parameters(s, 0);
1761 if ((ret = ff_jpegls_decode_picture(s, predictor,
1762 point_transform, ilv)) < 0)
1765 if (s->rgb || s->bayer) {
1766 if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0)
1769 if ((ret = ljpeg_decode_yuv_scan(s, predictor,
1771 nb_components)) < 0)
1776 if (s->progressive && predictor) {
1777 av_assert0(s->picture_ptr == s->picture);
1778 if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor,
1780 point_transform)) < 0)
1783 if ((ret = mjpeg_decode_scan(s, nb_components,
1784 prev_shift, point_transform,
1785 mb_bitmask, mb_bitmask_size, reference)) < 0)
1790 if (s->interlaced &&
1791 get_bits_left(&s->gb) > 32 &&
1792 show_bits(&s->gb, 8) == 0xFF) {
1793 GetBitContext bak = s->gb;
1794 align_get_bits(&bak);
1795 if (show_bits(&bak, 16) == 0xFFD1) {
1796 av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1798 skip_bits(&s->gb, 16);
1799 s->bottom_field ^= 1;
1808 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1809 return AVERROR_INVALIDDATA;
1812 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1814 if (get_bits(&s->gb, 16) != 4)
1815 return AVERROR_INVALIDDATA;
1816 s->restart_interval = get_bits(&s->gb, 16);
1817 s->restart_count = 0;
1818 av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
1819 s->restart_interval);
1824 static int mjpeg_decode_app(MJpegDecodeContext *s)
1828 len = get_bits(&s->gb, 16);
1831 // Pentax K-1 (digital camera) JPEG images embedded in DNG images contain unknown APP0 markers
1832 av_log(s->avctx, AV_LOG_WARNING, "skipping APPx (len=%"PRId32") for bayer-encoded image\n", len);
1833 skip_bits(&s->gb, len);
1836 return AVERROR_INVALIDDATA;
1838 if (8 * len > get_bits_left(&s->gb))
1839 return AVERROR_INVALIDDATA;
1841 id = get_bits_long(&s->gb, 32);
1844 if (s->avctx->debug & FF_DEBUG_STARTCODE)
1845 av_log(s->avctx, AV_LOG_DEBUG, "APPx (%s / %8X) len=%d\n",
1846 av_fourcc2str(av_bswap32(id)), id, len);
1848 /* Buggy AVID, it puts EOI only at every 10th frame. */
1849 /* Also, this fourcc is used by non-avid files too, it holds some
1850 information, but it's always present in AVID-created files. */
1851 if (id == AV_RB32("AVI1")) {
1857 4bytes field_size_less_padding
1860 i = get_bits(&s->gb, 8); len--;
1861 av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i);
1865 if (id == AV_RB32("JFIF")) {
1866 int t_w, t_h, v1, v2;
1869 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1870 v1 = get_bits(&s->gb, 8);
1871 v2 = get_bits(&s->gb, 8);
1872 skip_bits(&s->gb, 8);
1874 s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 16);
1875 s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 16);
1876 if ( s->avctx->sample_aspect_ratio.num <= 0
1877 || s->avctx->sample_aspect_ratio.den <= 0) {
1878 s->avctx->sample_aspect_ratio.num = 0;
1879 s->avctx->sample_aspect_ratio.den = 1;
1882 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1883 av_log(s->avctx, AV_LOG_INFO,
1884 "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1886 s->avctx->sample_aspect_ratio.num,
1887 s->avctx->sample_aspect_ratio.den);
1891 t_w = get_bits(&s->gb, 8);
1892 t_h = get_bits(&s->gb, 8);
1894 /* skip thumbnail */
1895 if (len -10 - (t_w * t_h * 3) > 0)
1896 len -= t_w * t_h * 3;
1903 if ( id == AV_RB32("Adob")
1905 && show_bits(&s->gb, 8) == 'e'
1906 && show_bits_long(&s->gb, 32) != AV_RB32("e_CM")) {
1907 skip_bits(&s->gb, 8); /* 'e' */
1908 skip_bits(&s->gb, 16); /* version */
1909 skip_bits(&s->gb, 16); /* flags0 */
1910 skip_bits(&s->gb, 16); /* flags1 */
1911 s->adobe_transform = get_bits(&s->gb, 8);
1912 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1913 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform);
1918 if (id == AV_RB32("LJIF")) {
1920 int pegasus_rct = s->pegasus_rct;
1921 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1922 av_log(s->avctx, AV_LOG_INFO,
1923 "Pegasus lossless jpeg header found\n");
1924 skip_bits(&s->gb, 16); /* version ? */
1925 skip_bits(&s->gb, 16); /* unknown always 0? */
1926 skip_bits(&s->gb, 16); /* unknown always 0? */
1927 skip_bits(&s->gb, 16); /* unknown always 0? */
1928 switch (i=get_bits(&s->gb, 8)) {
1938 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace %d\n", i);
1943 if (rgb != s->rgb || pegasus_rct != s->pegasus_rct) {
1944 av_log(s->avctx, AV_LOG_WARNING, "Mismatching LJIF tag\n");
1949 s->pegasus_rct = pegasus_rct;
1953 if (id == AV_RL32("colr") && len > 0) {
1954 s->colr = get_bits(&s->gb, 8);
1955 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1956 av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr);
1960 if (id == AV_RL32("xfrm") && len > 0) {
1961 s->xfrm = get_bits(&s->gb, 8);
1962 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1963 av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm);
1968 /* JPS extension by VRex */
1969 if (s->start_code == APP3 && id == AV_RB32("_JPS") && len >= 10) {
1970 int flags, layout, type;
1971 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1972 av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n");
1974 skip_bits(&s->gb, 32); len -= 4; /* JPS_ */
1975 skip_bits(&s->gb, 16); len -= 2; /* block length */
1976 skip_bits(&s->gb, 8); /* reserved */
1977 flags = get_bits(&s->gb, 8);
1978 layout = get_bits(&s->gb, 8);
1979 type = get_bits(&s->gb, 8);
1982 av_freep(&s->stereo3d);
1983 s->stereo3d = av_stereo3d_alloc();
1988 s->stereo3d->type = AV_STEREO3D_2D;
1989 } else if (type == 1) {
1992 s->stereo3d->type = AV_STEREO3D_LINES;
1995 s->stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
1998 s->stereo3d->type = AV_STEREO3D_TOPBOTTOM;
2001 if (!(flags & 0x04)) {
2002 s->stereo3d->flags = AV_STEREO3D_FLAG_INVERT;
2009 if (s->start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
2010 GetByteContext gbytes;
2011 int ret, le, ifd_offset, bytes_read;
2012 const uint8_t *aligned;
2014 skip_bits(&s->gb, 16); // skip padding
2017 // init byte wise reading
2018 aligned = align_get_bits(&s->gb);
2019 bytestream2_init(&gbytes, aligned, len);
2022 ret = ff_tdecode_header(&gbytes, &le, &ifd_offset);
2024 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: invalid TIFF header in EXIF data\n");
2026 bytestream2_seek(&gbytes, ifd_offset, SEEK_SET);
2028 // read 0th IFD and store the metadata
2029 // (return values > 0 indicate the presence of subimage metadata)
2030 ret = ff_exif_decode_ifd(s->avctx, &gbytes, le, 0, &s->exif_metadata);
2032 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error decoding EXIF data\n");
2036 bytes_read = bytestream2_tell(&gbytes);
2037 skip_bits(&s->gb, bytes_read << 3);
2044 if ((s->start_code == APP1) && (len > (0x28 - 8))) {
2045 id = get_bits_long(&s->gb, 32);
2048 if (id == AV_RB32("mjpg")) {
2051 4bytes pad field size
2059 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2060 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
2064 if (s->start_code == APP2 && id == AV_RB32("ICC_") && len >= 10) {
2067 unsigned nummarkers;
2069 id = get_bits_long(&s->gb, 32);
2070 id2 = get_bits(&s->gb, 24);
2072 if (id != AV_RB32("PROF") || id2 != AV_RB24("ILE")) {
2073 av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n");
2077 skip_bits(&s->gb, 8);
2078 seqno = get_bits(&s->gb, 8);
2081 av_log(s->avctx, AV_LOG_WARNING, "Invalid sequence number in APP2\n");
2085 nummarkers = get_bits(&s->gb, 8);
2087 if (nummarkers == 0) {
2088 av_log(s->avctx, AV_LOG_WARNING, "Invalid number of markers coded in APP2\n");
2090 } else if (s->iccnum != 0 && nummarkers != s->iccnum) {
2091 av_log(s->avctx, AV_LOG_WARNING, "Mistmatch in coded number of ICC markers between markers\n");
2093 } else if (seqno > nummarkers) {
2094 av_log(s->avctx, AV_LOG_WARNING, "Mismatching sequence number and coded number of ICC markers\n");
2098 /* Allocate if this is the first APP2 we've seen. */
2099 if (s->iccnum == 0) {
2100 s->iccdata = av_mallocz(nummarkers * sizeof(*(s->iccdata)));
2101 s->iccdatalens = av_mallocz(nummarkers * sizeof(*(s->iccdatalens)));
2102 if (!s->iccdata || !s->iccdatalens) {
2103 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data arrays\n");
2104 return AVERROR(ENOMEM);
2106 s->iccnum = nummarkers;
2109 if (s->iccdata[seqno - 1]) {
2110 av_log(s->avctx, AV_LOG_WARNING, "Duplicate ICC sequence number\n");
2114 s->iccdatalens[seqno - 1] = len;
2115 s->iccdata[seqno - 1] = av_malloc(len);
2116 if (!s->iccdata[seqno - 1]) {
2117 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data buffer\n");
2118 return AVERROR(ENOMEM);
2121 memcpy(s->iccdata[seqno - 1], align_get_bits(&s->gb), len);
2122 skip_bits(&s->gb, len << 3);
2126 if (s->iccread > s->iccnum)
2127 av_log(s->avctx, AV_LOG_WARNING, "Read more ICC markers than are supposed to be coded\n");
2131 /* slow but needed for extreme adobe jpegs */
2133 av_log(s->avctx, AV_LOG_ERROR,
2134 "mjpeg: error, decode_app parser read over the end\n");
2136 skip_bits(&s->gb, 8);
2141 static int mjpeg_decode_com(MJpegDecodeContext *s)
2143 int len = get_bits(&s->gb, 16);
2144 if (len >= 2 && 8 * len - 16 <= get_bits_left(&s->gb)) {
2146 char *cbuf = av_malloc(len - 1);
2148 return AVERROR(ENOMEM);
2150 for (i = 0; i < len - 2; i++)
2151 cbuf[i] = get_bits(&s->gb, 8);
2152 if (i > 0 && cbuf[i - 1] == '\n')
2157 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2158 av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf);
2160 /* buggy avid, it puts EOI only at every 10th frame */
2161 if (!strncmp(cbuf, "AVID", 4)) {
2162 parse_avid(s, cbuf, len);
2163 } else if (!strcmp(cbuf, "CS=ITU601"))
2165 else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) ||
2166 (!strncmp(cbuf, "Metasoft MJPEG Codec", 20)))
2168 else if (!strcmp(cbuf, "MULTISCOPE II")) {
2169 s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 };
2179 /* return the 8 bit start code value and update the search
2180 state. Return -1 if no start code found */
2181 static int find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
2183 const uint8_t *buf_ptr;
2188 buf_ptr = *pbuf_ptr;
2189 while (buf_end - buf_ptr > 1) {
2192 if ((v == 0xff) && (v2 >= SOF0) && (v2 <= COM) && buf_ptr < buf_end) {
2201 ff_dlog(NULL, "find_marker skipped %d bytes\n", skipped);
2202 *pbuf_ptr = buf_ptr;
2206 int ff_mjpeg_find_marker(MJpegDecodeContext *s,
2207 const uint8_t **buf_ptr, const uint8_t *buf_end,
2208 const uint8_t **unescaped_buf_ptr,
2209 int *unescaped_buf_size)
2212 start_code = find_marker(buf_ptr, buf_end);
2214 av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - *buf_ptr);
2216 return AVERROR(ENOMEM);
2218 /* unescape buffer of SOS, use special treatment for JPEG-LS */
2219 if (start_code == SOS && !s->ls) {
2220 const uint8_t *src = *buf_ptr;
2221 const uint8_t *ptr = src;
2222 uint8_t *dst = s->buffer;
2224 #define copy_data_segment(skip) do { \
2225 ptrdiff_t length = (ptr - src) - (skip); \
2227 memcpy(dst, src, length); \
2233 if (s->avctx->codec_id == AV_CODEC_ID_THP) {
2235 copy_data_segment(0);
2237 while (ptr < buf_end) {
2238 uint8_t x = *(ptr++);
2242 while (ptr < buf_end && x == 0xff) {
2247 /* 0xFF, 0xFF, ... */
2249 copy_data_segment(skip);
2251 /* decrement src as it is equal to ptr after the
2252 * copy_data_segment macro and we might want to
2253 * copy the current value of x later on */
2257 if (x < RST0 || x > RST7) {
2258 copy_data_segment(1);
2265 copy_data_segment(0);
2267 #undef copy_data_segment
2269 *unescaped_buf_ptr = s->buffer;
2270 *unescaped_buf_size = dst - s->buffer;
2271 memset(s->buffer + *unescaped_buf_size, 0,
2272 AV_INPUT_BUFFER_PADDING_SIZE);
2274 av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %"PTRDIFF_SPECIFIER" bytes\n",
2275 (buf_end - *buf_ptr) - (dst - s->buffer));
2276 } else if (start_code == SOS && s->ls) {
2277 const uint8_t *src = *buf_ptr;
2278 uint8_t *dst = s->buffer;
2284 while (src + t < buf_end) {
2285 uint8_t x = src[t++];
2287 while ((src + t < buf_end) && x == 0xff)
2296 init_put_bits(&pb, dst, t);
2298 /* unescape bitstream */
2300 uint8_t x = src[b++];
2301 put_bits(&pb, 8, x);
2302 if (x == 0xFF && b < t) {
2305 av_log(s->avctx, AV_LOG_WARNING, "Invalid escape sequence\n");
2308 put_bits(&pb, 7, x);
2312 flush_put_bits(&pb);
2314 *unescaped_buf_ptr = dst;
2315 *unescaped_buf_size = (bit_count + 7) >> 3;
2316 memset(s->buffer + *unescaped_buf_size, 0,
2317 AV_INPUT_BUFFER_PADDING_SIZE);
2319 *unescaped_buf_ptr = *buf_ptr;
2320 *unescaped_buf_size = buf_end - *buf_ptr;
2326 static void reset_icc_profile(MJpegDecodeContext *s)
2331 for (i = 0; i < s->iccnum; i++)
2332 av_freep(&s->iccdata[i]);
2333 av_freep(&s->iccdata);
2334 av_freep(&s->iccdatalens);
2340 int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
2343 AVFrame *frame = data;
2344 const uint8_t *buf = avpkt->data;
2345 int buf_size = avpkt->size;
2346 MJpegDecodeContext *s = avctx->priv_data;
2347 const uint8_t *buf_end, *buf_ptr;
2348 const uint8_t *unescaped_buf_ptr;
2350 int unescaped_buf_size;
2356 s->buf_size = buf_size;
2358 av_dict_free(&s->exif_metadata);
2359 av_freep(&s->stereo3d);
2360 s->adobe_transform = -1;
2363 reset_icc_profile(s);
2366 buf_end = buf + buf_size;
2367 while (buf_ptr < buf_end) {
2368 /* find start next marker */
2369 start_code = ff_mjpeg_find_marker(s, &buf_ptr, buf_end,
2371 &unescaped_buf_size);
2373 if (start_code < 0) {
2375 } else if (unescaped_buf_size > INT_MAX / 8) {
2376 av_log(avctx, AV_LOG_ERROR,
2377 "MJPEG packet 0x%x too big (%d/%d), corrupt data?\n",
2378 start_code, unescaped_buf_size, buf_size);
2379 return AVERROR_INVALIDDATA;
2381 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%"PTRDIFF_SPECIFIER"\n",
2382 start_code, buf_end - buf_ptr);
2384 ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2387 av_log(avctx, AV_LOG_ERROR, "invalid buffer\n");
2391 s->start_code = start_code;
2392 if (s->avctx->debug & FF_DEBUG_STARTCODE)
2393 av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
2395 /* process markers */
2396 if (start_code >= RST0 && start_code <= RST7) {
2397 av_log(avctx, AV_LOG_DEBUG,
2398 "restart marker: %d\n", start_code & 0x0f);
2400 } else if (start_code >= APP0 && start_code <= APP15) {
2401 if ((ret = mjpeg_decode_app(s)) < 0)
2402 av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
2405 } else if (start_code == COM) {
2406 ret = mjpeg_decode_com(s);
2409 } else if (start_code == DQT) {
2410 ret = ff_mjpeg_decode_dqt(s);
2417 if (!CONFIG_JPEGLS_DECODER &&
2418 (start_code == SOF48 || start_code == LSE)) {
2419 av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n");
2420 return AVERROR(ENOSYS);
2423 if (avctx->skip_frame == AVDISCARD_ALL) {
2424 switch(start_code) {
2439 switch (start_code) {
2441 s->restart_interval = 0;
2442 s->restart_count = 0;
2443 s->raw_image_buffer = buf_ptr;
2444 s->raw_image_buffer_size = buf_end - buf_ptr;
2445 /* nothing to do on SOI */
2448 if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
2449 av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2455 if (start_code == SOF0)
2456 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2458 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2462 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2466 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT;
2470 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2474 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS;
2475 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2479 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2483 s->avctx->profile = FF_PROFILE_MJPEG_JPEG_LS;
2484 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2488 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2492 if (!CONFIG_JPEGLS_DECODER ||
2493 (ret = ff_jpegls_decode_lse(s)) < 0)
2498 if (!avctx->hwaccel && avctx->skip_frame != AVDISCARD_ALL &&
2499 s->progressive && s->cur_scan && s->got_picture)
2500 mjpeg_idct_scan_progressive_ac(s);
2502 if (!s->got_picture) {
2503 av_log(avctx, AV_LOG_WARNING,
2504 "Found EOI before any SOF, ignoring\n");
2507 if (s->interlaced) {
2508 s->bottom_field ^= 1;
2509 /* if not bottom field, do not output image yet */
2510 if (s->bottom_field == !s->interlace_polarity)
2513 if (avctx->skip_frame == AVDISCARD_ALL) {
2515 goto the_end_no_picture;
2517 if (s->avctx->hwaccel) {
2518 ret = s->avctx->hwaccel->end_frame(s->avctx);
2522 av_freep(&s->hwaccel_picture_private);
2524 if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2530 int qp = FFMAX3(s->qscale[0],
2533 int qpw = (s->width + 15) / 16;
2534 AVBufferRef *qp_table_buf = av_buffer_alloc(qpw);
2536 memset(qp_table_buf->data, qp, qpw);
2537 av_frame_set_qp_table(data, qp_table_buf, 0, FF_QSCALE_TYPE_MPEG1);
2540 if(avctx->debug & FF_DEBUG_QP)
2541 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2546 s->raw_scan_buffer = buf_ptr;
2547 s->raw_scan_buffer_size = buf_end - buf_ptr;
2550 if (avctx->skip_frame == AVDISCARD_ALL) {
2551 skip_bits(&s->gb, get_bits_left(&s->gb));
2555 if ((ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL)) < 0 &&
2556 (avctx->err_recognition & AV_EF_EXPLODE))
2560 if ((ret = mjpeg_decode_dri(s)) < 0)
2573 av_log(avctx, AV_LOG_ERROR,
2574 "mjpeg: unsupported coding type (%x)\n", start_code);
2579 /* eof process start code */
2580 buf_ptr += (get_bits_count(&s->gb) + 7) / 8;
2581 av_log(avctx, AV_LOG_DEBUG,
2582 "marker parser used %d bytes (%d bits)\n",
2583 (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb));
2585 if (s->got_picture && s->cur_scan) {
2586 av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
2589 av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2590 return AVERROR_INVALIDDATA;
2596 is16bit = av_pix_fmt_desc_get(s->avctx->pix_fmt)->comp[0].step > 1;
2598 if (AV_RB32(s->upscale_h)) {
2600 av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2601 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2602 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2603 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2604 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2605 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2606 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2607 avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2608 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2609 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2610 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2611 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2613 ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2617 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2618 for (p = 0; p<s->nb_components; p++) {
2619 uint8_t *line = s->picture_ptr->data[p];
2622 if (!s->upscale_h[p])
2625 w = AV_CEIL_RSHIFT(w, hshift);
2626 h = AV_CEIL_RSHIFT(h, vshift);
2628 if (s->upscale_v[p] == 1)
2631 for (i = 0; i < h; i++) {
2632 if (s->upscale_h[p] == 1) {
2633 if (is16bit) ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 2];
2634 else line[w - 1] = line[(w - 1) / 2];
2635 for (index = w - 2; index > 0; index--) {
2637 ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
2639 line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
2641 } else if (s->upscale_h[p] == 2) {
2643 ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 3];
2645 ((uint16_t*)line)[w - 2] = ((uint16_t*)line)[w - 1];
2647 line[w - 1] = line[(w - 1) / 3];
2649 line[w - 2] = line[w - 1];
2651 for (index = w - 3; index > 0; index--) {
2652 line[index] = (line[index / 3] + line[(index + 1) / 3] + line[(index + 2) / 3] + 1) / 3;
2655 line += s->linesize[p];
2659 if (AV_RB32(s->upscale_v)) {
2661 av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2662 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2663 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2664 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2665 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2666 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2667 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2668 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2669 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2670 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2671 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2672 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2673 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2675 ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2679 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2680 for (p = 0; p < s->nb_components; p++) {
2684 if (!s->upscale_v[p])
2687 w = AV_CEIL_RSHIFT(w, hshift);
2688 h = AV_CEIL_RSHIFT(h, vshift);
2690 dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
2691 for (i = h - 1; i; i--) {
2692 uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2693 uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2694 if (s->upscale_v[p] != 2 && (src1 == src2 || i == h - 1)) {
2695 memcpy(dst, src1, w);
2697 for (index = 0; index < w; index++)
2698 dst[index] = (src1[index] + src2[index]) >> 1;
2700 dst -= s->linesize[p];
2704 if (s->flipped && !s->rgb) {
2706 ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2710 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2711 for (index=0; index<s->nb_components; index++) {
2712 uint8_t *dst = s->picture_ptr->data[index];
2713 int w = s->picture_ptr->width;
2714 int h = s->picture_ptr->height;
2715 if(index && index<3){
2716 w = AV_CEIL_RSHIFT(w, hshift);
2717 h = AV_CEIL_RSHIFT(h, vshift);
2720 uint8_t *dst2 = dst + s->picture_ptr->linesize[index]*(h-1);
2721 for (i=0; i<h/2; i++) {
2723 FFSWAP(int, dst[j], dst2[j]);
2724 dst += s->picture_ptr->linesize[index];
2725 dst2 -= s->picture_ptr->linesize[index];
2730 if (s->adobe_transform == 0 && s->avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
2731 int w = s->picture_ptr->width;
2732 int h = s->picture_ptr->height;
2733 av_assert0(s->nb_components == 4);
2734 for (i=0; i<h; i++) {
2737 for (index=0; index<4; index++) {
2738 dst[index] = s->picture_ptr->data[index]
2739 + s->picture_ptr->linesize[index]*i;
2741 for (j=0; j<w; j++) {
2743 int r = dst[0][j] * k;
2744 int g = dst[1][j] * k;
2745 int b = dst[2][j] * k;
2746 dst[0][j] = g*257 >> 16;
2747 dst[1][j] = b*257 >> 16;
2748 dst[2][j] = r*257 >> 16;
2753 if (s->adobe_transform == 2 && s->avctx->pix_fmt == AV_PIX_FMT_YUVA444P) {
2754 int w = s->picture_ptr->width;
2755 int h = s->picture_ptr->height;
2756 av_assert0(s->nb_components == 4);
2757 for (i=0; i<h; i++) {
2760 for (index=0; index<4; index++) {
2761 dst[index] = s->picture_ptr->data[index]
2762 + s->picture_ptr->linesize[index]*i;
2764 for (j=0; j<w; j++) {
2766 int r = (255 - dst[0][j]) * k;
2767 int g = (128 - dst[1][j]) * k;
2768 int b = (128 - dst[2][j]) * k;
2769 dst[0][j] = r*257 >> 16;
2770 dst[1][j] = (g*257 >> 16) + 128;
2771 dst[2][j] = (b*257 >> 16) + 128;
2778 AVStereo3D *stereo = av_stereo3d_create_side_data(data);
2780 stereo->type = s->stereo3d->type;
2781 stereo->flags = s->stereo3d->flags;
2783 av_freep(&s->stereo3d);
2786 if (s->iccnum != 0 && s->iccnum == s->iccread) {
2787 AVFrameSideData *sd;
2792 /* Sum size of all parts. */
2793 for (i = 0; i < s->iccnum; i++)
2794 total_size += s->iccdatalens[i];
2796 sd = av_frame_new_side_data(data, AV_FRAME_DATA_ICC_PROFILE, total_size);
2798 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2799 return AVERROR(ENOMEM);
2802 /* Reassemble the parts, which are now in-order. */
2803 for (i = 0; i < s->iccnum; i++) {
2804 memcpy(sd->data + offset, s->iccdata[i], s->iccdatalens[i]);
2805 offset += s->iccdatalens[i];
2809 av_dict_copy(&((AVFrame *) data)->metadata, s->exif_metadata, 0);
2810 av_dict_free(&s->exif_metadata);
2813 av_log(avctx, AV_LOG_DEBUG, "decode frame unused %"PTRDIFF_SPECIFIER" bytes\n",
2815 // return buf_end - buf_ptr;
2816 return buf_ptr - buf;
2819 av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2821 MJpegDecodeContext *s = avctx->priv_data;
2824 if (s->interlaced && s->bottom_field == !s->interlace_polarity && s->got_picture && !avctx->frame_number) {
2825 av_log(avctx, AV_LOG_INFO, "Single field\n");
2829 av_frame_free(&s->picture);
2830 s->picture_ptr = NULL;
2831 } else if (s->picture_ptr)
2832 av_frame_unref(s->picture_ptr);
2834 av_freep(&s->buffer);
2835 av_freep(&s->stereo3d);
2836 av_freep(&s->ljpeg_buffer);
2837 s->ljpeg_buffer_size = 0;
2839 for (i = 0; i < 3; i++) {
2840 for (j = 0; j < 4; j++)
2841 ff_free_vlc(&s->vlcs[i][j]);
2843 for (i = 0; i < MAX_COMPONENTS; i++) {
2844 av_freep(&s->blocks[i]);
2845 av_freep(&s->last_nnz[i]);
2847 av_dict_free(&s->exif_metadata);
2849 reset_icc_profile(s);
2851 av_freep(&s->hwaccel_picture_private);
2856 static void decode_flush(AVCodecContext *avctx)
2858 MJpegDecodeContext *s = avctx->priv_data;
2862 #if CONFIG_MJPEG_DECODER
2863 #define OFFSET(x) offsetof(MJpegDecodeContext, x)
2864 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2865 static const AVOption options[] = {
2866 { "extern_huff", "Use external huffman table.",
2867 OFFSET(extern_huff), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
2871 static const AVClass mjpegdec_class = {
2872 .class_name = "MJPEG decoder",
2873 .item_name = av_default_item_name,
2875 .version = LIBAVUTIL_VERSION_INT,
2878 AVCodec ff_mjpeg_decoder = {
2880 .long_name = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
2881 .type = AVMEDIA_TYPE_VIDEO,
2882 .id = AV_CODEC_ID_MJPEG,
2883 .priv_data_size = sizeof(MJpegDecodeContext),
2884 .init = ff_mjpeg_decode_init,
2885 .close = ff_mjpeg_decode_end,
2886 .decode = ff_mjpeg_decode_frame,
2887 .flush = decode_flush,
2888 .capabilities = AV_CODEC_CAP_DR1,
2890 .priv_class = &mjpegdec_class,
2891 .profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
2892 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
2893 FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2894 .hw_configs = (const AVCodecHWConfigInternal*[]) {
2895 #if CONFIG_MJPEG_NVDEC_HWACCEL
2896 HWACCEL_NVDEC(mjpeg),
2898 #if CONFIG_MJPEG_VAAPI_HWACCEL
2899 HWACCEL_VAAPI(mjpeg),
2905 #if CONFIG_THP_DECODER
2906 AVCodec ff_thp_decoder = {
2908 .long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
2909 .type = AVMEDIA_TYPE_VIDEO,
2910 .id = AV_CODEC_ID_THP,
2911 .priv_data_size = sizeof(MJpegDecodeContext),
2912 .init = ff_mjpeg_decode_init,
2913 .close = ff_mjpeg_decode_end,
2914 .decode = ff_mjpeg_decode_frame,
2915 .flush = decode_flush,
2916 .capabilities = AV_CODEC_CAP_DR1,
2918 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,