1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * MJPEG decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001 Fabrice Bellard
4cabdff1aSopenharmony_ci * Copyright (c) 2003 Alex Beregszaszi
5cabdff1aSopenharmony_ci * Copyright (c) 2003-2004 Michael Niedermayer
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * Support for external huffman table, various fixes (AVID workaround),
8cabdff1aSopenharmony_ci * aspecting, new decode_frame mechanism and apple mjpeg-b support
9cabdff1aSopenharmony_ci *                                  by Alex Beregszaszi
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * This file is part of FFmpeg.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
14cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
15cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
16cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
19cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
20cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21cabdff1aSopenharmony_ci * Lesser General Public License for more details.
22cabdff1aSopenharmony_ci *
23cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
24cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
25cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26cabdff1aSopenharmony_ci */
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci/**
29cabdff1aSopenharmony_ci * @file
30cabdff1aSopenharmony_ci * MJPEG decoder.
31cabdff1aSopenharmony_ci */
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#include "config_components.h"
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_ci#include "libavutil/display.h"
36cabdff1aSopenharmony_ci#include "libavutil/imgutils.h"
37cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
38cabdff1aSopenharmony_ci#include "libavutil/opt.h"
39cabdff1aSopenharmony_ci#include "avcodec.h"
40cabdff1aSopenharmony_ci#include "blockdsp.h"
41cabdff1aSopenharmony_ci#include "codec_internal.h"
42cabdff1aSopenharmony_ci#include "copy_block.h"
43cabdff1aSopenharmony_ci#include "decode.h"
44cabdff1aSopenharmony_ci#include "hwconfig.h"
45cabdff1aSopenharmony_ci#include "idctdsp.h"
46cabdff1aSopenharmony_ci#include "internal.h"
47cabdff1aSopenharmony_ci#include "jpegtables.h"
48cabdff1aSopenharmony_ci#include "mjpeg.h"
49cabdff1aSopenharmony_ci#include "mjpegdec.h"
50cabdff1aSopenharmony_ci#include "jpeglsdec.h"
51cabdff1aSopenharmony_ci#include "profiles.h"
52cabdff1aSopenharmony_ci#include "put_bits.h"
53cabdff1aSopenharmony_ci#include "tiff.h"
54cabdff1aSopenharmony_ci#include "exif.h"
55cabdff1aSopenharmony_ci#include "bytestream.h"
56cabdff1aSopenharmony_ci#include "tiff_common.h"
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci
59cabdff1aSopenharmony_cistatic int init_default_huffman_tables(MJpegDecodeContext *s)
60cabdff1aSopenharmony_ci{
61cabdff1aSopenharmony_ci    static const struct {
62cabdff1aSopenharmony_ci        int class;
63cabdff1aSopenharmony_ci        int index;
64cabdff1aSopenharmony_ci        const uint8_t *bits;
65cabdff1aSopenharmony_ci        const uint8_t *values;
66cabdff1aSopenharmony_ci        int length;
67cabdff1aSopenharmony_ci    } ht[] = {
68cabdff1aSopenharmony_ci        { 0, 0, ff_mjpeg_bits_dc_luminance,
69cabdff1aSopenharmony_ci                ff_mjpeg_val_dc, 12 },
70cabdff1aSopenharmony_ci        { 0, 1, ff_mjpeg_bits_dc_chrominance,
71cabdff1aSopenharmony_ci                ff_mjpeg_val_dc, 12 },
72cabdff1aSopenharmony_ci        { 1, 0, ff_mjpeg_bits_ac_luminance,
73cabdff1aSopenharmony_ci                ff_mjpeg_val_ac_luminance,   162 },
74cabdff1aSopenharmony_ci        { 1, 1, ff_mjpeg_bits_ac_chrominance,
75cabdff1aSopenharmony_ci                ff_mjpeg_val_ac_chrominance, 162 },
76cabdff1aSopenharmony_ci        { 2, 0, ff_mjpeg_bits_ac_luminance,
77cabdff1aSopenharmony_ci                ff_mjpeg_val_ac_luminance,   162 },
78cabdff1aSopenharmony_ci        { 2, 1, ff_mjpeg_bits_ac_chrominance,
79cabdff1aSopenharmony_ci                ff_mjpeg_val_ac_chrominance, 162 },
80cabdff1aSopenharmony_ci    };
81cabdff1aSopenharmony_ci    int i, ret;
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_ci    for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
84cabdff1aSopenharmony_ci        ff_free_vlc(&s->vlcs[ht[i].class][ht[i].index]);
85cabdff1aSopenharmony_ci        ret = ff_mjpeg_build_vlc(&s->vlcs[ht[i].class][ht[i].index],
86cabdff1aSopenharmony_ci                                 ht[i].bits, ht[i].values,
87cabdff1aSopenharmony_ci                                 ht[i].class == 1, s->avctx);
88cabdff1aSopenharmony_ci        if (ret < 0)
89cabdff1aSopenharmony_ci            return ret;
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci        if (ht[i].class < 2) {
92cabdff1aSopenharmony_ci            memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
93cabdff1aSopenharmony_ci                   ht[i].bits + 1, 16);
94cabdff1aSopenharmony_ci            memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
95cabdff1aSopenharmony_ci                   ht[i].values, ht[i].length);
96cabdff1aSopenharmony_ci        }
97cabdff1aSopenharmony_ci    }
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci    return 0;
100cabdff1aSopenharmony_ci}
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_cistatic void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
103cabdff1aSopenharmony_ci{
104cabdff1aSopenharmony_ci    s->buggy_avid = 1;
105cabdff1aSopenharmony_ci    if (len > 14 && buf[12] == 1) /* 1 - NTSC */
106cabdff1aSopenharmony_ci        s->interlace_polarity = 1;
107cabdff1aSopenharmony_ci    if (len > 14 && buf[12] == 2) /* 2 - PAL */
108cabdff1aSopenharmony_ci        s->interlace_polarity = 0;
109cabdff1aSopenharmony_ci    if (s->avctx->debug & FF_DEBUG_PICT_INFO)
110cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_INFO, "AVID: len:%d %d\n", len, len > 14 ? buf[12] : -1);
111cabdff1aSopenharmony_ci}
112cabdff1aSopenharmony_ci
113cabdff1aSopenharmony_cistatic void init_idct(AVCodecContext *avctx)
114cabdff1aSopenharmony_ci{
115cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
116cabdff1aSopenharmony_ci
117cabdff1aSopenharmony_ci    ff_idctdsp_init(&s->idsp, avctx);
118cabdff1aSopenharmony_ci    ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
119cabdff1aSopenharmony_ci                      ff_zigzag_direct);
120cabdff1aSopenharmony_ci}
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_ciav_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
123cabdff1aSopenharmony_ci{
124cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
125cabdff1aSopenharmony_ci    int ret;
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_ci    if (!s->picture_ptr) {
128cabdff1aSopenharmony_ci        s->picture = av_frame_alloc();
129cabdff1aSopenharmony_ci        if (!s->picture)
130cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
131cabdff1aSopenharmony_ci        s->picture_ptr = s->picture;
132cabdff1aSopenharmony_ci    }
133cabdff1aSopenharmony_ci
134cabdff1aSopenharmony_ci    s->pkt = avctx->internal->in_pkt;
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ci    s->avctx = avctx;
137cabdff1aSopenharmony_ci    ff_blockdsp_init(&s->bdsp, avctx);
138cabdff1aSopenharmony_ci    ff_hpeldsp_init(&s->hdsp, avctx->flags);
139cabdff1aSopenharmony_ci    init_idct(avctx);
140cabdff1aSopenharmony_ci    s->buffer_size   = 0;
141cabdff1aSopenharmony_ci    s->buffer        = NULL;
142cabdff1aSopenharmony_ci    s->start_code    = -1;
143cabdff1aSopenharmony_ci    s->first_picture = 1;
144cabdff1aSopenharmony_ci    s->got_picture   = 0;
145cabdff1aSopenharmony_ci    s->orig_height    = avctx->coded_height;
146cabdff1aSopenharmony_ci    avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
147cabdff1aSopenharmony_ci    avctx->colorspace = AVCOL_SPC_BT470BG;
148cabdff1aSopenharmony_ci    s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci    if ((ret = init_default_huffman_tables(s)) < 0)
151cabdff1aSopenharmony_ci        return ret;
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci    if (s->extern_huff) {
154cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_INFO, "using external huffman table\n");
155cabdff1aSopenharmony_ci        if ((ret = init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8)) < 0)
156cabdff1aSopenharmony_ci            return ret;
157cabdff1aSopenharmony_ci        if (ff_mjpeg_decode_dht(s)) {
158cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
159cabdff1aSopenharmony_ci                   "error using external huffman table, switching back to internal\n");
160cabdff1aSopenharmony_ci            if ((ret = init_default_huffman_tables(s)) < 0)
161cabdff1aSopenharmony_ci                return ret;
162cabdff1aSopenharmony_ci        }
163cabdff1aSopenharmony_ci    }
164cabdff1aSopenharmony_ci    if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
165cabdff1aSopenharmony_ci        s->interlace_polarity = 1;           /* bottom field first */
166cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_DEBUG, "bottom field first\n");
167cabdff1aSopenharmony_ci    } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
168cabdff1aSopenharmony_ci        if (avctx->codec_tag == AV_RL32("MJPG"))
169cabdff1aSopenharmony_ci            s->interlace_polarity = 1;
170cabdff1aSopenharmony_ci    }
171cabdff1aSopenharmony_ci
172cabdff1aSopenharmony_ci    if (avctx->codec_id == AV_CODEC_ID_SMVJPEG) {
173cabdff1aSopenharmony_ci        if (avctx->extradata_size >= 4)
174cabdff1aSopenharmony_ci            s->smv_frames_per_jpeg = AV_RL32(avctx->extradata);
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci        if (s->smv_frames_per_jpeg <= 0) {
177cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Invalid number of frames per jpeg.\n");
178cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
179cabdff1aSopenharmony_ci        }
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci        s->smv_frame = av_frame_alloc();
182cabdff1aSopenharmony_ci        if (!s->smv_frame)
183cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
184cabdff1aSopenharmony_ci    } else if (avctx->extradata_size > 8
185cabdff1aSopenharmony_ci        && AV_RL32(avctx->extradata) == 0x2C
186cabdff1aSopenharmony_ci        && AV_RL32(avctx->extradata+4) == 0x18) {
187cabdff1aSopenharmony_ci        parse_avid(s, avctx->extradata, avctx->extradata_size);
188cabdff1aSopenharmony_ci    }
189cabdff1aSopenharmony_ci
190cabdff1aSopenharmony_ci    if (avctx->codec->id == AV_CODEC_ID_AMV)
191cabdff1aSopenharmony_ci        s->flipped = 1;
192cabdff1aSopenharmony_ci
193cabdff1aSopenharmony_ci    return 0;
194cabdff1aSopenharmony_ci}
195cabdff1aSopenharmony_ci
196cabdff1aSopenharmony_ci
197cabdff1aSopenharmony_ci/* quantize tables */
198cabdff1aSopenharmony_ciint ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
199cabdff1aSopenharmony_ci{
200cabdff1aSopenharmony_ci    int len, index, i;
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_ci    len = get_bits(&s->gb, 16) - 2;
203cabdff1aSopenharmony_ci
204cabdff1aSopenharmony_ci    if (8*len > get_bits_left(&s->gb)) {
205cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "dqt: len %d is too large\n", len);
206cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
207cabdff1aSopenharmony_ci    }
208cabdff1aSopenharmony_ci
209cabdff1aSopenharmony_ci    while (len >= 65) {
210cabdff1aSopenharmony_ci        int pr = get_bits(&s->gb, 4);
211cabdff1aSopenharmony_ci        if (pr > 1) {
212cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n");
213cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
214cabdff1aSopenharmony_ci        }
215cabdff1aSopenharmony_ci        index = get_bits(&s->gb, 4);
216cabdff1aSopenharmony_ci        if (index >= 4)
217cabdff1aSopenharmony_ci            return -1;
218cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
219cabdff1aSopenharmony_ci        /* read quant table */
220cabdff1aSopenharmony_ci        for (i = 0; i < 64; i++) {
221cabdff1aSopenharmony_ci            s->quant_matrixes[index][i] = get_bits(&s->gb, pr ? 16 : 8);
222cabdff1aSopenharmony_ci            if (s->quant_matrixes[index][i] == 0) {
223cabdff1aSopenharmony_ci                int log_level = s->avctx->err_recognition & AV_EF_EXPLODE ? AV_LOG_ERROR : AV_LOG_WARNING;
224cabdff1aSopenharmony_ci                av_log(s->avctx, log_level, "dqt: 0 quant value\n");
225cabdff1aSopenharmony_ci                if (s->avctx->err_recognition & AV_EF_EXPLODE)
226cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
227cabdff1aSopenharmony_ci            }
228cabdff1aSopenharmony_ci        }
229cabdff1aSopenharmony_ci
230cabdff1aSopenharmony_ci        // XXX FIXME fine-tune, and perhaps add dc too
231cabdff1aSopenharmony_ci        s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
232cabdff1aSopenharmony_ci                                 s->quant_matrixes[index][8]) >> 1;
233cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
234cabdff1aSopenharmony_ci               index, s->qscale[index]);
235cabdff1aSopenharmony_ci        len -= 1 + 64 * (1+pr);
236cabdff1aSopenharmony_ci    }
237cabdff1aSopenharmony_ci    return 0;
238cabdff1aSopenharmony_ci}
239cabdff1aSopenharmony_ci
240cabdff1aSopenharmony_ci/* decode huffman tables and build VLC decoders */
241cabdff1aSopenharmony_ciint ff_mjpeg_decode_dht(MJpegDecodeContext *s)
242cabdff1aSopenharmony_ci{
243cabdff1aSopenharmony_ci    int len, index, i, class, n, v;
244cabdff1aSopenharmony_ci    uint8_t bits_table[17];
245cabdff1aSopenharmony_ci    uint8_t val_table[256];
246cabdff1aSopenharmony_ci    int ret = 0;
247cabdff1aSopenharmony_ci
248cabdff1aSopenharmony_ci    len = get_bits(&s->gb, 16) - 2;
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci    if (8*len > get_bits_left(&s->gb)) {
251cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "dht: len %d is too large\n", len);
252cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
253cabdff1aSopenharmony_ci    }
254cabdff1aSopenharmony_ci
255cabdff1aSopenharmony_ci    while (len > 0) {
256cabdff1aSopenharmony_ci        if (len < 17)
257cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
258cabdff1aSopenharmony_ci        class = get_bits(&s->gb, 4);
259cabdff1aSopenharmony_ci        if (class >= 2)
260cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
261cabdff1aSopenharmony_ci        index = get_bits(&s->gb, 4);
262cabdff1aSopenharmony_ci        if (index >= 4)
263cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
264cabdff1aSopenharmony_ci        n = 0;
265cabdff1aSopenharmony_ci        for (i = 1; i <= 16; i++) {
266cabdff1aSopenharmony_ci            bits_table[i] = get_bits(&s->gb, 8);
267cabdff1aSopenharmony_ci            n += bits_table[i];
268cabdff1aSopenharmony_ci        }
269cabdff1aSopenharmony_ci        len -= 17;
270cabdff1aSopenharmony_ci        if (len < n || n > 256)
271cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
272cabdff1aSopenharmony_ci
273cabdff1aSopenharmony_ci        for (i = 0; i < n; i++) {
274cabdff1aSopenharmony_ci            v = get_bits(&s->gb, 8);
275cabdff1aSopenharmony_ci            val_table[i] = v;
276cabdff1aSopenharmony_ci        }
277cabdff1aSopenharmony_ci        len -= n;
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_ci        /* build VLC and flush previous vlc if present */
280cabdff1aSopenharmony_ci        ff_free_vlc(&s->vlcs[class][index]);
281cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
282cabdff1aSopenharmony_ci               class, index, n);
283cabdff1aSopenharmony_ci        if ((ret = ff_mjpeg_build_vlc(&s->vlcs[class][index], bits_table,
284cabdff1aSopenharmony_ci                                      val_table, class > 0, s->avctx)) < 0)
285cabdff1aSopenharmony_ci            return ret;
286cabdff1aSopenharmony_ci
287cabdff1aSopenharmony_ci        if (class > 0) {
288cabdff1aSopenharmony_ci            ff_free_vlc(&s->vlcs[2][index]);
289cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_build_vlc(&s->vlcs[2][index], bits_table,
290cabdff1aSopenharmony_ci                                          val_table, 0, s->avctx)) < 0)
291cabdff1aSopenharmony_ci                return ret;
292cabdff1aSopenharmony_ci        }
293cabdff1aSopenharmony_ci
294cabdff1aSopenharmony_ci        for (i = 0; i < 16; i++)
295cabdff1aSopenharmony_ci            s->raw_huffman_lengths[class][index][i] = bits_table[i + 1];
296cabdff1aSopenharmony_ci        for (i = 0; i < 256; i++)
297cabdff1aSopenharmony_ci            s->raw_huffman_values[class][index][i] = val_table[i];
298cabdff1aSopenharmony_ci    }
299cabdff1aSopenharmony_ci    return 0;
300cabdff1aSopenharmony_ci}
301cabdff1aSopenharmony_ci
302cabdff1aSopenharmony_ciint ff_mjpeg_decode_sof(MJpegDecodeContext *s)
303cabdff1aSopenharmony_ci{
304cabdff1aSopenharmony_ci    int len, nb_components, i, width, height, bits, ret, size_change;
305cabdff1aSopenharmony_ci    unsigned pix_fmt_id;
306cabdff1aSopenharmony_ci    int h_count[MAX_COMPONENTS] = { 0 };
307cabdff1aSopenharmony_ci    int v_count[MAX_COMPONENTS] = { 0 };
308cabdff1aSopenharmony_ci
309cabdff1aSopenharmony_ci    s->cur_scan = 0;
310cabdff1aSopenharmony_ci    memset(s->upscale_h, 0, sizeof(s->upscale_h));
311cabdff1aSopenharmony_ci    memset(s->upscale_v, 0, sizeof(s->upscale_v));
312cabdff1aSopenharmony_ci
313cabdff1aSopenharmony_ci    len     = get_bits(&s->gb, 16);
314cabdff1aSopenharmony_ci    bits    = get_bits(&s->gb, 8);
315cabdff1aSopenharmony_ci
316cabdff1aSopenharmony_ci    if (bits > 16 || bits < 1) {
317cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "bits %d is invalid\n", bits);
318cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
319cabdff1aSopenharmony_ci    }
320cabdff1aSopenharmony_ci
321cabdff1aSopenharmony_ci    if (s->avctx->bits_per_raw_sample != bits) {
322cabdff1aSopenharmony_ci        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);
323cabdff1aSopenharmony_ci        s->avctx->bits_per_raw_sample = bits;
324cabdff1aSopenharmony_ci        init_idct(s->avctx);
325cabdff1aSopenharmony_ci    }
326cabdff1aSopenharmony_ci    if (s->pegasus_rct)
327cabdff1aSopenharmony_ci        bits = 9;
328cabdff1aSopenharmony_ci    if (bits == 9 && !s->pegasus_rct)
329cabdff1aSopenharmony_ci        s->rct  = 1;    // FIXME ugly
330cabdff1aSopenharmony_ci
331cabdff1aSopenharmony_ci    if(s->lossless && s->avctx->lowres){
332cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "lowres is not possible with lossless jpeg\n");
333cabdff1aSopenharmony_ci        return -1;
334cabdff1aSopenharmony_ci    }
335cabdff1aSopenharmony_ci
336cabdff1aSopenharmony_ci    height = get_bits(&s->gb, 16);
337cabdff1aSopenharmony_ci    width  = get_bits(&s->gb, 16);
338cabdff1aSopenharmony_ci
339cabdff1aSopenharmony_ci    // HACK for odd_height.mov
340cabdff1aSopenharmony_ci    if (s->interlaced && s->width == width && s->height == height + 1)
341cabdff1aSopenharmony_ci        height= s->height;
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci    av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
344cabdff1aSopenharmony_ci    if (av_image_check_size(width, height, 0, s->avctx) < 0)
345cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
346cabdff1aSopenharmony_ci    if (s->buf_size && (width + 7) / 8 * ((height + 7) / 8) > s->buf_size * 4LL)
347cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
348cabdff1aSopenharmony_ci
349cabdff1aSopenharmony_ci    nb_components = get_bits(&s->gb, 8);
350cabdff1aSopenharmony_ci    if (nb_components <= 0 ||
351cabdff1aSopenharmony_ci        nb_components > MAX_COMPONENTS)
352cabdff1aSopenharmony_ci        return -1;
353cabdff1aSopenharmony_ci    if (s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
354cabdff1aSopenharmony_ci        if (nb_components != s->nb_components) {
355cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
356cabdff1aSopenharmony_ci                   "nb_components changing in interlaced picture\n");
357cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
358cabdff1aSopenharmony_ci        }
359cabdff1aSopenharmony_ci    }
360cabdff1aSopenharmony_ci    if (s->ls && !(bits <= 8 || nb_components == 1)) {
361cabdff1aSopenharmony_ci        avpriv_report_missing_feature(s->avctx,
362cabdff1aSopenharmony_ci                                      "JPEG-LS that is not <= 8 "
363cabdff1aSopenharmony_ci                                      "bits/component or 16-bit gray");
364cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
365cabdff1aSopenharmony_ci    }
366cabdff1aSopenharmony_ci    if (len != 8 + 3 * nb_components) {
367cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "decode_sof0: error, len(%d) mismatch %d components\n", len, nb_components);
368cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
369cabdff1aSopenharmony_ci    }
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci    s->nb_components = nb_components;
372cabdff1aSopenharmony_ci    s->h_max         = 1;
373cabdff1aSopenharmony_ci    s->v_max         = 1;
374cabdff1aSopenharmony_ci    for (i = 0; i < nb_components; i++) {
375cabdff1aSopenharmony_ci        /* component id */
376cabdff1aSopenharmony_ci        s->component_id[i] = get_bits(&s->gb, 8) - 1;
377cabdff1aSopenharmony_ci        h_count[i]         = get_bits(&s->gb, 4);
378cabdff1aSopenharmony_ci        v_count[i]         = get_bits(&s->gb, 4);
379cabdff1aSopenharmony_ci        /* compute hmax and vmax (only used in interleaved case) */
380cabdff1aSopenharmony_ci        if (h_count[i] > s->h_max)
381cabdff1aSopenharmony_ci            s->h_max = h_count[i];
382cabdff1aSopenharmony_ci        if (v_count[i] > s->v_max)
383cabdff1aSopenharmony_ci            s->v_max = v_count[i];
384cabdff1aSopenharmony_ci        s->quant_index[i] = get_bits(&s->gb, 8);
385cabdff1aSopenharmony_ci        if (s->quant_index[i] >= 4) {
386cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n");
387cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
388cabdff1aSopenharmony_ci        }
389cabdff1aSopenharmony_ci        if (!h_count[i] || !v_count[i]) {
390cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
391cabdff1aSopenharmony_ci                   "Invalid sampling factor in component %d %d:%d\n",
392cabdff1aSopenharmony_ci                   i, h_count[i], v_count[i]);
393cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
394cabdff1aSopenharmony_ci        }
395cabdff1aSopenharmony_ci
396cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
397cabdff1aSopenharmony_ci               i, h_count[i], v_count[i],
398cabdff1aSopenharmony_ci               s->component_id[i], s->quant_index[i]);
399cabdff1aSopenharmony_ci    }
400cabdff1aSopenharmony_ci    if (   nb_components == 4
401cabdff1aSopenharmony_ci        && s->component_id[0] == 'C' - 1
402cabdff1aSopenharmony_ci        && s->component_id[1] == 'M' - 1
403cabdff1aSopenharmony_ci        && s->component_id[2] == 'Y' - 1
404cabdff1aSopenharmony_ci        && s->component_id[3] == 'K' - 1)
405cabdff1aSopenharmony_ci        s->adobe_transform = 0;
406cabdff1aSopenharmony_ci
407cabdff1aSopenharmony_ci    if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
408cabdff1aSopenharmony_ci        avpriv_report_missing_feature(s->avctx, "Subsampling in JPEG-LS");
409cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
410cabdff1aSopenharmony_ci    }
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_ci    if (s->bayer) {
413cabdff1aSopenharmony_ci        if (nb_components == 2) {
414cabdff1aSopenharmony_ci            /* Bayer images embedded in DNGs can contain 2 interleaved components and the
415cabdff1aSopenharmony_ci               width stored in their SOF3 markers is the width of each one.  We only output
416cabdff1aSopenharmony_ci               a single component, therefore we need to adjust the output image width.  We
417cabdff1aSopenharmony_ci               handle the deinterleaving (but not the debayering) in this file. */
418cabdff1aSopenharmony_ci            width *= 2;
419cabdff1aSopenharmony_ci        }
420cabdff1aSopenharmony_ci        /* They can also contain 1 component, which is double the width and half the height
421cabdff1aSopenharmony_ci            of the final image (rows are interleaved).  We don't handle the decoding in this
422cabdff1aSopenharmony_ci            file, but leave that to the TIFF/DNG decoder. */
423cabdff1aSopenharmony_ci    }
424cabdff1aSopenharmony_ci
425cabdff1aSopenharmony_ci    /* if different size, realloc/alloc picture */
426cabdff1aSopenharmony_ci    if (width != s->width || height != s->height || bits != s->bits ||
427cabdff1aSopenharmony_ci        memcmp(s->h_count, h_count, sizeof(h_count))                ||
428cabdff1aSopenharmony_ci        memcmp(s->v_count, v_count, sizeof(v_count))) {
429cabdff1aSopenharmony_ci        size_change = 1;
430cabdff1aSopenharmony_ci
431cabdff1aSopenharmony_ci        s->width      = width;
432cabdff1aSopenharmony_ci        s->height     = height;
433cabdff1aSopenharmony_ci        s->bits       = bits;
434cabdff1aSopenharmony_ci        memcpy(s->h_count, h_count, sizeof(h_count));
435cabdff1aSopenharmony_ci        memcpy(s->v_count, v_count, sizeof(v_count));
436cabdff1aSopenharmony_ci        s->interlaced = 0;
437cabdff1aSopenharmony_ci        s->got_picture = 0;
438cabdff1aSopenharmony_ci
439cabdff1aSopenharmony_ci        /* test interlaced mode */
440cabdff1aSopenharmony_ci        if (s->first_picture   &&
441cabdff1aSopenharmony_ci            (s->multiscope != 2 || s->avctx->time_base.den >= 25 * s->avctx->time_base.num) &&
442cabdff1aSopenharmony_ci            s->orig_height != 0 &&
443cabdff1aSopenharmony_ci            s->height < ((s->orig_height * 3) / 4)) {
444cabdff1aSopenharmony_ci            s->interlaced                    = 1;
445cabdff1aSopenharmony_ci            s->bottom_field                  = s->interlace_polarity;
446cabdff1aSopenharmony_ci            s->picture_ptr->interlaced_frame = 1;
447cabdff1aSopenharmony_ci            s->picture_ptr->top_field_first  = !s->interlace_polarity;
448cabdff1aSopenharmony_ci            height *= 2;
449cabdff1aSopenharmony_ci        }
450cabdff1aSopenharmony_ci
451cabdff1aSopenharmony_ci        ret = ff_set_dimensions(s->avctx, width, height);
452cabdff1aSopenharmony_ci        if (ret < 0)
453cabdff1aSopenharmony_ci            return ret;
454cabdff1aSopenharmony_ci
455cabdff1aSopenharmony_ci        if ((s->avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
456cabdff1aSopenharmony_ci             s->avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
457cabdff1aSopenharmony_ci            s->orig_height < height)
458cabdff1aSopenharmony_ci            s->avctx->height = AV_CEIL_RSHIFT(s->orig_height, s->avctx->lowres);
459cabdff1aSopenharmony_ci
460cabdff1aSopenharmony_ci        s->first_picture = 0;
461cabdff1aSopenharmony_ci    } else {
462cabdff1aSopenharmony_ci        size_change = 0;
463cabdff1aSopenharmony_ci    }
464cabdff1aSopenharmony_ci
465cabdff1aSopenharmony_ci    if (s->avctx->codec_id == AV_CODEC_ID_SMVJPEG) {
466cabdff1aSopenharmony_ci        s->avctx->height = s->avctx->coded_height / s->smv_frames_per_jpeg;
467cabdff1aSopenharmony_ci        if (s->avctx->height <= 0)
468cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
469cabdff1aSopenharmony_ci    }
470cabdff1aSopenharmony_ci
471cabdff1aSopenharmony_ci    if (s->got_picture && s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
472cabdff1aSopenharmony_ci        if (s->progressive) {
473cabdff1aSopenharmony_ci            avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
474cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
475cabdff1aSopenharmony_ci        }
476cabdff1aSopenharmony_ci    } else {
477cabdff1aSopenharmony_ci        if (s->v_max == 1 && s->h_max == 1 && s->lossless==1 && (nb_components==3 || nb_components==4))
478cabdff1aSopenharmony_ci            s->rgb = 1;
479cabdff1aSopenharmony_ci        else if (!s->lossless)
480cabdff1aSopenharmony_ci            s->rgb = 0;
481cabdff1aSopenharmony_ci        /* XXX: not complete test ! */
482cabdff1aSopenharmony_ci        pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
483cabdff1aSopenharmony_ci                     (s->h_count[1] << 20) | (s->v_count[1] << 16) |
484cabdff1aSopenharmony_ci                     (s->h_count[2] << 12) | (s->v_count[2] <<  8) |
485cabdff1aSopenharmony_ci                     (s->h_count[3] <<  4) |  s->v_count[3];
486cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
487cabdff1aSopenharmony_ci        /* NOTE we do not allocate pictures large enough for the possible
488cabdff1aSopenharmony_ci         * padding of h/v_count being 4 */
489cabdff1aSopenharmony_ci        if (!(pix_fmt_id & 0xD0D0D0D0))
490cabdff1aSopenharmony_ci            pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
491cabdff1aSopenharmony_ci        if (!(pix_fmt_id & 0x0D0D0D0D))
492cabdff1aSopenharmony_ci            pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
493cabdff1aSopenharmony_ci
494cabdff1aSopenharmony_ci        for (i = 0; i < 8; i++) {
495cabdff1aSopenharmony_ci            int j = 6 + (i&1) - (i&6);
496cabdff1aSopenharmony_ci            int is = (pix_fmt_id >> (4*i)) & 0xF;
497cabdff1aSopenharmony_ci            int js = (pix_fmt_id >> (4*j)) & 0xF;
498cabdff1aSopenharmony_ci
499cabdff1aSopenharmony_ci            if (is == 1 && js != 2 && (i < 2 || i > 5))
500cabdff1aSopenharmony_ci                js = (pix_fmt_id >> ( 8 + 4*(i&1))) & 0xF;
501cabdff1aSopenharmony_ci            if (is == 1 && js != 2 && (i < 2 || i > 5))
502cabdff1aSopenharmony_ci                js = (pix_fmt_id >> (16 + 4*(i&1))) & 0xF;
503cabdff1aSopenharmony_ci
504cabdff1aSopenharmony_ci            if (is == 1 && js == 2) {
505cabdff1aSopenharmony_ci                if (i & 1) s->upscale_h[j/2] = 1;
506cabdff1aSopenharmony_ci                else       s->upscale_v[j/2] = 1;
507cabdff1aSopenharmony_ci            }
508cabdff1aSopenharmony_ci        }
509cabdff1aSopenharmony_ci
510cabdff1aSopenharmony_ci        if (s->bayer) {
511cabdff1aSopenharmony_ci            if (pix_fmt_id != 0x11110000 && pix_fmt_id != 0x11000000)
512cabdff1aSopenharmony_ci                goto unk_pixfmt;
513cabdff1aSopenharmony_ci        }
514cabdff1aSopenharmony_ci
515cabdff1aSopenharmony_ci        switch (pix_fmt_id) {
516cabdff1aSopenharmony_ci        case 0x11110000: /* for bayer-encoded huffman lossless JPEGs embedded in DNGs */
517cabdff1aSopenharmony_ci            if (!s->bayer)
518cabdff1aSopenharmony_ci                goto unk_pixfmt;
519cabdff1aSopenharmony_ci            s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
520cabdff1aSopenharmony_ci            break;
521cabdff1aSopenharmony_ci        case 0x11111100:
522cabdff1aSopenharmony_ci            if (s->rgb)
523cabdff1aSopenharmony_ci                s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
524cabdff1aSopenharmony_ci            else {
525cabdff1aSopenharmony_ci                if (   s->adobe_transform == 0
526cabdff1aSopenharmony_ci                    || s->component_id[0] == 'R' - 1 && s->component_id[1] == 'G' - 1 && s->component_id[2] == 'B' - 1) {
527cabdff1aSopenharmony_ci                    s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
528cabdff1aSopenharmony_ci                } else {
529cabdff1aSopenharmony_ci                    if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
530cabdff1aSopenharmony_ci                    else              s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
531cabdff1aSopenharmony_ci                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
532cabdff1aSopenharmony_ci                }
533cabdff1aSopenharmony_ci            }
534cabdff1aSopenharmony_ci            av_assert0(s->nb_components == 3);
535cabdff1aSopenharmony_ci            break;
536cabdff1aSopenharmony_ci        case 0x11111111:
537cabdff1aSopenharmony_ci            if (s->rgb)
538cabdff1aSopenharmony_ci                s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
539cabdff1aSopenharmony_ci            else {
540cabdff1aSopenharmony_ci                if (s->adobe_transform == 0 && s->bits <= 8) {
541cabdff1aSopenharmony_ci                    s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
542cabdff1aSopenharmony_ci                } else {
543cabdff1aSopenharmony_ci                    s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
544cabdff1aSopenharmony_ci                    s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
545cabdff1aSopenharmony_ci                }
546cabdff1aSopenharmony_ci            }
547cabdff1aSopenharmony_ci            av_assert0(s->nb_components == 4);
548cabdff1aSopenharmony_ci            break;
549cabdff1aSopenharmony_ci        case 0x22111122:
550cabdff1aSopenharmony_ci        case 0x22111111:
551cabdff1aSopenharmony_ci            if (s->adobe_transform == 0 && s->bits <= 8) {
552cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
553cabdff1aSopenharmony_ci                s->upscale_v[1] = s->upscale_v[2] = 1;
554cabdff1aSopenharmony_ci                s->upscale_h[1] = s->upscale_h[2] = 1;
555cabdff1aSopenharmony_ci            } else if (s->adobe_transform == 2 && s->bits <= 8) {
556cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
557cabdff1aSopenharmony_ci                s->upscale_v[1] = s->upscale_v[2] = 1;
558cabdff1aSopenharmony_ci                s->upscale_h[1] = s->upscale_h[2] = 1;
559cabdff1aSopenharmony_ci                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
560cabdff1aSopenharmony_ci            } else {
561cabdff1aSopenharmony_ci                if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
562cabdff1aSopenharmony_ci                else              s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
563cabdff1aSopenharmony_ci                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
564cabdff1aSopenharmony_ci            }
565cabdff1aSopenharmony_ci            av_assert0(s->nb_components == 4);
566cabdff1aSopenharmony_ci            break;
567cabdff1aSopenharmony_ci        case 0x12121100:
568cabdff1aSopenharmony_ci        case 0x22122100:
569cabdff1aSopenharmony_ci        case 0x21211100:
570cabdff1aSopenharmony_ci        case 0x21112100:
571cabdff1aSopenharmony_ci        case 0x22211200:
572cabdff1aSopenharmony_ci        case 0x22221100:
573cabdff1aSopenharmony_ci        case 0x22112200:
574cabdff1aSopenharmony_ci        case 0x11222200:
575cabdff1aSopenharmony_ci            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
576cabdff1aSopenharmony_ci            else
577cabdff1aSopenharmony_ci                goto unk_pixfmt;
578cabdff1aSopenharmony_ci            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
579cabdff1aSopenharmony_ci            break;
580cabdff1aSopenharmony_ci        case 0x11000000:
581cabdff1aSopenharmony_ci        case 0x13000000:
582cabdff1aSopenharmony_ci        case 0x14000000:
583cabdff1aSopenharmony_ci        case 0x31000000:
584cabdff1aSopenharmony_ci        case 0x33000000:
585cabdff1aSopenharmony_ci        case 0x34000000:
586cabdff1aSopenharmony_ci        case 0x41000000:
587cabdff1aSopenharmony_ci        case 0x43000000:
588cabdff1aSopenharmony_ci        case 0x44000000:
589cabdff1aSopenharmony_ci            if(s->bits <= 8)
590cabdff1aSopenharmony_ci                s->avctx->pix_fmt = s->force_pal8 ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8;
591cabdff1aSopenharmony_ci            else
592cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
593cabdff1aSopenharmony_ci            break;
594cabdff1aSopenharmony_ci        case 0x12111100:
595cabdff1aSopenharmony_ci        case 0x14121200:
596cabdff1aSopenharmony_ci        case 0x14111100:
597cabdff1aSopenharmony_ci        case 0x22211100:
598cabdff1aSopenharmony_ci        case 0x22112100:
599cabdff1aSopenharmony_ci            if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
600cabdff1aSopenharmony_ci                if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
601cabdff1aSopenharmony_ci                else
602cabdff1aSopenharmony_ci                    goto unk_pixfmt;
603cabdff1aSopenharmony_ci                s->upscale_v[0] = s->upscale_v[1] = 1;
604cabdff1aSopenharmony_ci            } else {
605cabdff1aSopenharmony_ci                if (pix_fmt_id == 0x14111100)
606cabdff1aSopenharmony_ci                    s->upscale_v[1] = s->upscale_v[2] = 1;
607cabdff1aSopenharmony_ci                if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
608cabdff1aSopenharmony_ci                else
609cabdff1aSopenharmony_ci                    goto unk_pixfmt;
610cabdff1aSopenharmony_ci                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
611cabdff1aSopenharmony_ci            }
612cabdff1aSopenharmony_ci            break;
613cabdff1aSopenharmony_ci        case 0x21111100:
614cabdff1aSopenharmony_ci            if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
615cabdff1aSopenharmony_ci                if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
616cabdff1aSopenharmony_ci                else
617cabdff1aSopenharmony_ci                    goto unk_pixfmt;
618cabdff1aSopenharmony_ci                s->upscale_h[0] = s->upscale_h[1] = 1;
619cabdff1aSopenharmony_ci            } else {
620cabdff1aSopenharmony_ci                if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
621cabdff1aSopenharmony_ci                else              s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
622cabdff1aSopenharmony_ci                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
623cabdff1aSopenharmony_ci            }
624cabdff1aSopenharmony_ci            break;
625cabdff1aSopenharmony_ci        case 0x31111100:
626cabdff1aSopenharmony_ci            if (s->bits > 8)
627cabdff1aSopenharmony_ci                goto unk_pixfmt;
628cabdff1aSopenharmony_ci            s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
629cabdff1aSopenharmony_ci            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
630cabdff1aSopenharmony_ci            s->upscale_h[1] = s->upscale_h[2] = 2;
631cabdff1aSopenharmony_ci            break;
632cabdff1aSopenharmony_ci        case 0x22121100:
633cabdff1aSopenharmony_ci        case 0x22111200:
634cabdff1aSopenharmony_ci            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
635cabdff1aSopenharmony_ci            else
636cabdff1aSopenharmony_ci                goto unk_pixfmt;
637cabdff1aSopenharmony_ci            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
638cabdff1aSopenharmony_ci            break;
639cabdff1aSopenharmony_ci        case 0x22111100:
640cabdff1aSopenharmony_ci        case 0x23111100:
641cabdff1aSopenharmony_ci        case 0x42111100:
642cabdff1aSopenharmony_ci        case 0x24111100:
643cabdff1aSopenharmony_ci            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
644cabdff1aSopenharmony_ci            else              s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
645cabdff1aSopenharmony_ci            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
646cabdff1aSopenharmony_ci            if (pix_fmt_id == 0x42111100) {
647cabdff1aSopenharmony_ci                if (s->bits > 8)
648cabdff1aSopenharmony_ci                    goto unk_pixfmt;
649cabdff1aSopenharmony_ci                s->upscale_h[1] = s->upscale_h[2] = 1;
650cabdff1aSopenharmony_ci            } else if (pix_fmt_id == 0x24111100) {
651cabdff1aSopenharmony_ci                if (s->bits > 8)
652cabdff1aSopenharmony_ci                    goto unk_pixfmt;
653cabdff1aSopenharmony_ci                s->upscale_v[1] = s->upscale_v[2] = 1;
654cabdff1aSopenharmony_ci            } else if (pix_fmt_id == 0x23111100) {
655cabdff1aSopenharmony_ci                if (s->bits > 8)
656cabdff1aSopenharmony_ci                    goto unk_pixfmt;
657cabdff1aSopenharmony_ci                s->upscale_v[1] = s->upscale_v[2] = 2;
658cabdff1aSopenharmony_ci            }
659cabdff1aSopenharmony_ci            break;
660cabdff1aSopenharmony_ci        case 0x41111100:
661cabdff1aSopenharmony_ci            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
662cabdff1aSopenharmony_ci            else
663cabdff1aSopenharmony_ci                goto unk_pixfmt;
664cabdff1aSopenharmony_ci            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
665cabdff1aSopenharmony_ci            break;
666cabdff1aSopenharmony_ci        default:
667cabdff1aSopenharmony_ci    unk_pixfmt:
668cabdff1aSopenharmony_ci            avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
669cabdff1aSopenharmony_ci            memset(s->upscale_h, 0, sizeof(s->upscale_h));
670cabdff1aSopenharmony_ci            memset(s->upscale_v, 0, sizeof(s->upscale_v));
671cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
672cabdff1aSopenharmony_ci        }
673cabdff1aSopenharmony_ci        if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
674cabdff1aSopenharmony_ci            avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
675cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
676cabdff1aSopenharmony_ci        }
677cabdff1aSopenharmony_ci        if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->progressive && s->avctx->pix_fmt == AV_PIX_FMT_GBRP) {
678cabdff1aSopenharmony_ci            avpriv_report_missing_feature(s->avctx, "progressive for weird subsampling");
679cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
680cabdff1aSopenharmony_ci        }
681cabdff1aSopenharmony_ci        if (s->ls) {
682cabdff1aSopenharmony_ci            memset(s->upscale_h, 0, sizeof(s->upscale_h));
683cabdff1aSopenharmony_ci            memset(s->upscale_v, 0, sizeof(s->upscale_v));
684cabdff1aSopenharmony_ci            if (s->nb_components == 3) {
685cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
686cabdff1aSopenharmony_ci            } else if (s->nb_components != 1) {
687cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
688cabdff1aSopenharmony_ci                return AVERROR_PATCHWELCOME;
689cabdff1aSopenharmony_ci            } else if ((s->palette_index || s->force_pal8) && s->bits <= 8)
690cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
691cabdff1aSopenharmony_ci            else if (s->bits <= 8)
692cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
693cabdff1aSopenharmony_ci            else
694cabdff1aSopenharmony_ci                s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
695cabdff1aSopenharmony_ci        }
696cabdff1aSopenharmony_ci
697cabdff1aSopenharmony_ci        s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
698cabdff1aSopenharmony_ci        if (!s->pix_desc) {
699cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
700cabdff1aSopenharmony_ci            return AVERROR_BUG;
701cabdff1aSopenharmony_ci        }
702cabdff1aSopenharmony_ci
703cabdff1aSopenharmony_ci        if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
704cabdff1aSopenharmony_ci            s->avctx->pix_fmt = s->hwaccel_pix_fmt;
705cabdff1aSopenharmony_ci        } else {
706cabdff1aSopenharmony_ci            enum AVPixelFormat pix_fmts[] = {
707cabdff1aSopenharmony_ci#if CONFIG_MJPEG_NVDEC_HWACCEL
708cabdff1aSopenharmony_ci                AV_PIX_FMT_CUDA,
709cabdff1aSopenharmony_ci#endif
710cabdff1aSopenharmony_ci#if CONFIG_MJPEG_VAAPI_HWACCEL
711cabdff1aSopenharmony_ci                AV_PIX_FMT_VAAPI,
712cabdff1aSopenharmony_ci#endif
713cabdff1aSopenharmony_ci                s->avctx->pix_fmt,
714cabdff1aSopenharmony_ci                AV_PIX_FMT_NONE,
715cabdff1aSopenharmony_ci            };
716cabdff1aSopenharmony_ci            s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
717cabdff1aSopenharmony_ci            if (s->hwaccel_pix_fmt < 0)
718cabdff1aSopenharmony_ci                return AVERROR(EINVAL);
719cabdff1aSopenharmony_ci
720cabdff1aSopenharmony_ci            s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
721cabdff1aSopenharmony_ci            s->avctx->pix_fmt     = s->hwaccel_pix_fmt;
722cabdff1aSopenharmony_ci        }
723cabdff1aSopenharmony_ci
724cabdff1aSopenharmony_ci        if (s->avctx->skip_frame == AVDISCARD_ALL) {
725cabdff1aSopenharmony_ci            s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
726cabdff1aSopenharmony_ci            s->picture_ptr->key_frame = 1;
727cabdff1aSopenharmony_ci            s->got_picture            = 1;
728cabdff1aSopenharmony_ci            return 0;
729cabdff1aSopenharmony_ci        }
730cabdff1aSopenharmony_ci
731cabdff1aSopenharmony_ci        av_frame_unref(s->picture_ptr);
732cabdff1aSopenharmony_ci        if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0)
733cabdff1aSopenharmony_ci            return -1;
734cabdff1aSopenharmony_ci        s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
735cabdff1aSopenharmony_ci        s->picture_ptr->key_frame = 1;
736cabdff1aSopenharmony_ci        s->got_picture            = 1;
737cabdff1aSopenharmony_ci
738cabdff1aSopenharmony_ci        // Lets clear the palette to avoid leaving uninitialized values in it
739cabdff1aSopenharmony_ci        if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
740cabdff1aSopenharmony_ci            memset(s->picture_ptr->data[1], 0, 1024);
741cabdff1aSopenharmony_ci
742cabdff1aSopenharmony_ci        for (i = 0; i < 4; i++)
743cabdff1aSopenharmony_ci            s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
744cabdff1aSopenharmony_ci
745cabdff1aSopenharmony_ci        ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
746cabdff1aSopenharmony_ci                s->width, s->height, s->linesize[0], s->linesize[1],
747cabdff1aSopenharmony_ci                s->interlaced, s->avctx->height);
748cabdff1aSopenharmony_ci
749cabdff1aSopenharmony_ci    }
750cabdff1aSopenharmony_ci
751cabdff1aSopenharmony_ci    if ((s->rgb && !s->lossless && !s->ls) ||
752cabdff1aSopenharmony_ci        (!s->rgb && s->ls && s->nb_components > 1) ||
753cabdff1aSopenharmony_ci        (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 && !s->ls)
754cabdff1aSopenharmony_ci    ) {
755cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
756cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
757cabdff1aSopenharmony_ci    }
758cabdff1aSopenharmony_ci
759cabdff1aSopenharmony_ci    /* totally blank picture as progressive JPEG will only add details to it */
760cabdff1aSopenharmony_ci    if (s->progressive) {
761cabdff1aSopenharmony_ci        int bw = (width  + s->h_max * 8 - 1) / (s->h_max * 8);
762cabdff1aSopenharmony_ci        int bh = (height + s->v_max * 8 - 1) / (s->v_max * 8);
763cabdff1aSopenharmony_ci        for (i = 0; i < s->nb_components; i++) {
764cabdff1aSopenharmony_ci            int size = bw * bh * s->h_count[i] * s->v_count[i];
765cabdff1aSopenharmony_ci            av_freep(&s->blocks[i]);
766cabdff1aSopenharmony_ci            av_freep(&s->last_nnz[i]);
767cabdff1aSopenharmony_ci            s->blocks[i]       = av_calloc(size, sizeof(**s->blocks));
768cabdff1aSopenharmony_ci            s->last_nnz[i]     = av_calloc(size, sizeof(**s->last_nnz));
769cabdff1aSopenharmony_ci            if (!s->blocks[i] || !s->last_nnz[i])
770cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
771cabdff1aSopenharmony_ci            s->block_stride[i] = bw * s->h_count[i];
772cabdff1aSopenharmony_ci        }
773cabdff1aSopenharmony_ci        memset(s->coefs_finished, 0, sizeof(s->coefs_finished));
774cabdff1aSopenharmony_ci    }
775cabdff1aSopenharmony_ci
776cabdff1aSopenharmony_ci    if (s->avctx->hwaccel) {
777cabdff1aSopenharmony_ci        s->hwaccel_picture_private =
778cabdff1aSopenharmony_ci            av_mallocz(s->avctx->hwaccel->frame_priv_data_size);
779cabdff1aSopenharmony_ci        if (!s->hwaccel_picture_private)
780cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
781cabdff1aSopenharmony_ci
782cabdff1aSopenharmony_ci        ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_image_buffer,
783cabdff1aSopenharmony_ci                                             s->raw_image_buffer_size);
784cabdff1aSopenharmony_ci        if (ret < 0)
785cabdff1aSopenharmony_ci            return ret;
786cabdff1aSopenharmony_ci    }
787cabdff1aSopenharmony_ci
788cabdff1aSopenharmony_ci    return 0;
789cabdff1aSopenharmony_ci}
790cabdff1aSopenharmony_ci
791cabdff1aSopenharmony_cistatic inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
792cabdff1aSopenharmony_ci{
793cabdff1aSopenharmony_ci    int code;
794cabdff1aSopenharmony_ci    code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
795cabdff1aSopenharmony_ci    if (code < 0 || code > 16) {
796cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_WARNING,
797cabdff1aSopenharmony_ci               "mjpeg_decode_dc: bad vlc: %d:%d (%p)\n",
798cabdff1aSopenharmony_ci               0, dc_index, &s->vlcs[0][dc_index]);
799cabdff1aSopenharmony_ci        return 0xfffff;
800cabdff1aSopenharmony_ci    }
801cabdff1aSopenharmony_ci
802cabdff1aSopenharmony_ci    if (code)
803cabdff1aSopenharmony_ci        return get_xbits(&s->gb, code);
804cabdff1aSopenharmony_ci    else
805cabdff1aSopenharmony_ci        return 0;
806cabdff1aSopenharmony_ci}
807cabdff1aSopenharmony_ci
808cabdff1aSopenharmony_ci/* decode block and dequantize */
809cabdff1aSopenharmony_cistatic int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
810cabdff1aSopenharmony_ci                        int dc_index, int ac_index, uint16_t *quant_matrix)
811cabdff1aSopenharmony_ci{
812cabdff1aSopenharmony_ci    int code, i, j, level, val;
813cabdff1aSopenharmony_ci
814cabdff1aSopenharmony_ci    /* DC coef */
815cabdff1aSopenharmony_ci    val = mjpeg_decode_dc(s, dc_index);
816cabdff1aSopenharmony_ci    if (val == 0xfffff) {
817cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
818cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
819cabdff1aSopenharmony_ci    }
820cabdff1aSopenharmony_ci    val = val * (unsigned)quant_matrix[0] + s->last_dc[component];
821cabdff1aSopenharmony_ci    val = av_clip_int16(val);
822cabdff1aSopenharmony_ci    s->last_dc[component] = val;
823cabdff1aSopenharmony_ci    block[0] = val;
824cabdff1aSopenharmony_ci    /* AC coefs */
825cabdff1aSopenharmony_ci    i = 0;
826cabdff1aSopenharmony_ci    {OPEN_READER(re, &s->gb);
827cabdff1aSopenharmony_ci    do {
828cabdff1aSopenharmony_ci        UPDATE_CACHE(re, &s->gb);
829cabdff1aSopenharmony_ci        GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
830cabdff1aSopenharmony_ci
831cabdff1aSopenharmony_ci        i += ((unsigned)code) >> 4;
832cabdff1aSopenharmony_ci            code &= 0xf;
833cabdff1aSopenharmony_ci        if (code) {
834cabdff1aSopenharmony_ci            if (code > MIN_CACHE_BITS - 16)
835cabdff1aSopenharmony_ci                UPDATE_CACHE(re, &s->gb);
836cabdff1aSopenharmony_ci
837cabdff1aSopenharmony_ci            {
838cabdff1aSopenharmony_ci                int cache = GET_CACHE(re, &s->gb);
839cabdff1aSopenharmony_ci                int sign  = (~cache) >> 31;
840cabdff1aSopenharmony_ci                level     = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
841cabdff1aSopenharmony_ci            }
842cabdff1aSopenharmony_ci
843cabdff1aSopenharmony_ci            LAST_SKIP_BITS(re, &s->gb, code);
844cabdff1aSopenharmony_ci
845cabdff1aSopenharmony_ci            if (i > 63) {
846cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
847cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
848cabdff1aSopenharmony_ci            }
849cabdff1aSopenharmony_ci            j        = s->scantable.permutated[i];
850cabdff1aSopenharmony_ci            block[j] = level * quant_matrix[i];
851cabdff1aSopenharmony_ci        }
852cabdff1aSopenharmony_ci    } while (i < 63);
853cabdff1aSopenharmony_ci    CLOSE_READER(re, &s->gb);}
854cabdff1aSopenharmony_ci
855cabdff1aSopenharmony_ci    return 0;
856cabdff1aSopenharmony_ci}
857cabdff1aSopenharmony_ci
858cabdff1aSopenharmony_cistatic int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block,
859cabdff1aSopenharmony_ci                                 int component, int dc_index,
860cabdff1aSopenharmony_ci                                 uint16_t *quant_matrix, int Al)
861cabdff1aSopenharmony_ci{
862cabdff1aSopenharmony_ci    unsigned val;
863cabdff1aSopenharmony_ci    s->bdsp.clear_block(block);
864cabdff1aSopenharmony_ci    val = mjpeg_decode_dc(s, dc_index);
865cabdff1aSopenharmony_ci    if (val == 0xfffff) {
866cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
867cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
868cabdff1aSopenharmony_ci    }
869cabdff1aSopenharmony_ci    val = (val * (quant_matrix[0] << Al)) + s->last_dc[component];
870cabdff1aSopenharmony_ci    s->last_dc[component] = val;
871cabdff1aSopenharmony_ci    block[0] = val;
872cabdff1aSopenharmony_ci    return 0;
873cabdff1aSopenharmony_ci}
874cabdff1aSopenharmony_ci
875cabdff1aSopenharmony_ci/* decode block and dequantize - progressive JPEG version */
876cabdff1aSopenharmony_cistatic int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
877cabdff1aSopenharmony_ci                                    uint8_t *last_nnz, int ac_index,
878cabdff1aSopenharmony_ci                                    uint16_t *quant_matrix,
879cabdff1aSopenharmony_ci                                    int ss, int se, int Al, int *EOBRUN)
880cabdff1aSopenharmony_ci{
881cabdff1aSopenharmony_ci    int code, i, j, val, run;
882cabdff1aSopenharmony_ci    unsigned level;
883cabdff1aSopenharmony_ci
884cabdff1aSopenharmony_ci    if (*EOBRUN) {
885cabdff1aSopenharmony_ci        (*EOBRUN)--;
886cabdff1aSopenharmony_ci        return 0;
887cabdff1aSopenharmony_ci    }
888cabdff1aSopenharmony_ci
889cabdff1aSopenharmony_ci    {
890cabdff1aSopenharmony_ci        OPEN_READER(re, &s->gb);
891cabdff1aSopenharmony_ci        for (i = ss; ; i++) {
892cabdff1aSopenharmony_ci            UPDATE_CACHE(re, &s->gb);
893cabdff1aSopenharmony_ci            GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
894cabdff1aSopenharmony_ci
895cabdff1aSopenharmony_ci            run = ((unsigned) code) >> 4;
896cabdff1aSopenharmony_ci            code &= 0xF;
897cabdff1aSopenharmony_ci            if (code) {
898cabdff1aSopenharmony_ci                i += run;
899cabdff1aSopenharmony_ci                if (code > MIN_CACHE_BITS - 16)
900cabdff1aSopenharmony_ci                    UPDATE_CACHE(re, &s->gb);
901cabdff1aSopenharmony_ci
902cabdff1aSopenharmony_ci                {
903cabdff1aSopenharmony_ci                    int cache = GET_CACHE(re, &s->gb);
904cabdff1aSopenharmony_ci                    int sign  = (~cache) >> 31;
905cabdff1aSopenharmony_ci                    level     = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
906cabdff1aSopenharmony_ci                }
907cabdff1aSopenharmony_ci
908cabdff1aSopenharmony_ci                LAST_SKIP_BITS(re, &s->gb, code);
909cabdff1aSopenharmony_ci
910cabdff1aSopenharmony_ci                if (i >= se) {
911cabdff1aSopenharmony_ci                    if (i == se) {
912cabdff1aSopenharmony_ci                        j = s->scantable.permutated[se];
913cabdff1aSopenharmony_ci                        block[j] = level * (quant_matrix[se] << Al);
914cabdff1aSopenharmony_ci                        break;
915cabdff1aSopenharmony_ci                    }
916cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
917cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
918cabdff1aSopenharmony_ci                }
919cabdff1aSopenharmony_ci                j = s->scantable.permutated[i];
920cabdff1aSopenharmony_ci                block[j] = level * (quant_matrix[i] << Al);
921cabdff1aSopenharmony_ci            } else {
922cabdff1aSopenharmony_ci                if (run == 0xF) {// ZRL - skip 15 coefficients
923cabdff1aSopenharmony_ci                    i += 15;
924cabdff1aSopenharmony_ci                    if (i >= se) {
925cabdff1aSopenharmony_ci                        av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
926cabdff1aSopenharmony_ci                        return AVERROR_INVALIDDATA;
927cabdff1aSopenharmony_ci                    }
928cabdff1aSopenharmony_ci                } else {
929cabdff1aSopenharmony_ci                    val = (1 << run);
930cabdff1aSopenharmony_ci                    if (run) {
931cabdff1aSopenharmony_ci                        UPDATE_CACHE(re, &s->gb);
932cabdff1aSopenharmony_ci                        val += NEG_USR32(GET_CACHE(re, &s->gb), run);
933cabdff1aSopenharmony_ci                        LAST_SKIP_BITS(re, &s->gb, run);
934cabdff1aSopenharmony_ci                    }
935cabdff1aSopenharmony_ci                    *EOBRUN = val - 1;
936cabdff1aSopenharmony_ci                    break;
937cabdff1aSopenharmony_ci                }
938cabdff1aSopenharmony_ci            }
939cabdff1aSopenharmony_ci        }
940cabdff1aSopenharmony_ci        CLOSE_READER(re, &s->gb);
941cabdff1aSopenharmony_ci    }
942cabdff1aSopenharmony_ci
943cabdff1aSopenharmony_ci    if (i > *last_nnz)
944cabdff1aSopenharmony_ci        *last_nnz = i;
945cabdff1aSopenharmony_ci
946cabdff1aSopenharmony_ci    return 0;
947cabdff1aSopenharmony_ci}
948cabdff1aSopenharmony_ci
949cabdff1aSopenharmony_ci#define REFINE_BIT(j) {                                             \
950cabdff1aSopenharmony_ci    UPDATE_CACHE(re, &s->gb);                                       \
951cabdff1aSopenharmony_ci    sign = block[j] >> 15;                                          \
952cabdff1aSopenharmony_ci    block[j] += SHOW_UBITS(re, &s->gb, 1) *                         \
953cabdff1aSopenharmony_ci                ((quant_matrix[i] ^ sign) - sign) << Al;            \
954cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, &s->gb, 1);                                  \
955cabdff1aSopenharmony_ci}
956cabdff1aSopenharmony_ci
957cabdff1aSopenharmony_ci#define ZERO_RUN                                                    \
958cabdff1aSopenharmony_cifor (; ; i++) {                                                     \
959cabdff1aSopenharmony_ci    if (i > last) {                                                 \
960cabdff1aSopenharmony_ci        i += run;                                                   \
961cabdff1aSopenharmony_ci        if (i > se) {                                               \
962cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
963cabdff1aSopenharmony_ci            return -1;                                              \
964cabdff1aSopenharmony_ci        }                                                           \
965cabdff1aSopenharmony_ci        break;                                                      \
966cabdff1aSopenharmony_ci    }                                                               \
967cabdff1aSopenharmony_ci    j = s->scantable.permutated[i];                                 \
968cabdff1aSopenharmony_ci    if (block[j])                                                   \
969cabdff1aSopenharmony_ci        REFINE_BIT(j)                                               \
970cabdff1aSopenharmony_ci    else if (run-- == 0)                                            \
971cabdff1aSopenharmony_ci        break;                                                      \
972cabdff1aSopenharmony_ci}
973cabdff1aSopenharmony_ci
974cabdff1aSopenharmony_ci/* decode block and dequantize - progressive JPEG refinement pass */
975cabdff1aSopenharmony_cistatic int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
976cabdff1aSopenharmony_ci                                   uint8_t *last_nnz,
977cabdff1aSopenharmony_ci                                   int ac_index, uint16_t *quant_matrix,
978cabdff1aSopenharmony_ci                                   int ss, int se, int Al, int *EOBRUN)
979cabdff1aSopenharmony_ci{
980cabdff1aSopenharmony_ci    int code, i = ss, j, sign, val, run;
981cabdff1aSopenharmony_ci    int last    = FFMIN(se, *last_nnz);
982cabdff1aSopenharmony_ci
983cabdff1aSopenharmony_ci    OPEN_READER(re, &s->gb);
984cabdff1aSopenharmony_ci    if (*EOBRUN) {
985cabdff1aSopenharmony_ci        (*EOBRUN)--;
986cabdff1aSopenharmony_ci    } else {
987cabdff1aSopenharmony_ci        for (; ; i++) {
988cabdff1aSopenharmony_ci            UPDATE_CACHE(re, &s->gb);
989cabdff1aSopenharmony_ci            GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
990cabdff1aSopenharmony_ci
991cabdff1aSopenharmony_ci            if (code & 0xF) {
992cabdff1aSopenharmony_ci                run = ((unsigned) code) >> 4;
993cabdff1aSopenharmony_ci                UPDATE_CACHE(re, &s->gb);
994cabdff1aSopenharmony_ci                val = SHOW_UBITS(re, &s->gb, 1);
995cabdff1aSopenharmony_ci                LAST_SKIP_BITS(re, &s->gb, 1);
996cabdff1aSopenharmony_ci                ZERO_RUN;
997cabdff1aSopenharmony_ci                j = s->scantable.permutated[i];
998cabdff1aSopenharmony_ci                val--;
999cabdff1aSopenharmony_ci                block[j] = ((quant_matrix[i] << Al) ^ val) - val;
1000cabdff1aSopenharmony_ci                if (i == se) {
1001cabdff1aSopenharmony_ci                    if (i > *last_nnz)
1002cabdff1aSopenharmony_ci                        *last_nnz = i;
1003cabdff1aSopenharmony_ci                    CLOSE_READER(re, &s->gb);
1004cabdff1aSopenharmony_ci                    return 0;
1005cabdff1aSopenharmony_ci                }
1006cabdff1aSopenharmony_ci            } else {
1007cabdff1aSopenharmony_ci                run = ((unsigned) code) >> 4;
1008cabdff1aSopenharmony_ci                if (run == 0xF) {
1009cabdff1aSopenharmony_ci                    ZERO_RUN;
1010cabdff1aSopenharmony_ci                } else {
1011cabdff1aSopenharmony_ci                    val = run;
1012cabdff1aSopenharmony_ci                    run = (1 << run);
1013cabdff1aSopenharmony_ci                    if (val) {
1014cabdff1aSopenharmony_ci                        UPDATE_CACHE(re, &s->gb);
1015cabdff1aSopenharmony_ci                        run += SHOW_UBITS(re, &s->gb, val);
1016cabdff1aSopenharmony_ci                        LAST_SKIP_BITS(re, &s->gb, val);
1017cabdff1aSopenharmony_ci                    }
1018cabdff1aSopenharmony_ci                    *EOBRUN = run - 1;
1019cabdff1aSopenharmony_ci                    break;
1020cabdff1aSopenharmony_ci                }
1021cabdff1aSopenharmony_ci            }
1022cabdff1aSopenharmony_ci        }
1023cabdff1aSopenharmony_ci
1024cabdff1aSopenharmony_ci        if (i > *last_nnz)
1025cabdff1aSopenharmony_ci            *last_nnz = i;
1026cabdff1aSopenharmony_ci    }
1027cabdff1aSopenharmony_ci
1028cabdff1aSopenharmony_ci    for (; i <= last; i++) {
1029cabdff1aSopenharmony_ci        j = s->scantable.permutated[i];
1030cabdff1aSopenharmony_ci        if (block[j])
1031cabdff1aSopenharmony_ci            REFINE_BIT(j)
1032cabdff1aSopenharmony_ci    }
1033cabdff1aSopenharmony_ci    CLOSE_READER(re, &s->gb);
1034cabdff1aSopenharmony_ci
1035cabdff1aSopenharmony_ci    return 0;
1036cabdff1aSopenharmony_ci}
1037cabdff1aSopenharmony_ci#undef REFINE_BIT
1038cabdff1aSopenharmony_ci#undef ZERO_RUN
1039cabdff1aSopenharmony_ci
1040cabdff1aSopenharmony_cistatic int handle_rstn(MJpegDecodeContext *s, int nb_components)
1041cabdff1aSopenharmony_ci{
1042cabdff1aSopenharmony_ci    int i;
1043cabdff1aSopenharmony_ci    int reset = 0;
1044cabdff1aSopenharmony_ci
1045cabdff1aSopenharmony_ci    if (s->restart_interval) {
1046cabdff1aSopenharmony_ci        s->restart_count--;
1047cabdff1aSopenharmony_ci        if(s->restart_count == 0 && s->avctx->codec_id == AV_CODEC_ID_THP){
1048cabdff1aSopenharmony_ci            align_get_bits(&s->gb);
1049cabdff1aSopenharmony_ci            for (i = 0; i < nb_components; i++) /* reset dc */
1050cabdff1aSopenharmony_ci                s->last_dc[i] = (4 << s->bits);
1051cabdff1aSopenharmony_ci        }
1052cabdff1aSopenharmony_ci
1053cabdff1aSopenharmony_ci        i = 8 + ((-get_bits_count(&s->gb)) & 7);
1054cabdff1aSopenharmony_ci        /* skip RSTn */
1055cabdff1aSopenharmony_ci        if (s->restart_count == 0) {
1056cabdff1aSopenharmony_ci            if(   show_bits(&s->gb, i) == (1 << i) - 1
1057cabdff1aSopenharmony_ci               || show_bits(&s->gb, i) == 0xFF) {
1058cabdff1aSopenharmony_ci                int pos = get_bits_count(&s->gb);
1059cabdff1aSopenharmony_ci                align_get_bits(&s->gb);
1060cabdff1aSopenharmony_ci                while (get_bits_left(&s->gb) >= 8 && show_bits(&s->gb, 8) == 0xFF)
1061cabdff1aSopenharmony_ci                    skip_bits(&s->gb, 8);
1062cabdff1aSopenharmony_ci                if (get_bits_left(&s->gb) >= 8 && (get_bits(&s->gb, 8) & 0xF8) == 0xD0) {
1063cabdff1aSopenharmony_ci                    for (i = 0; i < nb_components; i++) /* reset dc */
1064cabdff1aSopenharmony_ci                        s->last_dc[i] = (4 << s->bits);
1065cabdff1aSopenharmony_ci                    reset = 1;
1066cabdff1aSopenharmony_ci                } else
1067cabdff1aSopenharmony_ci                    skip_bits_long(&s->gb, pos - get_bits_count(&s->gb));
1068cabdff1aSopenharmony_ci            }
1069cabdff1aSopenharmony_ci        }
1070cabdff1aSopenharmony_ci    }
1071cabdff1aSopenharmony_ci    return reset;
1072cabdff1aSopenharmony_ci}
1073cabdff1aSopenharmony_ci
1074cabdff1aSopenharmony_ci/* Handles 1 to 4 components */
1075cabdff1aSopenharmony_cistatic int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform)
1076cabdff1aSopenharmony_ci{
1077cabdff1aSopenharmony_ci    int i, mb_x, mb_y;
1078cabdff1aSopenharmony_ci    unsigned width;
1079cabdff1aSopenharmony_ci    uint16_t (*buffer)[4];
1080cabdff1aSopenharmony_ci    int left[4], top[4], topleft[4];
1081cabdff1aSopenharmony_ci    const int linesize = s->linesize[0];
1082cabdff1aSopenharmony_ci    const int mask     = ((1 << s->bits) - 1) << point_transform;
1083cabdff1aSopenharmony_ci    int resync_mb_y = 0;
1084cabdff1aSopenharmony_ci    int resync_mb_x = 0;
1085cabdff1aSopenharmony_ci    int vpred[6];
1086cabdff1aSopenharmony_ci
1087cabdff1aSopenharmony_ci    if (!s->bayer && s->nb_components < 3)
1088cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1089cabdff1aSopenharmony_ci    if (s->bayer && s->nb_components > 2)
1090cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1091cabdff1aSopenharmony_ci    if (s->nb_components <= 0 || s->nb_components > 4)
1092cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1093cabdff1aSopenharmony_ci    if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
1094cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1095cabdff1aSopenharmony_ci    if (s->bayer) {
1096cabdff1aSopenharmony_ci        if (s->rct || s->pegasus_rct)
1097cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1098cabdff1aSopenharmony_ci    }
1099cabdff1aSopenharmony_ci
1100cabdff1aSopenharmony_ci
1101cabdff1aSopenharmony_ci    s->restart_count = s->restart_interval;
1102cabdff1aSopenharmony_ci
1103cabdff1aSopenharmony_ci    if (s->restart_interval == 0)
1104cabdff1aSopenharmony_ci        s->restart_interval = INT_MAX;
1105cabdff1aSopenharmony_ci
1106cabdff1aSopenharmony_ci    if (s->bayer)
1107cabdff1aSopenharmony_ci        width = s->mb_width / nb_components; /* Interleaved, width stored is the total so need to divide */
1108cabdff1aSopenharmony_ci    else
1109cabdff1aSopenharmony_ci        width = s->mb_width;
1110cabdff1aSopenharmony_ci
1111cabdff1aSopenharmony_ci    av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, width * 4 * sizeof(s->ljpeg_buffer[0][0]));
1112cabdff1aSopenharmony_ci    if (!s->ljpeg_buffer)
1113cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1114cabdff1aSopenharmony_ci
1115cabdff1aSopenharmony_ci    buffer = s->ljpeg_buffer;
1116cabdff1aSopenharmony_ci
1117cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++)
1118cabdff1aSopenharmony_ci        buffer[0][i] = 1 << (s->bits - 1);
1119cabdff1aSopenharmony_ci
1120cabdff1aSopenharmony_ci    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1121cabdff1aSopenharmony_ci        uint8_t *ptr = s->picture_ptr->data[0] + (linesize * mb_y);
1122cabdff1aSopenharmony_ci
1123cabdff1aSopenharmony_ci        if (s->interlaced && s->bottom_field)
1124cabdff1aSopenharmony_ci            ptr += linesize >> 1;
1125cabdff1aSopenharmony_ci
1126cabdff1aSopenharmony_ci        for (i = 0; i < 4; i++)
1127cabdff1aSopenharmony_ci            top[i] = left[i] = topleft[i] = buffer[0][i];
1128cabdff1aSopenharmony_ci
1129cabdff1aSopenharmony_ci        if ((mb_y * s->width) % s->restart_interval == 0) {
1130cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++)
1131cabdff1aSopenharmony_ci                vpred[i] = 1 << (s->bits-1);
1132cabdff1aSopenharmony_ci        }
1133cabdff1aSopenharmony_ci
1134cabdff1aSopenharmony_ci        for (mb_x = 0; mb_x < width; mb_x++) {
1135cabdff1aSopenharmony_ci            int modified_predictor = predictor;
1136cabdff1aSopenharmony_ci
1137cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 1) {
1138cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "bitstream end in rgb_scan\n");
1139cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1140cabdff1aSopenharmony_ci            }
1141cabdff1aSopenharmony_ci
1142cabdff1aSopenharmony_ci            if (s->restart_interval && !s->restart_count){
1143cabdff1aSopenharmony_ci                s->restart_count = s->restart_interval;
1144cabdff1aSopenharmony_ci                resync_mb_x = mb_x;
1145cabdff1aSopenharmony_ci                resync_mb_y = mb_y;
1146cabdff1aSopenharmony_ci                for(i=0; i<4; i++)
1147cabdff1aSopenharmony_ci                    top[i] = left[i]= topleft[i]= 1 << (s->bits - 1);
1148cabdff1aSopenharmony_ci            }
1149cabdff1aSopenharmony_ci            if (mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || !mb_x)
1150cabdff1aSopenharmony_ci                modified_predictor = 1;
1151cabdff1aSopenharmony_ci
1152cabdff1aSopenharmony_ci            for (i=0;i<nb_components;i++) {
1153cabdff1aSopenharmony_ci                int pred, dc;
1154cabdff1aSopenharmony_ci
1155cabdff1aSopenharmony_ci                topleft[i] = top[i];
1156cabdff1aSopenharmony_ci                top[i]     = buffer[mb_x][i];
1157cabdff1aSopenharmony_ci
1158cabdff1aSopenharmony_ci                dc = mjpeg_decode_dc(s, s->dc_index[i]);
1159cabdff1aSopenharmony_ci                if(dc == 0xFFFFF)
1160cabdff1aSopenharmony_ci                    return -1;
1161cabdff1aSopenharmony_ci
1162cabdff1aSopenharmony_ci                if (!s->bayer || mb_x) {
1163cabdff1aSopenharmony_ci                    pred = left[i];
1164cabdff1aSopenharmony_ci                } else { /* This path runs only for the first line in bayer images */
1165cabdff1aSopenharmony_ci                    vpred[i] += dc;
1166cabdff1aSopenharmony_ci                    pred = vpred[i] - dc;
1167cabdff1aSopenharmony_ci                }
1168cabdff1aSopenharmony_ci
1169cabdff1aSopenharmony_ci                PREDICT(pred, topleft[i], top[i], pred, modified_predictor);
1170cabdff1aSopenharmony_ci
1171cabdff1aSopenharmony_ci                left[i] = buffer[mb_x][i] =
1172cabdff1aSopenharmony_ci                    mask & (pred + (unsigned)(dc * (1 << point_transform)));
1173cabdff1aSopenharmony_ci            }
1174cabdff1aSopenharmony_ci
1175cabdff1aSopenharmony_ci            if (s->restart_interval && !--s->restart_count) {
1176cabdff1aSopenharmony_ci                align_get_bits(&s->gb);
1177cabdff1aSopenharmony_ci                skip_bits(&s->gb, 16); /* skip RSTn */
1178cabdff1aSopenharmony_ci            }
1179cabdff1aSopenharmony_ci        }
1180cabdff1aSopenharmony_ci        if (s->rct && s->nb_components == 4) {
1181cabdff1aSopenharmony_ci            for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1182cabdff1aSopenharmony_ci                ptr[4*mb_x + 2] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1183cabdff1aSopenharmony_ci                ptr[4*mb_x + 1] = buffer[mb_x][1] + ptr[4*mb_x + 2];
1184cabdff1aSopenharmony_ci                ptr[4*mb_x + 3] = buffer[mb_x][2] + ptr[4*mb_x + 2];
1185cabdff1aSopenharmony_ci                ptr[4*mb_x + 0] = buffer[mb_x][3];
1186cabdff1aSopenharmony_ci            }
1187cabdff1aSopenharmony_ci        } else if (s->nb_components == 4) {
1188cabdff1aSopenharmony_ci            for(i=0; i<nb_components; i++) {
1189cabdff1aSopenharmony_ci                int c= s->comp_index[i];
1190cabdff1aSopenharmony_ci                if (s->bits <= 8) {
1191cabdff1aSopenharmony_ci                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1192cabdff1aSopenharmony_ci                        ptr[4*mb_x+3-c] = buffer[mb_x][i];
1193cabdff1aSopenharmony_ci                    }
1194cabdff1aSopenharmony_ci                } else if(s->bits == 9) {
1195cabdff1aSopenharmony_ci                    return AVERROR_PATCHWELCOME;
1196cabdff1aSopenharmony_ci                } else {
1197cabdff1aSopenharmony_ci                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1198cabdff1aSopenharmony_ci                        ((uint16_t*)ptr)[4*mb_x+c] = buffer[mb_x][i];
1199cabdff1aSopenharmony_ci                    }
1200cabdff1aSopenharmony_ci                }
1201cabdff1aSopenharmony_ci            }
1202cabdff1aSopenharmony_ci        } else if (s->rct) {
1203cabdff1aSopenharmony_ci            for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1204cabdff1aSopenharmony_ci                ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1205cabdff1aSopenharmony_ci                ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
1206cabdff1aSopenharmony_ci                ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
1207cabdff1aSopenharmony_ci            }
1208cabdff1aSopenharmony_ci        } else if (s->pegasus_rct) {
1209cabdff1aSopenharmony_ci            for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1210cabdff1aSopenharmony_ci                ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2]) >> 2);
1211cabdff1aSopenharmony_ci                ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
1212cabdff1aSopenharmony_ci                ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
1213cabdff1aSopenharmony_ci            }
1214cabdff1aSopenharmony_ci        } else if (s->bayer) {
1215cabdff1aSopenharmony_ci            if (s->bits <= 8)
1216cabdff1aSopenharmony_ci                return AVERROR_PATCHWELCOME;
1217cabdff1aSopenharmony_ci            if (nb_components == 1) {
1218cabdff1aSopenharmony_ci                /* Leave decoding to the TIFF/DNG decoder (see comment in ff_mjpeg_decode_sof) */
1219cabdff1aSopenharmony_ci                for (mb_x = 0; mb_x < width; mb_x++)
1220cabdff1aSopenharmony_ci                    ((uint16_t*)ptr)[mb_x] = buffer[mb_x][0];
1221cabdff1aSopenharmony_ci            } else if (nb_components == 2) {
1222cabdff1aSopenharmony_ci                for (mb_x = 0; mb_x < width; mb_x++) {
1223cabdff1aSopenharmony_ci                    ((uint16_t*)ptr)[2*mb_x + 0] = buffer[mb_x][0];
1224cabdff1aSopenharmony_ci                    ((uint16_t*)ptr)[2*mb_x + 1] = buffer[mb_x][1];
1225cabdff1aSopenharmony_ci                }
1226cabdff1aSopenharmony_ci            }
1227cabdff1aSopenharmony_ci        } else {
1228cabdff1aSopenharmony_ci            for(i=0; i<nb_components; i++) {
1229cabdff1aSopenharmony_ci                int c= s->comp_index[i];
1230cabdff1aSopenharmony_ci                if (s->bits <= 8) {
1231cabdff1aSopenharmony_ci                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1232cabdff1aSopenharmony_ci                        ptr[3*mb_x+2-c] = buffer[mb_x][i];
1233cabdff1aSopenharmony_ci                    }
1234cabdff1aSopenharmony_ci                } else if(s->bits == 9) {
1235cabdff1aSopenharmony_ci                    return AVERROR_PATCHWELCOME;
1236cabdff1aSopenharmony_ci                } else {
1237cabdff1aSopenharmony_ci                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1238cabdff1aSopenharmony_ci                        ((uint16_t*)ptr)[3*mb_x+2-c] = buffer[mb_x][i];
1239cabdff1aSopenharmony_ci                    }
1240cabdff1aSopenharmony_ci                }
1241cabdff1aSopenharmony_ci            }
1242cabdff1aSopenharmony_ci        }
1243cabdff1aSopenharmony_ci    }
1244cabdff1aSopenharmony_ci    return 0;
1245cabdff1aSopenharmony_ci}
1246cabdff1aSopenharmony_ci
1247cabdff1aSopenharmony_cistatic int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor,
1248cabdff1aSopenharmony_ci                                 int point_transform, int nb_components)
1249cabdff1aSopenharmony_ci{
1250cabdff1aSopenharmony_ci    int i, mb_x, mb_y, mask;
1251cabdff1aSopenharmony_ci    int bits= (s->bits+7)&~7;
1252cabdff1aSopenharmony_ci    int resync_mb_y = 0;
1253cabdff1aSopenharmony_ci    int resync_mb_x = 0;
1254cabdff1aSopenharmony_ci
1255cabdff1aSopenharmony_ci    point_transform += bits - s->bits;
1256cabdff1aSopenharmony_ci    mask = ((1 << s->bits) - 1) << point_transform;
1257cabdff1aSopenharmony_ci
1258cabdff1aSopenharmony_ci    av_assert0(nb_components>=1 && nb_components<=4);
1259cabdff1aSopenharmony_ci
1260cabdff1aSopenharmony_ci    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1261cabdff1aSopenharmony_ci        for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1262cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 1) {
1263cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "bitstream end in yuv_scan\n");
1264cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1265cabdff1aSopenharmony_ci            }
1266cabdff1aSopenharmony_ci            if (s->restart_interval && !s->restart_count){
1267cabdff1aSopenharmony_ci                s->restart_count = s->restart_interval;
1268cabdff1aSopenharmony_ci                resync_mb_x = mb_x;
1269cabdff1aSopenharmony_ci                resync_mb_y = mb_y;
1270cabdff1aSopenharmony_ci            }
1271cabdff1aSopenharmony_ci
1272cabdff1aSopenharmony_ci            if(!mb_x || mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || s->interlaced){
1273cabdff1aSopenharmony_ci                int toprow  = mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x;
1274cabdff1aSopenharmony_ci                int leftcol = !mb_x || mb_y == resync_mb_y && mb_x == resync_mb_x;
1275cabdff1aSopenharmony_ci                for (i = 0; i < nb_components; i++) {
1276cabdff1aSopenharmony_ci                    uint8_t *ptr;
1277cabdff1aSopenharmony_ci                    uint16_t *ptr16;
1278cabdff1aSopenharmony_ci                    int n, h, v, x, y, c, j, linesize;
1279cabdff1aSopenharmony_ci                    n = s->nb_blocks[i];
1280cabdff1aSopenharmony_ci                    c = s->comp_index[i];
1281cabdff1aSopenharmony_ci                    h = s->h_scount[i];
1282cabdff1aSopenharmony_ci                    v = s->v_scount[i];
1283cabdff1aSopenharmony_ci                    x = 0;
1284cabdff1aSopenharmony_ci                    y = 0;
1285cabdff1aSopenharmony_ci                    linesize= s->linesize[c];
1286cabdff1aSopenharmony_ci
1287cabdff1aSopenharmony_ci                    if(bits>8) linesize /= 2;
1288cabdff1aSopenharmony_ci
1289cabdff1aSopenharmony_ci                    for(j=0; j<n; j++) {
1290cabdff1aSopenharmony_ci                        int pred, dc;
1291cabdff1aSopenharmony_ci
1292cabdff1aSopenharmony_ci                        dc = mjpeg_decode_dc(s, s->dc_index[i]);
1293cabdff1aSopenharmony_ci                        if(dc == 0xFFFFF)
1294cabdff1aSopenharmony_ci                            return -1;
1295cabdff1aSopenharmony_ci                        if (   h * mb_x + x >= s->width
1296cabdff1aSopenharmony_ci                            || v * mb_y + y >= s->height) {
1297cabdff1aSopenharmony_ci                            // Nothing to do
1298cabdff1aSopenharmony_ci                        } else if (bits<=8) {
1299cabdff1aSopenharmony_ci                            ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1300cabdff1aSopenharmony_ci                            if(y==0 && toprow){
1301cabdff1aSopenharmony_ci                                if(x==0 && leftcol){
1302cabdff1aSopenharmony_ci                                    pred= 1 << (bits - 1);
1303cabdff1aSopenharmony_ci                                }else{
1304cabdff1aSopenharmony_ci                                    pred= ptr[-1];
1305cabdff1aSopenharmony_ci                                }
1306cabdff1aSopenharmony_ci                            }else{
1307cabdff1aSopenharmony_ci                                if(x==0 && leftcol){
1308cabdff1aSopenharmony_ci                                    pred= ptr[-linesize];
1309cabdff1aSopenharmony_ci                                }else{
1310cabdff1aSopenharmony_ci                                    PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1311cabdff1aSopenharmony_ci                                }
1312cabdff1aSopenharmony_ci                            }
1313cabdff1aSopenharmony_ci
1314cabdff1aSopenharmony_ci                            if (s->interlaced && s->bottom_field)
1315cabdff1aSopenharmony_ci                                ptr += linesize >> 1;
1316cabdff1aSopenharmony_ci                            pred &= mask;
1317cabdff1aSopenharmony_ci                            *ptr= pred + ((unsigned)dc << point_transform);
1318cabdff1aSopenharmony_ci                        }else{
1319cabdff1aSopenharmony_ci                            ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1320cabdff1aSopenharmony_ci                            if(y==0 && toprow){
1321cabdff1aSopenharmony_ci                                if(x==0 && leftcol){
1322cabdff1aSopenharmony_ci                                    pred= 1 << (bits - 1);
1323cabdff1aSopenharmony_ci                                }else{
1324cabdff1aSopenharmony_ci                                    pred= ptr16[-1];
1325cabdff1aSopenharmony_ci                                }
1326cabdff1aSopenharmony_ci                            }else{
1327cabdff1aSopenharmony_ci                                if(x==0 && leftcol){
1328cabdff1aSopenharmony_ci                                    pred= ptr16[-linesize];
1329cabdff1aSopenharmony_ci                                }else{
1330cabdff1aSopenharmony_ci                                    PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
1331cabdff1aSopenharmony_ci                                }
1332cabdff1aSopenharmony_ci                            }
1333cabdff1aSopenharmony_ci
1334cabdff1aSopenharmony_ci                            if (s->interlaced && s->bottom_field)
1335cabdff1aSopenharmony_ci                                ptr16 += linesize >> 1;
1336cabdff1aSopenharmony_ci                            pred &= mask;
1337cabdff1aSopenharmony_ci                            *ptr16= pred + ((unsigned)dc << point_transform);
1338cabdff1aSopenharmony_ci                        }
1339cabdff1aSopenharmony_ci                        if (++x == h) {
1340cabdff1aSopenharmony_ci                            x = 0;
1341cabdff1aSopenharmony_ci                            y++;
1342cabdff1aSopenharmony_ci                        }
1343cabdff1aSopenharmony_ci                    }
1344cabdff1aSopenharmony_ci                }
1345cabdff1aSopenharmony_ci            } else {
1346cabdff1aSopenharmony_ci                for (i = 0; i < nb_components; i++) {
1347cabdff1aSopenharmony_ci                    uint8_t *ptr;
1348cabdff1aSopenharmony_ci                    uint16_t *ptr16;
1349cabdff1aSopenharmony_ci                    int n, h, v, x, y, c, j, linesize, dc;
1350cabdff1aSopenharmony_ci                    n        = s->nb_blocks[i];
1351cabdff1aSopenharmony_ci                    c        = s->comp_index[i];
1352cabdff1aSopenharmony_ci                    h        = s->h_scount[i];
1353cabdff1aSopenharmony_ci                    v        = s->v_scount[i];
1354cabdff1aSopenharmony_ci                    x        = 0;
1355cabdff1aSopenharmony_ci                    y        = 0;
1356cabdff1aSopenharmony_ci                    linesize = s->linesize[c];
1357cabdff1aSopenharmony_ci
1358cabdff1aSopenharmony_ci                    if(bits>8) linesize /= 2;
1359cabdff1aSopenharmony_ci
1360cabdff1aSopenharmony_ci                    for (j = 0; j < n; j++) {
1361cabdff1aSopenharmony_ci                        int pred;
1362cabdff1aSopenharmony_ci
1363cabdff1aSopenharmony_ci                        dc = mjpeg_decode_dc(s, s->dc_index[i]);
1364cabdff1aSopenharmony_ci                        if(dc == 0xFFFFF)
1365cabdff1aSopenharmony_ci                            return -1;
1366cabdff1aSopenharmony_ci                        if (   h * mb_x + x >= s->width
1367cabdff1aSopenharmony_ci                            || v * mb_y + y >= s->height) {
1368cabdff1aSopenharmony_ci                            // Nothing to do
1369cabdff1aSopenharmony_ci                        } else if (bits<=8) {
1370cabdff1aSopenharmony_ci                            ptr = s->picture_ptr->data[c] +
1371cabdff1aSopenharmony_ci                              (linesize * (v * mb_y + y)) +
1372cabdff1aSopenharmony_ci                              (h * mb_x + x); //FIXME optimize this crap
1373cabdff1aSopenharmony_ci                            PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1374cabdff1aSopenharmony_ci
1375cabdff1aSopenharmony_ci                            pred &= mask;
1376cabdff1aSopenharmony_ci                            *ptr = pred + ((unsigned)dc << point_transform);
1377cabdff1aSopenharmony_ci                        }else{
1378cabdff1aSopenharmony_ci                            ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1379cabdff1aSopenharmony_ci                            PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
1380cabdff1aSopenharmony_ci
1381cabdff1aSopenharmony_ci                            pred &= mask;
1382cabdff1aSopenharmony_ci                            *ptr16= pred + ((unsigned)dc << point_transform);
1383cabdff1aSopenharmony_ci                        }
1384cabdff1aSopenharmony_ci
1385cabdff1aSopenharmony_ci                        if (++x == h) {
1386cabdff1aSopenharmony_ci                            x = 0;
1387cabdff1aSopenharmony_ci                            y++;
1388cabdff1aSopenharmony_ci                        }
1389cabdff1aSopenharmony_ci                    }
1390cabdff1aSopenharmony_ci                }
1391cabdff1aSopenharmony_ci            }
1392cabdff1aSopenharmony_ci            if (s->restart_interval && !--s->restart_count) {
1393cabdff1aSopenharmony_ci                align_get_bits(&s->gb);
1394cabdff1aSopenharmony_ci                skip_bits(&s->gb, 16); /* skip RSTn */
1395cabdff1aSopenharmony_ci            }
1396cabdff1aSopenharmony_ci        }
1397cabdff1aSopenharmony_ci    }
1398cabdff1aSopenharmony_ci    return 0;
1399cabdff1aSopenharmony_ci}
1400cabdff1aSopenharmony_ci
1401cabdff1aSopenharmony_cistatic av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s,
1402cabdff1aSopenharmony_ci                                              uint8_t *dst, const uint8_t *src,
1403cabdff1aSopenharmony_ci                                              int linesize, int lowres)
1404cabdff1aSopenharmony_ci{
1405cabdff1aSopenharmony_ci    switch (lowres) {
1406cabdff1aSopenharmony_ci    case 0: s->hdsp.put_pixels_tab[1][0](dst, src, linesize, 8);
1407cabdff1aSopenharmony_ci        break;
1408cabdff1aSopenharmony_ci    case 1: copy_block4(dst, src, linesize, linesize, 4);
1409cabdff1aSopenharmony_ci        break;
1410cabdff1aSopenharmony_ci    case 2: copy_block2(dst, src, linesize, linesize, 2);
1411cabdff1aSopenharmony_ci        break;
1412cabdff1aSopenharmony_ci    case 3: *dst = *src;
1413cabdff1aSopenharmony_ci        break;
1414cabdff1aSopenharmony_ci    }
1415cabdff1aSopenharmony_ci}
1416cabdff1aSopenharmony_ci
1417cabdff1aSopenharmony_cistatic void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
1418cabdff1aSopenharmony_ci{
1419cabdff1aSopenharmony_ci    int block_x, block_y;
1420cabdff1aSopenharmony_ci    int size = 8 >> s->avctx->lowres;
1421cabdff1aSopenharmony_ci    if (s->bits > 8) {
1422cabdff1aSopenharmony_ci        for (block_y=0; block_y<size; block_y++)
1423cabdff1aSopenharmony_ci            for (block_x=0; block_x<size; block_x++)
1424cabdff1aSopenharmony_ci                *(uint16_t*)(ptr + 2*block_x + block_y*linesize) <<= 16 - s->bits;
1425cabdff1aSopenharmony_ci    } else {
1426cabdff1aSopenharmony_ci        for (block_y=0; block_y<size; block_y++)
1427cabdff1aSopenharmony_ci            for (block_x=0; block_x<size; block_x++)
1428cabdff1aSopenharmony_ci                *(ptr + block_x + block_y*linesize) <<= 8 - s->bits;
1429cabdff1aSopenharmony_ci    }
1430cabdff1aSopenharmony_ci}
1431cabdff1aSopenharmony_ci
1432cabdff1aSopenharmony_cistatic int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
1433cabdff1aSopenharmony_ci                             int Al, const uint8_t *mb_bitmask,
1434cabdff1aSopenharmony_ci                             int mb_bitmask_size,
1435cabdff1aSopenharmony_ci                             const AVFrame *reference)
1436cabdff1aSopenharmony_ci{
1437cabdff1aSopenharmony_ci    int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height;
1438cabdff1aSopenharmony_ci    uint8_t *data[MAX_COMPONENTS];
1439cabdff1aSopenharmony_ci    const uint8_t *reference_data[MAX_COMPONENTS];
1440cabdff1aSopenharmony_ci    int linesize[MAX_COMPONENTS];
1441cabdff1aSopenharmony_ci    GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1442cabdff1aSopenharmony_ci    int bytes_per_pixel = 1 + (s->bits > 8);
1443cabdff1aSopenharmony_ci
1444cabdff1aSopenharmony_ci    if (mb_bitmask) {
1445cabdff1aSopenharmony_ci        if (mb_bitmask_size != (s->mb_width * s->mb_height + 7)>>3) {
1446cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "mb_bitmask_size mismatches\n");
1447cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1448cabdff1aSopenharmony_ci        }
1449cabdff1aSopenharmony_ci        init_get_bits(&mb_bitmask_gb, mb_bitmask, s->mb_width * s->mb_height);
1450cabdff1aSopenharmony_ci    }
1451cabdff1aSopenharmony_ci
1452cabdff1aSopenharmony_ci    s->restart_count = 0;
1453cabdff1aSopenharmony_ci
1454cabdff1aSopenharmony_ci    av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &chroma_h_shift,
1455cabdff1aSopenharmony_ci                                     &chroma_v_shift);
1456cabdff1aSopenharmony_ci    chroma_width  = AV_CEIL_RSHIFT(s->width,  chroma_h_shift);
1457cabdff1aSopenharmony_ci    chroma_height = AV_CEIL_RSHIFT(s->height, chroma_v_shift);
1458cabdff1aSopenharmony_ci
1459cabdff1aSopenharmony_ci    for (i = 0; i < nb_components; i++) {
1460cabdff1aSopenharmony_ci        int c   = s->comp_index[i];
1461cabdff1aSopenharmony_ci        data[c] = s->picture_ptr->data[c];
1462cabdff1aSopenharmony_ci        reference_data[c] = reference ? reference->data[c] : NULL;
1463cabdff1aSopenharmony_ci        linesize[c] = s->linesize[c];
1464cabdff1aSopenharmony_ci        s->coefs_finished[c] |= 1;
1465cabdff1aSopenharmony_ci    }
1466cabdff1aSopenharmony_ci
1467cabdff1aSopenharmony_ci    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1468cabdff1aSopenharmony_ci        for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1469cabdff1aSopenharmony_ci            const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);
1470cabdff1aSopenharmony_ci
1471cabdff1aSopenharmony_ci            if (s->restart_interval && !s->restart_count)
1472cabdff1aSopenharmony_ci                s->restart_count = s->restart_interval;
1473cabdff1aSopenharmony_ci
1474cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0) {
1475cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1476cabdff1aSopenharmony_ci                       -get_bits_left(&s->gb));
1477cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1478cabdff1aSopenharmony_ci            }
1479cabdff1aSopenharmony_ci            for (i = 0; i < nb_components; i++) {
1480cabdff1aSopenharmony_ci                uint8_t *ptr;
1481cabdff1aSopenharmony_ci                int n, h, v, x, y, c, j;
1482cabdff1aSopenharmony_ci                int block_offset;
1483cabdff1aSopenharmony_ci                n = s->nb_blocks[i];
1484cabdff1aSopenharmony_ci                c = s->comp_index[i];
1485cabdff1aSopenharmony_ci                h = s->h_scount[i];
1486cabdff1aSopenharmony_ci                v = s->v_scount[i];
1487cabdff1aSopenharmony_ci                x = 0;
1488cabdff1aSopenharmony_ci                y = 0;
1489cabdff1aSopenharmony_ci                for (j = 0; j < n; j++) {
1490cabdff1aSopenharmony_ci                    block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1491cabdff1aSopenharmony_ci                                     (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1492cabdff1aSopenharmony_ci
1493cabdff1aSopenharmony_ci                    if (s->interlaced && s->bottom_field)
1494cabdff1aSopenharmony_ci                        block_offset += linesize[c] >> 1;
1495cabdff1aSopenharmony_ci                    if (   8*(h * mb_x + x) < ((c == 1) || (c == 2) ? chroma_width  : s->width)
1496cabdff1aSopenharmony_ci                        && 8*(v * mb_y + y) < ((c == 1) || (c == 2) ? chroma_height : s->height)) {
1497cabdff1aSopenharmony_ci                        ptr = data[c] + block_offset;
1498cabdff1aSopenharmony_ci                    } else
1499cabdff1aSopenharmony_ci                        ptr = NULL;
1500cabdff1aSopenharmony_ci                    if (!s->progressive) {
1501cabdff1aSopenharmony_ci                        if (copy_mb) {
1502cabdff1aSopenharmony_ci                            if (ptr)
1503cabdff1aSopenharmony_ci                                mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1504cabdff1aSopenharmony_ci                                                linesize[c], s->avctx->lowres);
1505cabdff1aSopenharmony_ci
1506cabdff1aSopenharmony_ci                        } else {
1507cabdff1aSopenharmony_ci                            s->bdsp.clear_block(s->block);
1508cabdff1aSopenharmony_ci                            if (decode_block(s, s->block, i,
1509cabdff1aSopenharmony_ci                                             s->dc_index[i], s->ac_index[i],
1510cabdff1aSopenharmony_ci                                             s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1511cabdff1aSopenharmony_ci                                av_log(s->avctx, AV_LOG_ERROR,
1512cabdff1aSopenharmony_ci                                       "error y=%d x=%d\n", mb_y, mb_x);
1513cabdff1aSopenharmony_ci                                return AVERROR_INVALIDDATA;
1514cabdff1aSopenharmony_ci                            }
1515cabdff1aSopenharmony_ci                            if (ptr) {
1516cabdff1aSopenharmony_ci                                s->idsp.idct_put(ptr, linesize[c], s->block);
1517cabdff1aSopenharmony_ci                                if (s->bits & 7)
1518cabdff1aSopenharmony_ci                                    shift_output(s, ptr, linesize[c]);
1519cabdff1aSopenharmony_ci                            }
1520cabdff1aSopenharmony_ci                        }
1521cabdff1aSopenharmony_ci                    } else {
1522cabdff1aSopenharmony_ci                        int block_idx  = s->block_stride[c] * (v * mb_y + y) +
1523cabdff1aSopenharmony_ci                                         (h * mb_x + x);
1524cabdff1aSopenharmony_ci                        int16_t *block = s->blocks[c][block_idx];
1525cabdff1aSopenharmony_ci                        if (Ah)
1526cabdff1aSopenharmony_ci                            block[0] += get_bits1(&s->gb) *
1527cabdff1aSopenharmony_ci                                        s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1528cabdff1aSopenharmony_ci                        else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1529cabdff1aSopenharmony_ci                                                       s->quant_matrixes[s->quant_sindex[i]],
1530cabdff1aSopenharmony_ci                                                       Al) < 0) {
1531cabdff1aSopenharmony_ci                            av_log(s->avctx, AV_LOG_ERROR,
1532cabdff1aSopenharmony_ci                                   "error y=%d x=%d\n", mb_y, mb_x);
1533cabdff1aSopenharmony_ci                            return AVERROR_INVALIDDATA;
1534cabdff1aSopenharmony_ci                        }
1535cabdff1aSopenharmony_ci                    }
1536cabdff1aSopenharmony_ci                    ff_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
1537cabdff1aSopenharmony_ci                    ff_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
1538cabdff1aSopenharmony_ci                            mb_x, mb_y, x, y, c, s->bottom_field,
1539cabdff1aSopenharmony_ci                            (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1540cabdff1aSopenharmony_ci                    if (++x == h) {
1541cabdff1aSopenharmony_ci                        x = 0;
1542cabdff1aSopenharmony_ci                        y++;
1543cabdff1aSopenharmony_ci                    }
1544cabdff1aSopenharmony_ci                }
1545cabdff1aSopenharmony_ci            }
1546cabdff1aSopenharmony_ci
1547cabdff1aSopenharmony_ci            handle_rstn(s, nb_components);
1548cabdff1aSopenharmony_ci        }
1549cabdff1aSopenharmony_ci    }
1550cabdff1aSopenharmony_ci    return 0;
1551cabdff1aSopenharmony_ci}
1552cabdff1aSopenharmony_ci
1553cabdff1aSopenharmony_cistatic int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
1554cabdff1aSopenharmony_ci                                            int se, int Ah, int Al)
1555cabdff1aSopenharmony_ci{
1556cabdff1aSopenharmony_ci    int mb_x, mb_y;
1557cabdff1aSopenharmony_ci    int EOBRUN = 0;
1558cabdff1aSopenharmony_ci    int c = s->comp_index[0];
1559cabdff1aSopenharmony_ci    uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1560cabdff1aSopenharmony_ci
1561cabdff1aSopenharmony_ci    av_assert0(ss>=0 && Ah>=0 && Al>=0);
1562cabdff1aSopenharmony_ci    if (se < ss || se > 63) {
1563cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", ss, se);
1564cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1565cabdff1aSopenharmony_ci    }
1566cabdff1aSopenharmony_ci
1567cabdff1aSopenharmony_ci    // s->coefs_finished is a bitmask for coefficients coded
1568cabdff1aSopenharmony_ci    // ss and se are parameters telling start and end coefficients
1569cabdff1aSopenharmony_ci    s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss);
1570cabdff1aSopenharmony_ci
1571cabdff1aSopenharmony_ci    s->restart_count = 0;
1572cabdff1aSopenharmony_ci
1573cabdff1aSopenharmony_ci    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1574cabdff1aSopenharmony_ci        int block_idx    = mb_y * s->block_stride[c];
1575cabdff1aSopenharmony_ci        int16_t (*block)[64] = &s->blocks[c][block_idx];
1576cabdff1aSopenharmony_ci        uint8_t *last_nnz    = &s->last_nnz[c][block_idx];
1577cabdff1aSopenharmony_ci        if (get_bits_left(&s->gb) <= 0) {
1578cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "bitstream truncated in mjpeg_decode_scan_progressive_ac\n");
1579cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1580cabdff1aSopenharmony_ci        }
1581cabdff1aSopenharmony_ci        for (mb_x = 0; mb_x < s->mb_width; mb_x++, block++, last_nnz++) {
1582cabdff1aSopenharmony_ci                int ret;
1583cabdff1aSopenharmony_ci                if (s->restart_interval && !s->restart_count)
1584cabdff1aSopenharmony_ci                    s->restart_count = s->restart_interval;
1585cabdff1aSopenharmony_ci
1586cabdff1aSopenharmony_ci                if (Ah)
1587cabdff1aSopenharmony_ci                    ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
1588cabdff1aSopenharmony_ci                                                  quant_matrix, ss, se, Al, &EOBRUN);
1589cabdff1aSopenharmony_ci                else
1590cabdff1aSopenharmony_ci                    ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
1591cabdff1aSopenharmony_ci                                                   quant_matrix, ss, se, Al, &EOBRUN);
1592cabdff1aSopenharmony_ci
1593cabdff1aSopenharmony_ci                if (ret >= 0 && get_bits_left(&s->gb) < 0)
1594cabdff1aSopenharmony_ci                    ret = AVERROR_INVALIDDATA;
1595cabdff1aSopenharmony_ci                if (ret < 0) {
1596cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR,
1597cabdff1aSopenharmony_ci                           "error y=%d x=%d\n", mb_y, mb_x);
1598cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1599cabdff1aSopenharmony_ci                }
1600cabdff1aSopenharmony_ci
1601cabdff1aSopenharmony_ci            if (handle_rstn(s, 0))
1602cabdff1aSopenharmony_ci                EOBRUN = 0;
1603cabdff1aSopenharmony_ci        }
1604cabdff1aSopenharmony_ci    }
1605cabdff1aSopenharmony_ci    return 0;
1606cabdff1aSopenharmony_ci}
1607cabdff1aSopenharmony_ci
1608cabdff1aSopenharmony_cistatic void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
1609cabdff1aSopenharmony_ci{
1610cabdff1aSopenharmony_ci    int mb_x, mb_y;
1611cabdff1aSopenharmony_ci    int c;
1612cabdff1aSopenharmony_ci    const int bytes_per_pixel = 1 + (s->bits > 8);
1613cabdff1aSopenharmony_ci    const int block_size = s->lossless ? 1 : 8;
1614cabdff1aSopenharmony_ci
1615cabdff1aSopenharmony_ci    for (c = 0; c < s->nb_components; c++) {
1616cabdff1aSopenharmony_ci        uint8_t *data = s->picture_ptr->data[c];
1617cabdff1aSopenharmony_ci        int linesize  = s->linesize[c];
1618cabdff1aSopenharmony_ci        int h = s->h_max / s->h_count[c];
1619cabdff1aSopenharmony_ci        int v = s->v_max / s->v_count[c];
1620cabdff1aSopenharmony_ci        int mb_width     = (s->width  + h * block_size - 1) / (h * block_size);
1621cabdff1aSopenharmony_ci        int mb_height    = (s->height + v * block_size - 1) / (v * block_size);
1622cabdff1aSopenharmony_ci
1623cabdff1aSopenharmony_ci        if (~s->coefs_finished[c])
1624cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
1625cabdff1aSopenharmony_ci
1626cabdff1aSopenharmony_ci        if (s->interlaced && s->bottom_field)
1627cabdff1aSopenharmony_ci            data += linesize >> 1;
1628cabdff1aSopenharmony_ci
1629cabdff1aSopenharmony_ci        for (mb_y = 0; mb_y < mb_height; mb_y++) {
1630cabdff1aSopenharmony_ci            uint8_t *ptr     = data + (mb_y * linesize * 8 >> s->avctx->lowres);
1631cabdff1aSopenharmony_ci            int block_idx    = mb_y * s->block_stride[c];
1632cabdff1aSopenharmony_ci            int16_t (*block)[64] = &s->blocks[c][block_idx];
1633cabdff1aSopenharmony_ci            for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
1634cabdff1aSopenharmony_ci                s->idsp.idct_put(ptr, linesize, *block);
1635cabdff1aSopenharmony_ci                if (s->bits & 7)
1636cabdff1aSopenharmony_ci                    shift_output(s, ptr, linesize);
1637cabdff1aSopenharmony_ci                ptr += bytes_per_pixel*8 >> s->avctx->lowres;
1638cabdff1aSopenharmony_ci            }
1639cabdff1aSopenharmony_ci        }
1640cabdff1aSopenharmony_ci    }
1641cabdff1aSopenharmony_ci}
1642cabdff1aSopenharmony_ci
1643cabdff1aSopenharmony_ciint ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
1644cabdff1aSopenharmony_ci                        int mb_bitmask_size, const AVFrame *reference)
1645cabdff1aSopenharmony_ci{
1646cabdff1aSopenharmony_ci    int len, nb_components, i, h, v, predictor, point_transform;
1647cabdff1aSopenharmony_ci    int index, id, ret;
1648cabdff1aSopenharmony_ci    const int block_size = s->lossless ? 1 : 8;
1649cabdff1aSopenharmony_ci    int ilv, prev_shift;
1650cabdff1aSopenharmony_ci
1651cabdff1aSopenharmony_ci    if (!s->got_picture) {
1652cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_WARNING,
1653cabdff1aSopenharmony_ci                "Can not process SOS before SOF, skipping\n");
1654cabdff1aSopenharmony_ci        return -1;
1655cabdff1aSopenharmony_ci    }
1656cabdff1aSopenharmony_ci
1657cabdff1aSopenharmony_ci    if (reference) {
1658cabdff1aSopenharmony_ci        if (reference->width  != s->picture_ptr->width  ||
1659cabdff1aSopenharmony_ci            reference->height != s->picture_ptr->height ||
1660cabdff1aSopenharmony_ci            reference->format != s->picture_ptr->format) {
1661cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Reference mismatching\n");
1662cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1663cabdff1aSopenharmony_ci        }
1664cabdff1aSopenharmony_ci    }
1665cabdff1aSopenharmony_ci
1666cabdff1aSopenharmony_ci    /* XXX: verify len field validity */
1667cabdff1aSopenharmony_ci    len = get_bits(&s->gb, 16);
1668cabdff1aSopenharmony_ci    nb_components = get_bits(&s->gb, 8);
1669cabdff1aSopenharmony_ci    if (nb_components == 0 || nb_components > MAX_COMPONENTS) {
1670cabdff1aSopenharmony_ci        avpriv_report_missing_feature(s->avctx,
1671cabdff1aSopenharmony_ci                                      "decode_sos: nb_components (%d)",
1672cabdff1aSopenharmony_ci                                      nb_components);
1673cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1674cabdff1aSopenharmony_ci    }
1675cabdff1aSopenharmony_ci    if (len != 6 + 2 * nb_components) {
1676cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1677cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1678cabdff1aSopenharmony_ci    }
1679cabdff1aSopenharmony_ci    for (i = 0; i < nb_components; i++) {
1680cabdff1aSopenharmony_ci        id = get_bits(&s->gb, 8) - 1;
1681cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1682cabdff1aSopenharmony_ci        /* find component index */
1683cabdff1aSopenharmony_ci        for (index = 0; index < s->nb_components; index++)
1684cabdff1aSopenharmony_ci            if (id == s->component_id[index])
1685cabdff1aSopenharmony_ci                break;
1686cabdff1aSopenharmony_ci        if (index == s->nb_components) {
1687cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
1688cabdff1aSopenharmony_ci                   "decode_sos: index(%d) out of components\n", index);
1689cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1690cabdff1aSopenharmony_ci        }
1691cabdff1aSopenharmony_ci        /* Metasoft MJPEG codec has Cb and Cr swapped */
1692cabdff1aSopenharmony_ci        if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1693cabdff1aSopenharmony_ci            && nb_components == 3 && s->nb_components == 3 && i)
1694cabdff1aSopenharmony_ci            index = 3 - i;
1695cabdff1aSopenharmony_ci
1696cabdff1aSopenharmony_ci        s->quant_sindex[i] = s->quant_index[index];
1697cabdff1aSopenharmony_ci        s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1698cabdff1aSopenharmony_ci        s->h_scount[i]  = s->h_count[index];
1699cabdff1aSopenharmony_ci        s->v_scount[i]  = s->v_count[index];
1700cabdff1aSopenharmony_ci
1701cabdff1aSopenharmony_ci        if((nb_components == 1 || nb_components == 3) && s->nb_components == 3 && s->avctx->pix_fmt == AV_PIX_FMT_GBR24P)
1702cabdff1aSopenharmony_ci            index = (index+2)%3;
1703cabdff1aSopenharmony_ci
1704cabdff1aSopenharmony_ci        s->comp_index[i] = index;
1705cabdff1aSopenharmony_ci
1706cabdff1aSopenharmony_ci        s->dc_index[i] = get_bits(&s->gb, 4);
1707cabdff1aSopenharmony_ci        s->ac_index[i] = get_bits(&s->gb, 4);
1708cabdff1aSopenharmony_ci
1709cabdff1aSopenharmony_ci        if (s->dc_index[i] <  0 || s->ac_index[i] < 0 ||
1710cabdff1aSopenharmony_ci            s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1711cabdff1aSopenharmony_ci            goto out_of_range;
1712cabdff1aSopenharmony_ci        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))
1713cabdff1aSopenharmony_ci            goto out_of_range;
1714cabdff1aSopenharmony_ci    }
1715cabdff1aSopenharmony_ci
1716cabdff1aSopenharmony_ci    predictor = get_bits(&s->gb, 8);       /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
1717cabdff1aSopenharmony_ci    ilv = get_bits(&s->gb, 8);             /* JPEG Se / JPEG-LS ILV */
1718cabdff1aSopenharmony_ci    if(s->avctx->codec_tag != AV_RL32("CJPG")){
1719cabdff1aSopenharmony_ci        prev_shift      = get_bits(&s->gb, 4); /* Ah */
1720cabdff1aSopenharmony_ci        point_transform = get_bits(&s->gb, 4); /* Al */
1721cabdff1aSopenharmony_ci    }else
1722cabdff1aSopenharmony_ci        prev_shift = point_transform = 0;
1723cabdff1aSopenharmony_ci
1724cabdff1aSopenharmony_ci    if (nb_components > 1) {
1725cabdff1aSopenharmony_ci        /* interleaved stream */
1726cabdff1aSopenharmony_ci        s->mb_width  = (s->width  + s->h_max * block_size - 1) / (s->h_max * block_size);
1727cabdff1aSopenharmony_ci        s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1728cabdff1aSopenharmony_ci    } else if (!s->ls) { /* skip this for JPEG-LS */
1729cabdff1aSopenharmony_ci        h = s->h_max / s->h_scount[0];
1730cabdff1aSopenharmony_ci        v = s->v_max / s->v_scount[0];
1731cabdff1aSopenharmony_ci        s->mb_width     = (s->width  + h * block_size - 1) / (h * block_size);
1732cabdff1aSopenharmony_ci        s->mb_height    = (s->height + v * block_size - 1) / (v * block_size);
1733cabdff1aSopenharmony_ci        s->nb_blocks[0] = 1;
1734cabdff1aSopenharmony_ci        s->h_scount[0]  = 1;
1735cabdff1aSopenharmony_ci        s->v_scount[0]  = 1;
1736cabdff1aSopenharmony_ci    }
1737cabdff1aSopenharmony_ci
1738cabdff1aSopenharmony_ci    if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1739cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
1740cabdff1aSopenharmony_ci               s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1741cabdff1aSopenharmony_ci               predictor, point_transform, ilv, s->bits, s->mjpb_skiptosod,
1742cabdff1aSopenharmony_ci               s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), nb_components);
1743cabdff1aSopenharmony_ci
1744cabdff1aSopenharmony_ci
1745cabdff1aSopenharmony_ci    /* mjpeg-b can have padding bytes between sos and image data, skip them */
1746cabdff1aSopenharmony_ci    for (i = s->mjpb_skiptosod; i > 0; i--)
1747cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8);
1748cabdff1aSopenharmony_ci
1749cabdff1aSopenharmony_cinext_field:
1750cabdff1aSopenharmony_ci    for (i = 0; i < nb_components; i++)
1751cabdff1aSopenharmony_ci        s->last_dc[i] = (4 << s->bits);
1752cabdff1aSopenharmony_ci
1753cabdff1aSopenharmony_ci    if (s->avctx->hwaccel) {
1754cabdff1aSopenharmony_ci        int bytes_to_start = get_bits_count(&s->gb) / 8;
1755cabdff1aSopenharmony_ci        av_assert0(bytes_to_start >= 0 &&
1756cabdff1aSopenharmony_ci                   s->raw_scan_buffer_size >= bytes_to_start);
1757cabdff1aSopenharmony_ci
1758cabdff1aSopenharmony_ci        ret = s->avctx->hwaccel->decode_slice(s->avctx,
1759cabdff1aSopenharmony_ci                                              s->raw_scan_buffer      + bytes_to_start,
1760cabdff1aSopenharmony_ci                                              s->raw_scan_buffer_size - bytes_to_start);
1761cabdff1aSopenharmony_ci        if (ret < 0)
1762cabdff1aSopenharmony_ci            return ret;
1763cabdff1aSopenharmony_ci
1764cabdff1aSopenharmony_ci    } else if (s->lossless) {
1765cabdff1aSopenharmony_ci        av_assert0(s->picture_ptr == s->picture);
1766cabdff1aSopenharmony_ci        if (CONFIG_JPEGLS_DECODER && s->ls) {
1767cabdff1aSopenharmony_ci//            for () {
1768cabdff1aSopenharmony_ci//            reset_ls_coding_parameters(s, 0);
1769cabdff1aSopenharmony_ci
1770cabdff1aSopenharmony_ci            if ((ret = ff_jpegls_decode_picture(s, predictor,
1771cabdff1aSopenharmony_ci                                                point_transform, ilv)) < 0)
1772cabdff1aSopenharmony_ci                return ret;
1773cabdff1aSopenharmony_ci        } else {
1774cabdff1aSopenharmony_ci            if (s->rgb || s->bayer) {
1775cabdff1aSopenharmony_ci                if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0)
1776cabdff1aSopenharmony_ci                    return ret;
1777cabdff1aSopenharmony_ci            } else {
1778cabdff1aSopenharmony_ci                if ((ret = ljpeg_decode_yuv_scan(s, predictor,
1779cabdff1aSopenharmony_ci                                                 point_transform,
1780cabdff1aSopenharmony_ci                                                 nb_components)) < 0)
1781cabdff1aSopenharmony_ci                    return ret;
1782cabdff1aSopenharmony_ci            }
1783cabdff1aSopenharmony_ci        }
1784cabdff1aSopenharmony_ci    } else {
1785cabdff1aSopenharmony_ci        if (s->progressive && predictor) {
1786cabdff1aSopenharmony_ci            av_assert0(s->picture_ptr == s->picture);
1787cabdff1aSopenharmony_ci            if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor,
1788cabdff1aSopenharmony_ci                                                        ilv, prev_shift,
1789cabdff1aSopenharmony_ci                                                        point_transform)) < 0)
1790cabdff1aSopenharmony_ci                return ret;
1791cabdff1aSopenharmony_ci        } else {
1792cabdff1aSopenharmony_ci            if ((ret = mjpeg_decode_scan(s, nb_components,
1793cabdff1aSopenharmony_ci                                         prev_shift, point_transform,
1794cabdff1aSopenharmony_ci                                         mb_bitmask, mb_bitmask_size, reference)) < 0)
1795cabdff1aSopenharmony_ci                return ret;
1796cabdff1aSopenharmony_ci        }
1797cabdff1aSopenharmony_ci    }
1798cabdff1aSopenharmony_ci
1799cabdff1aSopenharmony_ci    if (s->interlaced &&
1800cabdff1aSopenharmony_ci        get_bits_left(&s->gb) > 32 &&
1801cabdff1aSopenharmony_ci        show_bits(&s->gb, 8) == 0xFF) {
1802cabdff1aSopenharmony_ci        GetBitContext bak = s->gb;
1803cabdff1aSopenharmony_ci        align_get_bits(&bak);
1804cabdff1aSopenharmony_ci        if (show_bits(&bak, 16) == 0xFFD1) {
1805cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1806cabdff1aSopenharmony_ci            s->gb = bak;
1807cabdff1aSopenharmony_ci            skip_bits(&s->gb, 16);
1808cabdff1aSopenharmony_ci            s->bottom_field ^= 1;
1809cabdff1aSopenharmony_ci
1810cabdff1aSopenharmony_ci            goto next_field;
1811cabdff1aSopenharmony_ci        }
1812cabdff1aSopenharmony_ci    }
1813cabdff1aSopenharmony_ci
1814cabdff1aSopenharmony_ci    emms_c();
1815cabdff1aSopenharmony_ci    return 0;
1816cabdff1aSopenharmony_ci out_of_range:
1817cabdff1aSopenharmony_ci    av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1818cabdff1aSopenharmony_ci    return AVERROR_INVALIDDATA;
1819cabdff1aSopenharmony_ci}
1820cabdff1aSopenharmony_ci
1821cabdff1aSopenharmony_cistatic int mjpeg_decode_dri(MJpegDecodeContext *s)
1822cabdff1aSopenharmony_ci{
1823cabdff1aSopenharmony_ci    if (get_bits(&s->gb, 16) != 4)
1824cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1825cabdff1aSopenharmony_ci    s->restart_interval = get_bits(&s->gb, 16);
1826cabdff1aSopenharmony_ci    s->restart_count    = 0;
1827cabdff1aSopenharmony_ci    av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
1828cabdff1aSopenharmony_ci           s->restart_interval);
1829cabdff1aSopenharmony_ci
1830cabdff1aSopenharmony_ci    return 0;
1831cabdff1aSopenharmony_ci}
1832cabdff1aSopenharmony_ci
1833cabdff1aSopenharmony_cistatic int mjpeg_decode_app(MJpegDecodeContext *s)
1834cabdff1aSopenharmony_ci{
1835cabdff1aSopenharmony_ci    int len, id, i;
1836cabdff1aSopenharmony_ci
1837cabdff1aSopenharmony_ci    len = get_bits(&s->gb, 16);
1838cabdff1aSopenharmony_ci    if (len < 6) {
1839cabdff1aSopenharmony_ci        if (s->bayer) {
1840cabdff1aSopenharmony_ci            // Pentax K-1 (digital camera) JPEG images embedded in DNG images contain unknown APP0 markers
1841cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "skipping APPx (len=%"PRId32") for bayer-encoded image\n", len);
1842cabdff1aSopenharmony_ci            skip_bits(&s->gb, len);
1843cabdff1aSopenharmony_ci            return 0;
1844cabdff1aSopenharmony_ci        } else
1845cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1846cabdff1aSopenharmony_ci    }
1847cabdff1aSopenharmony_ci    if (8 * len > get_bits_left(&s->gb))
1848cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1849cabdff1aSopenharmony_ci
1850cabdff1aSopenharmony_ci    id   = get_bits_long(&s->gb, 32);
1851cabdff1aSopenharmony_ci    len -= 6;
1852cabdff1aSopenharmony_ci
1853cabdff1aSopenharmony_ci    if (s->avctx->debug & FF_DEBUG_STARTCODE)
1854cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "APPx (%s / %8X) len=%d\n",
1855cabdff1aSopenharmony_ci               av_fourcc2str(av_bswap32(id)), id, len);
1856cabdff1aSopenharmony_ci
1857cabdff1aSopenharmony_ci    /* Buggy AVID, it puts EOI only at every 10th frame. */
1858cabdff1aSopenharmony_ci    /* Also, this fourcc is used by non-avid files too, it holds some
1859cabdff1aSopenharmony_ci       information, but it's always present in AVID-created files. */
1860cabdff1aSopenharmony_ci    if (id == AV_RB32("AVI1")) {
1861cabdff1aSopenharmony_ci        /* structure:
1862cabdff1aSopenharmony_ci            4bytes      AVI1
1863cabdff1aSopenharmony_ci            1bytes      polarity
1864cabdff1aSopenharmony_ci            1bytes      always zero
1865cabdff1aSopenharmony_ci            4bytes      field_size
1866cabdff1aSopenharmony_ci            4bytes      field_size_less_padding
1867cabdff1aSopenharmony_ci        */
1868cabdff1aSopenharmony_ci            s->buggy_avid = 1;
1869cabdff1aSopenharmony_ci        i = get_bits(&s->gb, 8); len--;
1870cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i);
1871cabdff1aSopenharmony_ci        goto out;
1872cabdff1aSopenharmony_ci    }
1873cabdff1aSopenharmony_ci
1874cabdff1aSopenharmony_ci    if (id == AV_RB32("JFIF")) {
1875cabdff1aSopenharmony_ci        int t_w, t_h, v1, v2;
1876cabdff1aSopenharmony_ci        if (len < 8)
1877cabdff1aSopenharmony_ci            goto out;
1878cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8); /* the trailing zero-byte */
1879cabdff1aSopenharmony_ci        v1 = get_bits(&s->gb, 8);
1880cabdff1aSopenharmony_ci        v2 = get_bits(&s->gb, 8);
1881cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8);
1882cabdff1aSopenharmony_ci
1883cabdff1aSopenharmony_ci        s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 16);
1884cabdff1aSopenharmony_ci        s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 16);
1885cabdff1aSopenharmony_ci        if (   s->avctx->sample_aspect_ratio.num <= 0
1886cabdff1aSopenharmony_ci            || s->avctx->sample_aspect_ratio.den <= 0) {
1887cabdff1aSopenharmony_ci            s->avctx->sample_aspect_ratio.num = 0;
1888cabdff1aSopenharmony_ci            s->avctx->sample_aspect_ratio.den = 1;
1889cabdff1aSopenharmony_ci        }
1890cabdff1aSopenharmony_ci
1891cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1892cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO,
1893cabdff1aSopenharmony_ci                   "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1894cabdff1aSopenharmony_ci                   v1, v2,
1895cabdff1aSopenharmony_ci                   s->avctx->sample_aspect_ratio.num,
1896cabdff1aSopenharmony_ci                   s->avctx->sample_aspect_ratio.den);
1897cabdff1aSopenharmony_ci
1898cabdff1aSopenharmony_ci        len -= 8;
1899cabdff1aSopenharmony_ci        if (len >= 2) {
1900cabdff1aSopenharmony_ci            t_w = get_bits(&s->gb, 8);
1901cabdff1aSopenharmony_ci            t_h = get_bits(&s->gb, 8);
1902cabdff1aSopenharmony_ci            if (t_w && t_h) {
1903cabdff1aSopenharmony_ci                /* skip thumbnail */
1904cabdff1aSopenharmony_ci                if (len -10 - (t_w * t_h * 3) > 0)
1905cabdff1aSopenharmony_ci                    len -= t_w * t_h * 3;
1906cabdff1aSopenharmony_ci            }
1907cabdff1aSopenharmony_ci            len -= 2;
1908cabdff1aSopenharmony_ci        }
1909cabdff1aSopenharmony_ci        goto out;
1910cabdff1aSopenharmony_ci    }
1911cabdff1aSopenharmony_ci
1912cabdff1aSopenharmony_ci    if (   id == AV_RB32("Adob")
1913cabdff1aSopenharmony_ci        && len >= 7
1914cabdff1aSopenharmony_ci        && show_bits(&s->gb, 8) == 'e'
1915cabdff1aSopenharmony_ci        && show_bits_long(&s->gb, 32) != AV_RB32("e_CM")) {
1916cabdff1aSopenharmony_ci        skip_bits(&s->gb,  8); /* 'e' */
1917cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* version */
1918cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* flags0 */
1919cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* flags1 */
1920cabdff1aSopenharmony_ci        s->adobe_transform = get_bits(&s->gb,  8);
1921cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1922cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform);
1923cabdff1aSopenharmony_ci        len -= 7;
1924cabdff1aSopenharmony_ci        goto out;
1925cabdff1aSopenharmony_ci    }
1926cabdff1aSopenharmony_ci
1927cabdff1aSopenharmony_ci    if (id == AV_RB32("LJIF")) {
1928cabdff1aSopenharmony_ci        int rgb = s->rgb;
1929cabdff1aSopenharmony_ci        int pegasus_rct = s->pegasus_rct;
1930cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1931cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO,
1932cabdff1aSopenharmony_ci                   "Pegasus lossless jpeg header found\n");
1933cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* version ? */
1934cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* unknown always 0? */
1935cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* unknown always 0? */
1936cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); /* unknown always 0? */
1937cabdff1aSopenharmony_ci        switch (i=get_bits(&s->gb, 8)) {
1938cabdff1aSopenharmony_ci        case 1:
1939cabdff1aSopenharmony_ci            rgb         = 1;
1940cabdff1aSopenharmony_ci            pegasus_rct = 0;
1941cabdff1aSopenharmony_ci            break;
1942cabdff1aSopenharmony_ci        case 2:
1943cabdff1aSopenharmony_ci            rgb         = 1;
1944cabdff1aSopenharmony_ci            pegasus_rct = 1;
1945cabdff1aSopenharmony_ci            break;
1946cabdff1aSopenharmony_ci        default:
1947cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace %d\n", i);
1948cabdff1aSopenharmony_ci        }
1949cabdff1aSopenharmony_ci
1950cabdff1aSopenharmony_ci        len -= 9;
1951cabdff1aSopenharmony_ci        if (s->bayer)
1952cabdff1aSopenharmony_ci            goto out;
1953cabdff1aSopenharmony_ci        if (s->got_picture)
1954cabdff1aSopenharmony_ci            if (rgb != s->rgb || pegasus_rct != s->pegasus_rct) {
1955cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_WARNING, "Mismatching LJIF tag\n");
1956cabdff1aSopenharmony_ci                goto out;
1957cabdff1aSopenharmony_ci            }
1958cabdff1aSopenharmony_ci
1959cabdff1aSopenharmony_ci        s->rgb = rgb;
1960cabdff1aSopenharmony_ci        s->pegasus_rct = pegasus_rct;
1961cabdff1aSopenharmony_ci
1962cabdff1aSopenharmony_ci        goto out;
1963cabdff1aSopenharmony_ci    }
1964cabdff1aSopenharmony_ci    if (id == AV_RL32("colr") && len > 0) {
1965cabdff1aSopenharmony_ci        s->colr = get_bits(&s->gb, 8);
1966cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1967cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr);
1968cabdff1aSopenharmony_ci        len --;
1969cabdff1aSopenharmony_ci        goto out;
1970cabdff1aSopenharmony_ci    }
1971cabdff1aSopenharmony_ci    if (id == AV_RL32("xfrm") && len > 0) {
1972cabdff1aSopenharmony_ci        s->xfrm = get_bits(&s->gb, 8);
1973cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1974cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm);
1975cabdff1aSopenharmony_ci        len --;
1976cabdff1aSopenharmony_ci        goto out;
1977cabdff1aSopenharmony_ci    }
1978cabdff1aSopenharmony_ci
1979cabdff1aSopenharmony_ci    /* JPS extension by VRex */
1980cabdff1aSopenharmony_ci    if (s->start_code == APP3 && id == AV_RB32("_JPS") && len >= 10) {
1981cabdff1aSopenharmony_ci        int flags, layout, type;
1982cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1983cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n");
1984cabdff1aSopenharmony_ci
1985cabdff1aSopenharmony_ci        skip_bits(&s->gb, 32); len -= 4;  /* JPS_ */
1986cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); len -= 2;  /* block length */
1987cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8);             /* reserved */
1988cabdff1aSopenharmony_ci        flags  = get_bits(&s->gb, 8);
1989cabdff1aSopenharmony_ci        layout = get_bits(&s->gb, 8);
1990cabdff1aSopenharmony_ci        type   = get_bits(&s->gb, 8);
1991cabdff1aSopenharmony_ci        len -= 4;
1992cabdff1aSopenharmony_ci
1993cabdff1aSopenharmony_ci        av_freep(&s->stereo3d);
1994cabdff1aSopenharmony_ci        s->stereo3d = av_stereo3d_alloc();
1995cabdff1aSopenharmony_ci        if (!s->stereo3d) {
1996cabdff1aSopenharmony_ci            goto out;
1997cabdff1aSopenharmony_ci        }
1998cabdff1aSopenharmony_ci        if (type == 0) {
1999cabdff1aSopenharmony_ci            s->stereo3d->type = AV_STEREO3D_2D;
2000cabdff1aSopenharmony_ci        } else if (type == 1) {
2001cabdff1aSopenharmony_ci            switch (layout) {
2002cabdff1aSopenharmony_ci            case 0x01:
2003cabdff1aSopenharmony_ci                s->stereo3d->type = AV_STEREO3D_LINES;
2004cabdff1aSopenharmony_ci                break;
2005cabdff1aSopenharmony_ci            case 0x02:
2006cabdff1aSopenharmony_ci                s->stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
2007cabdff1aSopenharmony_ci                break;
2008cabdff1aSopenharmony_ci            case 0x03:
2009cabdff1aSopenharmony_ci                s->stereo3d->type = AV_STEREO3D_TOPBOTTOM;
2010cabdff1aSopenharmony_ci                break;
2011cabdff1aSopenharmony_ci            }
2012cabdff1aSopenharmony_ci            if (!(flags & 0x04)) {
2013cabdff1aSopenharmony_ci                s->stereo3d->flags = AV_STEREO3D_FLAG_INVERT;
2014cabdff1aSopenharmony_ci            }
2015cabdff1aSopenharmony_ci        }
2016cabdff1aSopenharmony_ci        goto out;
2017cabdff1aSopenharmony_ci    }
2018cabdff1aSopenharmony_ci
2019cabdff1aSopenharmony_ci    /* EXIF metadata */
2020cabdff1aSopenharmony_ci    if (s->start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
2021cabdff1aSopenharmony_ci        GetByteContext gbytes;
2022cabdff1aSopenharmony_ci        int ret, le, ifd_offset, bytes_read;
2023cabdff1aSopenharmony_ci        const uint8_t *aligned;
2024cabdff1aSopenharmony_ci
2025cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16); // skip padding
2026cabdff1aSopenharmony_ci        len -= 2;
2027cabdff1aSopenharmony_ci
2028cabdff1aSopenharmony_ci        // init byte wise reading
2029cabdff1aSopenharmony_ci        aligned = align_get_bits(&s->gb);
2030cabdff1aSopenharmony_ci        bytestream2_init(&gbytes, aligned, len);
2031cabdff1aSopenharmony_ci
2032cabdff1aSopenharmony_ci        // read TIFF header
2033cabdff1aSopenharmony_ci        ret = ff_tdecode_header(&gbytes, &le, &ifd_offset);
2034cabdff1aSopenharmony_ci        if (ret) {
2035cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "mjpeg: invalid TIFF header in EXIF data\n");
2036cabdff1aSopenharmony_ci        } else {
2037cabdff1aSopenharmony_ci            bytestream2_seek(&gbytes, ifd_offset, SEEK_SET);
2038cabdff1aSopenharmony_ci
2039cabdff1aSopenharmony_ci            // read 0th IFD and store the metadata
2040cabdff1aSopenharmony_ci            // (return values > 0 indicate the presence of subimage metadata)
2041cabdff1aSopenharmony_ci            ret = ff_exif_decode_ifd(s->avctx, &gbytes, le, 0, &s->exif_metadata);
2042cabdff1aSopenharmony_ci            if (ret < 0) {
2043cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error decoding EXIF data\n");
2044cabdff1aSopenharmony_ci            }
2045cabdff1aSopenharmony_ci        }
2046cabdff1aSopenharmony_ci
2047cabdff1aSopenharmony_ci        bytes_read = bytestream2_tell(&gbytes);
2048cabdff1aSopenharmony_ci        skip_bits(&s->gb, bytes_read << 3);
2049cabdff1aSopenharmony_ci        len -= bytes_read;
2050cabdff1aSopenharmony_ci
2051cabdff1aSopenharmony_ci        goto out;
2052cabdff1aSopenharmony_ci    }
2053cabdff1aSopenharmony_ci
2054cabdff1aSopenharmony_ci    /* Apple MJPEG-A */
2055cabdff1aSopenharmony_ci    if ((s->start_code == APP1) && (len > (0x28 - 8))) {
2056cabdff1aSopenharmony_ci        id   = get_bits_long(&s->gb, 32);
2057cabdff1aSopenharmony_ci        len -= 4;
2058cabdff1aSopenharmony_ci        /* Apple MJPEG-A */
2059cabdff1aSopenharmony_ci        if (id == AV_RB32("mjpg")) {
2060cabdff1aSopenharmony_ci            /* structure:
2061cabdff1aSopenharmony_ci                4bytes      field size
2062cabdff1aSopenharmony_ci                4bytes      pad field size
2063cabdff1aSopenharmony_ci                4bytes      next off
2064cabdff1aSopenharmony_ci                4bytes      quant off
2065cabdff1aSopenharmony_ci                4bytes      huff off
2066cabdff1aSopenharmony_ci                4bytes      image off
2067cabdff1aSopenharmony_ci                4bytes      scan off
2068cabdff1aSopenharmony_ci                4bytes      data off
2069cabdff1aSopenharmony_ci            */
2070cabdff1aSopenharmony_ci            if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2071cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
2072cabdff1aSopenharmony_ci        }
2073cabdff1aSopenharmony_ci    }
2074cabdff1aSopenharmony_ci
2075cabdff1aSopenharmony_ci    if (s->start_code == APP2 && id == AV_RB32("ICC_") && len >= 10) {
2076cabdff1aSopenharmony_ci        int id2;
2077cabdff1aSopenharmony_ci        unsigned seqno;
2078cabdff1aSopenharmony_ci        unsigned nummarkers;
2079cabdff1aSopenharmony_ci
2080cabdff1aSopenharmony_ci        id   = get_bits_long(&s->gb, 32);
2081cabdff1aSopenharmony_ci        id2  = get_bits(&s->gb, 24);
2082cabdff1aSopenharmony_ci        len -= 7;
2083cabdff1aSopenharmony_ci        if (id != AV_RB32("PROF") || id2 != AV_RB24("ILE")) {
2084cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n");
2085cabdff1aSopenharmony_ci            goto out;
2086cabdff1aSopenharmony_ci        }
2087cabdff1aSopenharmony_ci
2088cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8);
2089cabdff1aSopenharmony_ci        seqno  = get_bits(&s->gb, 8);
2090cabdff1aSopenharmony_ci        len   -= 2;
2091cabdff1aSopenharmony_ci        if (seqno == 0) {
2092cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Invalid sequence number in APP2\n");
2093cabdff1aSopenharmony_ci            goto out;
2094cabdff1aSopenharmony_ci        }
2095cabdff1aSopenharmony_ci
2096cabdff1aSopenharmony_ci        nummarkers  = get_bits(&s->gb, 8);
2097cabdff1aSopenharmony_ci        len        -= 1;
2098cabdff1aSopenharmony_ci        if (nummarkers == 0) {
2099cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Invalid number of markers coded in APP2\n");
2100cabdff1aSopenharmony_ci            goto out;
2101cabdff1aSopenharmony_ci        } else if (s->iccnum != 0 && nummarkers != s->iccnum) {
2102cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Mistmatch in coded number of ICC markers between markers\n");
2103cabdff1aSopenharmony_ci            goto out;
2104cabdff1aSopenharmony_ci        } else if (seqno > nummarkers) {
2105cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Mismatching sequence number and coded number of ICC markers\n");
2106cabdff1aSopenharmony_ci            goto out;
2107cabdff1aSopenharmony_ci        }
2108cabdff1aSopenharmony_ci
2109cabdff1aSopenharmony_ci        /* Allocate if this is the first APP2 we've seen. */
2110cabdff1aSopenharmony_ci        if (s->iccnum == 0) {
2111cabdff1aSopenharmony_ci            if (!FF_ALLOCZ_TYPED_ARRAY(s->iccentries, nummarkers)) {
2112cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data arrays\n");
2113cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
2114cabdff1aSopenharmony_ci            }
2115cabdff1aSopenharmony_ci            s->iccnum = nummarkers;
2116cabdff1aSopenharmony_ci        }
2117cabdff1aSopenharmony_ci
2118cabdff1aSopenharmony_ci        if (s->iccentries[seqno - 1].data) {
2119cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Duplicate ICC sequence number\n");
2120cabdff1aSopenharmony_ci            goto out;
2121cabdff1aSopenharmony_ci        }
2122cabdff1aSopenharmony_ci
2123cabdff1aSopenharmony_ci        s->iccentries[seqno - 1].length = len;
2124cabdff1aSopenharmony_ci        s->iccentries[seqno - 1].data   = av_malloc(len);
2125cabdff1aSopenharmony_ci        if (!s->iccentries[seqno - 1].data) {
2126cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data buffer\n");
2127cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
2128cabdff1aSopenharmony_ci        }
2129cabdff1aSopenharmony_ci
2130cabdff1aSopenharmony_ci        memcpy(s->iccentries[seqno - 1].data, align_get_bits(&s->gb), len);
2131cabdff1aSopenharmony_ci        skip_bits(&s->gb, len << 3);
2132cabdff1aSopenharmony_ci        len = 0;
2133cabdff1aSopenharmony_ci        s->iccread++;
2134cabdff1aSopenharmony_ci
2135cabdff1aSopenharmony_ci        if (s->iccread > s->iccnum)
2136cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_WARNING, "Read more ICC markers than are supposed to be coded\n");
2137cabdff1aSopenharmony_ci    }
2138cabdff1aSopenharmony_ci
2139cabdff1aSopenharmony_ciout:
2140cabdff1aSopenharmony_ci    /* slow but needed for extreme adobe jpegs */
2141cabdff1aSopenharmony_ci    if (len < 0)
2142cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR,
2143cabdff1aSopenharmony_ci               "mjpeg: error, decode_app parser read over the end\n");
2144cabdff1aSopenharmony_ci    while (--len > 0)
2145cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8);
2146cabdff1aSopenharmony_ci
2147cabdff1aSopenharmony_ci    return 0;
2148cabdff1aSopenharmony_ci}
2149cabdff1aSopenharmony_ci
2150cabdff1aSopenharmony_cistatic int mjpeg_decode_com(MJpegDecodeContext *s)
2151cabdff1aSopenharmony_ci{
2152cabdff1aSopenharmony_ci    int len = get_bits(&s->gb, 16);
2153cabdff1aSopenharmony_ci    if (len >= 2 && 8 * len - 16 <= get_bits_left(&s->gb)) {
2154cabdff1aSopenharmony_ci        int i;
2155cabdff1aSopenharmony_ci        char *cbuf = av_malloc(len - 1);
2156cabdff1aSopenharmony_ci        if (!cbuf)
2157cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
2158cabdff1aSopenharmony_ci
2159cabdff1aSopenharmony_ci        for (i = 0; i < len - 2; i++)
2160cabdff1aSopenharmony_ci            cbuf[i] = get_bits(&s->gb, 8);
2161cabdff1aSopenharmony_ci        if (i > 0 && cbuf[i - 1] == '\n')
2162cabdff1aSopenharmony_ci            cbuf[i - 1] = 0;
2163cabdff1aSopenharmony_ci        else
2164cabdff1aSopenharmony_ci            cbuf[i] = 0;
2165cabdff1aSopenharmony_ci
2166cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2167cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf);
2168cabdff1aSopenharmony_ci
2169cabdff1aSopenharmony_ci        /* buggy avid, it puts EOI only at every 10th frame */
2170cabdff1aSopenharmony_ci        if (!strncmp(cbuf, "AVID", 4)) {
2171cabdff1aSopenharmony_ci            parse_avid(s, cbuf, len);
2172cabdff1aSopenharmony_ci        } else if (!strcmp(cbuf, "CS=ITU601"))
2173cabdff1aSopenharmony_ci            s->cs_itu601 = 1;
2174cabdff1aSopenharmony_ci        else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) ||
2175cabdff1aSopenharmony_ci                 (!strncmp(cbuf, "Metasoft MJPEG Codec", 20)))
2176cabdff1aSopenharmony_ci            s->flipped = 1;
2177cabdff1aSopenharmony_ci        else if (!strcmp(cbuf, "MULTISCOPE II")) {
2178cabdff1aSopenharmony_ci            s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 };
2179cabdff1aSopenharmony_ci            s->multiscope = 2;
2180cabdff1aSopenharmony_ci        }
2181cabdff1aSopenharmony_ci
2182cabdff1aSopenharmony_ci        av_free(cbuf);
2183cabdff1aSopenharmony_ci    }
2184cabdff1aSopenharmony_ci
2185cabdff1aSopenharmony_ci    return 0;
2186cabdff1aSopenharmony_ci}
2187cabdff1aSopenharmony_ci
2188cabdff1aSopenharmony_ci/* return the 8 bit start code value and update the search
2189cabdff1aSopenharmony_ci   state. Return -1 if no start code found */
2190cabdff1aSopenharmony_cistatic int find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
2191cabdff1aSopenharmony_ci{
2192cabdff1aSopenharmony_ci    const uint8_t *buf_ptr;
2193cabdff1aSopenharmony_ci    unsigned int v, v2;
2194cabdff1aSopenharmony_ci    int val;
2195cabdff1aSopenharmony_ci    int skipped = 0;
2196cabdff1aSopenharmony_ci
2197cabdff1aSopenharmony_ci    buf_ptr = *pbuf_ptr;
2198cabdff1aSopenharmony_ci    while (buf_end - buf_ptr > 1) {
2199cabdff1aSopenharmony_ci        v  = *buf_ptr++;
2200cabdff1aSopenharmony_ci        v2 = *buf_ptr;
2201cabdff1aSopenharmony_ci        if ((v == 0xff) && (v2 >= SOF0) && (v2 <= COM) && buf_ptr < buf_end) {
2202cabdff1aSopenharmony_ci            val = *buf_ptr++;
2203cabdff1aSopenharmony_ci            goto found;
2204cabdff1aSopenharmony_ci        }
2205cabdff1aSopenharmony_ci        skipped++;
2206cabdff1aSopenharmony_ci    }
2207cabdff1aSopenharmony_ci    buf_ptr = buf_end;
2208cabdff1aSopenharmony_ci    val = -1;
2209cabdff1aSopenharmony_cifound:
2210cabdff1aSopenharmony_ci    ff_dlog(NULL, "find_marker skipped %d bytes\n", skipped);
2211cabdff1aSopenharmony_ci    *pbuf_ptr = buf_ptr;
2212cabdff1aSopenharmony_ci    return val;
2213cabdff1aSopenharmony_ci}
2214cabdff1aSopenharmony_ci
2215cabdff1aSopenharmony_ciint ff_mjpeg_find_marker(MJpegDecodeContext *s,
2216cabdff1aSopenharmony_ci                         const uint8_t **buf_ptr, const uint8_t *buf_end,
2217cabdff1aSopenharmony_ci                         const uint8_t **unescaped_buf_ptr,
2218cabdff1aSopenharmony_ci                         int *unescaped_buf_size)
2219cabdff1aSopenharmony_ci{
2220cabdff1aSopenharmony_ci    int start_code;
2221cabdff1aSopenharmony_ci    start_code = find_marker(buf_ptr, buf_end);
2222cabdff1aSopenharmony_ci
2223cabdff1aSopenharmony_ci    av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - *buf_ptr);
2224cabdff1aSopenharmony_ci    if (!s->buffer)
2225cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
2226cabdff1aSopenharmony_ci
2227cabdff1aSopenharmony_ci    /* unescape buffer of SOS, use special treatment for JPEG-LS */
2228cabdff1aSopenharmony_ci    if (start_code == SOS && !s->ls) {
2229cabdff1aSopenharmony_ci        const uint8_t *src = *buf_ptr;
2230cabdff1aSopenharmony_ci        const uint8_t *ptr = src;
2231cabdff1aSopenharmony_ci        uint8_t *dst = s->buffer;
2232cabdff1aSopenharmony_ci
2233cabdff1aSopenharmony_ci        #define copy_data_segment(skip) do {       \
2234cabdff1aSopenharmony_ci            ptrdiff_t length = (ptr - src) - (skip);  \
2235cabdff1aSopenharmony_ci            if (length > 0) {                         \
2236cabdff1aSopenharmony_ci                memcpy(dst, src, length);             \
2237cabdff1aSopenharmony_ci                dst += length;                        \
2238cabdff1aSopenharmony_ci                src = ptr;                            \
2239cabdff1aSopenharmony_ci            }                                         \
2240cabdff1aSopenharmony_ci        } while (0)
2241cabdff1aSopenharmony_ci
2242cabdff1aSopenharmony_ci        if (s->avctx->codec_id == AV_CODEC_ID_THP) {
2243cabdff1aSopenharmony_ci            ptr = buf_end;
2244cabdff1aSopenharmony_ci            copy_data_segment(0);
2245cabdff1aSopenharmony_ci        } else {
2246cabdff1aSopenharmony_ci            while (ptr < buf_end) {
2247cabdff1aSopenharmony_ci                uint8_t x = *(ptr++);
2248cabdff1aSopenharmony_ci
2249cabdff1aSopenharmony_ci                if (x == 0xff) {
2250cabdff1aSopenharmony_ci                    ptrdiff_t skip = 0;
2251cabdff1aSopenharmony_ci                    while (ptr < buf_end && x == 0xff) {
2252cabdff1aSopenharmony_ci                        x = *(ptr++);
2253cabdff1aSopenharmony_ci                        skip++;
2254cabdff1aSopenharmony_ci                    }
2255cabdff1aSopenharmony_ci
2256cabdff1aSopenharmony_ci                    /* 0xFF, 0xFF, ... */
2257cabdff1aSopenharmony_ci                    if (skip > 1) {
2258cabdff1aSopenharmony_ci                        copy_data_segment(skip);
2259cabdff1aSopenharmony_ci
2260cabdff1aSopenharmony_ci                        /* decrement src as it is equal to ptr after the
2261cabdff1aSopenharmony_ci                         * copy_data_segment macro and we might want to
2262cabdff1aSopenharmony_ci                         * copy the current value of x later on */
2263cabdff1aSopenharmony_ci                        src--;
2264cabdff1aSopenharmony_ci                    }
2265cabdff1aSopenharmony_ci
2266cabdff1aSopenharmony_ci                    if (x < RST0 || x > RST7) {
2267cabdff1aSopenharmony_ci                        copy_data_segment(1);
2268cabdff1aSopenharmony_ci                        if (x)
2269cabdff1aSopenharmony_ci                            break;
2270cabdff1aSopenharmony_ci                    }
2271cabdff1aSopenharmony_ci                }
2272cabdff1aSopenharmony_ci            }
2273cabdff1aSopenharmony_ci            if (src < ptr)
2274cabdff1aSopenharmony_ci                copy_data_segment(0);
2275cabdff1aSopenharmony_ci        }
2276cabdff1aSopenharmony_ci        #undef copy_data_segment
2277cabdff1aSopenharmony_ci
2278cabdff1aSopenharmony_ci        *unescaped_buf_ptr  = s->buffer;
2279cabdff1aSopenharmony_ci        *unescaped_buf_size = dst - s->buffer;
2280cabdff1aSopenharmony_ci        memset(s->buffer + *unescaped_buf_size, 0,
2281cabdff1aSopenharmony_ci               AV_INPUT_BUFFER_PADDING_SIZE);
2282cabdff1aSopenharmony_ci
2283cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %"PTRDIFF_SPECIFIER" bytes\n",
2284cabdff1aSopenharmony_ci               (buf_end - *buf_ptr) - (dst - s->buffer));
2285cabdff1aSopenharmony_ci    } else if (start_code == SOS && s->ls) {
2286cabdff1aSopenharmony_ci        const uint8_t *src = *buf_ptr;
2287cabdff1aSopenharmony_ci        uint8_t *dst  = s->buffer;
2288cabdff1aSopenharmony_ci        int bit_count = 0;
2289cabdff1aSopenharmony_ci        int t = 0, b = 0;
2290cabdff1aSopenharmony_ci        PutBitContext pb;
2291cabdff1aSopenharmony_ci
2292cabdff1aSopenharmony_ci        /* find marker */
2293cabdff1aSopenharmony_ci        while (src + t < buf_end) {
2294cabdff1aSopenharmony_ci            uint8_t x = src[t++];
2295cabdff1aSopenharmony_ci            if (x == 0xff) {
2296cabdff1aSopenharmony_ci                while ((src + t < buf_end) && x == 0xff)
2297cabdff1aSopenharmony_ci                    x = src[t++];
2298cabdff1aSopenharmony_ci                if (x & 0x80) {
2299cabdff1aSopenharmony_ci                    t -= FFMIN(2, t);
2300cabdff1aSopenharmony_ci                    break;
2301cabdff1aSopenharmony_ci                }
2302cabdff1aSopenharmony_ci            }
2303cabdff1aSopenharmony_ci        }
2304cabdff1aSopenharmony_ci        bit_count = t * 8;
2305cabdff1aSopenharmony_ci        init_put_bits(&pb, dst, t);
2306cabdff1aSopenharmony_ci
2307cabdff1aSopenharmony_ci        /* unescape bitstream */
2308cabdff1aSopenharmony_ci        while (b < t) {
2309cabdff1aSopenharmony_ci            uint8_t x = src[b++];
2310cabdff1aSopenharmony_ci            put_bits(&pb, 8, x);
2311cabdff1aSopenharmony_ci            if (x == 0xFF && b < t) {
2312cabdff1aSopenharmony_ci                x = src[b++];
2313cabdff1aSopenharmony_ci                if (x & 0x80) {
2314cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_WARNING, "Invalid escape sequence\n");
2315cabdff1aSopenharmony_ci                    x &= 0x7f;
2316cabdff1aSopenharmony_ci                }
2317cabdff1aSopenharmony_ci                put_bits(&pb, 7, x);
2318cabdff1aSopenharmony_ci                bit_count--;
2319cabdff1aSopenharmony_ci            }
2320cabdff1aSopenharmony_ci        }
2321cabdff1aSopenharmony_ci        flush_put_bits(&pb);
2322cabdff1aSopenharmony_ci
2323cabdff1aSopenharmony_ci        *unescaped_buf_ptr  = dst;
2324cabdff1aSopenharmony_ci        *unescaped_buf_size = (bit_count + 7) >> 3;
2325cabdff1aSopenharmony_ci        memset(s->buffer + *unescaped_buf_size, 0,
2326cabdff1aSopenharmony_ci               AV_INPUT_BUFFER_PADDING_SIZE);
2327cabdff1aSopenharmony_ci    } else {
2328cabdff1aSopenharmony_ci        *unescaped_buf_ptr  = *buf_ptr;
2329cabdff1aSopenharmony_ci        *unescaped_buf_size = buf_end - *buf_ptr;
2330cabdff1aSopenharmony_ci    }
2331cabdff1aSopenharmony_ci
2332cabdff1aSopenharmony_ci    return start_code;
2333cabdff1aSopenharmony_ci}
2334cabdff1aSopenharmony_ci
2335cabdff1aSopenharmony_cistatic void reset_icc_profile(MJpegDecodeContext *s)
2336cabdff1aSopenharmony_ci{
2337cabdff1aSopenharmony_ci    int i;
2338cabdff1aSopenharmony_ci
2339cabdff1aSopenharmony_ci    if (s->iccentries) {
2340cabdff1aSopenharmony_ci        for (i = 0; i < s->iccnum; i++)
2341cabdff1aSopenharmony_ci            av_freep(&s->iccentries[i].data);
2342cabdff1aSopenharmony_ci        av_freep(&s->iccentries);
2343cabdff1aSopenharmony_ci    }
2344cabdff1aSopenharmony_ci
2345cabdff1aSopenharmony_ci    s->iccread = 0;
2346cabdff1aSopenharmony_ci    s->iccnum  = 0;
2347cabdff1aSopenharmony_ci}
2348cabdff1aSopenharmony_ci
2349cabdff1aSopenharmony_ci// SMV JPEG just stacks several output frames into one JPEG picture
2350cabdff1aSopenharmony_ci// we handle that by setting up the cropping parameters appropriately
2351cabdff1aSopenharmony_cistatic int smv_process_frame(AVCodecContext *avctx, AVFrame *frame)
2352cabdff1aSopenharmony_ci{
2353cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
2354cabdff1aSopenharmony_ci    int ret;
2355cabdff1aSopenharmony_ci
2356cabdff1aSopenharmony_ci    if (s->smv_next_frame > 0) {
2357cabdff1aSopenharmony_ci        av_assert0(s->smv_frame->buf[0]);
2358cabdff1aSopenharmony_ci        av_frame_unref(frame);
2359cabdff1aSopenharmony_ci        ret = av_frame_ref(frame, s->smv_frame);
2360cabdff1aSopenharmony_ci        if (ret < 0)
2361cabdff1aSopenharmony_ci            return ret;
2362cabdff1aSopenharmony_ci    } else {
2363cabdff1aSopenharmony_ci        av_assert0(frame->buf[0]);
2364cabdff1aSopenharmony_ci        av_frame_unref(s->smv_frame);
2365cabdff1aSopenharmony_ci        ret = av_frame_ref(s->smv_frame, frame);
2366cabdff1aSopenharmony_ci        if (ret < 0)
2367cabdff1aSopenharmony_ci            return ret;
2368cabdff1aSopenharmony_ci    }
2369cabdff1aSopenharmony_ci
2370cabdff1aSopenharmony_ci    av_assert0((s->smv_next_frame + 1) * avctx->height <= avctx->coded_height);
2371cabdff1aSopenharmony_ci
2372cabdff1aSopenharmony_ci    frame->width       = avctx->coded_width;
2373cabdff1aSopenharmony_ci    frame->height      = avctx->coded_height;
2374cabdff1aSopenharmony_ci    frame->crop_top    = FFMIN(s->smv_next_frame * avctx->height, frame->height);
2375cabdff1aSopenharmony_ci    frame->crop_bottom = frame->height - (s->smv_next_frame + 1) * avctx->height;
2376cabdff1aSopenharmony_ci
2377cabdff1aSopenharmony_ci    s->smv_next_frame = (s->smv_next_frame + 1) % s->smv_frames_per_jpeg;
2378cabdff1aSopenharmony_ci
2379cabdff1aSopenharmony_ci    if (s->smv_next_frame == 0)
2380cabdff1aSopenharmony_ci        av_frame_unref(s->smv_frame);
2381cabdff1aSopenharmony_ci
2382cabdff1aSopenharmony_ci    return 0;
2383cabdff1aSopenharmony_ci}
2384cabdff1aSopenharmony_ci
2385cabdff1aSopenharmony_cistatic int mjpeg_get_packet(AVCodecContext *avctx)
2386cabdff1aSopenharmony_ci{
2387cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
2388cabdff1aSopenharmony_ci    int ret;
2389cabdff1aSopenharmony_ci
2390cabdff1aSopenharmony_ci    av_packet_unref(s->pkt);
2391cabdff1aSopenharmony_ci    ret = ff_decode_get_packet(avctx, s->pkt);
2392cabdff1aSopenharmony_ci    if (ret < 0)
2393cabdff1aSopenharmony_ci        return ret;
2394cabdff1aSopenharmony_ci
2395cabdff1aSopenharmony_ci#if CONFIG_SP5X_DECODER || CONFIG_AMV_DECODER
2396cabdff1aSopenharmony_ci    if (avctx->codec_id == AV_CODEC_ID_SP5X ||
2397cabdff1aSopenharmony_ci        avctx->codec_id == AV_CODEC_ID_AMV) {
2398cabdff1aSopenharmony_ci        ret = ff_sp5x_process_packet(avctx, s->pkt);
2399cabdff1aSopenharmony_ci        if (ret < 0)
2400cabdff1aSopenharmony_ci            return ret;
2401cabdff1aSopenharmony_ci    }
2402cabdff1aSopenharmony_ci#endif
2403cabdff1aSopenharmony_ci
2404cabdff1aSopenharmony_ci    s->buf_size = s->pkt->size;
2405cabdff1aSopenharmony_ci
2406cabdff1aSopenharmony_ci    return 0;
2407cabdff1aSopenharmony_ci}
2408cabdff1aSopenharmony_ci
2409cabdff1aSopenharmony_ciint ff_mjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
2410cabdff1aSopenharmony_ci{
2411cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
2412cabdff1aSopenharmony_ci    const uint8_t *buf_end, *buf_ptr;
2413cabdff1aSopenharmony_ci    const uint8_t *unescaped_buf_ptr;
2414cabdff1aSopenharmony_ci    int hshift, vshift;
2415cabdff1aSopenharmony_ci    int unescaped_buf_size;
2416cabdff1aSopenharmony_ci    int start_code;
2417cabdff1aSopenharmony_ci    int i, index;
2418cabdff1aSopenharmony_ci    int ret = 0;
2419cabdff1aSopenharmony_ci    int is16bit;
2420cabdff1aSopenharmony_ci    AVDictionaryEntry *e = NULL;
2421cabdff1aSopenharmony_ci
2422cabdff1aSopenharmony_ci    s->force_pal8 = 0;
2423cabdff1aSopenharmony_ci
2424cabdff1aSopenharmony_ci    if (avctx->codec_id == AV_CODEC_ID_SMVJPEG && s->smv_next_frame > 0)
2425cabdff1aSopenharmony_ci        return smv_process_frame(avctx, frame);
2426cabdff1aSopenharmony_ci
2427cabdff1aSopenharmony_ci    av_dict_free(&s->exif_metadata);
2428cabdff1aSopenharmony_ci    av_freep(&s->stereo3d);
2429cabdff1aSopenharmony_ci    s->adobe_transform = -1;
2430cabdff1aSopenharmony_ci
2431cabdff1aSopenharmony_ci    if (s->iccnum != 0)
2432cabdff1aSopenharmony_ci        reset_icc_profile(s);
2433cabdff1aSopenharmony_ci
2434cabdff1aSopenharmony_ci    ret = mjpeg_get_packet(avctx);
2435cabdff1aSopenharmony_ci    if (ret < 0)
2436cabdff1aSopenharmony_ci        return ret;
2437cabdff1aSopenharmony_ciredo_for_pal8:
2438cabdff1aSopenharmony_ci    buf_ptr = s->pkt->data;
2439cabdff1aSopenharmony_ci    buf_end = s->pkt->data + s->pkt->size;
2440cabdff1aSopenharmony_ci    while (buf_ptr < buf_end) {
2441cabdff1aSopenharmony_ci        /* find start next marker */
2442cabdff1aSopenharmony_ci        start_code = ff_mjpeg_find_marker(s, &buf_ptr, buf_end,
2443cabdff1aSopenharmony_ci                                          &unescaped_buf_ptr,
2444cabdff1aSopenharmony_ci                                          &unescaped_buf_size);
2445cabdff1aSopenharmony_ci        /* EOF */
2446cabdff1aSopenharmony_ci        if (start_code < 0) {
2447cabdff1aSopenharmony_ci            break;
2448cabdff1aSopenharmony_ci        } else if (unescaped_buf_size > INT_MAX / 8) {
2449cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
2450cabdff1aSopenharmony_ci                   "MJPEG packet 0x%x too big (%d/%d), corrupt data?\n",
2451cabdff1aSopenharmony_ci                   start_code, unescaped_buf_size, s->pkt->size);
2452cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
2453cabdff1aSopenharmony_ci        }
2454cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%"PTRDIFF_SPECIFIER"\n",
2455cabdff1aSopenharmony_ci               start_code, buf_end - buf_ptr);
2456cabdff1aSopenharmony_ci
2457cabdff1aSopenharmony_ci        ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2458cabdff1aSopenharmony_ci
2459cabdff1aSopenharmony_ci        if (ret < 0) {
2460cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "invalid buffer\n");
2461cabdff1aSopenharmony_ci            goto fail;
2462cabdff1aSopenharmony_ci        }
2463cabdff1aSopenharmony_ci
2464cabdff1aSopenharmony_ci        s->start_code = start_code;
2465cabdff1aSopenharmony_ci        if (s->avctx->debug & FF_DEBUG_STARTCODE)
2466cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
2467cabdff1aSopenharmony_ci
2468cabdff1aSopenharmony_ci        /* process markers */
2469cabdff1aSopenharmony_ci        if (start_code >= RST0 && start_code <= RST7) {
2470cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_DEBUG,
2471cabdff1aSopenharmony_ci                   "restart marker: %d\n", start_code & 0x0f);
2472cabdff1aSopenharmony_ci            /* APP fields */
2473cabdff1aSopenharmony_ci        } else if (start_code >= APP0 && start_code <= APP15) {
2474cabdff1aSopenharmony_ci            if ((ret = mjpeg_decode_app(s)) < 0)
2475cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
2476cabdff1aSopenharmony_ci                       av_err2str(ret));
2477cabdff1aSopenharmony_ci            /* Comment */
2478cabdff1aSopenharmony_ci        } else if (start_code == COM) {
2479cabdff1aSopenharmony_ci            ret = mjpeg_decode_com(s);
2480cabdff1aSopenharmony_ci            if (ret < 0)
2481cabdff1aSopenharmony_ci                return ret;
2482cabdff1aSopenharmony_ci        } else if (start_code == DQT) {
2483cabdff1aSopenharmony_ci            ret = ff_mjpeg_decode_dqt(s);
2484cabdff1aSopenharmony_ci            if (ret < 0)
2485cabdff1aSopenharmony_ci                return ret;
2486cabdff1aSopenharmony_ci        }
2487cabdff1aSopenharmony_ci
2488cabdff1aSopenharmony_ci        ret = -1;
2489cabdff1aSopenharmony_ci
2490cabdff1aSopenharmony_ci        if (!CONFIG_JPEGLS_DECODER &&
2491cabdff1aSopenharmony_ci            (start_code == SOF48 || start_code == LSE)) {
2492cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n");
2493cabdff1aSopenharmony_ci            return AVERROR(ENOSYS);
2494cabdff1aSopenharmony_ci        }
2495cabdff1aSopenharmony_ci
2496cabdff1aSopenharmony_ci        if (avctx->skip_frame == AVDISCARD_ALL) {
2497cabdff1aSopenharmony_ci            switch(start_code) {
2498cabdff1aSopenharmony_ci            case SOF0:
2499cabdff1aSopenharmony_ci            case SOF1:
2500cabdff1aSopenharmony_ci            case SOF2:
2501cabdff1aSopenharmony_ci            case SOF3:
2502cabdff1aSopenharmony_ci            case SOF48:
2503cabdff1aSopenharmony_ci            case SOI:
2504cabdff1aSopenharmony_ci            case SOS:
2505cabdff1aSopenharmony_ci            case EOI:
2506cabdff1aSopenharmony_ci                break;
2507cabdff1aSopenharmony_ci            default:
2508cabdff1aSopenharmony_ci                goto skip;
2509cabdff1aSopenharmony_ci            }
2510cabdff1aSopenharmony_ci        }
2511cabdff1aSopenharmony_ci
2512cabdff1aSopenharmony_ci        switch (start_code) {
2513cabdff1aSopenharmony_ci        case SOI:
2514cabdff1aSopenharmony_ci            s->restart_interval = 0;
2515cabdff1aSopenharmony_ci            s->restart_count    = 0;
2516cabdff1aSopenharmony_ci            s->raw_image_buffer      = buf_ptr;
2517cabdff1aSopenharmony_ci            s->raw_image_buffer_size = buf_end - buf_ptr;
2518cabdff1aSopenharmony_ci            /* nothing to do on SOI */
2519cabdff1aSopenharmony_ci            break;
2520cabdff1aSopenharmony_ci        case DHT:
2521cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
2522cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2523cabdff1aSopenharmony_ci                goto fail;
2524cabdff1aSopenharmony_ci            }
2525cabdff1aSopenharmony_ci            break;
2526cabdff1aSopenharmony_ci        case SOF0:
2527cabdff1aSopenharmony_ci        case SOF1:
2528cabdff1aSopenharmony_ci            if (start_code == SOF0)
2529cabdff1aSopenharmony_ci                s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2530cabdff1aSopenharmony_ci            else
2531cabdff1aSopenharmony_ci                s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2532cabdff1aSopenharmony_ci            s->lossless    = 0;
2533cabdff1aSopenharmony_ci            s->ls          = 0;
2534cabdff1aSopenharmony_ci            s->progressive = 0;
2535cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2536cabdff1aSopenharmony_ci                goto fail;
2537cabdff1aSopenharmony_ci            break;
2538cabdff1aSopenharmony_ci        case SOF2:
2539cabdff1aSopenharmony_ci            s->avctx->profile = FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT;
2540cabdff1aSopenharmony_ci            s->lossless    = 0;
2541cabdff1aSopenharmony_ci            s->ls          = 0;
2542cabdff1aSopenharmony_ci            s->progressive = 1;
2543cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2544cabdff1aSopenharmony_ci                goto fail;
2545cabdff1aSopenharmony_ci            break;
2546cabdff1aSopenharmony_ci        case SOF3:
2547cabdff1aSopenharmony_ci            s->avctx->profile     = FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS;
2548cabdff1aSopenharmony_ci            s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2549cabdff1aSopenharmony_ci            s->lossless    = 1;
2550cabdff1aSopenharmony_ci            s->ls          = 0;
2551cabdff1aSopenharmony_ci            s->progressive = 0;
2552cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2553cabdff1aSopenharmony_ci                goto fail;
2554cabdff1aSopenharmony_ci            break;
2555cabdff1aSopenharmony_ci        case SOF48:
2556cabdff1aSopenharmony_ci            s->avctx->profile     = FF_PROFILE_MJPEG_JPEG_LS;
2557cabdff1aSopenharmony_ci            s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2558cabdff1aSopenharmony_ci            s->lossless    = 1;
2559cabdff1aSopenharmony_ci            s->ls          = 1;
2560cabdff1aSopenharmony_ci            s->progressive = 0;
2561cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2562cabdff1aSopenharmony_ci                goto fail;
2563cabdff1aSopenharmony_ci            break;
2564cabdff1aSopenharmony_ci        case LSE:
2565cabdff1aSopenharmony_ci            if (!CONFIG_JPEGLS_DECODER ||
2566cabdff1aSopenharmony_ci                (ret = ff_jpegls_decode_lse(s)) < 0)
2567cabdff1aSopenharmony_ci                goto fail;
2568cabdff1aSopenharmony_ci            if (ret == 1)
2569cabdff1aSopenharmony_ci                goto redo_for_pal8;
2570cabdff1aSopenharmony_ci            break;
2571cabdff1aSopenharmony_ci        case EOI:
2572cabdff1aSopenharmony_cieoi_parser:
2573cabdff1aSopenharmony_ci            if (!avctx->hwaccel && avctx->skip_frame != AVDISCARD_ALL &&
2574cabdff1aSopenharmony_ci                s->progressive && s->cur_scan && s->got_picture)
2575cabdff1aSopenharmony_ci                mjpeg_idct_scan_progressive_ac(s);
2576cabdff1aSopenharmony_ci            s->cur_scan = 0;
2577cabdff1aSopenharmony_ci            if (!s->got_picture) {
2578cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_WARNING,
2579cabdff1aSopenharmony_ci                       "Found EOI before any SOF, ignoring\n");
2580cabdff1aSopenharmony_ci                break;
2581cabdff1aSopenharmony_ci            }
2582cabdff1aSopenharmony_ci            if (s->interlaced) {
2583cabdff1aSopenharmony_ci                s->bottom_field ^= 1;
2584cabdff1aSopenharmony_ci                /* if not bottom field, do not output image yet */
2585cabdff1aSopenharmony_ci                if (s->bottom_field == !s->interlace_polarity)
2586cabdff1aSopenharmony_ci                    break;
2587cabdff1aSopenharmony_ci            }
2588cabdff1aSopenharmony_ci            if (avctx->skip_frame == AVDISCARD_ALL) {
2589cabdff1aSopenharmony_ci                s->got_picture = 0;
2590cabdff1aSopenharmony_ci                ret = AVERROR(EAGAIN);
2591cabdff1aSopenharmony_ci                goto the_end_no_picture;
2592cabdff1aSopenharmony_ci            }
2593cabdff1aSopenharmony_ci            if (s->avctx->hwaccel) {
2594cabdff1aSopenharmony_ci                ret = s->avctx->hwaccel->end_frame(s->avctx);
2595cabdff1aSopenharmony_ci                if (ret < 0)
2596cabdff1aSopenharmony_ci                    return ret;
2597cabdff1aSopenharmony_ci
2598cabdff1aSopenharmony_ci                av_freep(&s->hwaccel_picture_private);
2599cabdff1aSopenharmony_ci            }
2600cabdff1aSopenharmony_ci            if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2601cabdff1aSopenharmony_ci                return ret;
2602cabdff1aSopenharmony_ci            s->got_picture = 0;
2603cabdff1aSopenharmony_ci
2604cabdff1aSopenharmony_ci            frame->pkt_dts = s->pkt->dts;
2605cabdff1aSopenharmony_ci
2606cabdff1aSopenharmony_ci            if (!s->lossless && avctx->debug & FF_DEBUG_QP) {
2607cabdff1aSopenharmony_ci                int qp = FFMAX3(s->qscale[0],
2608cabdff1aSopenharmony_ci                                s->qscale[1],
2609cabdff1aSopenharmony_ci                                s->qscale[2]);
2610cabdff1aSopenharmony_ci
2611cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2612cabdff1aSopenharmony_ci            }
2613cabdff1aSopenharmony_ci
2614cabdff1aSopenharmony_ci            goto the_end;
2615cabdff1aSopenharmony_ci        case SOS:
2616cabdff1aSopenharmony_ci            s->raw_scan_buffer      = buf_ptr;
2617cabdff1aSopenharmony_ci            s->raw_scan_buffer_size = buf_end - buf_ptr;
2618cabdff1aSopenharmony_ci
2619cabdff1aSopenharmony_ci            s->cur_scan++;
2620cabdff1aSopenharmony_ci            if (avctx->skip_frame == AVDISCARD_ALL) {
2621cabdff1aSopenharmony_ci                skip_bits(&s->gb, get_bits_left(&s->gb));
2622cabdff1aSopenharmony_ci                break;
2623cabdff1aSopenharmony_ci            }
2624cabdff1aSopenharmony_ci
2625cabdff1aSopenharmony_ci            if ((ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL)) < 0 &&
2626cabdff1aSopenharmony_ci                (avctx->err_recognition & AV_EF_EXPLODE))
2627cabdff1aSopenharmony_ci                goto fail;
2628cabdff1aSopenharmony_ci            break;
2629cabdff1aSopenharmony_ci        case DRI:
2630cabdff1aSopenharmony_ci            if ((ret = mjpeg_decode_dri(s)) < 0)
2631cabdff1aSopenharmony_ci                return ret;
2632cabdff1aSopenharmony_ci            break;
2633cabdff1aSopenharmony_ci        case SOF5:
2634cabdff1aSopenharmony_ci        case SOF6:
2635cabdff1aSopenharmony_ci        case SOF7:
2636cabdff1aSopenharmony_ci        case SOF9:
2637cabdff1aSopenharmony_ci        case SOF10:
2638cabdff1aSopenharmony_ci        case SOF11:
2639cabdff1aSopenharmony_ci        case SOF13:
2640cabdff1aSopenharmony_ci        case SOF14:
2641cabdff1aSopenharmony_ci        case SOF15:
2642cabdff1aSopenharmony_ci        case JPG:
2643cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
2644cabdff1aSopenharmony_ci                   "mjpeg: unsupported coding type (%x)\n", start_code);
2645cabdff1aSopenharmony_ci            break;
2646cabdff1aSopenharmony_ci        }
2647cabdff1aSopenharmony_ci
2648cabdff1aSopenharmony_ciskip:
2649cabdff1aSopenharmony_ci        /* eof process start code */
2650cabdff1aSopenharmony_ci        buf_ptr += (get_bits_count(&s->gb) + 7) / 8;
2651cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_DEBUG,
2652cabdff1aSopenharmony_ci               "marker parser used %d bytes (%d bits)\n",
2653cabdff1aSopenharmony_ci               (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb));
2654cabdff1aSopenharmony_ci    }
2655cabdff1aSopenharmony_ci    if (s->got_picture && s->cur_scan) {
2656cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
2657cabdff1aSopenharmony_ci        goto eoi_parser;
2658cabdff1aSopenharmony_ci    }
2659cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2660cabdff1aSopenharmony_ci    return AVERROR_INVALIDDATA;
2661cabdff1aSopenharmony_cifail:
2662cabdff1aSopenharmony_ci    s->got_picture = 0;
2663cabdff1aSopenharmony_ci    return ret;
2664cabdff1aSopenharmony_cithe_end:
2665cabdff1aSopenharmony_ci
2666cabdff1aSopenharmony_ci    is16bit = av_pix_fmt_desc_get(s->avctx->pix_fmt)->comp[0].step > 1;
2667cabdff1aSopenharmony_ci
2668cabdff1aSopenharmony_ci    if (AV_RB32(s->upscale_h)) {
2669cabdff1aSopenharmony_ci        int p;
2670cabdff1aSopenharmony_ci        av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2671cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV444P  ||
2672cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2673cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV440P  ||
2674cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2675cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2676cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV420P  ||
2677cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2678cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P  ||
2679cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2680cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_GBRP     ||
2681cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_GBRAP
2682cabdff1aSopenharmony_ci                  );
2683cabdff1aSopenharmony_ci        ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2684cabdff1aSopenharmony_ci        if (ret)
2685cabdff1aSopenharmony_ci            return ret;
2686cabdff1aSopenharmony_ci
2687cabdff1aSopenharmony_ci        av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2688cabdff1aSopenharmony_ci        for (p = 0; p<s->nb_components; p++) {
2689cabdff1aSopenharmony_ci            uint8_t *line = s->picture_ptr->data[p];
2690cabdff1aSopenharmony_ci            int w = s->width;
2691cabdff1aSopenharmony_ci            int h = s->height;
2692cabdff1aSopenharmony_ci            if (!s->upscale_h[p])
2693cabdff1aSopenharmony_ci                continue;
2694cabdff1aSopenharmony_ci            if (p==1 || p==2) {
2695cabdff1aSopenharmony_ci                w = AV_CEIL_RSHIFT(w, hshift);
2696cabdff1aSopenharmony_ci                h = AV_CEIL_RSHIFT(h, vshift);
2697cabdff1aSopenharmony_ci            }
2698cabdff1aSopenharmony_ci            if (s->upscale_v[p] == 1)
2699cabdff1aSopenharmony_ci                h = (h+1)>>1;
2700cabdff1aSopenharmony_ci            av_assert0(w > 0);
2701cabdff1aSopenharmony_ci            for (i = 0; i < h; i++) {
2702cabdff1aSopenharmony_ci                if (s->upscale_h[p] == 1) {
2703cabdff1aSopenharmony_ci                    if (is16bit) ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 2];
2704cabdff1aSopenharmony_ci                    else                      line[w - 1] = line[(w - 1) / 2];
2705cabdff1aSopenharmony_ci                    for (index = w - 2; index > 0; index--) {
2706cabdff1aSopenharmony_ci                        if (is16bit)
2707cabdff1aSopenharmony_ci                            ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
2708cabdff1aSopenharmony_ci                        else
2709cabdff1aSopenharmony_ci                            line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
2710cabdff1aSopenharmony_ci                    }
2711cabdff1aSopenharmony_ci                } else if (s->upscale_h[p] == 2) {
2712cabdff1aSopenharmony_ci                    if (is16bit) {
2713cabdff1aSopenharmony_ci                        ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 3];
2714cabdff1aSopenharmony_ci                        if (w > 1)
2715cabdff1aSopenharmony_ci                            ((uint16_t*)line)[w - 2] = ((uint16_t*)line)[w - 1];
2716cabdff1aSopenharmony_ci                    } else {
2717cabdff1aSopenharmony_ci                        line[w - 1] = line[(w - 1) / 3];
2718cabdff1aSopenharmony_ci                        if (w > 1)
2719cabdff1aSopenharmony_ci                            line[w - 2] = line[w - 1];
2720cabdff1aSopenharmony_ci                    }
2721cabdff1aSopenharmony_ci                    for (index = w - 3; index > 0; index--) {
2722cabdff1aSopenharmony_ci                        line[index] = (line[index / 3] + line[(index + 1) / 3] + line[(index + 2) / 3] + 1) / 3;
2723cabdff1aSopenharmony_ci                    }
2724cabdff1aSopenharmony_ci                }
2725cabdff1aSopenharmony_ci                line += s->linesize[p];
2726cabdff1aSopenharmony_ci            }
2727cabdff1aSopenharmony_ci        }
2728cabdff1aSopenharmony_ci    }
2729cabdff1aSopenharmony_ci    if (AV_RB32(s->upscale_v)) {
2730cabdff1aSopenharmony_ci        int p;
2731cabdff1aSopenharmony_ci        av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2732cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV444P  ||
2733cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2734cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV422P  ||
2735cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2736cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV420P  ||
2737cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUV440P  ||
2738cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2739cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2740cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P  ||
2741cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2742cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_GBRP     ||
2743cabdff1aSopenharmony_ci                   avctx->pix_fmt == AV_PIX_FMT_GBRAP
2744cabdff1aSopenharmony_ci                   );
2745cabdff1aSopenharmony_ci        ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2746cabdff1aSopenharmony_ci        if (ret)
2747cabdff1aSopenharmony_ci            return ret;
2748cabdff1aSopenharmony_ci
2749cabdff1aSopenharmony_ci        av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2750cabdff1aSopenharmony_ci        for (p = 0; p < s->nb_components; p++) {
2751cabdff1aSopenharmony_ci            uint8_t *dst;
2752cabdff1aSopenharmony_ci            int w = s->width;
2753cabdff1aSopenharmony_ci            int h = s->height;
2754cabdff1aSopenharmony_ci            if (!s->upscale_v[p])
2755cabdff1aSopenharmony_ci                continue;
2756cabdff1aSopenharmony_ci            if (p==1 || p==2) {
2757cabdff1aSopenharmony_ci                w = AV_CEIL_RSHIFT(w, hshift);
2758cabdff1aSopenharmony_ci                h = AV_CEIL_RSHIFT(h, vshift);
2759cabdff1aSopenharmony_ci            }
2760cabdff1aSopenharmony_ci            dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
2761cabdff1aSopenharmony_ci            for (i = h - 1; i; i--) {
2762cabdff1aSopenharmony_ci                uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2763cabdff1aSopenharmony_ci                uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2764cabdff1aSopenharmony_ci                if (s->upscale_v[p] != 2 && (src1 == src2 || i == h - 1)) {
2765cabdff1aSopenharmony_ci                    memcpy(dst, src1, w);
2766cabdff1aSopenharmony_ci                } else {
2767cabdff1aSopenharmony_ci                    for (index = 0; index < w; index++)
2768cabdff1aSopenharmony_ci                        dst[index] = (src1[index] + src2[index]) >> 1;
2769cabdff1aSopenharmony_ci                }
2770cabdff1aSopenharmony_ci                dst -= s->linesize[p];
2771cabdff1aSopenharmony_ci            }
2772cabdff1aSopenharmony_ci        }
2773cabdff1aSopenharmony_ci    }
2774cabdff1aSopenharmony_ci    if (s->flipped && !s->rgb) {
2775cabdff1aSopenharmony_ci        int j;
2776cabdff1aSopenharmony_ci        ret = av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2777cabdff1aSopenharmony_ci        if (ret)
2778cabdff1aSopenharmony_ci            return ret;
2779cabdff1aSopenharmony_ci
2780cabdff1aSopenharmony_ci        av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2781cabdff1aSopenharmony_ci        for (index=0; index<s->nb_components; index++) {
2782cabdff1aSopenharmony_ci            uint8_t *dst = s->picture_ptr->data[index];
2783cabdff1aSopenharmony_ci            int w = s->picture_ptr->width;
2784cabdff1aSopenharmony_ci            int h = s->picture_ptr->height;
2785cabdff1aSopenharmony_ci            if(index && index<3){
2786cabdff1aSopenharmony_ci                w = AV_CEIL_RSHIFT(w, hshift);
2787cabdff1aSopenharmony_ci                h = AV_CEIL_RSHIFT(h, vshift);
2788cabdff1aSopenharmony_ci            }
2789cabdff1aSopenharmony_ci            if(dst){
2790cabdff1aSopenharmony_ci                uint8_t *dst2 = dst + s->picture_ptr->linesize[index]*(h-1);
2791cabdff1aSopenharmony_ci                for (i=0; i<h/2; i++) {
2792cabdff1aSopenharmony_ci                    for (j=0; j<w; j++)
2793cabdff1aSopenharmony_ci                        FFSWAP(int, dst[j], dst2[j]);
2794cabdff1aSopenharmony_ci                    dst  += s->picture_ptr->linesize[index];
2795cabdff1aSopenharmony_ci                    dst2 -= s->picture_ptr->linesize[index];
2796cabdff1aSopenharmony_ci                }
2797cabdff1aSopenharmony_ci            }
2798cabdff1aSopenharmony_ci        }
2799cabdff1aSopenharmony_ci    }
2800cabdff1aSopenharmony_ci    if (s->adobe_transform == 0 && s->avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
2801cabdff1aSopenharmony_ci        int w = s->picture_ptr->width;
2802cabdff1aSopenharmony_ci        int h = s->picture_ptr->height;
2803cabdff1aSopenharmony_ci        av_assert0(s->nb_components == 4);
2804cabdff1aSopenharmony_ci        for (i=0; i<h; i++) {
2805cabdff1aSopenharmony_ci            int j;
2806cabdff1aSopenharmony_ci            uint8_t *dst[4];
2807cabdff1aSopenharmony_ci            for (index=0; index<4; index++) {
2808cabdff1aSopenharmony_ci                dst[index] =   s->picture_ptr->data[index]
2809cabdff1aSopenharmony_ci                             + s->picture_ptr->linesize[index]*i;
2810cabdff1aSopenharmony_ci            }
2811cabdff1aSopenharmony_ci            for (j=0; j<w; j++) {
2812cabdff1aSopenharmony_ci                int k = dst[3][j];
2813cabdff1aSopenharmony_ci                int r = dst[0][j] * k;
2814cabdff1aSopenharmony_ci                int g = dst[1][j] * k;
2815cabdff1aSopenharmony_ci                int b = dst[2][j] * k;
2816cabdff1aSopenharmony_ci                dst[0][j] = g*257 >> 16;
2817cabdff1aSopenharmony_ci                dst[1][j] = b*257 >> 16;
2818cabdff1aSopenharmony_ci                dst[2][j] = r*257 >> 16;
2819cabdff1aSopenharmony_ci                dst[3][j] = 255;
2820cabdff1aSopenharmony_ci            }
2821cabdff1aSopenharmony_ci        }
2822cabdff1aSopenharmony_ci    }
2823cabdff1aSopenharmony_ci    if (s->adobe_transform == 2 && s->avctx->pix_fmt == AV_PIX_FMT_YUVA444P) {
2824cabdff1aSopenharmony_ci        int w = s->picture_ptr->width;
2825cabdff1aSopenharmony_ci        int h = s->picture_ptr->height;
2826cabdff1aSopenharmony_ci        av_assert0(s->nb_components == 4);
2827cabdff1aSopenharmony_ci        for (i=0; i<h; i++) {
2828cabdff1aSopenharmony_ci            int j;
2829cabdff1aSopenharmony_ci            uint8_t *dst[4];
2830cabdff1aSopenharmony_ci            for (index=0; index<4; index++) {
2831cabdff1aSopenharmony_ci                dst[index] =   s->picture_ptr->data[index]
2832cabdff1aSopenharmony_ci                             + s->picture_ptr->linesize[index]*i;
2833cabdff1aSopenharmony_ci            }
2834cabdff1aSopenharmony_ci            for (j=0; j<w; j++) {
2835cabdff1aSopenharmony_ci                int k = dst[3][j];
2836cabdff1aSopenharmony_ci                int r = (255 - dst[0][j]) * k;
2837cabdff1aSopenharmony_ci                int g = (128 - dst[1][j]) * k;
2838cabdff1aSopenharmony_ci                int b = (128 - dst[2][j]) * k;
2839cabdff1aSopenharmony_ci                dst[0][j] = r*257 >> 16;
2840cabdff1aSopenharmony_ci                dst[1][j] = (g*257 >> 16) + 128;
2841cabdff1aSopenharmony_ci                dst[2][j] = (b*257 >> 16) + 128;
2842cabdff1aSopenharmony_ci                dst[3][j] = 255;
2843cabdff1aSopenharmony_ci            }
2844cabdff1aSopenharmony_ci        }
2845cabdff1aSopenharmony_ci    }
2846cabdff1aSopenharmony_ci
2847cabdff1aSopenharmony_ci    if (s->stereo3d) {
2848cabdff1aSopenharmony_ci        AVStereo3D *stereo = av_stereo3d_create_side_data(frame);
2849cabdff1aSopenharmony_ci        if (stereo) {
2850cabdff1aSopenharmony_ci            stereo->type  = s->stereo3d->type;
2851cabdff1aSopenharmony_ci            stereo->flags = s->stereo3d->flags;
2852cabdff1aSopenharmony_ci        }
2853cabdff1aSopenharmony_ci        av_freep(&s->stereo3d);
2854cabdff1aSopenharmony_ci    }
2855cabdff1aSopenharmony_ci
2856cabdff1aSopenharmony_ci    if (s->iccnum != 0 && s->iccnum == s->iccread) {
2857cabdff1aSopenharmony_ci        AVFrameSideData *sd;
2858cabdff1aSopenharmony_ci        size_t offset = 0;
2859cabdff1aSopenharmony_ci        int total_size = 0;
2860cabdff1aSopenharmony_ci        int i;
2861cabdff1aSopenharmony_ci
2862cabdff1aSopenharmony_ci        /* Sum size of all parts. */
2863cabdff1aSopenharmony_ci        for (i = 0; i < s->iccnum; i++)
2864cabdff1aSopenharmony_ci            total_size += s->iccentries[i].length;
2865cabdff1aSopenharmony_ci
2866cabdff1aSopenharmony_ci        sd = av_frame_new_side_data(frame, AV_FRAME_DATA_ICC_PROFILE, total_size);
2867cabdff1aSopenharmony_ci        if (!sd) {
2868cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2869cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
2870cabdff1aSopenharmony_ci        }
2871cabdff1aSopenharmony_ci
2872cabdff1aSopenharmony_ci        /* Reassemble the parts, which are now in-order. */
2873cabdff1aSopenharmony_ci        for (i = 0; i < s->iccnum; i++) {
2874cabdff1aSopenharmony_ci            memcpy(sd->data + offset, s->iccentries[i].data, s->iccentries[i].length);
2875cabdff1aSopenharmony_ci            offset += s->iccentries[i].length;
2876cabdff1aSopenharmony_ci        }
2877cabdff1aSopenharmony_ci    }
2878cabdff1aSopenharmony_ci
2879cabdff1aSopenharmony_ci    if (e = av_dict_get(s->exif_metadata, "Orientation", e, AV_DICT_IGNORE_SUFFIX)) {
2880cabdff1aSopenharmony_ci        char *value = e->value + strspn(e->value, " \n\t\r"), *endptr;
2881cabdff1aSopenharmony_ci        int orientation = strtol(value, &endptr, 0);
2882cabdff1aSopenharmony_ci
2883cabdff1aSopenharmony_ci        if (!*endptr) {
2884cabdff1aSopenharmony_ci            AVFrameSideData *sd = NULL;
2885cabdff1aSopenharmony_ci
2886cabdff1aSopenharmony_ci            if (orientation >= 2 && orientation <= 8) {
2887cabdff1aSopenharmony_ci                int32_t *matrix;
2888cabdff1aSopenharmony_ci
2889cabdff1aSopenharmony_ci                sd = av_frame_new_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9);
2890cabdff1aSopenharmony_ci                if (!sd) {
2891cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2892cabdff1aSopenharmony_ci                    return AVERROR(ENOMEM);
2893cabdff1aSopenharmony_ci                }
2894cabdff1aSopenharmony_ci
2895cabdff1aSopenharmony_ci                matrix = (int32_t *)sd->data;
2896cabdff1aSopenharmony_ci
2897cabdff1aSopenharmony_ci                switch (orientation) {
2898cabdff1aSopenharmony_ci                case 2:
2899cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, 0.0);
2900cabdff1aSopenharmony_ci                    av_display_matrix_flip(matrix, 1, 0);
2901cabdff1aSopenharmony_ci                    break;
2902cabdff1aSopenharmony_ci                case 3:
2903cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, 180.0);
2904cabdff1aSopenharmony_ci                    break;
2905cabdff1aSopenharmony_ci                case 4:
2906cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, 180.0);
2907cabdff1aSopenharmony_ci                    av_display_matrix_flip(matrix, 1, 0);
2908cabdff1aSopenharmony_ci                    break;
2909cabdff1aSopenharmony_ci                case 5:
2910cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, 90.0);
2911cabdff1aSopenharmony_ci                    av_display_matrix_flip(matrix, 1, 0);
2912cabdff1aSopenharmony_ci                    break;
2913cabdff1aSopenharmony_ci                case 6:
2914cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, 90.0);
2915cabdff1aSopenharmony_ci                    break;
2916cabdff1aSopenharmony_ci                case 7:
2917cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, -90.0);
2918cabdff1aSopenharmony_ci                    av_display_matrix_flip(matrix, 1, 0);
2919cabdff1aSopenharmony_ci                    break;
2920cabdff1aSopenharmony_ci                case 8:
2921cabdff1aSopenharmony_ci                    av_display_rotation_set(matrix, -90.0);
2922cabdff1aSopenharmony_ci                    break;
2923cabdff1aSopenharmony_ci                default:
2924cabdff1aSopenharmony_ci                    av_assert0(0);
2925cabdff1aSopenharmony_ci                }
2926cabdff1aSopenharmony_ci            }
2927cabdff1aSopenharmony_ci        }
2928cabdff1aSopenharmony_ci    }
2929cabdff1aSopenharmony_ci
2930cabdff1aSopenharmony_ci    av_dict_copy(&frame->metadata, s->exif_metadata, 0);
2931cabdff1aSopenharmony_ci    av_dict_free(&s->exif_metadata);
2932cabdff1aSopenharmony_ci
2933cabdff1aSopenharmony_ci    if (avctx->codec_id == AV_CODEC_ID_SMVJPEG) {
2934cabdff1aSopenharmony_ci        ret = smv_process_frame(avctx, frame);
2935cabdff1aSopenharmony_ci        if (ret < 0) {
2936cabdff1aSopenharmony_ci            av_frame_unref(frame);
2937cabdff1aSopenharmony_ci            return ret;
2938cabdff1aSopenharmony_ci        }
2939cabdff1aSopenharmony_ci    }
2940cabdff1aSopenharmony_ci    if ((avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
2941cabdff1aSopenharmony_ci         avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
2942cabdff1aSopenharmony_ci        avctx->coded_height > s->orig_height) {
2943cabdff1aSopenharmony_ci        frame->height   = AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres);
2944cabdff1aSopenharmony_ci        frame->crop_top = frame->height - avctx->height;
2945cabdff1aSopenharmony_ci    }
2946cabdff1aSopenharmony_ci
2947cabdff1aSopenharmony_ci    ret = 0;
2948cabdff1aSopenharmony_ci
2949cabdff1aSopenharmony_cithe_end_no_picture:
2950cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG, "decode frame unused %"PTRDIFF_SPECIFIER" bytes\n",
2951cabdff1aSopenharmony_ci           buf_end - buf_ptr);
2952cabdff1aSopenharmony_ci
2953cabdff1aSopenharmony_ci    return ret;
2954cabdff1aSopenharmony_ci}
2955cabdff1aSopenharmony_ci
2956cabdff1aSopenharmony_ci/* mxpeg may call the following function (with a blank MJpegDecodeContext)
2957cabdff1aSopenharmony_ci * even without having called ff_mjpeg_decode_init(). */
2958cabdff1aSopenharmony_ciav_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2959cabdff1aSopenharmony_ci{
2960cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
2961cabdff1aSopenharmony_ci    int i, j;
2962cabdff1aSopenharmony_ci
2963cabdff1aSopenharmony_ci    if (s->interlaced && s->bottom_field == !s->interlace_polarity && s->got_picture && !avctx->frame_number) {
2964cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_INFO, "Single field\n");
2965cabdff1aSopenharmony_ci    }
2966cabdff1aSopenharmony_ci
2967cabdff1aSopenharmony_ci    if (s->picture) {
2968cabdff1aSopenharmony_ci        av_frame_free(&s->picture);
2969cabdff1aSopenharmony_ci        s->picture_ptr = NULL;
2970cabdff1aSopenharmony_ci    } else if (s->picture_ptr)
2971cabdff1aSopenharmony_ci        av_frame_unref(s->picture_ptr);
2972cabdff1aSopenharmony_ci
2973cabdff1aSopenharmony_ci    av_frame_free(&s->smv_frame);
2974cabdff1aSopenharmony_ci
2975cabdff1aSopenharmony_ci    av_freep(&s->buffer);
2976cabdff1aSopenharmony_ci    av_freep(&s->stereo3d);
2977cabdff1aSopenharmony_ci    av_freep(&s->ljpeg_buffer);
2978cabdff1aSopenharmony_ci    s->ljpeg_buffer_size = 0;
2979cabdff1aSopenharmony_ci
2980cabdff1aSopenharmony_ci    for (i = 0; i < 3; i++) {
2981cabdff1aSopenharmony_ci        for (j = 0; j < 4; j++)
2982cabdff1aSopenharmony_ci            ff_free_vlc(&s->vlcs[i][j]);
2983cabdff1aSopenharmony_ci    }
2984cabdff1aSopenharmony_ci    for (i = 0; i < MAX_COMPONENTS; i++) {
2985cabdff1aSopenharmony_ci        av_freep(&s->blocks[i]);
2986cabdff1aSopenharmony_ci        av_freep(&s->last_nnz[i]);
2987cabdff1aSopenharmony_ci    }
2988cabdff1aSopenharmony_ci    av_dict_free(&s->exif_metadata);
2989cabdff1aSopenharmony_ci
2990cabdff1aSopenharmony_ci    reset_icc_profile(s);
2991cabdff1aSopenharmony_ci
2992cabdff1aSopenharmony_ci    av_freep(&s->hwaccel_picture_private);
2993cabdff1aSopenharmony_ci    av_freep(&s->jls_state);
2994cabdff1aSopenharmony_ci
2995cabdff1aSopenharmony_ci    return 0;
2996cabdff1aSopenharmony_ci}
2997cabdff1aSopenharmony_ci
2998cabdff1aSopenharmony_cistatic void decode_flush(AVCodecContext *avctx)
2999cabdff1aSopenharmony_ci{
3000cabdff1aSopenharmony_ci    MJpegDecodeContext *s = avctx->priv_data;
3001cabdff1aSopenharmony_ci    s->got_picture = 0;
3002cabdff1aSopenharmony_ci
3003cabdff1aSopenharmony_ci    s->smv_next_frame = 0;
3004cabdff1aSopenharmony_ci    av_frame_unref(s->smv_frame);
3005cabdff1aSopenharmony_ci}
3006cabdff1aSopenharmony_ci
3007cabdff1aSopenharmony_ci#if CONFIG_MJPEG_DECODER
3008cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(MJpegDecodeContext, x)
3009cabdff1aSopenharmony_ci#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
3010cabdff1aSopenharmony_cistatic const AVOption options[] = {
3011cabdff1aSopenharmony_ci    { "extern_huff", "Use external huffman table.",
3012cabdff1aSopenharmony_ci      OFFSET(extern_huff), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
3013cabdff1aSopenharmony_ci    { NULL },
3014cabdff1aSopenharmony_ci};
3015cabdff1aSopenharmony_ci
3016cabdff1aSopenharmony_cistatic const AVClass mjpegdec_class = {
3017cabdff1aSopenharmony_ci    .class_name = "MJPEG decoder",
3018cabdff1aSopenharmony_ci    .item_name  = av_default_item_name,
3019cabdff1aSopenharmony_ci    .option     = options,
3020cabdff1aSopenharmony_ci    .version    = LIBAVUTIL_VERSION_INT,
3021cabdff1aSopenharmony_ci};
3022cabdff1aSopenharmony_ci
3023cabdff1aSopenharmony_ciconst FFCodec ff_mjpeg_decoder = {
3024cabdff1aSopenharmony_ci    .p.name         = "mjpeg",
3025cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
3026cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_VIDEO,
3027cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_MJPEG,
3028cabdff1aSopenharmony_ci    .priv_data_size = sizeof(MJpegDecodeContext),
3029cabdff1aSopenharmony_ci    .init           = ff_mjpeg_decode_init,
3030cabdff1aSopenharmony_ci    .close          = ff_mjpeg_decode_end,
3031cabdff1aSopenharmony_ci    FF_CODEC_RECEIVE_FRAME_CB(ff_mjpeg_receive_frame),
3032cabdff1aSopenharmony_ci    .flush          = decode_flush,
3033cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,
3034cabdff1aSopenharmony_ci    .p.max_lowres   = 3,
3035cabdff1aSopenharmony_ci    .p.priv_class   = &mjpegdec_class,
3036cabdff1aSopenharmony_ci    .p.profiles     = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
3037cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP |
3038cabdff1aSopenharmony_ci                      FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_SETS_PKT_DTS,
3039cabdff1aSopenharmony_ci    .hw_configs     = (const AVCodecHWConfigInternal *const []) {
3040cabdff1aSopenharmony_ci#if CONFIG_MJPEG_NVDEC_HWACCEL
3041cabdff1aSopenharmony_ci                        HWACCEL_NVDEC(mjpeg),
3042cabdff1aSopenharmony_ci#endif
3043cabdff1aSopenharmony_ci#if CONFIG_MJPEG_VAAPI_HWACCEL
3044cabdff1aSopenharmony_ci                        HWACCEL_VAAPI(mjpeg),
3045cabdff1aSopenharmony_ci#endif
3046cabdff1aSopenharmony_ci                        NULL
3047cabdff1aSopenharmony_ci                    },
3048cabdff1aSopenharmony_ci};
3049cabdff1aSopenharmony_ci#endif
3050cabdff1aSopenharmony_ci#if CONFIG_THP_DECODER
3051cabdff1aSopenharmony_ciconst FFCodec ff_thp_decoder = {
3052cabdff1aSopenharmony_ci    .p.name         = "thp",
3053cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
3054cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_VIDEO,
3055cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_THP,
3056cabdff1aSopenharmony_ci    .priv_data_size = sizeof(MJpegDecodeContext),
3057cabdff1aSopenharmony_ci    .init           = ff_mjpeg_decode_init,
3058cabdff1aSopenharmony_ci    .close          = ff_mjpeg_decode_end,
3059cabdff1aSopenharmony_ci    FF_CODEC_RECEIVE_FRAME_CB(ff_mjpeg_receive_frame),
3060cabdff1aSopenharmony_ci    .flush          = decode_flush,
3061cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,
3062cabdff1aSopenharmony_ci    .p.max_lowres   = 3,
3063cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP |
3064cabdff1aSopenharmony_ci                      FF_CODEC_CAP_SETS_PKT_DTS,
3065cabdff1aSopenharmony_ci};
3066cabdff1aSopenharmony_ci#endif
3067cabdff1aSopenharmony_ci
3068cabdff1aSopenharmony_ci#if CONFIG_SMVJPEG_DECODER
3069cabdff1aSopenharmony_ciconst FFCodec ff_smvjpeg_decoder = {
3070cabdff1aSopenharmony_ci    .p.name         = "smvjpeg",
3071cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("SMV JPEG"),
3072cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_VIDEO,
3073cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_SMVJPEG,
3074cabdff1aSopenharmony_ci    .priv_data_size = sizeof(MJpegDecodeContext),
3075cabdff1aSopenharmony_ci    .init           = ff_mjpeg_decode_init,
3076cabdff1aSopenharmony_ci    .close          = ff_mjpeg_decode_end,
3077cabdff1aSopenharmony_ci    FF_CODEC_RECEIVE_FRAME_CB(ff_mjpeg_receive_frame),
3078cabdff1aSopenharmony_ci    .flush          = decode_flush,
3079cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,
3080cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING |
3081cabdff1aSopenharmony_ci                      FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP,
3082cabdff1aSopenharmony_ci};
3083cabdff1aSopenharmony_ci#endif
3084