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 int build_vlc(VLC *vlc, const uint8_t *bits_table,
54 const uint8_t *val_table, int nb_codes,
55 int use_static, int is_ac)
57 uint8_t huff_size[256] = { 0 };
58 uint16_t huff_code[256];
59 uint16_t huff_sym[256];
62 av_assert0(nb_codes <= 256);
64 ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table);
66 for (i = 0; i < 256; i++)
67 huff_sym[i] = i + 16 * is_ac;
70 huff_sym[0] = 16 * 256;
72 return ff_init_vlc_sparse(vlc, 9, nb_codes, huff_size, 1, 1,
73 huff_code, 2, 2, huff_sym, 2, 2, use_static);
76 static int init_default_huffman_tables(MJpegDecodeContext *s)
82 const uint8_t *values;
86 { 0, 0, avpriv_mjpeg_bits_dc_luminance,
87 avpriv_mjpeg_val_dc, 12, 12 },
88 { 0, 1, avpriv_mjpeg_bits_dc_chrominance,
89 avpriv_mjpeg_val_dc, 12, 12 },
90 { 1, 0, avpriv_mjpeg_bits_ac_luminance,
91 avpriv_mjpeg_val_ac_luminance, 251, 162 },
92 { 1, 1, avpriv_mjpeg_bits_ac_chrominance,
93 avpriv_mjpeg_val_ac_chrominance, 251, 162 },
94 { 2, 0, avpriv_mjpeg_bits_ac_luminance,
95 avpriv_mjpeg_val_ac_luminance, 251, 162 },
96 { 2, 1, avpriv_mjpeg_bits_ac_chrominance,
97 avpriv_mjpeg_val_ac_chrominance, 251, 162 },
101 for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
102 ret = build_vlc(&s->vlcs[ht[i].class][ht[i].index],
103 ht[i].bits, ht[i].values, ht[i].codes,
104 0, ht[i].class == 1);
108 if (ht[i].class < 2) {
109 memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
111 memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
112 ht[i].values, ht[i].length);
119 static void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
122 if (len > 14 && buf[12] == 1) /* 1 - NTSC */
123 s->interlace_polarity = 1;
124 if (len > 14 && buf[12] == 2) /* 2 - PAL */
125 s->interlace_polarity = 0;
126 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
127 av_log(s->avctx, AV_LOG_INFO, "AVID: len:%d %d\n", len, len > 14 ? buf[12] : -1);
130 static void init_idct(AVCodecContext *avctx)
132 MJpegDecodeContext *s = avctx->priv_data;
134 ff_idctdsp_init(&s->idsp, avctx);
135 ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
139 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
141 MJpegDecodeContext *s = avctx->priv_data;
144 if (!s->picture_ptr) {
145 s->picture = av_frame_alloc();
147 return AVERROR(ENOMEM);
148 s->picture_ptr = s->picture;
152 ff_blockdsp_init(&s->bdsp, avctx);
153 ff_hpeldsp_init(&s->hdsp, avctx->flags);
158 s->first_picture = 1;
160 s->org_height = avctx->coded_height;
161 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
162 avctx->colorspace = AVCOL_SPC_BT470BG;
163 s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
165 if ((ret = init_default_huffman_tables(s)) < 0)
168 if (s->extern_huff) {
169 av_log(avctx, AV_LOG_INFO, "using external huffman table\n");
170 if ((ret = init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8)) < 0)
172 if (ff_mjpeg_decode_dht(s)) {
173 av_log(avctx, AV_LOG_ERROR,
174 "error using external huffman table, switching back to internal\n");
175 init_default_huffman_tables(s);
178 if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
179 s->interlace_polarity = 1; /* bottom field first */
180 av_log(avctx, AV_LOG_DEBUG, "bottom field first\n");
181 } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
182 if (avctx->codec_tag == AV_RL32("MJPG"))
183 s->interlace_polarity = 1;
186 if ( avctx->extradata_size > 8
187 && AV_RL32(avctx->extradata) == 0x2C
188 && AV_RL32(avctx->extradata+4) == 0x18) {
189 parse_avid(s, avctx->extradata, avctx->extradata_size);
192 if (avctx->codec->id == AV_CODEC_ID_AMV)
199 /* quantize tables */
200 int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
204 len = get_bits(&s->gb, 16) - 2;
206 if (8*len > get_bits_left(&s->gb)) {
207 av_log(s->avctx, AV_LOG_ERROR, "dqt: len %d is too large\n", len);
208 return AVERROR_INVALIDDATA;
212 int pr = get_bits(&s->gb, 4);
214 av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n");
215 return AVERROR_INVALIDDATA;
217 index = get_bits(&s->gb, 4);
220 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
221 /* read quant table */
222 for (i = 0; i < 64; i++) {
223 s->quant_matrixes[index][i] = get_bits(&s->gb, pr ? 16 : 8);
224 if (s->quant_matrixes[index][i] == 0) {
225 av_log(s->avctx, AV_LOG_ERROR, "dqt: 0 quant value\n");
226 return AVERROR_INVALIDDATA;
230 // XXX FIXME fine-tune, and perhaps add dc too
231 s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
232 s->quant_matrixes[index][8]) >> 1;
233 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
234 index, s->qscale[index]);
235 len -= 1 + 64 * (1+pr);
240 /* decode huffman tables and build VLC decoders */
241 int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
243 int len, index, i, class, n, v, code_max;
244 uint8_t bits_table[17];
245 uint8_t val_table[256];
248 len = get_bits(&s->gb, 16) - 2;
250 if (8*len > get_bits_left(&s->gb)) {
251 av_log(s->avctx, AV_LOG_ERROR, "dht: len %d is too large\n", len);
252 return AVERROR_INVALIDDATA;
257 return AVERROR_INVALIDDATA;
258 class = get_bits(&s->gb, 4);
260 return AVERROR_INVALIDDATA;
261 index = get_bits(&s->gb, 4);
263 return AVERROR_INVALIDDATA;
265 for (i = 1; i <= 16; i++) {
266 bits_table[i] = get_bits(&s->gb, 8);
270 if (len < n || n > 256)
271 return AVERROR_INVALIDDATA;
274 for (i = 0; i < n; i++) {
275 v = get_bits(&s->gb, 8);
282 /* build VLC and flush previous vlc if present */
283 ff_free_vlc(&s->vlcs[class][index]);
284 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
285 class, index, code_max + 1);
286 if ((ret = build_vlc(&s->vlcs[class][index], bits_table, val_table,
287 code_max + 1, 0, class > 0)) < 0)
291 ff_free_vlc(&s->vlcs[2][index]);
292 if ((ret = build_vlc(&s->vlcs[2][index], bits_table, val_table,
293 code_max + 1, 0, 0)) < 0)
297 for (i = 0; i < 16; i++)
298 s->raw_huffman_lengths[class][index][i] = bits_table[i + 1];
299 for (i = 0; i < 256; i++)
300 s->raw_huffman_values[class][index][i] = val_table[i];
305 int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
307 int len, nb_components, i, width, height, bits, ret, size_change;
309 int h_count[MAX_COMPONENTS] = { 0 };
310 int v_count[MAX_COMPONENTS] = { 0 };
313 memset(s->upscale_h, 0, sizeof(s->upscale_h));
314 memset(s->upscale_v, 0, sizeof(s->upscale_v));
316 len = get_bits(&s->gb, 16);
317 bits = get_bits(&s->gb, 8);
319 if (bits > 16 || bits < 1) {
320 av_log(s->avctx, AV_LOG_ERROR, "bits %d is invalid\n", bits);
321 return AVERROR_INVALIDDATA;
324 if (s->avctx->bits_per_raw_sample != bits) {
325 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);
326 s->avctx->bits_per_raw_sample = bits;
331 if (bits == 9 && !s->pegasus_rct)
332 s->rct = 1; // FIXME ugly
334 if(s->lossless && s->avctx->lowres){
335 av_log(s->avctx, AV_LOG_ERROR, "lowres is not possible with lossless jpeg\n");
339 height = get_bits(&s->gb, 16);
340 width = get_bits(&s->gb, 16);
342 // HACK for odd_height.mov
343 if (s->interlaced && s->width == width && s->height == height + 1)
346 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
347 if (av_image_check_size(width, height, 0, s->avctx) < 0)
348 return AVERROR_INVALIDDATA;
349 if (s->buf_size && (width + 7) / 8 * ((height + 7) / 8) > s->buf_size * 4LL)
350 return AVERROR_INVALIDDATA;
352 nb_components = get_bits(&s->gb, 8);
353 if (nb_components <= 0 ||
354 nb_components > MAX_COMPONENTS)
356 if (s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
357 if (nb_components != s->nb_components) {
358 av_log(s->avctx, AV_LOG_ERROR,
359 "nb_components changing in interlaced picture\n");
360 return AVERROR_INVALIDDATA;
363 if (s->ls && !(bits <= 8 || nb_components == 1)) {
364 avpriv_report_missing_feature(s->avctx,
365 "JPEG-LS that is not <= 8 "
366 "bits/component or 16-bit gray");
367 return AVERROR_PATCHWELCOME;
369 if (len != 8 + 3 * nb_components) {
370 av_log(s->avctx, AV_LOG_ERROR, "decode_sof0: error, len(%d) mismatch %d components\n", len, nb_components);
371 return AVERROR_INVALIDDATA;
374 s->nb_components = nb_components;
377 for (i = 0; i < nb_components; i++) {
379 s->component_id[i] = get_bits(&s->gb, 8) - 1;
380 h_count[i] = get_bits(&s->gb, 4);
381 v_count[i] = get_bits(&s->gb, 4);
382 /* compute hmax and vmax (only used in interleaved case) */
383 if (h_count[i] > s->h_max)
384 s->h_max = h_count[i];
385 if (v_count[i] > s->v_max)
386 s->v_max = v_count[i];
387 s->quant_index[i] = get_bits(&s->gb, 8);
388 if (s->quant_index[i] >= 4) {
389 av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n");
390 return AVERROR_INVALIDDATA;
392 if (!h_count[i] || !v_count[i]) {
393 av_log(s->avctx, AV_LOG_ERROR,
394 "Invalid sampling factor in component %d %d:%d\n",
395 i, h_count[i], v_count[i]);
396 return AVERROR_INVALIDDATA;
399 av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
400 i, h_count[i], v_count[i],
401 s->component_id[i], s->quant_index[i]);
403 if ( nb_components == 4
404 && s->component_id[0] == 'C' - 1
405 && s->component_id[1] == 'M' - 1
406 && s->component_id[2] == 'Y' - 1
407 && s->component_id[3] == 'K' - 1)
408 s->adobe_transform = 0;
410 if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
411 avpriv_report_missing_feature(s->avctx, "Subsampling in JPEG-LS");
412 return AVERROR_PATCHWELCOME;
416 if (nb_components == 2) {
417 /* Bayer images embedded in DNGs can contain 2 interleaved components and the
418 width stored in their SOF3 markers is the width of each one. We only output
419 a single component, therefore we need to adjust the output image width. We
420 handle the deinterleaving (but not the debayering) in this file. */
423 /* They can also contain 1 component, which is double the width and half the height
424 of the final image (rows are interleaved). We don't handle the decoding in this
425 file, but leave that to the TIFF/DNG decoder. */
428 /* if different size, realloc/alloc picture */
429 if (width != s->width || height != s->height || bits != s->bits ||
430 memcmp(s->h_count, h_count, sizeof(h_count)) ||
431 memcmp(s->v_count, v_count, sizeof(v_count))) {
437 memcpy(s->h_count, h_count, sizeof(h_count));
438 memcpy(s->v_count, v_count, sizeof(v_count));
442 /* test interlaced mode */
443 if (s->first_picture &&
444 (s->multiscope != 2 || s->avctx->time_base.den >= 25 * s->avctx->time_base.num) &&
445 s->org_height != 0 &&
446 s->height < ((s->org_height * 3) / 4)) {
448 s->bottom_field = s->interlace_polarity;
449 s->picture_ptr->interlaced_frame = 1;
450 s->picture_ptr->top_field_first = !s->interlace_polarity;
454 ret = ff_set_dimensions(s->avctx, width, height);
458 s->first_picture = 0;
463 if (s->got_picture && s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
464 if (s->progressive) {
465 avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
466 return AVERROR_INVALIDDATA;
469 if (s->v_max == 1 && s->h_max == 1 && s->lossless==1 && (nb_components==3 || nb_components==4))
471 else if (!s->lossless)
473 /* XXX: not complete test ! */
474 pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
475 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
476 (s->h_count[2] << 12) | (s->v_count[2] << 8) |
477 (s->h_count[3] << 4) | s->v_count[3];
478 av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
479 /* NOTE we do not allocate pictures large enough for the possible
480 * padding of h/v_count being 4 */
481 if (!(pix_fmt_id & 0xD0D0D0D0))
482 pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
483 if (!(pix_fmt_id & 0x0D0D0D0D))
484 pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
486 for (i = 0; i < 8; i++) {
487 int j = 6 + (i&1) - (i&6);
488 int is = (pix_fmt_id >> (4*i)) & 0xF;
489 int js = (pix_fmt_id >> (4*j)) & 0xF;
491 if (is == 1 && js != 2 && (i < 2 || i > 5))
492 js = (pix_fmt_id >> ( 8 + 4*(i&1))) & 0xF;
493 if (is == 1 && js != 2 && (i < 2 || i > 5))
494 js = (pix_fmt_id >> (16 + 4*(i&1))) & 0xF;
496 if (is == 1 && js == 2) {
497 if (i & 1) s->upscale_h[j/2] = 1;
498 else s->upscale_v[j/2] = 1;
502 switch (pix_fmt_id) {
503 case 0x11110000: /* for bayer-encoded huffman lossless JPEGs embedded in DNGs */
506 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
510 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
512 if ( s->adobe_transform == 0
513 || s->component_id[0] == 'R' - 1 && s->component_id[1] == 'G' - 1 && s->component_id[2] == 'B' - 1) {
514 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
516 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
517 else s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
518 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
521 av_assert0(s->nb_components == 3);
525 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
527 if (s->adobe_transform == 0 && s->bits <= 8) {
528 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
530 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
531 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
534 av_assert0(s->nb_components == 4);
538 if (s->adobe_transform == 0 && s->bits <= 8) {
539 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
540 s->upscale_v[1] = s->upscale_v[2] = 1;
541 s->upscale_h[1] = s->upscale_h[2] = 1;
542 } else if (s->adobe_transform == 2 && s->bits <= 8) {
543 s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
544 s->upscale_v[1] = s->upscale_v[2] = 1;
545 s->upscale_h[1] = s->upscale_h[2] = 1;
546 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
548 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
549 else s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
550 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
552 av_assert0(s->nb_components == 4);
558 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
561 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
566 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
569 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
581 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
583 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
590 if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
591 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
594 s->upscale_v[0] = s->upscale_v[1] = 1;
596 if (pix_fmt_id == 0x14111100)
597 s->upscale_v[1] = s->upscale_v[2] = 1;
598 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
601 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
605 if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
606 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
609 s->upscale_h[0] = s->upscale_h[1] = 1;
611 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
612 else s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
613 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
619 s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
620 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
621 s->upscale_h[1] = s->upscale_h[2] = 2;
625 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
628 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
634 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
635 else s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
636 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
637 if (pix_fmt_id == 0x42111100) {
640 s->upscale_h[1] = s->upscale_h[2] = 1;
641 } else if (pix_fmt_id == 0x24111100) {
644 s->upscale_v[1] = s->upscale_v[2] = 1;
645 } else if (pix_fmt_id == 0x23111100) {
648 s->upscale_v[1] = s->upscale_v[2] = 2;
652 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
655 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
659 avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
660 memset(s->upscale_h, 0, sizeof(s->upscale_h));
661 memset(s->upscale_v, 0, sizeof(s->upscale_v));
662 return AVERROR_PATCHWELCOME;
664 if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
665 avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
666 return AVERROR_PATCHWELCOME;
668 if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->progressive && s->avctx->pix_fmt == AV_PIX_FMT_GBRP) {
669 avpriv_report_missing_feature(s->avctx, "progressive for weird subsampling");
670 return AVERROR_PATCHWELCOME;
673 memset(s->upscale_h, 0, sizeof(s->upscale_h));
674 memset(s->upscale_v, 0, sizeof(s->upscale_v));
675 if (s->nb_components == 3) {
676 s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
677 } else if (s->nb_components != 1) {
678 av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
679 return AVERROR_PATCHWELCOME;
680 } else if (s->palette_index && s->bits <= 8)
681 s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
682 else if (s->bits <= 8)
683 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
685 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
688 s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
690 av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
694 if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
695 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
697 enum AVPixelFormat pix_fmts[] = {
698 #if CONFIG_MJPEG_NVDEC_HWACCEL
701 #if CONFIG_MJPEG_VAAPI_HWACCEL
707 s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
708 if (s->hwaccel_pix_fmt < 0)
709 return AVERROR(EINVAL);
711 s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
712 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
715 if (s->avctx->skip_frame == AVDISCARD_ALL) {
716 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
717 s->picture_ptr->key_frame = 1;
722 av_frame_unref(s->picture_ptr);
723 if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0)
725 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
726 s->picture_ptr->key_frame = 1;
729 for (i = 0; i < 4; i++)
730 s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
732 ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
733 s->width, s->height, s->linesize[0], s->linesize[1],
734 s->interlaced, s->avctx->height);
738 if ((s->rgb && !s->lossless && !s->ls) ||
739 (!s->rgb && s->ls && s->nb_components > 1) ||
740 (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 && !s->ls)
742 av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
743 return AVERROR_PATCHWELCOME;
746 /* totally blank picture as progressive JPEG will only add details to it */
747 if (s->progressive) {
748 int bw = (width + s->h_max * 8 - 1) / (s->h_max * 8);
749 int bh = (height + s->v_max * 8 - 1) / (s->v_max * 8);
750 for (i = 0; i < s->nb_components; i++) {
751 int size = bw * bh * s->h_count[i] * s->v_count[i];
752 av_freep(&s->blocks[i]);
753 av_freep(&s->last_nnz[i]);
754 s->blocks[i] = av_mallocz_array(size, sizeof(**s->blocks));
755 s->last_nnz[i] = av_mallocz_array(size, sizeof(**s->last_nnz));
756 if (!s->blocks[i] || !s->last_nnz[i])
757 return AVERROR(ENOMEM);
758 s->block_stride[i] = bw * s->h_count[i];
760 memset(s->coefs_finished, 0, sizeof(s->coefs_finished));
763 if (s->avctx->hwaccel) {
764 s->hwaccel_picture_private =
765 av_mallocz(s->avctx->hwaccel->frame_priv_data_size);
766 if (!s->hwaccel_picture_private)
767 return AVERROR(ENOMEM);
769 ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_image_buffer,
770 s->raw_image_buffer_size);
778 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
781 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
782 if (code < 0 || code > 16) {
783 av_log(s->avctx, AV_LOG_WARNING,
784 "mjpeg_decode_dc: bad vlc: %d:%d (%p)\n",
785 0, dc_index, &s->vlcs[0][dc_index]);
790 return get_xbits(&s->gb, code);
795 /* decode block and dequantize */
796 static int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
797 int dc_index, int ac_index, uint16_t *quant_matrix)
799 int code, i, j, level, val;
802 val = mjpeg_decode_dc(s, dc_index);
803 if (val == 0xfffff) {
804 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
805 return AVERROR_INVALIDDATA;
807 val = val * (unsigned)quant_matrix[0] + s->last_dc[component];
808 val = av_clip_int16(val);
809 s->last_dc[component] = val;
813 {OPEN_READER(re, &s->gb);
815 UPDATE_CACHE(re, &s->gb);
816 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
818 i += ((unsigned)code) >> 4;
821 if (code > MIN_CACHE_BITS - 16)
822 UPDATE_CACHE(re, &s->gb);
825 int cache = GET_CACHE(re, &s->gb);
826 int sign = (~cache) >> 31;
827 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
830 LAST_SKIP_BITS(re, &s->gb, code);
833 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
834 return AVERROR_INVALIDDATA;
836 j = s->scantable.permutated[i];
837 block[j] = level * quant_matrix[i];
840 CLOSE_READER(re, &s->gb);}
845 static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block,
846 int component, int dc_index,
847 uint16_t *quant_matrix, int Al)
850 s->bdsp.clear_block(block);
851 val = mjpeg_decode_dc(s, dc_index);
852 if (val == 0xfffff) {
853 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
854 return AVERROR_INVALIDDATA;
856 val = (val * (quant_matrix[0] << Al)) + s->last_dc[component];
857 s->last_dc[component] = val;
862 /* decode block and dequantize - progressive JPEG version */
863 static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
864 uint8_t *last_nnz, int ac_index,
865 uint16_t *quant_matrix,
866 int ss, int se, int Al, int *EOBRUN)
868 int code, i, j, val, run;
877 OPEN_READER(re, &s->gb);
878 for (i = ss; ; i++) {
879 UPDATE_CACHE(re, &s->gb);
880 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
882 run = ((unsigned) code) >> 4;
886 if (code > MIN_CACHE_BITS - 16)
887 UPDATE_CACHE(re, &s->gb);
890 int cache = GET_CACHE(re, &s->gb);
891 int sign = (~cache) >> 31;
892 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
895 LAST_SKIP_BITS(re, &s->gb, code);
899 j = s->scantable.permutated[se];
900 block[j] = level * (quant_matrix[se] << Al);
903 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
904 return AVERROR_INVALIDDATA;
906 j = s->scantable.permutated[i];
907 block[j] = level * (quant_matrix[i] << Al);
909 if (run == 0xF) {// ZRL - skip 15 coefficients
912 av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
913 return AVERROR_INVALIDDATA;
918 UPDATE_CACHE(re, &s->gb);
919 val += NEG_USR32(GET_CACHE(re, &s->gb), run);
920 LAST_SKIP_BITS(re, &s->gb, run);
927 CLOSE_READER(re, &s->gb);
936 #define REFINE_BIT(j) { \
937 UPDATE_CACHE(re, &s->gb); \
938 sign = block[j] >> 15; \
939 block[j] += SHOW_UBITS(re, &s->gb, 1) * \
940 ((quant_matrix[i] ^ sign) - sign) << Al; \
941 LAST_SKIP_BITS(re, &s->gb, 1); \
949 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
954 j = s->scantable.permutated[i]; \
957 else if (run-- == 0) \
961 /* decode block and dequantize - progressive JPEG refinement pass */
962 static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
964 int ac_index, uint16_t *quant_matrix,
965 int ss, int se, int Al, int *EOBRUN)
967 int code, i = ss, j, sign, val, run;
968 int last = FFMIN(se, *last_nnz);
970 OPEN_READER(re, &s->gb);
975 UPDATE_CACHE(re, &s->gb);
976 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
979 run = ((unsigned) code) >> 4;
980 UPDATE_CACHE(re, &s->gb);
981 val = SHOW_UBITS(re, &s->gb, 1);
982 LAST_SKIP_BITS(re, &s->gb, 1);
984 j = s->scantable.permutated[i];
986 block[j] = ((quant_matrix[i] << Al) ^ val) - val;
990 CLOSE_READER(re, &s->gb);
994 run = ((unsigned) code) >> 4;
1001 UPDATE_CACHE(re, &s->gb);
1002 run += SHOW_UBITS(re, &s->gb, val);
1003 LAST_SKIP_BITS(re, &s->gb, val);
1015 for (; i <= last; i++) {
1016 j = s->scantable.permutated[i];
1020 CLOSE_READER(re, &s->gb);
1027 static int handle_rstn(MJpegDecodeContext *s, int nb_components)
1032 if (s->restart_interval) {
1034 if(s->restart_count == 0 && s->avctx->codec_id == AV_CODEC_ID_THP){
1035 align_get_bits(&s->gb);
1036 for (i = 0; i < nb_components; i++) /* reset dc */
1037 s->last_dc[i] = (4 << s->bits);
1040 i = 8 + ((-get_bits_count(&s->gb)) & 7);
1042 if (s->restart_count == 0) {
1043 if( show_bits(&s->gb, i) == (1 << i) - 1
1044 || show_bits(&s->gb, i) == 0xFF) {
1045 int pos = get_bits_count(&s->gb);
1046 align_get_bits(&s->gb);
1047 while (get_bits_left(&s->gb) >= 8 && show_bits(&s->gb, 8) == 0xFF)
1048 skip_bits(&s->gb, 8);
1049 if (get_bits_left(&s->gb) >= 8 && (get_bits(&s->gb, 8) & 0xF8) == 0xD0) {
1050 for (i = 0; i < nb_components; i++) /* reset dc */
1051 s->last_dc[i] = (4 << s->bits);
1054 skip_bits_long(&s->gb, pos - get_bits_count(&s->gb));
1061 /* Handles 1 to 4 components */
1062 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform)
1066 uint16_t (*buffer)[4];
1067 int left[4], top[4], topleft[4];
1068 const int linesize = s->linesize[0];
1069 const int mask = ((1 << s->bits) - 1) << point_transform;
1070 int resync_mb_y = 0;
1071 int resync_mb_x = 0;
1074 if (s->nb_components <= 0 || s->nb_components > 4)
1075 return AVERROR_INVALIDDATA;
1076 if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
1077 return AVERROR_INVALIDDATA;
1080 s->restart_count = s->restart_interval;
1082 if (s->restart_interval == 0)
1083 s->restart_interval = INT_MAX;
1086 width = s->mb_width / nb_components; /* Interleaved, width stored is the total so need to divide */
1088 width = s->mb_width;
1090 av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, width * 4 * sizeof(s->ljpeg_buffer[0][0]));
1091 if (!s->ljpeg_buffer)
1092 return AVERROR(ENOMEM);
1094 buffer = s->ljpeg_buffer;
1096 for (i = 0; i < 4; i++)
1097 buffer[0][i] = 1 << (s->bits - 1);
1099 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1100 uint8_t *ptr = s->picture_ptr->data[0] + (linesize * mb_y);
1102 if (s->interlaced && s->bottom_field)
1103 ptr += linesize >> 1;
1105 for (i = 0; i < 4; i++)
1106 top[i] = left[i] = topleft[i] = buffer[0][i];
1108 if ((mb_y * s->width) % s->restart_interval == 0) {
1109 for (i = 0; i < 6; i++)
1110 vpred[i] = 1 << (s->bits-1);
1113 for (mb_x = 0; mb_x < width; mb_x++) {
1114 int modified_predictor = predictor;
1116 if (get_bits_left(&s->gb) < 1) {
1117 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in rgb_scan\n");
1118 return AVERROR_INVALIDDATA;
1121 if (s->restart_interval && !s->restart_count){
1122 s->restart_count = s->restart_interval;
1126 top[i] = left[i]= topleft[i]= 1 << (s->bits - 1);
1128 if (mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || !mb_x)
1129 modified_predictor = 1;
1131 for (i=0;i<nb_components;i++) {
1134 topleft[i] = top[i];
1135 top[i] = buffer[mb_x][i];
1137 dc = mjpeg_decode_dc(s, s->dc_index[i]);
1141 if (!s->bayer || mb_x) {
1143 } else { /* This path runs only for the first line in bayer images */
1145 pred = vpred[i] - dc;
1148 PREDICT(pred, topleft[i], top[i], pred, modified_predictor);
1150 left[i] = buffer[mb_x][i] =
1151 mask & (pred + (unsigned)(dc * (1 << point_transform)));
1154 if (s->restart_interval && !--s->restart_count) {
1155 align_get_bits(&s->gb);
1156 skip_bits(&s->gb, 16); /* skip RSTn */
1159 if (s->rct && s->nb_components == 4) {
1160 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1161 ptr[4*mb_x + 2] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1162 ptr[4*mb_x + 1] = buffer[mb_x][1] + ptr[4*mb_x + 2];
1163 ptr[4*mb_x + 3] = buffer[mb_x][2] + ptr[4*mb_x + 2];
1164 ptr[4*mb_x + 0] = buffer[mb_x][3];
1166 } else if (s->nb_components == 4) {
1167 for(i=0; i<nb_components; i++) {
1168 int c= s->comp_index[i];
1170 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1171 ptr[4*mb_x+3-c] = buffer[mb_x][i];
1173 } else if(s->bits == 9) {
1174 return AVERROR_PATCHWELCOME;
1176 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1177 ((uint16_t*)ptr)[4*mb_x+c] = buffer[mb_x][i];
1181 } else if (s->rct) {
1182 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1183 ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1184 ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
1185 ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
1187 } else if (s->pegasus_rct) {
1188 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1189 ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2]) >> 2);
1190 ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
1191 ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
1193 } else if (s->bayer) {
1194 if (nb_components == 1) {
1195 /* Leave decoding to the TIFF/DNG decoder (see comment in ff_mjpeg_decode_sof) */
1196 for (mb_x = 0; mb_x < width; mb_x++)
1197 ((uint16_t*)ptr)[mb_x] = buffer[mb_x][0];
1198 } else if (nb_components == 2) {
1199 for (mb_x = 0; mb_x < width; mb_x++) {
1200 ((uint16_t*)ptr)[2*mb_x + 0] = buffer[mb_x][0];
1201 ((uint16_t*)ptr)[2*mb_x + 1] = buffer[mb_x][1];
1205 for(i=0; i<nb_components; i++) {
1206 int c= s->comp_index[i];
1208 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1209 ptr[3*mb_x+2-c] = buffer[mb_x][i];
1211 } else if(s->bits == 9) {
1212 return AVERROR_PATCHWELCOME;
1214 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1215 ((uint16_t*)ptr)[3*mb_x+2-c] = buffer[mb_x][i];
1224 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor,
1225 int point_transform, int nb_components)
1227 int i, mb_x, mb_y, mask;
1228 int bits= (s->bits+7)&~7;
1229 int resync_mb_y = 0;
1230 int resync_mb_x = 0;
1232 point_transform += bits - s->bits;
1233 mask = ((1 << s->bits) - 1) << point_transform;
1235 av_assert0(nb_components>=1 && nb_components<=4);
1237 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1238 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1239 if (get_bits_left(&s->gb) < 1) {
1240 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in yuv_scan\n");
1241 return AVERROR_INVALIDDATA;
1243 if (s->restart_interval && !s->restart_count){
1244 s->restart_count = s->restart_interval;
1249 if(!mb_x || mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || s->interlaced){
1250 int toprow = mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x;
1251 int leftcol = !mb_x || mb_y == resync_mb_y && mb_x == resync_mb_x;
1252 for (i = 0; i < nb_components; i++) {
1255 int n, h, v, x, y, c, j, linesize;
1256 n = s->nb_blocks[i];
1257 c = s->comp_index[i];
1262 linesize= s->linesize[c];
1264 if(bits>8) linesize /= 2;
1266 for(j=0; j<n; j++) {
1269 dc = mjpeg_decode_dc(s, s->dc_index[i]);
1272 if ( h * mb_x + x >= s->width
1273 || v * mb_y + y >= s->height) {
1275 } else if (bits<=8) {
1276 ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1278 if(x==0 && leftcol){
1279 pred= 1 << (bits - 1);
1284 if(x==0 && leftcol){
1285 pred= ptr[-linesize];
1287 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1291 if (s->interlaced && s->bottom_field)
1292 ptr += linesize >> 1;
1294 *ptr= pred + ((unsigned)dc << point_transform);
1296 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1298 if(x==0 && leftcol){
1299 pred= 1 << (bits - 1);
1304 if(x==0 && leftcol){
1305 pred= ptr16[-linesize];
1307 PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
1311 if (s->interlaced && s->bottom_field)
1312 ptr16 += linesize >> 1;
1314 *ptr16= pred + ((unsigned)dc << point_transform);
1323 for (i = 0; i < nb_components; i++) {
1326 int n, h, v, x, y, c, j, linesize, dc;
1327 n = s->nb_blocks[i];
1328 c = s->comp_index[i];
1333 linesize = s->linesize[c];
1335 if(bits>8) linesize /= 2;
1337 for (j = 0; j < n; j++) {
1340 dc = mjpeg_decode_dc(s, s->dc_index[i]);
1343 if ( h * mb_x + x >= s->width
1344 || v * mb_y + y >= s->height) {
1346 } else if (bits<=8) {
1347 ptr = s->picture_ptr->data[c] +
1348 (linesize * (v * mb_y + y)) +
1349 (h * mb_x + x); //FIXME optimize this crap
1350 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1353 *ptr = pred + ((unsigned)dc << point_transform);
1355 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1356 PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
1359 *ptr16= pred + ((unsigned)dc << point_transform);
1369 if (s->restart_interval && !--s->restart_count) {
1370 align_get_bits(&s->gb);
1371 skip_bits(&s->gb, 16); /* skip RSTn */
1378 static av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s,
1379 uint8_t *dst, const uint8_t *src,
1380 int linesize, int lowres)
1383 case 0: s->hdsp.put_pixels_tab[1][0](dst, src, linesize, 8);
1385 case 1: copy_block4(dst, src, linesize, linesize, 4);
1387 case 2: copy_block2(dst, src, linesize, linesize, 2);
1389 case 3: *dst = *src;
1394 static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
1396 int block_x, block_y;
1397 int size = 8 >> s->avctx->lowres;
1399 for (block_y=0; block_y<size; block_y++)
1400 for (block_x=0; block_x<size; block_x++)
1401 *(uint16_t*)(ptr + 2*block_x + block_y*linesize) <<= 16 - s->bits;
1403 for (block_y=0; block_y<size; block_y++)
1404 for (block_x=0; block_x<size; block_x++)
1405 *(ptr + block_x + block_y*linesize) <<= 8 - s->bits;
1409 static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
1410 int Al, const uint8_t *mb_bitmask,
1411 int mb_bitmask_size,
1412 const AVFrame *reference)
1414 int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height;
1415 uint8_t *data[MAX_COMPONENTS];
1416 const uint8_t *reference_data[MAX_COMPONENTS];
1417 int linesize[MAX_COMPONENTS];
1418 GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1419 int bytes_per_pixel = 1 + (s->bits > 8);
1422 if (mb_bitmask_size != (s->mb_width * s->mb_height + 7)>>3) {
1423 av_log(s->avctx, AV_LOG_ERROR, "mb_bitmask_size mismatches\n");
1424 return AVERROR_INVALIDDATA;
1426 init_get_bits(&mb_bitmask_gb, mb_bitmask, s->mb_width * s->mb_height);
1429 s->restart_count = 0;
1431 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &chroma_h_shift,
1433 chroma_width = AV_CEIL_RSHIFT(s->width, chroma_h_shift);
1434 chroma_height = AV_CEIL_RSHIFT(s->height, chroma_v_shift);
1436 for (i = 0; i < nb_components; i++) {
1437 int c = s->comp_index[i];
1438 data[c] = s->picture_ptr->data[c];
1439 reference_data[c] = reference ? reference->data[c] : NULL;
1440 linesize[c] = s->linesize[c];
1441 s->coefs_finished[c] |= 1;
1444 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1445 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1446 const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);
1448 if (s->restart_interval && !s->restart_count)
1449 s->restart_count = s->restart_interval;
1451 if (get_bits_left(&s->gb) < 0) {
1452 av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1453 -get_bits_left(&s->gb));
1454 return AVERROR_INVALIDDATA;
1456 for (i = 0; i < nb_components; i++) {
1458 int n, h, v, x, y, c, j;
1460 n = s->nb_blocks[i];
1461 c = s->comp_index[i];
1466 for (j = 0; j < n; j++) {
1467 block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1468 (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1470 if (s->interlaced && s->bottom_field)
1471 block_offset += linesize[c] >> 1;
1472 if ( 8*(h * mb_x + x) < ((c == 1) || (c == 2) ? chroma_width : s->width)
1473 && 8*(v * mb_y + y) < ((c == 1) || (c == 2) ? chroma_height : s->height)) {
1474 ptr = data[c] + block_offset;
1477 if (!s->progressive) {
1480 mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1481 linesize[c], s->avctx->lowres);
1484 s->bdsp.clear_block(s->block);
1485 if (decode_block(s, s->block, i,
1486 s->dc_index[i], s->ac_index[i],
1487 s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1488 av_log(s->avctx, AV_LOG_ERROR,
1489 "error y=%d x=%d\n", mb_y, mb_x);
1490 return AVERROR_INVALIDDATA;
1493 s->idsp.idct_put(ptr, linesize[c], s->block);
1495 shift_output(s, ptr, linesize[c]);
1499 int block_idx = s->block_stride[c] * (v * mb_y + y) +
1501 int16_t *block = s->blocks[c][block_idx];
1503 block[0] += get_bits1(&s->gb) *
1504 s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1505 else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1506 s->quant_matrixes[s->quant_sindex[i]],
1508 av_log(s->avctx, AV_LOG_ERROR,
1509 "error y=%d x=%d\n", mb_y, mb_x);
1510 return AVERROR_INVALIDDATA;
1513 ff_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
1514 ff_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
1515 mb_x, mb_y, x, y, c, s->bottom_field,
1516 (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1524 handle_rstn(s, nb_components);
1530 static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
1531 int se, int Ah, int Al)
1535 int c = s->comp_index[0];
1536 uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1538 av_assert0(ss>=0 && Ah>=0 && Al>=0);
1539 if (se < ss || se > 63) {
1540 av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", ss, se);
1541 return AVERROR_INVALIDDATA;
1544 // s->coefs_finished is a bitmask for coefficients coded
1545 // ss and se are parameters telling start and end coefficients
1546 s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss);
1548 s->restart_count = 0;
1550 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1551 int block_idx = mb_y * s->block_stride[c];
1552 int16_t (*block)[64] = &s->blocks[c][block_idx];
1553 uint8_t *last_nnz = &s->last_nnz[c][block_idx];
1554 if (get_bits_left(&s->gb) <= 0) {
1555 av_log(s->avctx, AV_LOG_ERROR, "bitstream truncated in mjpeg_decode_scan_progressive_ac\n");
1556 return AVERROR_INVALIDDATA;
1558 for (mb_x = 0; mb_x < s->mb_width; mb_x++, block++, last_nnz++) {
1560 if (s->restart_interval && !s->restart_count)
1561 s->restart_count = s->restart_interval;
1564 ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
1565 quant_matrix, ss, se, Al, &EOBRUN);
1567 ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
1568 quant_matrix, ss, se, Al, &EOBRUN);
1570 av_log(s->avctx, AV_LOG_ERROR,
1571 "error y=%d x=%d\n", mb_y, mb_x);
1572 return AVERROR_INVALIDDATA;
1575 if (handle_rstn(s, 0))
1582 static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
1586 const int bytes_per_pixel = 1 + (s->bits > 8);
1587 const int block_size = s->lossless ? 1 : 8;
1589 for (c = 0; c < s->nb_components; c++) {
1590 uint8_t *data = s->picture_ptr->data[c];
1591 int linesize = s->linesize[c];
1592 int h = s->h_max / s->h_count[c];
1593 int v = s->v_max / s->v_count[c];
1594 int mb_width = (s->width + h * block_size - 1) / (h * block_size);
1595 int mb_height = (s->height + v * block_size - 1) / (v * block_size);
1597 if (~s->coefs_finished[c])
1598 av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
1600 if (s->interlaced && s->bottom_field)
1601 data += linesize >> 1;
1603 for (mb_y = 0; mb_y < mb_height; mb_y++) {
1604 uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
1605 int block_idx = mb_y * s->block_stride[c];
1606 int16_t (*block)[64] = &s->blocks[c][block_idx];
1607 for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
1608 s->idsp.idct_put(ptr, linesize, *block);
1610 shift_output(s, ptr, linesize);
1611 ptr += bytes_per_pixel*8 >> s->avctx->lowres;
1617 int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
1618 int mb_bitmask_size, const AVFrame *reference)
1620 int len, nb_components, i, h, v, predictor, point_transform;
1622 const int block_size = s->lossless ? 1 : 8;
1623 int ilv, prev_shift;
1625 if (!s->got_picture) {
1626 av_log(s->avctx, AV_LOG_WARNING,
1627 "Can not process SOS before SOF, skipping\n");
1632 if (reference->width != s->picture_ptr->width ||
1633 reference->height != s->picture_ptr->height ||
1634 reference->format != s->picture_ptr->format) {
1635 av_log(s->avctx, AV_LOG_ERROR, "Reference mismatching\n");
1636 return AVERROR_INVALIDDATA;
1640 /* XXX: verify len field validity */
1641 len = get_bits(&s->gb, 16);
1642 nb_components = get_bits(&s->gb, 8);
1643 if (nb_components == 0 || nb_components > MAX_COMPONENTS) {
1644 avpriv_report_missing_feature(s->avctx,
1645 "decode_sos: nb_components (%d)",
1647 return AVERROR_PATCHWELCOME;
1649 if (len != 6 + 2 * nb_components) {
1650 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1651 return AVERROR_INVALIDDATA;
1653 for (i = 0; i < nb_components; i++) {
1654 id = get_bits(&s->gb, 8) - 1;
1655 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1656 /* find component index */
1657 for (index = 0; index < s->nb_components; index++)
1658 if (id == s->component_id[index])
1660 if (index == s->nb_components) {
1661 av_log(s->avctx, AV_LOG_ERROR,
1662 "decode_sos: index(%d) out of components\n", index);
1663 return AVERROR_INVALIDDATA;
1665 /* Metasoft MJPEG codec has Cb and Cr swapped */
1666 if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1667 && nb_components == 3 && s->nb_components == 3 && i)
1670 s->quant_sindex[i] = s->quant_index[index];
1671 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1672 s->h_scount[i] = s->h_count[index];
1673 s->v_scount[i] = s->v_count[index];
1675 if((nb_components == 1 || nb_components == 3) && s->nb_components == 3 && s->avctx->pix_fmt == AV_PIX_FMT_GBR24P)
1676 index = (index+2)%3;
1678 s->comp_index[i] = index;
1680 s->dc_index[i] = get_bits(&s->gb, 4);
1681 s->ac_index[i] = get_bits(&s->gb, 4);
1683 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1684 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1686 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))
1690 predictor = get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
1691 ilv = get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */
1692 if(s->avctx->codec_tag != AV_RL32("CJPG")){
1693 prev_shift = get_bits(&s->gb, 4); /* Ah */
1694 point_transform = get_bits(&s->gb, 4); /* Al */
1696 prev_shift = point_transform = 0;
1698 if (nb_components > 1) {
1699 /* interleaved stream */
1700 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1701 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1702 } else if (!s->ls) { /* skip this for JPEG-LS */
1703 h = s->h_max / s->h_scount[0];
1704 v = s->v_max / s->v_scount[0];
1705 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1706 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1707 s->nb_blocks[0] = 1;
1712 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1713 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
1714 s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1715 predictor, point_transform, ilv, s->bits, s->mjpb_skiptosod,
1716 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), nb_components);
1719 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1720 for (i = s->mjpb_skiptosod; i > 0; i--)
1721 skip_bits(&s->gb, 8);
1724 for (i = 0; i < nb_components; i++)
1725 s->last_dc[i] = (4 << s->bits);
1727 if (s->avctx->hwaccel) {
1728 int bytes_to_start = get_bits_count(&s->gb) / 8;
1729 av_assert0(bytes_to_start >= 0 &&
1730 s->raw_scan_buffer_size >= bytes_to_start);
1732 ret = s->avctx->hwaccel->decode_slice(s->avctx,
1733 s->raw_scan_buffer + bytes_to_start,
1734 s->raw_scan_buffer_size - bytes_to_start);
1738 } else if (s->lossless) {
1739 av_assert0(s->picture_ptr == s->picture);
1740 if (CONFIG_JPEGLS_DECODER && s->ls) {
1742 // reset_ls_coding_parameters(s, 0);
1744 if ((ret = ff_jpegls_decode_picture(s, predictor,
1745 point_transform, ilv)) < 0)
1748 if (s->rgb || s->bayer) {
1749 if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0)
1752 if ((ret = ljpeg_decode_yuv_scan(s, predictor,
1754 nb_components)) < 0)
1759 if (s->progressive && predictor) {
1760 av_assert0(s->picture_ptr == s->picture);
1761 if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor,
1763 point_transform)) < 0)
1766 if ((ret = mjpeg_decode_scan(s, nb_components,
1767 prev_shift, point_transform,
1768 mb_bitmask, mb_bitmask_size, reference)) < 0)
1773 if (s->interlaced &&
1774 get_bits_left(&s->gb) > 32 &&
1775 show_bits(&s->gb, 8) == 0xFF) {
1776 GetBitContext bak = s->gb;
1777 align_get_bits(&bak);
1778 if (show_bits(&bak, 16) == 0xFFD1) {
1779 av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1781 skip_bits(&s->gb, 16);
1782 s->bottom_field ^= 1;
1791 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1792 return AVERROR_INVALIDDATA;
1795 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1797 if (get_bits(&s->gb, 16) != 4)
1798 return AVERROR_INVALIDDATA;
1799 s->restart_interval = get_bits(&s->gb, 16);
1800 s->restart_count = 0;
1801 av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
1802 s->restart_interval);
1807 static int mjpeg_decode_app(MJpegDecodeContext *s)
1811 len = get_bits(&s->gb, 16);
1814 // Pentax K-1 (digital camera) JPEG images embedded in DNG images contain unknown APP0 markers
1815 av_log(s->avctx, AV_LOG_WARNING, "skipping APPx (len=%"PRId32") for bayer-encoded image\n", len);
1816 skip_bits(&s->gb, len);
1819 return AVERROR_INVALIDDATA;
1821 if (8 * len > get_bits_left(&s->gb))
1822 return AVERROR_INVALIDDATA;
1824 id = get_bits_long(&s->gb, 32);
1827 if (s->avctx->debug & FF_DEBUG_STARTCODE)
1828 av_log(s->avctx, AV_LOG_DEBUG, "APPx (%s / %8X) len=%d\n",
1829 av_fourcc2str(av_bswap32(id)), id, len);
1831 /* Buggy AVID, it puts EOI only at every 10th frame. */
1832 /* Also, this fourcc is used by non-avid files too, it holds some
1833 information, but it's always present in AVID-created files. */
1834 if (id == AV_RB32("AVI1")) {
1840 4bytes field_size_less_padding
1843 i = get_bits(&s->gb, 8); len--;
1844 av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i);
1848 if (id == AV_RB32("JFIF")) {
1849 int t_w, t_h, v1, v2;
1852 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1853 v1 = get_bits(&s->gb, 8);
1854 v2 = get_bits(&s->gb, 8);
1855 skip_bits(&s->gb, 8);
1857 s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 16);
1858 s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 16);
1859 if ( s->avctx->sample_aspect_ratio.num <= 0
1860 || s->avctx->sample_aspect_ratio.den <= 0) {
1861 s->avctx->sample_aspect_ratio.num = 0;
1862 s->avctx->sample_aspect_ratio.den = 1;
1865 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1866 av_log(s->avctx, AV_LOG_INFO,
1867 "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1869 s->avctx->sample_aspect_ratio.num,
1870 s->avctx->sample_aspect_ratio.den);
1874 t_w = get_bits(&s->gb, 8);
1875 t_h = get_bits(&s->gb, 8);
1877 /* skip thumbnail */
1878 if (len -10 - (t_w * t_h * 3) > 0)
1879 len -= t_w * t_h * 3;
1886 if ( id == AV_RB32("Adob")
1888 && show_bits(&s->gb, 8) == 'e'
1889 && show_bits_long(&s->gb, 32) != AV_RB32("e_CM")) {
1890 skip_bits(&s->gb, 8); /* 'e' */
1891 skip_bits(&s->gb, 16); /* version */
1892 skip_bits(&s->gb, 16); /* flags0 */
1893 skip_bits(&s->gb, 16); /* flags1 */
1894 s->adobe_transform = get_bits(&s->gb, 8);
1895 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1896 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform);
1901 if (id == AV_RB32("LJIF")) {
1903 int pegasus_rct = s->pegasus_rct;
1904 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1905 av_log(s->avctx, AV_LOG_INFO,
1906 "Pegasus lossless jpeg header found\n");
1907 skip_bits(&s->gb, 16); /* version ? */
1908 skip_bits(&s->gb, 16); /* unknown always 0? */
1909 skip_bits(&s->gb, 16); /* unknown always 0? */
1910 skip_bits(&s->gb, 16); /* unknown always 0? */
1911 switch (i=get_bits(&s->gb, 8)) {
1921 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace %d\n", i);
1926 if (rgb != s->rgb || pegasus_rct != s->pegasus_rct) {
1927 av_log(s->avctx, AV_LOG_WARNING, "Mismatching LJIF tag\n");
1932 s->pegasus_rct = pegasus_rct;
1936 if (id == AV_RL32("colr") && len > 0) {
1937 s->colr = get_bits(&s->gb, 8);
1938 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1939 av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr);
1943 if (id == AV_RL32("xfrm") && len > 0) {
1944 s->xfrm = get_bits(&s->gb, 8);
1945 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1946 av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm);
1951 /* JPS extension by VRex */
1952 if (s->start_code == APP3 && id == AV_RB32("_JPS") && len >= 10) {
1953 int flags, layout, type;
1954 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1955 av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n");
1957 skip_bits(&s->gb, 32); len -= 4; /* JPS_ */
1958 skip_bits(&s->gb, 16); len -= 2; /* block length */
1959 skip_bits(&s->gb, 8); /* reserved */
1960 flags = get_bits(&s->gb, 8);
1961 layout = get_bits(&s->gb, 8);
1962 type = get_bits(&s->gb, 8);
1965 av_freep(&s->stereo3d);
1966 s->stereo3d = av_stereo3d_alloc();
1971 s->stereo3d->type = AV_STEREO3D_2D;
1972 } else if (type == 1) {
1975 s->stereo3d->type = AV_STEREO3D_LINES;
1978 s->stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
1981 s->stereo3d->type = AV_STEREO3D_TOPBOTTOM;
1984 if (!(flags & 0x04)) {
1985 s->stereo3d->flags = AV_STEREO3D_FLAG_INVERT;
1992 if (s->start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
1993 GetByteContext gbytes;
1994 int ret, le, ifd_offset, bytes_read;
1995 const uint8_t *aligned;
1997 skip_bits(&s->gb, 16); // skip padding
2000 // init byte wise reading
2001 aligned = align_get_bits(&s->gb);
2002 bytestream2_init(&gbytes, aligned, len);
2005 ret = ff_tdecode_header(&gbytes, &le, &ifd_offset);
2007 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: invalid TIFF header in EXIF data\n");
2009 bytestream2_seek(&gbytes, ifd_offset, SEEK_SET);
2011 // read 0th IFD and store the metadata
2012 // (return values > 0 indicate the presence of subimage metadata)
2013 ret = ff_exif_decode_ifd(s->avctx, &gbytes, le, 0, &s->exif_metadata);
2015 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error decoding EXIF data\n");
2019 bytes_read = bytestream2_tell(&gbytes);
2020 skip_bits(&s->gb, bytes_read << 3);
2027 if ((s->start_code == APP1) && (len > (0x28 - 8))) {
2028 id = get_bits_long(&s->gb, 32);
2031 if (id == AV_RB32("mjpg")) {
2034 4bytes pad field size
2042 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2043 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
2047 if (s->start_code == APP2 && id == AV_RB32("ICC_") && len >= 10) {
2050 unsigned nummarkers;
2052 id = get_bits_long(&s->gb, 32);
2053 id2 = get_bits_long(&s->gb, 24);
2055 if (id != AV_RB32("PROF") || id2 != AV_RB24("ILE")) {
2056 av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n");
2060 skip_bits(&s->gb, 8);
2061 seqno = get_bits(&s->gb, 8);
2064 av_log(s->avctx, AV_LOG_WARNING, "Invalid sequence number in APP2\n");
2068 nummarkers = get_bits(&s->gb, 8);
2070 if (nummarkers == 0) {
2071 av_log(s->avctx, AV_LOG_WARNING, "Invalid number of markers coded in APP2\n");
2073 } else if (s->iccnum != 0 && nummarkers != s->iccnum) {
2074 av_log(s->avctx, AV_LOG_WARNING, "Mistmatch in coded number of ICC markers between markers\n");
2076 } else if (seqno > nummarkers) {
2077 av_log(s->avctx, AV_LOG_WARNING, "Mismatching sequence number and coded number of ICC markers\n");
2081 /* Allocate if this is the first APP2 we've seen. */
2082 if (s->iccnum == 0) {
2083 s->iccdata = av_mallocz(nummarkers * sizeof(*(s->iccdata)));
2084 s->iccdatalens = av_mallocz(nummarkers * sizeof(*(s->iccdatalens)));
2085 if (!s->iccdata || !s->iccdatalens) {
2086 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data arrays\n");
2087 return AVERROR(ENOMEM);
2089 s->iccnum = nummarkers;
2092 if (s->iccdata[seqno - 1]) {
2093 av_log(s->avctx, AV_LOG_WARNING, "Duplicate ICC sequence number\n");
2097 s->iccdatalens[seqno - 1] = len;
2098 s->iccdata[seqno - 1] = av_malloc(len);
2099 if (!s->iccdata[seqno - 1]) {
2100 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data buffer\n");
2101 return AVERROR(ENOMEM);
2104 memcpy(s->iccdata[seqno - 1], align_get_bits(&s->gb), len);
2105 skip_bits(&s->gb, len << 3);
2109 if (s->iccread > s->iccnum)
2110 av_log(s->avctx, AV_LOG_WARNING, "Read more ICC markers than are supposed to be coded\n");
2114 /* slow but needed for extreme adobe jpegs */
2116 av_log(s->avctx, AV_LOG_ERROR,
2117 "mjpeg: error, decode_app parser read over the end\n");
2119 skip_bits(&s->gb, 8);
2124 static int mjpeg_decode_com(MJpegDecodeContext *s)
2126 int len = get_bits(&s->gb, 16);
2127 if (len >= 2 && 8 * len - 16 <= get_bits_left(&s->gb)) {
2129 char *cbuf = av_malloc(len - 1);
2131 return AVERROR(ENOMEM);
2133 for (i = 0; i < len - 2; i++)
2134 cbuf[i] = get_bits(&s->gb, 8);
2135 if (i > 0 && cbuf[i - 1] == '\n')
2140 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2141 av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf);
2143 /* buggy avid, it puts EOI only at every 10th frame */
2144 if (!strncmp(cbuf, "AVID", 4)) {
2145 parse_avid(s, cbuf, len);
2146 } else if (!strcmp(cbuf, "CS=ITU601"))
2148 else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) ||
2149 (!strncmp(cbuf, "Metasoft MJPEG Codec", 20)))
2151 else if (!strcmp(cbuf, "MULTISCOPE II")) {
2152 s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 };
2162 /* return the 8 bit start code value and update the search
2163 state. Return -1 if no start code found */
2164 static int find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
2166 const uint8_t *buf_ptr;
2171 buf_ptr = *pbuf_ptr;
2172 while (buf_end - buf_ptr > 1) {
2175 if ((v == 0xff) && (v2 >= SOF0) && (v2 <= COM) && buf_ptr < buf_end) {
2184 ff_dlog(NULL, "find_marker skipped %d bytes\n", skipped);
2185 *pbuf_ptr = buf_ptr;
2189 int ff_mjpeg_find_marker(MJpegDecodeContext *s,
2190 const uint8_t **buf_ptr, const uint8_t *buf_end,
2191 const uint8_t **unescaped_buf_ptr,
2192 int *unescaped_buf_size)
2195 start_code = find_marker(buf_ptr, buf_end);
2197 av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - *buf_ptr);
2199 return AVERROR(ENOMEM);
2201 /* unescape buffer of SOS, use special treatment for JPEG-LS */
2202 if (start_code == SOS && !s->ls) {
2203 const uint8_t *src = *buf_ptr;
2204 const uint8_t *ptr = src;
2205 uint8_t *dst = s->buffer;
2207 #define copy_data_segment(skip) do { \
2208 ptrdiff_t length = (ptr - src) - (skip); \
2210 memcpy(dst, src, length); \
2216 if (s->avctx->codec_id == AV_CODEC_ID_THP) {
2218 copy_data_segment(0);
2220 while (ptr < buf_end) {
2221 uint8_t x = *(ptr++);
2225 while (ptr < buf_end && x == 0xff) {
2230 /* 0xFF, 0xFF, ... */
2232 copy_data_segment(skip);
2234 /* decrement src as it is equal to ptr after the
2235 * copy_data_segment macro and we might want to
2236 * copy the current value of x later on */
2240 if (x < RST0 || x > RST7) {
2241 copy_data_segment(1);
2248 copy_data_segment(0);
2250 #undef copy_data_segment
2252 *unescaped_buf_ptr = s->buffer;
2253 *unescaped_buf_size = dst - s->buffer;
2254 memset(s->buffer + *unescaped_buf_size, 0,
2255 AV_INPUT_BUFFER_PADDING_SIZE);
2257 av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %"PTRDIFF_SPECIFIER" bytes\n",
2258 (buf_end - *buf_ptr) - (dst - s->buffer));
2259 } else if (start_code == SOS && s->ls) {
2260 const uint8_t *src = *buf_ptr;
2261 uint8_t *dst = s->buffer;
2267 while (src + t < buf_end) {
2268 uint8_t x = src[t++];
2270 while ((src + t < buf_end) && x == 0xff)
2279 init_put_bits(&pb, dst, t);
2281 /* unescape bitstream */
2283 uint8_t x = src[b++];
2284 put_bits(&pb, 8, x);
2285 if (x == 0xFF && b < t) {
2288 av_log(s->avctx, AV_LOG_WARNING, "Invalid escape sequence\n");
2291 put_bits(&pb, 7, x);
2295 flush_put_bits(&pb);
2297 *unescaped_buf_ptr = dst;
2298 *unescaped_buf_size = (bit_count + 7) >> 3;
2299 memset(s->buffer + *unescaped_buf_size, 0,
2300 AV_INPUT_BUFFER_PADDING_SIZE);
2302 *unescaped_buf_ptr = *buf_ptr;
2303 *unescaped_buf_size = buf_end - *buf_ptr;
2309 static void reset_icc_profile(MJpegDecodeContext *s)
2314 for (i = 0; i < s->iccnum; i++)
2315 av_freep(&s->iccdata[i]);
2316 av_freep(&s->iccdata);
2317 av_freep(&s->iccdatalens);
2323 int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
2326 AVFrame *frame = data;
2327 const uint8_t *buf = avpkt->data;
2328 int buf_size = avpkt->size;
2329 MJpegDecodeContext *s = avctx->priv_data;
2330 const uint8_t *buf_end, *buf_ptr;
2331 const uint8_t *unescaped_buf_ptr;
2333 int unescaped_buf_size;
2339 s->buf_size = buf_size;
2341 av_dict_free(&s->exif_metadata);
2342 av_freep(&s->stereo3d);
2343 s->adobe_transform = -1;
2346 reset_icc_profile(s);
2349 buf_end = buf + buf_size;
2350 while (buf_ptr < buf_end) {
2351 /* find start next marker */
2352 start_code = ff_mjpeg_find_marker(s, &buf_ptr, buf_end,
2354 &unescaped_buf_size);
2356 if (start_code < 0) {
2358 } else if (unescaped_buf_size > INT_MAX / 8) {
2359 av_log(avctx, AV_LOG_ERROR,
2360 "MJPEG packet 0x%x too big (%d/%d), corrupt data?\n",
2361 start_code, unescaped_buf_size, buf_size);
2362 return AVERROR_INVALIDDATA;
2364 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%"PTRDIFF_SPECIFIER"\n",
2365 start_code, buf_end - buf_ptr);
2367 ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2370 av_log(avctx, AV_LOG_ERROR, "invalid buffer\n");
2374 s->start_code = start_code;
2375 if (s->avctx->debug & FF_DEBUG_STARTCODE)
2376 av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
2378 /* process markers */
2379 if (start_code >= RST0 && start_code <= RST7) {
2380 av_log(avctx, AV_LOG_DEBUG,
2381 "restart marker: %d\n", start_code & 0x0f);
2383 } else if (start_code >= APP0 && start_code <= APP15) {
2384 if ((ret = mjpeg_decode_app(s)) < 0)
2385 av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
2388 } else if (start_code == COM) {
2389 ret = mjpeg_decode_com(s);
2392 } else if (start_code == DQT) {
2393 ret = ff_mjpeg_decode_dqt(s);
2400 if (!CONFIG_JPEGLS_DECODER &&
2401 (start_code == SOF48 || start_code == LSE)) {
2402 av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n");
2403 return AVERROR(ENOSYS);
2406 if (avctx->skip_frame == AVDISCARD_ALL) {
2407 switch(start_code) {
2422 switch (start_code) {
2424 s->restart_interval = 0;
2425 s->restart_count = 0;
2426 s->raw_image_buffer = buf_ptr;
2427 s->raw_image_buffer_size = buf_end - buf_ptr;
2428 /* nothing to do on SOI */
2431 if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
2432 av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2438 if (start_code == SOF0)
2439 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2441 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2445 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2449 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT;
2453 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2457 s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS;
2458 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2462 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2466 s->avctx->profile = FF_PROFILE_MJPEG_JPEG_LS;
2467 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2471 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2475 if (!CONFIG_JPEGLS_DECODER ||
2476 (ret = ff_jpegls_decode_lse(s)) < 0)
2481 if (!avctx->hwaccel && avctx->skip_frame != AVDISCARD_ALL &&
2482 s->progressive && s->cur_scan && s->got_picture)
2483 mjpeg_idct_scan_progressive_ac(s);
2485 if (!s->got_picture) {
2486 av_log(avctx, AV_LOG_WARNING,
2487 "Found EOI before any SOF, ignoring\n");
2490 if (s->interlaced) {
2491 s->bottom_field ^= 1;
2492 /* if not bottom field, do not output image yet */
2493 if (s->bottom_field == !s->interlace_polarity)
2496 if (avctx->skip_frame == AVDISCARD_ALL) {
2498 goto the_end_no_picture;
2500 if (s->avctx->hwaccel) {
2501 ret = s->avctx->hwaccel->end_frame(s->avctx);
2505 av_freep(&s->hwaccel_picture_private);
2507 if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2513 int qp = FFMAX3(s->qscale[0],
2516 int qpw = (s->width + 15) / 16;
2517 AVBufferRef *qp_table_buf = av_buffer_alloc(qpw);
2519 memset(qp_table_buf->data, qp, qpw);
2520 av_frame_set_qp_table(data, qp_table_buf, 0, FF_QSCALE_TYPE_MPEG1);
2523 if(avctx->debug & FF_DEBUG_QP)
2524 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2529 s->raw_scan_buffer = buf_ptr;
2530 s->raw_scan_buffer_size = buf_end - buf_ptr;
2533 if (avctx->skip_frame == AVDISCARD_ALL) {
2534 skip_bits(&s->gb, get_bits_left(&s->gb));
2538 if ((ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL)) < 0 &&
2539 (avctx->err_recognition & AV_EF_EXPLODE))
2543 if ((ret = mjpeg_decode_dri(s)) < 0)
2556 av_log(avctx, AV_LOG_ERROR,
2557 "mjpeg: unsupported coding type (%x)\n", start_code);
2562 /* eof process start code */
2563 buf_ptr += (get_bits_count(&s->gb) + 7) / 8;
2564 av_log(avctx, AV_LOG_DEBUG,
2565 "marker parser used %d bytes (%d bits)\n",
2566 (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb));
2568 if (s->got_picture && s->cur_scan) {
2569 av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
2572 av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2573 return AVERROR_INVALIDDATA;
2579 is16bit = av_pix_fmt_desc_get(s->avctx->pix_fmt)->comp[0].step > 1;
2581 if (AV_RB32(s->upscale_h)) {
2583 av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2584 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2585 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2586 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2587 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2588 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2589 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2590 avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2591 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2592 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2593 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2594 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2596 ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2600 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2601 for (p = 0; p<s->nb_components; p++) {
2602 uint8_t *line = s->picture_ptr->data[p];
2605 if (!s->upscale_h[p])
2608 w = AV_CEIL_RSHIFT(w, hshift);
2609 h = AV_CEIL_RSHIFT(h, vshift);
2611 if (s->upscale_v[p] == 1)
2614 for (i = 0; i < h; i++) {
2615 if (s->upscale_h[p] == 1) {
2616 if (is16bit) ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 2];
2617 else line[w - 1] = line[(w - 1) / 2];
2618 for (index = w - 2; index > 0; index--) {
2620 ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
2622 line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
2624 } else if (s->upscale_h[p] == 2) {
2626 ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 3];
2628 ((uint16_t*)line)[w - 2] = ((uint16_t*)line)[w - 1];
2630 line[w - 1] = line[(w - 1) / 3];
2632 line[w - 2] = line[w - 1];
2634 for (index = w - 3; index > 0; index--) {
2635 line[index] = (line[index / 3] + line[(index + 1) / 3] + line[(index + 2) / 3] + 1) / 3;
2638 line += s->linesize[p];
2642 if (AV_RB32(s->upscale_v)) {
2644 av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2645 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2646 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2647 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2648 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2649 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2650 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2651 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2652 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2653 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2654 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2655 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2656 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2658 ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2662 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2663 for (p = 0; p < s->nb_components; p++) {
2667 if (!s->upscale_v[p])
2670 w = AV_CEIL_RSHIFT(w, hshift);
2671 h = AV_CEIL_RSHIFT(h, vshift);
2673 dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
2674 for (i = h - 1; i; i--) {
2675 uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2676 uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2677 if (s->upscale_v[p] != 2 && (src1 == src2 || i == h - 1)) {
2678 memcpy(dst, src1, w);
2680 for (index = 0; index < w; index++)
2681 dst[index] = (src1[index] + src2[index]) >> 1;
2683 dst -= s->linesize[p];
2687 if (s->flipped && !s->rgb) {
2689 ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2693 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2694 for (index=0; index<s->nb_components; index++) {
2695 uint8_t *dst = s->picture_ptr->data[index];
2696 int w = s->picture_ptr->width;
2697 int h = s->picture_ptr->height;
2698 if(index && index<3){
2699 w = AV_CEIL_RSHIFT(w, hshift);
2700 h = AV_CEIL_RSHIFT(h, vshift);
2703 uint8_t *dst2 = dst + s->picture_ptr->linesize[index]*(h-1);
2704 for (i=0; i<h/2; i++) {
2706 FFSWAP(int, dst[j], dst2[j]);
2707 dst += s->picture_ptr->linesize[index];
2708 dst2 -= s->picture_ptr->linesize[index];
2713 if (s->adobe_transform == 0 && s->avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
2714 int w = s->picture_ptr->width;
2715 int h = s->picture_ptr->height;
2716 av_assert0(s->nb_components == 4);
2717 for (i=0; i<h; i++) {
2720 for (index=0; index<4; index++) {
2721 dst[index] = s->picture_ptr->data[index]
2722 + s->picture_ptr->linesize[index]*i;
2724 for (j=0; j<w; j++) {
2726 int r = dst[0][j] * k;
2727 int g = dst[1][j] * k;
2728 int b = dst[2][j] * k;
2729 dst[0][j] = g*257 >> 16;
2730 dst[1][j] = b*257 >> 16;
2731 dst[2][j] = r*257 >> 16;
2736 if (s->adobe_transform == 2 && s->avctx->pix_fmt == AV_PIX_FMT_YUVA444P) {
2737 int w = s->picture_ptr->width;
2738 int h = s->picture_ptr->height;
2739 av_assert0(s->nb_components == 4);
2740 for (i=0; i<h; i++) {
2743 for (index=0; index<4; index++) {
2744 dst[index] = s->picture_ptr->data[index]
2745 + s->picture_ptr->linesize[index]*i;
2747 for (j=0; j<w; j++) {
2749 int r = (255 - dst[0][j]) * k;
2750 int g = (128 - dst[1][j]) * k;
2751 int b = (128 - dst[2][j]) * k;
2752 dst[0][j] = r*257 >> 16;
2753 dst[1][j] = (g*257 >> 16) + 128;
2754 dst[2][j] = (b*257 >> 16) + 128;
2761 AVStereo3D *stereo = av_stereo3d_create_side_data(data);
2763 stereo->type = s->stereo3d->type;
2764 stereo->flags = s->stereo3d->flags;
2766 av_freep(&s->stereo3d);
2769 if (s->iccnum != 0 && s->iccnum == s->iccread) {
2770 AVFrameSideData *sd;
2775 /* Sum size of all parts. */
2776 for (i = 0; i < s->iccnum; i++)
2777 total_size += s->iccdatalens[i];
2779 sd = av_frame_new_side_data(data, AV_FRAME_DATA_ICC_PROFILE, total_size);
2781 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2782 return AVERROR(ENOMEM);
2785 /* Reassemble the parts, which are now in-order. */
2786 for (i = 0; i < s->iccnum; i++) {
2787 memcpy(sd->data + offset, s->iccdata[i], s->iccdatalens[i]);
2788 offset += s->iccdatalens[i];
2792 av_dict_copy(&((AVFrame *) data)->metadata, s->exif_metadata, 0);
2793 av_dict_free(&s->exif_metadata);
2796 av_log(avctx, AV_LOG_DEBUG, "decode frame unused %"PTRDIFF_SPECIFIER" bytes\n",
2798 // return buf_end - buf_ptr;
2799 return buf_ptr - buf;
2802 av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2804 MJpegDecodeContext *s = avctx->priv_data;
2807 if (s->interlaced && s->bottom_field == !s->interlace_polarity && s->got_picture && !avctx->frame_number) {
2808 av_log(avctx, AV_LOG_INFO, "Single field\n");
2812 av_frame_free(&s->picture);
2813 s->picture_ptr = NULL;
2814 } else if (s->picture_ptr)
2815 av_frame_unref(s->picture_ptr);
2817 av_freep(&s->buffer);
2818 av_freep(&s->stereo3d);
2819 av_freep(&s->ljpeg_buffer);
2820 s->ljpeg_buffer_size = 0;
2822 for (i = 0; i < 3; i++) {
2823 for (j = 0; j < 4; j++)
2824 ff_free_vlc(&s->vlcs[i][j]);
2826 for (i = 0; i < MAX_COMPONENTS; i++) {
2827 av_freep(&s->blocks[i]);
2828 av_freep(&s->last_nnz[i]);
2830 av_dict_free(&s->exif_metadata);
2832 reset_icc_profile(s);
2834 av_freep(&s->hwaccel_picture_private);
2839 static void decode_flush(AVCodecContext *avctx)
2841 MJpegDecodeContext *s = avctx->priv_data;
2845 #if CONFIG_MJPEG_DECODER
2846 #define OFFSET(x) offsetof(MJpegDecodeContext, x)
2847 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2848 static const AVOption options[] = {
2849 { "extern_huff", "Use external huffman table.",
2850 OFFSET(extern_huff), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
2854 static const AVClass mjpegdec_class = {
2855 .class_name = "MJPEG decoder",
2856 .item_name = av_default_item_name,
2858 .version = LIBAVUTIL_VERSION_INT,
2861 AVCodec ff_mjpeg_decoder = {
2863 .long_name = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
2864 .type = AVMEDIA_TYPE_VIDEO,
2865 .id = AV_CODEC_ID_MJPEG,
2866 .priv_data_size = sizeof(MJpegDecodeContext),
2867 .init = ff_mjpeg_decode_init,
2868 .close = ff_mjpeg_decode_end,
2869 .decode = ff_mjpeg_decode_frame,
2870 .flush = decode_flush,
2871 .capabilities = AV_CODEC_CAP_DR1,
2873 .priv_class = &mjpegdec_class,
2874 .profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
2875 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
2876 FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2877 .hw_configs = (const AVCodecHWConfigInternal*[]) {
2878 #if CONFIG_MJPEG_NVDEC_HWACCEL
2879 HWACCEL_NVDEC(mjpeg),
2881 #if CONFIG_MJPEG_VAAPI_HWACCEL
2882 HWACCEL_VAAPI(mjpeg),
2888 #if CONFIG_THP_DECODER
2889 AVCodec ff_thp_decoder = {
2891 .long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
2892 .type = AVMEDIA_TYPE_VIDEO,
2893 .id = AV_CODEC_ID_THP,
2894 .priv_data_size = sizeof(MJpegDecodeContext),
2895 .init = ff_mjpeg_decode_init,
2896 .close = ff_mjpeg_decode_end,
2897 .decode = ff_mjpeg_decode_frame,
2898 .flush = decode_flush,
2899 .capabilities = AV_CODEC_CAP_DR1,
2901 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,