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