mjpegdec.c 82.7 KB
Newer Older
1 2
/*
 * MJPEG decoder
3
 * Copyright (c) 2000, 2001 Fabrice Bellard
4 5 6
 * Copyright (c) 2003 Alex Beregszaszi
 * Copyright (c) 2003-2004 Michael Niedermayer
 *
7 8 9 10
 * Support for external huffman table, various fixes (AVID workaround),
 * aspecting, new decode_frame mechanism and apple mjpeg-b support
 *                                  by Alex Beregszaszi
 *
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
29
 * @file
30 31 32
 * MJPEG decoder.
 */

33
#include "libavutil/imgutils.h"
34
#include "libavutil/avassert.h"
35
#include "libavutil/opt.h"
36
#include "avcodec.h"
37
#include "blockdsp.h"
38
#include "copy_block.h"
39
#include "idctdsp.h"
40
#include "internal.h"
41
#include "mjpeg.h"
42
#include "mjpegdec.h"
43
#include "jpeglsdec.h"
44 45 46
#include "tiff.h"
#include "exif.h"
#include "bytestream.h"
47 48


49 50 51
static int build_vlc(VLC *vlc, const uint8_t *bits_table,
                     const uint8_t *val_table, int nb_codes,
                     int use_static, int is_ac)
52
{
53
    uint8_t huff_size[256] = { 0 };
54 55 56
    uint16_t huff_code[256];
    uint16_t huff_sym[256];
    int i;
57

58
    av_assert0(nb_codes <= 256);
59

60
    ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table);
61

62 63
    for (i = 0; i < 256; i++)
        huff_sym[i] = i + 16 * is_ac;
64

65 66
    if (is_ac)
        huff_sym[0] = 16 * 256;
67

68 69
    return ff_init_vlc_sparse(vlc, 9, nb_codes, huff_size, 1, 1,
                              huff_code, 2, 2, huff_sym, 2, 2, use_static);
70 71
}

72 73
static void build_basic_mjpeg_vlc(MJpegDecodeContext *s)
{
74 75 76 77 78 79 80 81 82 83 84 85
    build_vlc(&s->vlcs[0][0], avpriv_mjpeg_bits_dc_luminance,
              avpriv_mjpeg_val_dc, 12, 0, 0);
    build_vlc(&s->vlcs[0][1], avpriv_mjpeg_bits_dc_chrominance,
              avpriv_mjpeg_val_dc, 12, 0, 0);
    build_vlc(&s->vlcs[1][0], avpriv_mjpeg_bits_ac_luminance,
              avpriv_mjpeg_val_ac_luminance, 251, 0, 1);
    build_vlc(&s->vlcs[1][1], avpriv_mjpeg_bits_ac_chrominance,
              avpriv_mjpeg_val_ac_chrominance, 251, 0, 1);
    build_vlc(&s->vlcs[2][0], avpriv_mjpeg_bits_ac_luminance,
              avpriv_mjpeg_val_ac_luminance, 251, 0, 0);
    build_vlc(&s->vlcs[2][1], avpriv_mjpeg_bits_ac_chrominance,
              avpriv_mjpeg_val_ac_chrominance, 251, 0, 0);
86 87
}

88 89 90 91 92
static void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
{
    s->buggy_avid = 1;
    if (len > 14 && buf[12] == 1) /* 1 - NTSC */
        s->interlace_polarity = 1;
93 94
    if (len > 14 && buf[12] == 2) /* 2 - PAL */
        s->interlace_polarity = 0;
95 96
    if (s->avctx->debug & FF_DEBUG_PICT_INFO)
        av_log(s->avctx, AV_LOG_INFO, "AVID: len:%d %d\n", len, len > 14 ? buf[12] : -1);
97 98
}

99
av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
100 101 102
{
    MJpegDecodeContext *s = avctx->priv_data;

103 104 105 106 107 108
    if (!s->picture_ptr) {
        s->picture = av_frame_alloc();
        if (!s->picture)
            return AVERROR(ENOMEM);
        s->picture_ptr = s->picture;
    }
109

110
    s->avctx = avctx;
111
    ff_blockdsp_init(&s->bdsp, avctx);
112
    ff_hpeldsp_init(&s->hdsp, avctx->flags);
113 114 115
    ff_idctdsp_init(&s->idsp, avctx);
    ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
                      ff_zigzag_direct);
116 117 118
    s->buffer_size   = 0;
    s->buffer        = NULL;
    s->start_code    = -1;
119
    s->first_picture = 1;
120
    s->got_picture   = 0;
121
    s->org_height    = avctx->coded_height;
122
    avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
123
    avctx->colorspace = AVCOL_SPC_BT470BG;
124

125
    build_basic_mjpeg_vlc(s);
126

127
    if (s->extern_huff) {
128
        av_log(avctx, AV_LOG_INFO, "using external huffman table\n");
129
        init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8);
130
        if (ff_mjpeg_decode_dht(s)) {
131
            av_log(avctx, AV_LOG_ERROR,
132
                   "error using external huffman table, switching back to internal\n");
133
            build_basic_mjpeg_vlc(s);
134
        }
135
    }
136
    if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
137
        s->interlace_polarity = 1;           /* bottom field first */
138
        av_log(avctx, AV_LOG_DEBUG, "bottom field first\n");
139 140 141
    } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
        if (avctx->codec_tag == AV_RL32("MJPG"))
            s->interlace_polarity = 1;
142
    }
143 144 145 146 147 148 149

    if (   avctx->extradata_size > 8
        && AV_RL32(avctx->extradata) == 0x2C
        && AV_RL32(avctx->extradata+4) == 0x18) {
        parse_avid(s, avctx->extradata, avctx->extradata_size);
    }

150
    if (avctx->codec->id == AV_CODEC_ID_AMV)
151
        s->flipped = 1;
152 153 154 155 156 157

    return 0;
}


/* quantize tables */
158
int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
159 160 161 162 163 164
{
    int len, index, i, j;

    len = get_bits(&s->gb, 16) - 2;

    while (len >= 65) {
165 166 167 168
        int pr = get_bits(&s->gb, 4);
        if (pr > 1) {
            av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n");
            return AVERROR_INVALIDDATA;
169 170 171 172 173 174
        }
        index = get_bits(&s->gb, 4);
        if (index >= 4)
            return -1;
        av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
        /* read quant table */
175
        for (i = 0; i < 64; i++) {
176
            j = s->scantable.permutated[i];
177
            s->quant_matrixes[index][j] = get_bits(&s->gb, pr ? 16 : 8);
178 179
        }

180 181 182 183 184
        // XXX FIXME finetune, and perhaps add dc too
        s->qscale[index] = FFMAX(s->quant_matrixes[index][s->scantable.permutated[1]],
                                 s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1;
        av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
               index, s->qscale[index]);
185 186 187 188 189 190
        len -= 65;
    }
    return 0;
}

/* decode huffman tables and build VLC decoders */
191
int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
192 193 194 195
{
    int len, index, i, class, n, v, code_max;
    uint8_t bits_table[17];
    uint8_t val_table[256];
196
    int ret = 0;
197 198 199 200 201

    len = get_bits(&s->gb, 16) - 2;

    while (len > 0) {
        if (len < 17)
202
            return AVERROR_INVALIDDATA;
203 204
        class = get_bits(&s->gb, 4);
        if (class >= 2)
205
            return AVERROR_INVALIDDATA;
206 207
        index = get_bits(&s->gb, 4);
        if (index >= 4)
208
            return AVERROR_INVALIDDATA;
209
        n = 0;
210
        for (i = 1; i <= 16; i++) {
211 212 213 214 215
            bits_table[i] = get_bits(&s->gb, 8);
            n += bits_table[i];
        }
        len -= 17;
        if (len < n || n > 256)
216
            return AVERROR_INVALIDDATA;
217 218

        code_max = 0;
219
        for (i = 0; i < n; i++) {
220 221 222 223 224 225 226 227
            v = get_bits(&s->gb, 8);
            if (v > code_max)
                code_max = v;
            val_table[i] = v;
        }
        len -= n;

        /* build VLC and flush previous vlc if present */
228
        ff_free_vlc(&s->vlcs[class][index]);
229 230
        av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
               class, index, code_max + 1);
231 232 233
        if ((ret = build_vlc(&s->vlcs[class][index], bits_table, val_table,
                             code_max + 1, 0, class > 0)) < 0)
            return ret;
234

235
        if (class > 0) {
236
            ff_free_vlc(&s->vlcs[2][index]);
237 238 239
            if ((ret = build_vlc(&s->vlcs[2][index], bits_table, val_table,
                                 code_max + 1, 0, 0)) < 0)
                return ret;
240
        }
241 242 243 244
    }
    return 0;
}

245
int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
246
{
247 248
    int len, nb_components, i, width, height, bits, ret;
    unsigned pix_fmt_id;
249 250
    int h_count[MAX_COMPONENTS] = { 0 };
    int v_count[MAX_COMPONENTS] = { 0 };
251

252
    s->cur_scan = 0;
253
    s->upscale_h = s->upscale_v = 0;
254

255
    /* XXX: verify len field validity */
256
    len     = get_bits(&s->gb, 16);
257
    s->avctx->bits_per_raw_sample =
258
    bits    = get_bits(&s->gb, 8);
259

260 261 262 263 264
    if (bits > 16 || bits < 1) {
        av_log(s->avctx, AV_LOG_ERROR, "bits %d is invalid\n", bits);
        return AVERROR_INVALIDDATA;
    }

265
    if (s->pegasus_rct)
266 267
        bits = 9;
    if (bits == 9 && !s->pegasus_rct)
268
        s->rct  = 1;    // FIXME ugly
269

270 271 272 273 274
    if(s->lossless && s->avctx->lowres){
        av_log(s->avctx, AV_LOG_ERROR, "lowres is not possible with lossless jpeg\n");
        return -1;
    }

275
    height = get_bits(&s->gb, 16);
276
    width  = get_bits(&s->gb, 16);
277

278 279 280
    if (s->avctx->codec_id == AV_CODEC_ID_AMV && (height&15))
        avpriv_request_sample(s->avctx, "non mod 16 height AMV\n");

281 282
    // HACK for odd_height.mov
    if (s->interlaced && s->width == width && s->height == height + 1)
283 284 285
        height= s->height;

    av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
286
    if (av_image_check_size(width, height, 0, s->avctx))
287
        return AVERROR_INVALIDDATA;
288 289 290 291 292

    nb_components = get_bits(&s->gb, 8);
    if (nb_components <= 0 ||
        nb_components > MAX_COMPONENTS)
        return -1;
293 294
    if (s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
        if (nb_components != s->nb_components) {
295 296
            av_log(s->avctx, AV_LOG_ERROR,
                   "nb_components changing in interlaced picture\n");
297 298 299
            return AVERROR_INVALIDDATA;
        }
    }
300
    if (s->ls && !(bits <= 8 || nb_components == 1)) {
301 302 303
        avpriv_report_missing_feature(s->avctx,
                                      "JPEG-LS that is not <= 8 "
                                      "bits/component or 16-bit gray");
304
        return AVERROR_PATCHWELCOME;
305 306
    }
    s->nb_components = nb_components;
307 308 309
    s->h_max         = 1;
    s->v_max         = 1;
    for (i = 0; i < nb_components; i++) {
310 311
        /* component id */
        s->component_id[i] = get_bits(&s->gb, 8) - 1;
312 313
        h_count[i]         = get_bits(&s->gb, 4);
        v_count[i]         = get_bits(&s->gb, 4);
314
        /* compute hmax and vmax (only used in interleaved case) */
315 316 317 318
        if (h_count[i] > s->h_max)
            s->h_max = h_count[i];
        if (v_count[i] > s->v_max)
            s->v_max = v_count[i];
319
        s->quant_index[i] = get_bits(&s->gb, 8);
320 321
        if (s->quant_index[i] >= 4) {
            av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n");
322
            return AVERROR_INVALIDDATA;
323
        }
324
        if (!h_count[i] || !v_count[i]) {
325 326
            av_log(s->avctx, AV_LOG_ERROR,
                   "Invalid sampling factor in component %d %d:%d\n",
327
                   i, h_count[i], v_count[i]);
328 329 330
            return AVERROR_INVALIDDATA;
        }

331
        av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
332
               i, h_count[i], v_count[i],
333
               s->component_id[i], s->quant_index[i]);
334 335
    }

336
    if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
337
        avpriv_report_missing_feature(s->avctx, "Subsampling in JPEG-LS");
338
        return AVERROR_PATCHWELCOME;
339 340 341 342
    }


    /* if different size, realloc/alloc picture */
343 344 345
    if (width != s->width || height != s->height || bits != s->bits ||
        memcmp(s->h_count, h_count, sizeof(h_count))                ||
        memcmp(s->v_count, v_count, sizeof(v_count))) {
346

347 348
        s->width      = width;
        s->height     = height;
349
        s->bits       = bits;
350 351
        memcpy(s->h_count, h_count, sizeof(h_count));
        memcpy(s->v_count, v_count, sizeof(v_count));
352
        s->interlaced = 0;
353
        s->got_picture = 0;
354 355

        /* test interlaced mode */
356
        if (s->first_picture   &&
357 358
            s->org_height != 0 &&
            s->height < ((s->org_height * 3) / 4)) {
359 360
            s->interlaced                    = 1;
            s->bottom_field                  = s->interlace_polarity;
361
            s->picture_ptr->interlaced_frame = 1;
362
            s->picture_ptr->top_field_first  = !s->interlace_polarity;
363 364 365
            height *= 2;
        }

366 367 368
        ret = ff_set_dimensions(s->avctx, width, height);
        if (ret < 0)
            return ret;
369 370 371 372

        s->first_picture = 0;
    }

373
    if (s->got_picture && s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
374
        if (s->progressive) {
375
            avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
376 377
            return AVERROR_INVALIDDATA;
        }
378
    } else{
379
        if (s->v_max == 1 && s->h_max == 1 && s->lossless==1 && (nb_components==3 || nb_components==4))
380 381 382
            s->rgb = 1;
        else if (!s->lossless)
            s->rgb = 0;
383
    /* XXX: not complete test ! */
384
    pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
385 386 387
                 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
                 (s->h_count[2] << 12) | (s->v_count[2] <<  8) |
                 (s->h_count[3] <<  4) |  s->v_count[3];
388
    av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
389 390 391 392 393 394 395
    /* NOTE we do not allocate pictures large enough for the possible
     * padding of h/v_count being 4 */
    if (!(pix_fmt_id & 0xD0D0D0D0))
        pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
    if (!(pix_fmt_id & 0x0D0D0D0D))
        pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;

396 397 398 399
    for (i = 0; i < 8; i++) {
        int j = 6 + (i&1) - (i&6);
        int is = (pix_fmt_id >> (4*i)) & 0xF;
        int js = (pix_fmt_id >> (4*j)) & 0xF;
400 401 402 403 404 405

        if (is == 1 && js != 2 && (i < 2 || i > 5))
            js = (pix_fmt_id >> ( 8 + 4*(i&1))) & 0xF;
        if (is == 1 && js != 2 && (i < 2 || i > 5))
            js = (pix_fmt_id >> (16 + 4*(i&1))) & 0xF;

406 407 408 409 410 411
        if (is == 1 && js == 2) {
            if (i & 1) s->upscale_h |= 1 << (j/2);
            else       s->upscale_v |= 1 << (j/2);
        }
    }

412
    switch (pix_fmt_id) {
413
    case 0x11111100:
414
        if (s->rgb)
415
            s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
416 417
        else {
            if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
418
                s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
419
            } else {
420 421
                if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
                else              s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
Gavin Kinsey's avatar
Gavin Kinsey committed
422
            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
Michael Niedermayer's avatar
Michael Niedermayer committed
423
            }
Gavin Kinsey's avatar
Gavin Kinsey committed
424
        }
425
        av_assert0(s->nb_components == 3);
426
        break;
427 428
    case 0x11111111:
        if (s->rgb)
429
            s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
430
        else {
431 432 433 434 435
            if (s->adobe_transform == 0 && s->bits <= 8) {
                s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
            } else {
                s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
436
            }
437 438 439
        }
        av_assert0(s->nb_components == 4);
        break;
440
    case 0x22111122:
441
    case 0x22111111:
442 443
        if (s->adobe_transform == 0 && s->bits <= 8) {
            s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
444 445
            s->upscale_v |= 6;
            s->upscale_h |= 6;
446 447
        } else if (s->adobe_transform == 2 && s->bits <= 8) {
            s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
448 449
            s->upscale_v |= 6;
            s->upscale_h |= 6;
450
            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
451 452 453 454 455 456 457
        } else {
            if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
            else              s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        }
        av_assert0(s->nb_components == 4);
        break;
458
    case 0x12121100:
459 460 461
    case 0x22122100:
    case 0x21211100:
    case 0x22211200:
462 463 464
        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
        else
            goto unk_pixfmt;
465 466 467
        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        break;
    case 0x22221100:
468
    case 0x22112200:
469 470 471 472 473 474
    case 0x11222200:
        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
        else
            goto unk_pixfmt;
        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        break;
475
    case 0x11000000:
476 477 478 479 480 481 482 483
    case 0x13000000:
    case 0x14000000:
    case 0x31000000:
    case 0x33000000:
    case 0x34000000:
    case 0x41000000:
    case 0x43000000:
    case 0x44000000:
484
        if(s->bits <= 8)
485
            s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
486
        else
487
            s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
488
        break;
489
    case 0x12111100:
490
    case 0x14121200:
491
    case 0x14111100:
492
    case 0x22211100:
493
    case 0x22112100:
494 495 496 497 498 499
        if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
            if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
            else
                goto unk_pixfmt;
            s->upscale_v |= 3;
        } else {
500 501
            if (pix_fmt_id == 0x14111100)
                s->upscale_v |= 6;
502 503 504 505 506
            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
            else
                goto unk_pixfmt;
            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        }
507
        break;
508
    case 0x21111100:
509 510 511 512 513 514 515 516 517 518
        if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
            if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
            else
                goto unk_pixfmt;
            s->upscale_h |= 3;
        } else {
            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
            else              s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        }
519
        break;
520 521
    case 0x22121100:
    case 0x22111200:
522 523 524
        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
        else
            goto unk_pixfmt;
525 526
        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        break;
527
    case 0x22111100:
528
    case 0x42111100:
529
    case 0x24111100:
530 531
        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
        else              s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
Gavin Kinsey's avatar
Gavin Kinsey committed
532
        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
533
        if (pix_fmt_id == 0x42111100) {
534 535
            if (s->bits > 8)
                goto unk_pixfmt;
536
            s->upscale_h = 6;
537
        } else if (pix_fmt_id == 0x24111100) {
538 539
            if (s->bits > 8)
                goto unk_pixfmt;
540
            s->upscale_v = 6;
541
        }
542
        break;
543
    case 0x41111100:
544 545 546
        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
        else
            goto unk_pixfmt;
547 548
        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
        break;
549
    default:
550
unk_pixfmt:
551
        av_log(s->avctx, AV_LOG_ERROR, "Unhandled pixel format 0x%x bits:%d\n", pix_fmt_id, s->bits);
552
        s->upscale_h = s->upscale_v = 0;
553
        return AVERROR_PATCHWELCOME;
554
    }
555 556 557 558
    if ((s->upscale_h || s->upscale_v) && s->avctx->lowres) {
        av_log(s->avctx, AV_LOG_ERROR, "lowres not supported for weird subsampling\n");
        return AVERROR_PATCHWELCOME;
    }
559
    if (s->ls) {
560
        s->upscale_h = s->upscale_v = 0;
561
        if (s->nb_components > 1)
562
            s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
563 564
        else if (s->palette_index && s->bits <= 8)
            s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
565
        else if (s->bits <= 8)
566
            s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
567
        else
568
            s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
569 570
    }

571 572 573 574 575 576
    s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
    if (!s->pix_desc) {
        av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
        return AVERROR_BUG;
    }

577
    av_frame_unref(s->picture_ptr);
578
    if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0)
579
        return -1;
580 581 582
    s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
    s->picture_ptr->key_frame = 1;
    s->got_picture            = 1;
583

584
    for (i = 0; i < 4; i++)
585
        s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
586

587 588 589
    av_dlog(s->avctx, "%d %d %d %d %d %d\n",
            s->width, s->height, s->linesize[0], s->linesize[1],
            s->interlaced, s->avctx->height);
590

591
    if (len != (8 + (3 * nb_components)))
592
        av_log(s->avctx, AV_LOG_DEBUG, "decode_sof0: error, len(%d) mismatch\n", len);
593
    }
594

595 596 597 598 599
    if (s->rgb && !s->lossless && !s->ls) {
        av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
        return AVERROR_PATCHWELCOME;
    }

600
    /* totally blank picture as progressive JPEG will only add details to it */
601 602 603 604
    if (s->progressive) {
        int bw = (width  + s->h_max * 8 - 1) / (s->h_max * 8);
        int bh = (height + s->v_max * 8 - 1) / (s->v_max * 8);
        for (i = 0; i < s->nb_components; i++) {
Loren Merritt's avatar
Loren Merritt committed
605 606 607
            int size = bw * bh * s->h_count[i] * s->v_count[i];
            av_freep(&s->blocks[i]);
            av_freep(&s->last_nnz[i]);
608 609
            s->blocks[i]       = av_mallocz_array(size, sizeof(**s->blocks));
            s->last_nnz[i]     = av_mallocz_array(size, sizeof(**s->last_nnz));
610 611
            if (!s->blocks[i] || !s->last_nnz[i])
                return AVERROR(ENOMEM);
Loren Merritt's avatar
Loren Merritt committed
612 613 614
            s->block_stride[i] = bw * s->h_count[i];
        }
        memset(s->coefs_finished, 0, sizeof(s->coefs_finished));
615 616 617 618 619 620 621 622
    }
    return 0;
}

static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
{
    int code;
    code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
623
    if (code < 0 || code > 16) {
624 625 626
        av_log(s->avctx, AV_LOG_WARNING,
               "mjpeg_decode_dc: bad vlc: %d:%d (%p)\n",
               0, dc_index, &s->vlcs[0][dc_index]);
627
        return 0xfffff;
628 629
    }

630
    if (code)
631 632 633 634 635 636
        return get_xbits(&s->gb, code);
    else
        return 0;
}

/* decode block and dequantize */
Diego Biurrun's avatar
Diego Biurrun committed
637
static int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
638
                        int dc_index, int ac_index, int16_t *quant_matrix)
639 640 641 642 643
{
    int code, i, j, level, val;

    /* DC coef */
    val = mjpeg_decode_dc(s, dc_index);
644
    if (val == 0xfffff) {
645
        av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
646
        return AVERROR_INVALIDDATA;
647 648 649 650 651 652
    }
    val = val * quant_matrix[0] + s->last_dc[component];
    s->last_dc[component] = val;
    block[0] = val;
    /* AC coefs */
    i = 0;
653
    {OPEN_READER(re, &s->gb);
654
    do {
655
        UPDATE_CACHE(re, &s->gb);
656
        GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
657 658 659

        i += ((unsigned)code) >> 4;
            code &= 0xf;
660 661
        if (code) {
            if (code > MIN_CACHE_BITS - 16)
662
                UPDATE_CACHE(re, &s->gb);
663

664
            {
665 666 667
                int cache = GET_CACHE(re, &s->gb);
                int sign  = (~cache) >> 31;
                level     = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
668 669
            }

670
            LAST_SKIP_BITS(re, &s->gb, code);
671

672
            if (i > 63) {
673
                av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
674
                return AVERROR_INVALIDDATA;
675
            }
676
            j        = s->scantable.permutated[i];
677 678
            block[j] = level * quant_matrix[j];
        }
679
    } while (i < 63);
680
    CLOSE_READER(re, &s->gb);}
681 682 683 684

    return 0;
}

Diego Biurrun's avatar
Diego Biurrun committed
685
static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block,
686 687
                                 int component, int dc_index,
                                 int16_t *quant_matrix, int Al)
Loren Merritt's avatar
Loren Merritt committed
688 689
{
    int val;
690
    s->bdsp.clear_block(block);
Loren Merritt's avatar
Loren Merritt committed
691
    val = mjpeg_decode_dc(s, dc_index);
692
    if (val == 0xfffff) {
Loren Merritt's avatar
Loren Merritt committed
693
        av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
694
        return AVERROR_INVALIDDATA;
Loren Merritt's avatar
Loren Merritt committed
695 696 697 698 699 700 701
    }
    val = (val * quant_matrix[0] << Al) + s->last_dc[component];
    s->last_dc[component] = val;
    block[0] = val;
    return 0;
}

702
/* decode block and dequantize - progressive JPEG version */
Diego Biurrun's avatar
Diego Biurrun committed
703
static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
704 705
                                    uint8_t *last_nnz, int ac_index,
                                    int16_t *quant_matrix,
Loren Merritt's avatar
Loren Merritt committed
706
                                    int ss, int se, int Al, int *EOBRUN)
707 708 709
{
    int code, i, j, level, val, run;

710
    if (*EOBRUN) {
711 712 713
        (*EOBRUN)--;
        return 0;
    }
714

715 716 717 718 719
    {
        OPEN_READER(re, &s->gb);
        for (i = ss; ; i++) {
            UPDATE_CACHE(re, &s->gb);
            GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
720

721 722 723 724 725 726
            run = ((unsigned) code) >> 4;
            code &= 0xF;
            if (code) {
                i += run;
                if (code > MIN_CACHE_BITS - 16)
                    UPDATE_CACHE(re, &s->gb);
727

728 729 730 731
                {
                    int cache = GET_CACHE(re, &s->gb);
                    int sign  = (~cache) >> 31;
                    level     = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
732
                }
733 734 735

                LAST_SKIP_BITS(re, &s->gb, code);

736
                if (i >= se) {
737 738 739 740 741 742
                    if (i == se) {
                        j = s->scantable.permutated[se];
                        block[j] = level * quant_matrix[j] << Al;
                        break;
                    }
                    av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
743
                    return AVERROR_INVALIDDATA;
744
                }
745 746 747 748 749 750 751
                j = s->scantable.permutated[i];
                block[j] = level * quant_matrix[j] << Al;
            } else {
                if (run == 0xF) {// ZRL - skip 15 coefficients
                    i += 15;
                    if (i >= se) {
                        av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
752
                        return AVERROR_INVALIDDATA;
753 754 755 756 757 758 759 760 761 762
                    }
                } else {
                    val = (1 << run);
                    if (run) {
                        UPDATE_CACHE(re, &s->gb);
                        val += NEG_USR32(GET_CACHE(re, &s->gb), run);
                        LAST_SKIP_BITS(re, &s->gb, run);
                    }
                    *EOBRUN = val - 1;
                    break;
763
                }
764 765
            }
        }
766
        CLOSE_READER(re, &s->gb);
767
    }
768 769

    if (i > *last_nnz)
Loren Merritt's avatar
Loren Merritt committed
770
        *last_nnz = i;
771

Loren Merritt's avatar
Loren Merritt committed
772 773 774
    return 0;
}

775 776 777 778 779 780
#define REFINE_BIT(j) {                                             \
    UPDATE_CACHE(re, &s->gb);                                       \
    sign = block[j] >> 15;                                          \
    block[j] += SHOW_UBITS(re, &s->gb, 1) *                         \
                ((quant_matrix[j] ^ sign) - sign) << Al;            \
    LAST_SKIP_BITS(re, &s->gb, 1);                                  \
Loren Merritt's avatar
Loren Merritt committed
781 782
}

783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
#define ZERO_RUN                                                    \
for (; ; i++) {                                                     \
    if (i > last) {                                                 \
        i += run;                                                   \
        if (i > se) {                                               \
            av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
            return -1;                                              \
        }                                                           \
        break;                                                      \
    }                                                               \
    j = s->scantable.permutated[i];                                 \
    if (block[j])                                                   \
        REFINE_BIT(j)                                               \
    else if (run-- == 0)                                            \
        break;                                                      \
Loren Merritt's avatar
Loren Merritt committed
798 799 800
}

/* decode block and dequantize - progressive JPEG refinement pass */
Diego Biurrun's avatar
Diego Biurrun committed
801
static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
802 803 804
                                   uint8_t *last_nnz,
                                   int ac_index, int16_t *quant_matrix,
                                   int ss, int se, int Al, int *EOBRUN)
Loren Merritt's avatar
Loren Merritt committed
805
{
806 807
    int code, i = ss, j, sign, val, run;
    int last    = FFMIN(se, *last_nnz);
Loren Merritt's avatar
Loren Merritt committed
808 809

    OPEN_READER(re, &s->gb);
810
    if (*EOBRUN) {
Loren Merritt's avatar
Loren Merritt committed
811
        (*EOBRUN)--;
812 813
    } else {
        for (; ; i++) {
Loren Merritt's avatar
Loren Merritt committed
814
            UPDATE_CACHE(re, &s->gb);
815
            GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
816

817
            if (code & 0xF) {
Loren Merritt's avatar
Loren Merritt committed
818 819 820 821 822 823 824
                run = ((unsigned) code) >> 4;
                UPDATE_CACHE(re, &s->gb);
                val = SHOW_UBITS(re, &s->gb, 1);
                LAST_SKIP_BITS(re, &s->gb, 1);
                ZERO_RUN;
                j = s->scantable.permutated[i];
                val--;
825 826 827
                block[j] = ((quant_matrix[j]^val) - val) << Al;
                if (i == se) {
                    if (i > *last_nnz)
Loren Merritt's avatar
Loren Merritt committed
828
                        *last_nnz = i;
829
                    CLOSE_READER(re, &s->gb);
Loren Merritt's avatar
Loren Merritt committed
830 831
                    return 0;
                }
832
            } else {
Loren Merritt's avatar
Loren Merritt committed
833
                run = ((unsigned) code) >> 4;
834
                if (run == 0xF) {
Loren Merritt's avatar
Loren Merritt committed
835
                    ZERO_RUN;
836
                } else {
Loren Merritt's avatar
Loren Merritt committed
837 838
                    val = run;
                    run = (1 << run);
839
                    if (val) {
Loren Merritt's avatar
Loren Merritt committed
840 841 842 843 844 845 846 847 848 849
                        UPDATE_CACHE(re, &s->gb);
                        run += SHOW_UBITS(re, &s->gb, val);
                        LAST_SKIP_BITS(re, &s->gb, val);
                    }
                    *EOBRUN = run - 1;
                    break;
                }
            }
        }

850
        if (i > *last_nnz)
Loren Merritt's avatar
Loren Merritt committed
851 852 853
            *last_nnz = i;
    }

854
    for (; i <= last; i++) {
Loren Merritt's avatar
Loren Merritt committed
855
        j = s->scantable.permutated[i];
856
        if (block[j])
Loren Merritt's avatar
Loren Merritt committed
857 858 859
            REFINE_BIT(j)
    }
    CLOSE_READER(re, &s->gb);
860 861 862

    return 0;
}
Loren Merritt's avatar
Loren Merritt committed
863 864
#undef REFINE_BIT
#undef ZERO_RUN
865

866
static int handle_rstn(MJpegDecodeContext *s, int nb_components)
867 868
{
    int i;
869 870
    int reset = 0;

871 872 873 874 875
    if (s->restart_interval) {
        s->restart_count--;
        if(s->restart_count == 0 && s->avctx->codec_id == AV_CODEC_ID_THP){
            align_get_bits(&s->gb);
            for (i = 0; i < nb_components; i++) /* reset dc */
876
                s->last_dc[i] = (4 << s->bits);
877 878 879 880
        }

        i = 8 + ((-get_bits_count(&s->gb)) & 7);
        /* skip RSTn */
881
        if (s->restart_count == 0) {
882 883 884 885 886 887 888 889
            if(   show_bits(&s->gb, i) == (1 << i) - 1
               || show_bits(&s->gb, i) == 0xFF) {
                int pos = get_bits_count(&s->gb);
                align_get_bits(&s->gb);
                while (get_bits_left(&s->gb) >= 8 && show_bits(&s->gb, 8) == 0xFF)
                    skip_bits(&s->gb, 8);
                if (get_bits_left(&s->gb) >= 8 && (get_bits(&s->gb, 8) & 0xF8) == 0xD0) {
                    for (i = 0; i < nb_components; i++) /* reset dc */
890
                        s->last_dc[i] = (4 << s->bits);
891
                    reset = 1;
892 893 894
                } else
                    skip_bits_long(&s->gb, pos - get_bits_count(&s->gb));
            }
895 896
        }
    }
897
    return reset;
898 899
}

900 901
static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform)
{
902
    int i, mb_x, mb_y;
903
    uint16_t (*buffer)[4];
904
    int left[4], top[4], topleft[4];
905
    const int linesize = s->linesize[0];
906
    const int mask     = ((1 << s->bits) - 1) << point_transform;
907 908
    int resync_mb_y = 0;
    int resync_mb_x = 0;
909

910 911 912 913 914 915
    if (s->nb_components != 3 && s->nb_components != 4)
        return AVERROR_INVALIDDATA;
    if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
        return AVERROR_INVALIDDATA;


916 917
    s->restart_count = s->restart_interval;

918 919 920
    av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size,
                   (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
    buffer = s->ljpeg_buffer;
921

922
    for (i = 0; i < 4; i++)
923 924 925
        buffer[0][i] = 1 << (s->bits - 1);

    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
926
        uint8_t *ptr = s->picture_ptr->data[0] + (linesize * mb_y);
927 928 929 930

        if (s->interlaced && s->bottom_field)
            ptr += linesize >> 1;

931
        for (i = 0; i < 4; i++)
932 933 934
            top[i] = left[i] = topleft[i] = buffer[0][i];

        for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
935 936 937
            int modified_predictor = predictor;

            if (s->restart_interval && !s->restart_count){
938
                s->restart_count = s->restart_interval;
939 940
                resync_mb_x = mb_x;
                resync_mb_y = mb_y;
941
                for(i=0; i<4; i++)
942
                    top[i] = left[i]= topleft[i]= 1 << (s->bits - 1);
943
            }
944
            if (mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || !mb_x)
945
                modified_predictor = 1;
946

947
            for (i=0;i<nb_components;i++) {
948
                int pred, dc;
949

950 951
                topleft[i] = top[i];
                top[i]     = buffer[mb_x][i];
952 953 954

                PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);

955
                dc = mjpeg_decode_dc(s, s->dc_index[i]);
956
                if(dc == 0xFFFFF)
957 958
                    return -1;

959 960
                left[i] = buffer[mb_x][i] =
                    mask & (pred + (dc << point_transform));
961 962 963 964 965 966 967
            }

            if (s->restart_interval && !--s->restart_count) {
                align_get_bits(&s->gb);
                skip_bits(&s->gb, 16); /* skip RSTn */
            }
        }
968 969 970
        if (s->nb_components == 4) {
            for(i=0; i<nb_components; i++) {
                int c= s->comp_index[i];
971 972 973 974
                if (s->bits <= 8) {
                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
                        ptr[4*mb_x+3-c] = buffer[mb_x][i];
                    }
975 976
                } else if(s->bits == 9) {
                    return AVERROR_PATCHWELCOME;
977 978 979 980
                } else {
                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
                        ((uint16_t*)ptr)[4*mb_x+c] = buffer[mb_x][i];
                    }
981 982 983
                }
            }
        } else if (s->rct) {
984 985 986 987
            for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
                ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
                ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
                ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
988
            }
989 990 991 992 993
        } else if (s->pegasus_rct) {
            for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
                ptr[3*mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2]) >> 2);
                ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
                ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
994
            }
995 996
        } else {
            for(i=0; i<nb_components; i++) {
997
                int c= s->comp_index[i];
998 999 1000 1001
                if (s->bits <= 8) {
                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
                        ptr[3*mb_x+2-c] = buffer[mb_x][i];
                    }
1002 1003
                } else if(s->bits == 9) {
                    return AVERROR_PATCHWELCOME;
1004 1005 1006 1007
                } else {
                    for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
                        ((uint16_t*)ptr)[3*mb_x+2-c] = buffer[mb_x][i];
                    }
1008
                }
1009 1010 1011 1012 1013 1014
            }
        }
    }
    return 0;
}

1015
static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor,
1016
                                 int point_transform, int nb_components)
1017
{
1018
    int i, mb_x, mb_y, mask;
1019
    int bits= (s->bits+7)&~7;
1020 1021
    int resync_mb_y = 0;
    int resync_mb_x = 0;
1022 1023

    point_transform += bits - s->bits;
1024
    mask = ((1 << s->bits) - 1) << point_transform;
1025

1026
    av_assert0(nb_components>=1 && nb_components<=4);
1027

1028 1029
    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
        for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1030
            if (s->restart_interval && !s->restart_count){
1031
                s->restart_count = s->restart_interval;
1032 1033 1034
                resync_mb_x = mb_x;
                resync_mb_y = mb_y;
            }
1035

1036 1037 1038
            if(!mb_x || mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x || s->interlaced){
                int toprow  = mb_y == resync_mb_y || mb_y == resync_mb_y+1 && mb_x < resync_mb_x;
                int leftcol = !mb_x || mb_y == resync_mb_y && mb_x == resync_mb_x;
1039
                for (i = 0; i < nb_components; i++) {
1040
                    uint8_t *ptr;
1041
                    uint16_t *ptr16;
1042 1043 1044 1045 1046 1047 1048 1049 1050
                    int n, h, v, x, y, c, j, linesize;
                    n = s->nb_blocks[i];
                    c = s->comp_index[i];
                    h = s->h_scount[i];
                    v = s->v_scount[i];
                    x = 0;
                    y = 0;
                    linesize= s->linesize[c];

1051 1052
                    if(bits>8) linesize /= 2;

1053
                    for(j=0; j<n; j++) {
1054
                        int pred, dc;
1055

1056
                        dc = mjpeg_decode_dc(s, s->dc_index[i]);
1057
                        if(dc == 0xFFFFF)
1058 1059
                            return -1;
                        if(bits<=8){
1060
                        ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1061 1062
                        if(y==0 && toprow){
                            if(x==0 && leftcol){
1063
                                pred= 1 << (bits - 1);
1064 1065 1066 1067
                            }else{
                                pred= ptr[-1];
                            }
                        }else{
1068
                            if(x==0 && leftcol){
1069 1070 1071 1072 1073 1074 1075 1076
                                pred= ptr[-linesize];
                            }else{
                                PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
                            }
                        }

                        if (s->interlaced && s->bottom_field)
                            ptr += linesize >> 1;
1077
                        pred &= mask;
1078
                        *ptr= pred + (dc << point_transform);
1079
                        }else{
1080
                            ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1081 1082
                            if(y==0 && toprow){
                                if(x==0 && leftcol){
1083 1084 1085 1086 1087
                                    pred= 1 << (bits - 1);
                                }else{
                                    pred= ptr16[-1];
                                }
                            }else{
1088
                                if(x==0 && leftcol){
1089 1090 1091 1092 1093
                                    pred= ptr16[-linesize];
                                }else{
                                    PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);
                                }
                            }
1094

1095 1096
                            if (s->interlaced && s->bottom_field)
                                ptr16 += linesize >> 1;
1097
                            pred &= mask;
1098 1099
                            *ptr16= pred + (dc << point_transform);
                        }
1100 1101 1102 1103 1104 1105
                        if (++x == h) {
                            x = 0;
                            y++;
                        }
                    }
                }
1106 1107
            } else {
                for (i = 0; i < nb_components; i++) {
1108
                    uint8_t *ptr;
1109
                    uint16_t *ptr16;
1110
                    int n, h, v, x, y, c, j, linesize, dc;
1111 1112 1113 1114 1115 1116 1117
                    n        = s->nb_blocks[i];
                    c        = s->comp_index[i];
                    h        = s->h_scount[i];
                    v        = s->v_scount[i];
                    x        = 0;
                    y        = 0;
                    linesize = s->linesize[c];
1118

1119 1120
                    if(bits>8) linesize /= 2;

1121
                    for (j = 0; j < n; j++) {
1122 1123
                        int pred;

1124
                        dc = mjpeg_decode_dc(s, s->dc_index[i]);
1125
                        if(dc == 0xFFFFF)
1126
                            return -1;
1127
                        if(bits<=8){
1128
                            ptr = s->picture_ptr->data[c] +
1129 1130 1131
                              (linesize * (v * mb_y + y)) +
                              (h * mb_x + x); //FIXME optimize this crap
                            PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1132

1133
                            pred &= mask;
1134
                            *ptr = pred + (dc << point_transform);
1135
                        }else{
1136
                            ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
1137 1138
                            PREDICT(pred, ptr16[-linesize-1], ptr16[-linesize], ptr16[-1], predictor);

1139
                            pred &= mask;
1140 1141
                            *ptr16= pred + (dc << point_transform);
                        }
1142

1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158
                        if (++x == h) {
                            x = 0;
                            y++;
                        }
                    }
                }
            }
            if (s->restart_interval && !--s->restart_count) {
                align_get_bits(&s->gb);
                skip_bits(&s->gb, 16); /* skip RSTn */
            }
        }
    }
    return 0;
}

1159 1160
static av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s,
                                              uint8_t *dst, const uint8_t *src,
1161 1162 1163
                                              int linesize, int lowres)
{
    switch (lowres) {
1164
    case 0: s->hdsp.put_pixels_tab[1][0](dst, src, linesize, 8);
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
        break;
    case 1: copy_block4(dst, src, linesize, linesize, 4);
        break;
    case 2: copy_block2(dst, src, linesize, linesize, 2);
        break;
    case 3: *dst = *src;
        break;
    }
}

1175 1176 1177
static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
{
    int block_x, block_y;
1178
    int size = 8 >> s->avctx->lowres;
1179
    if (s->bits > 8) {
1180 1181
        for (block_y=0; block_y<size; block_y++)
            for (block_x=0; block_x<size; block_x++)
1182 1183
                *(uint16_t*)(ptr + 2*block_x + block_y*linesize) <<= 16 - s->bits;
    } else {
1184 1185
        for (block_y=0; block_y<size; block_y++)
            for (block_x=0; block_x<size; block_x++)
1186 1187 1188 1189
                *(ptr + block_x + block_y*linesize) <<= 8 - s->bits;
    }
}

1190 1191
static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
                             int Al, const uint8_t *mb_bitmask,
1192
                             int mb_bitmask_size,
1193 1194
                             const AVFrame *reference)
{
1195
    int i, mb_x, mb_y;
1196
    uint8_t *data[MAX_COMPONENTS];
1197
    const uint8_t *reference_data[MAX_COMPONENTS];
1198
    int linesize[MAX_COMPONENTS];
1199
    GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1200
    int bytes_per_pixel = 1 + (s->bits > 8);
1201

1202 1203 1204 1205 1206
    if (mb_bitmask) {
        if (mb_bitmask_size != (s->mb_width * s->mb_height + 7)>>3) {
            av_log(s->avctx, AV_LOG_ERROR, "mb_bitmask_size mismatches\n");
            return AVERROR_INVALIDDATA;
        }
1207
        init_get_bits(&mb_bitmask_gb, mb_bitmask, s->mb_width * s->mb_height);
1208
    }
1209

1210
    s->restart_count = 0;
1211

1212 1213
    for (i = 0; i < nb_components; i++) {
        int c   = s->comp_index[i];
1214
        data[c] = s->picture_ptr->data[c];
1215
        reference_data[c] = reference ? reference->data[c] : NULL;
1216
        linesize[c] = s->linesize[c];
Loren Merritt's avatar
Loren Merritt committed
1217
        s->coefs_finished[c] |= 1;
1218 1219
    }

1220 1221
    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
        for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1222 1223
            const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);

1224 1225 1226
            if (s->restart_interval && !s->restart_count)
                s->restart_count = s->restart_interval;

1227
            if (get_bits_left(&s->gb) < 0) {
1228
                av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1229
                       -get_bits_left(&s->gb));
1230
                return AVERROR_INVALIDDATA;
1231
            }
1232
            for (i = 0; i < nb_components; i++) {
1233 1234
                uint8_t *ptr;
                int n, h, v, x, y, c, j;
1235
                int block_offset;
1236 1237 1238 1239 1240 1241
                n = s->nb_blocks[i];
                c = s->comp_index[i];
                h = s->h_scount[i];
                v = s->v_scount[i];
                x = 0;
                y = 0;
1242
                for (j = 0; j < n; j++) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1243
                    block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1244
                                     (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1245

1246
                    if (s->interlaced && s->bottom_field)
1247 1248
                        block_offset += linesize[c] >> 1;
                    ptr = data[c] + block_offset;
1249 1250
                    if (!s->progressive) {
                        if (copy_mb)
1251
                            mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1252
                                             linesize[c], s->avctx->lowres);
1253

1254
                        else {
1255
                            s->bdsp.clear_block(s->block);
1256 1257
                            if (decode_block(s, s->block, i,
                                             s->dc_index[i], s->ac_index[i],
1258
                                             s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1259 1260
                                av_log(s->avctx, AV_LOG_ERROR,
                                       "error y=%d x=%d\n", mb_y, mb_x);
1261
                                return AVERROR_INVALIDDATA;
1262
                            }
1263
                            s->idsp.idct_put(ptr, linesize[c], s->block);
1264 1265
                            if (s->bits & 7)
                                shift_output(s, ptr, linesize[c]);
1266
                        }
Loren Merritt's avatar
Loren Merritt committed
1267
                    } else {
1268 1269
                        int block_idx  = s->block_stride[c] * (v * mb_y + y) +
                                         (h * mb_x + x);
Diego Biurrun's avatar
Diego Biurrun committed
1270
                        int16_t *block = s->blocks[c][block_idx];
1271 1272
                        if (Ah)
                            block[0] += get_bits1(&s->gb) *
1273
                                        s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1274
                        else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1275
                                                       s->quant_matrixes[s->quant_sindex[i]],
1276 1277 1278
                                                       Al) < 0) {
                            av_log(s->avctx, AV_LOG_ERROR,
                                   "error y=%d x=%d\n", mb_y, mb_x);
1279
                            return AVERROR_INVALIDDATA;
Loren Merritt's avatar
Loren Merritt committed
1280 1281
                        }
                    }
1282 1283 1284 1285
                    av_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
                    av_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
                            mb_x, mb_y, x, y, c, s->bottom_field,
                            (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1286 1287 1288 1289 1290 1291
                    if (++x == h) {
                        x = 0;
                        y++;
                    }
                }
            }
1292

1293
            handle_rstn(s, nb_components);
1294 1295 1296 1297 1298
        }
    }
    return 0;
}

1299 1300 1301
static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
                                            int se, int Ah, int Al)
{
Loren Merritt's avatar
Loren Merritt committed
1302 1303 1304
    int mb_x, mb_y;
    int EOBRUN = 0;
    int c = s->comp_index[0];
1305
    uint8_t *data = s->picture_ptr->data[c];
1306
    int linesize  = s->linesize[c];
Loren Merritt's avatar
Loren Merritt committed
1307
    int last_scan = 0;
1308
    int16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1309
    int bytes_per_pixel = 1 + (s->bits > 8);
Loren Merritt's avatar
Loren Merritt committed
1310

1311 1312 1313
    av_assert0(ss>=0 && Ah>=0 && Al>=0);
    if (se < ss || se > 63) {
        av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", ss, se);
1314 1315 1316
        return AVERROR_INVALIDDATA;
    }

1317
    if (!Al) {
1318 1319
        // s->coefs_finished is a bitmask for coefficients coded
        // ss and se are parameters telling start and end coefficients
1320
        s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss);
Loren Merritt's avatar
Loren Merritt committed
1321 1322 1323
        last_scan = !~s->coefs_finished[c];
    }

1324
    if (s->interlaced && s->bottom_field)
Loren Merritt's avatar
Loren Merritt committed
1325 1326
        data += linesize >> 1;

1327 1328
    s->restart_count = 0;

1329 1330 1331
    for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
        uint8_t *ptr     = data + (mb_y * linesize * 8 >> s->avctx->lowres);
        int block_idx    = mb_y * s->block_stride[c];
Diego Biurrun's avatar
Diego Biurrun committed
1332
        int16_t (*block)[64] = &s->blocks[c][block_idx];
1333 1334 1335
        uint8_t *last_nnz    = &s->last_nnz[c][block_idx];
        for (mb_x = 0; mb_x < s->mb_width; mb_x++, block++, last_nnz++) {
                int ret;
1336 1337 1338
                if (s->restart_interval && !s->restart_count)
                    s->restart_count = s->restart_interval;

1339 1340 1341 1342 1343 1344 1345 1346 1347
                if (Ah)
                    ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
                                                  quant_matrix, ss, se, Al, &EOBRUN);
                else
                    ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
                                                   quant_matrix, ss, se, Al, &EOBRUN);
                if (ret < 0) {
                    av_log(s->avctx, AV_LOG_ERROR,
                           "error y=%d x=%d\n", mb_y, mb_x);
1348
                    return AVERROR_INVALIDDATA;
1349 1350 1351
                }

            if (last_scan) {
1352
                    s->idsp.idct_put(ptr, linesize, *block);
1353 1354 1355
                    if (s->bits & 7)
                        shift_output(s, ptr, linesize);
                    ptr += bytes_per_pixel*8 >> s->avctx->lowres;
Loren Merritt's avatar
Loren Merritt committed
1356
            }
1357 1358
            if (handle_rstn(s, 0))
                EOBRUN = 0;
Loren Merritt's avatar
Loren Merritt committed
1359 1360 1361 1362 1363
        }
    }
    return 0;
}

1364
int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
1365
                        int mb_bitmask_size, const AVFrame *reference)
1366 1367
{
    int len, nb_components, i, h, v, predictor, point_transform;
1368
    int index, id, ret;
1369
    const int block_size = s->lossless ? 1 : 8;
1370 1371
    int ilv, prev_shift;

1372 1373 1374 1375 1376 1377 1378
    if (!s->got_picture) {
        av_log(s->avctx, AV_LOG_WARNING,
                "Can not process SOS before SOF, skipping\n");
        return -1;
    }

    av_assert0(s->picture_ptr->data[0]);
1379 1380 1381
    /* XXX: verify len field validity */
    len = get_bits(&s->gb, 16);
    nb_components = get_bits(&s->gb, 8);
1382 1383 1384
    if (nb_components == 0 || nb_components > MAX_COMPONENTS) {
        av_log(s->avctx, AV_LOG_ERROR,
               "decode_sos: nb_components (%d) unsupported\n", nb_components);
1385
        return AVERROR_PATCHWELCOME;
1386
    }
1387
    if (len != 6 + 2 * nb_components) {
1388
        av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1389
        return AVERROR_INVALIDDATA;
1390
    }
1391
    for (i = 0; i < nb_components; i++) {
1392 1393 1394
        id = get_bits(&s->gb, 8) - 1;
        av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
        /* find component index */
1395
        for (index = 0; index < s->nb_components; index++)
1396 1397
            if (id == s->component_id[index])
                break;
1398 1399 1400
        if (index == s->nb_components) {
            av_log(s->avctx, AV_LOG_ERROR,
                   "decode_sos: index(%d) out of components\n", index);
1401
            return AVERROR_INVALIDDATA;
1402
        }
1403 1404 1405 1406
        /* Metasoft MJPEG codec has Cb and Cr swapped */
        if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
            && nb_components == 3 && s->nb_components == 3 && i)
            index = 3 - i;
1407

1408
        s->quant_sindex[i] = s->quant_index[index];
1409 1410 1411 1412
        s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
        s->h_scount[i]  = s->h_count[index];
        s->v_scount[i]  = s->v_count[index];

1413
        if(nb_components == 3 && s->nb_components == 3 && s->avctx->pix_fmt == AV_PIX_FMT_GBR24P)
Michael Niedermayer's avatar
Michael Niedermayer committed
1414
            index = (i+2)%3;
1415
        if(nb_components == 1 && s->nb_components == 3 && s->avctx->pix_fmt == AV_PIX_FMT_GBR24P)
1416
            index = (index+2)%3;
Michael Niedermayer's avatar
Michael Niedermayer committed
1417

1418 1419 1420 1421 1422 1423 1424 1425
        s->comp_index[i] = index;

        s->dc_index[i] = get_bits(&s->gb, 4);
        s->ac_index[i] = get_bits(&s->gb, 4);

        if (s->dc_index[i] <  0 || s->ac_index[i] < 0 ||
            s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
            goto out_of_range;
1426
        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))
1427
            goto out_of_range;
1428 1429
    }

1430 1431
    predictor = get_bits(&s->gb, 8);       /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
    ilv = get_bits(&s->gb, 8);             /* JPEG Se / JPEG-LS ILV */
1432
    if(s->avctx->codec_tag != AV_RL32("CJPG")){
1433 1434
        prev_shift      = get_bits(&s->gb, 4); /* Ah */
        point_transform = get_bits(&s->gb, 4); /* Al */
1435
    }else
1436
        prev_shift = point_transform = 0;
1437 1438 1439 1440 1441

    if (nb_components > 1) {
        /* interleaved stream */
        s->mb_width  = (s->width  + s->h_max * block_size - 1) / (s->h_max * block_size);
        s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1442
    } else if (!s->ls) { /* skip this for JPEG-LS */
1443 1444
        h = s->h_max / s->h_scount[0];
        v = s->v_max / s->v_scount[0];
1445 1446
        s->mb_width     = (s->width  + h * block_size - 1) / (h * block_size);
        s->mb_height    = (s->height + v * block_size - 1) / (v * block_size);
1447
        s->nb_blocks[0] = 1;
1448 1449
        s->h_scount[0]  = 1;
        s->v_scount[0]  = 1;
1450 1451
    }

1452 1453 1454
    if (s->avctx->debug & FF_DEBUG_PICT_INFO)
        av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
               s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1455
               predictor, point_transform, ilv, s->bits, s->mjpb_skiptosod,
1456
               s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), nb_components);
1457 1458 1459 1460 1461 1462


    /* mjpeg-b can have padding bytes between sos and image data, skip them */
    for (i = s->mjpb_skiptosod; i > 0; i--)
        skip_bits(&s->gb, 8);

1463 1464
next_field:
    for (i = 0; i < nb_components; i++)
1465
        s->last_dc[i] = (4 << s->bits);
1466

1467
    if (s->lossless) {
1468
        av_assert0(s->picture_ptr == s->picture);
1469 1470
        if (CONFIG_JPEGLS_DECODER && s->ls) {
//            for () {
1471 1472
//            reset_ls_coding_parameters(s, 0);

1473 1474 1475
            if ((ret = ff_jpegls_decode_picture(s, predictor,
                                                point_transform, ilv)) < 0)
                return ret;
1476 1477
        } else {
            if (s->rgb) {
1478
                if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0)
1479
                    return ret;
1480
            } else {
1481
                if ((ret = ljpeg_decode_yuv_scan(s, predictor,
1482 1483
                                                 point_transform,
                                                 nb_components)) < 0)
1484
                    return ret;
1485 1486
            }
        }
1487 1488
    } else {
        if (s->progressive && predictor) {
1489
            av_assert0(s->picture_ptr == s->picture);
1490 1491
            if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor,
                                                        ilv, prev_shift,
1492
                                                        point_transform)) < 0)
1493
                return ret;
Loren Merritt's avatar
Loren Merritt committed
1494
        } else {
1495 1496
            if ((ret = mjpeg_decode_scan(s, nb_components,
                                         prev_shift, point_transform,
1497
                                         mb_bitmask, mb_bitmask_size, reference)) < 0)
1498
                return ret;
Loren Merritt's avatar
Loren Merritt committed
1499
        }
1500
    }
1501 1502 1503 1504 1505

    if (s->interlaced &&
        get_bits_left(&s->gb) > 32 &&
        show_bits(&s->gb, 8) == 0xFF) {
        GetBitContext bak = s->gb;
1506
        align_get_bits(&bak);
1507
        if (show_bits(&bak, 16) == 0xFFD1) {
1508
            av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1509 1510 1511 1512 1513 1514 1515 1516
            s->gb = bak;
            skip_bits(&s->gb, 16);
            s->bottom_field ^= 1;

            goto next_field;
        }
    }

1517 1518 1519 1520
    emms_c();
    return 0;
 out_of_range:
    av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1521
    return AVERROR_INVALIDDATA;
1522 1523 1524 1525 1526
}

static int mjpeg_decode_dri(MJpegDecodeContext *s)
{
    if (get_bits(&s->gb, 16) != 4)
1527
        return AVERROR_INVALIDDATA;
1528
    s->restart_interval = get_bits(&s->gb, 16);
1529 1530 1531
    s->restart_count    = 0;
    av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
           s->restart_interval);
1532 1533 1534 1535 1536 1537 1538 1539 1540

    return 0;
}

static int mjpeg_decode_app(MJpegDecodeContext *s)
{
    int len, id, i;

    len = get_bits(&s->gb, 16);
1541
    if (len < 6)
1542
        return AVERROR_INVALIDDATA;
1543
    if (8 * len > get_bits_left(&s->gb))
1544
        return AVERROR_INVALIDDATA;
1545

1546
    id   = get_bits_long(&s->gb, 32);
1547 1548
    len -= 6;

1549 1550 1551 1552 1553
    if (s->avctx->debug & FF_DEBUG_STARTCODE) {
        char id_str[32];
        av_get_codec_tag_string(id_str, sizeof(id_str), av_bswap32(id));
        av_log(s->avctx, AV_LOG_DEBUG, "APPx (%s / %8X) len=%d\n", id_str, id, len);
    }
1554

1555 1556 1557
    /* Buggy AVID, it puts EOI only at every 10th frame. */
    /* Also, this fourcc is used by non-avid files too, it holds some
       information, but it's always present in AVID-created files. */
1558
    if (id == AV_RB32("AVI1")) {
1559 1560 1561 1562 1563 1564 1565 1566
        /* structure:
            4bytes      AVI1
            1bytes      polarity
            1bytes      always zero
            4bytes      field_size
            4bytes      field_size_less_padding
        */
            s->buggy_avid = 1;
1567
        i = get_bits(&s->gb, 8); len--;
1568
        av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i);
1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
#if 0
        skip_bits(&s->gb, 8);
        skip_bits(&s->gb, 32);
        skip_bits(&s->gb, 32);
        len -= 10;
#endif
        goto out;
    }

//    len -= 2;

1580
    if (id == AV_RB32("JFIF")) {
1581 1582
        int t_w, t_h, v1, v2;
        skip_bits(&s->gb, 8); /* the trailing zero-byte */
1583 1584
        v1 = get_bits(&s->gb, 8);
        v2 = get_bits(&s->gb, 8);
1585 1586
        skip_bits(&s->gb, 8);

1587 1588
        s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 16);
        s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 16);
1589
        ff_set_sar(s->avctx, s->avctx->sample_aspect_ratio);
1590 1591

        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1592 1593 1594 1595 1596
            av_log(s->avctx, AV_LOG_INFO,
                   "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
                   v1, v2,
                   s->avctx->sample_aspect_ratio.num,
                   s->avctx->sample_aspect_ratio.den);
1597 1598 1599

        t_w = get_bits(&s->gb, 8);
        t_h = get_bits(&s->gb, 8);
1600
        if (t_w && t_h) {
1601
            /* skip thumbnail */
1602 1603
            if (len -10 - (t_w * t_h * 3) > 0)
                len -= t_w * t_h * 3;
1604 1605 1606 1607 1608
        }
        len -= 10;
        goto out;
    }

1609
    if (id == AV_RB32("Adob") && (get_bits(&s->gb, 8) == 'e')) {
1610 1611 1612
        skip_bits(&s->gb, 16); /* version */
        skip_bits(&s->gb, 16); /* flags0 */
        skip_bits(&s->gb, 16); /* flags1 */
1613 1614 1615
        s->adobe_transform = get_bits(&s->gb,  8);
        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
            av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform);
1616 1617 1618 1619
        len -= 7;
        goto out;
    }

1620
    if (id == AV_RB32("LJIF")) {
1621 1622
        int rgb = s->rgb;
        int pegasus_rct = s->pegasus_rct;
1623
        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1624 1625
            av_log(s->avctx, AV_LOG_INFO,
                   "Pegasus lossless jpeg header found\n");
1626
        skip_bits(&s->gb, 16); /* version ? */
1627 1628 1629
        skip_bits(&s->gb, 16); /* unknown always 0? */
        skip_bits(&s->gb, 16); /* unknown always 0? */
        skip_bits(&s->gb, 16); /* unknown always 0? */
1630
        switch (i=get_bits(&s->gb, 8)) {
1631
        case 1:
1632 1633
            rgb         = 1;
            pegasus_rct = 0;
1634 1635
            break;
        case 2:
1636 1637
            rgb         = 1;
            pegasus_rct = 1;
1638 1639
            break;
        default:
1640
            av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace %d\n", i);
1641
        }
1642

1643
        len -= 9;
1644 1645 1646 1647 1648 1649 1650 1651 1652
        if (s->got_picture)
            if (rgb != s->rgb || pegasus_rct != s->pegasus_rct) {
                av_log(s->avctx, AV_LOG_WARNING, "Mismatching LJIF tag\n");
                goto out;
            }

        s->rgb = rgb;
        s->pegasus_rct = pegasus_rct;

1653 1654
        goto out;
    }
1655 1656 1657 1658 1659 1660 1661
    if (id == AV_RL32("colr") && len > 0) {
        s->colr = get_bits(&s->gb, 8);
        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
            av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr);
        len --;
        goto out;
    }
1662 1663 1664 1665 1666 1667 1668
    if (id == AV_RL32("xfrm") && len > 0) {
        s->xfrm = get_bits(&s->gb, 8);
        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
            av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm);
        len --;
        goto out;
    }
1669

1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708
    /* JPS extension by VRex */
    if (s->start_code == APP3 && id == AV_RB32("_JPS") && len >= 10) {
        int flags, layout, type;
        if (s->avctx->debug & FF_DEBUG_PICT_INFO)
            av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n");

        skip_bits(&s->gb, 32); len -= 4;  /* JPS_ */
        skip_bits(&s->gb, 16); len -= 2;  /* block length */
        skip_bits(&s->gb, 8);             /* reserved */
        flags  = get_bits(&s->gb, 8);
        layout = get_bits(&s->gb, 8);
        type   = get_bits(&s->gb, 8);
        len -= 4;

        s->stereo3d = av_stereo3d_alloc();
        if (!s->stereo3d) {
            goto out;
        }
        if (type == 0) {
            s->stereo3d->type = AV_STEREO3D_2D;
        } else if (type == 1) {
            switch (layout) {
            case 0x01:
                s->stereo3d->type = AV_STEREO3D_LINES;
                break;
            case 0x02:
                s->stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
                break;
            case 0x03:
                s->stereo3d->type = AV_STEREO3D_TOPBOTTOM;
                break;
            }
            if (!(flags & 0x04)) {
                s->stereo3d->flags = AV_STEREO3D_FLAG_INVERT;
            }
        }
        goto out;
    }

1709
    /* EXIF metadata */
1710
    if (s->start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725
        GetByteContext gbytes;
        int ret, le, ifd_offset, bytes_read;
        const uint8_t *aligned;

        skip_bits(&s->gb, 16); // skip padding
        len -= 2;

        // init byte wise reading
        aligned = align_get_bits(&s->gb);
        bytestream2_init(&gbytes, aligned, len);

        // read TIFF header
        ret = ff_tdecode_header(&gbytes, &le, &ifd_offset);
        if (ret) {
            av_log(s->avctx, AV_LOG_ERROR, "mjpeg: invalid TIFF header in EXIF data\n");
1726
        } else {
1727
            bytestream2_seek(&gbytes, ifd_offset, SEEK_SET);
1728

1729 1730 1731 1732 1733 1734
            // read 0th IFD and store the metadata
            // (return values > 0 indicate the presence of subimage metadata)
            ret = avpriv_exif_decode_ifd(s->avctx, &gbytes, le, 0, &s->exif_metadata);
            if (ret < 0) {
                av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error decoding EXIF data\n");
            }
1735 1736 1737 1738 1739 1740 1741 1742 1743
        }

        bytes_read = bytestream2_tell(&gbytes);
        skip_bits(&s->gb, bytes_read << 3);
        len -= bytes_read;

        goto out;
    }

1744
    /* Apple MJPEG-A */
1745 1746
    if ((s->start_code == APP1) && (len > (0x28 - 8))) {
        id   = get_bits_long(&s->gb, 32);
1747
        len -= 4;
1748
        /* Apple MJPEG-A */
1749
        if (id == AV_RB32("mjpg")) {
1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767
#if 0
            skip_bits(&s->gb, 32); /* field size */
            skip_bits(&s->gb, 32); /* pad field size */
            skip_bits(&s->gb, 32); /* next off */
            skip_bits(&s->gb, 32); /* quant off */
            skip_bits(&s->gb, 32); /* huff off */
            skip_bits(&s->gb, 32); /* image off */
            skip_bits(&s->gb, 32); /* scan off */
            skip_bits(&s->gb, 32); /* data off */
#endif
            if (s->avctx->debug & FF_DEBUG_PICT_INFO)
                av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
        }
    }

out:
    /* slow but needed for extreme adobe jpegs */
    if (len < 0)
1768 1769 1770
        av_log(s->avctx, AV_LOG_ERROR,
               "mjpeg: error, decode_app parser read over the end\n");
    while (--len > 0)
1771 1772 1773 1774 1775 1776 1777 1778
        skip_bits(&s->gb, 8);

    return 0;
}

static int mjpeg_decode_com(MJpegDecodeContext *s)
{
    int len = get_bits(&s->gb, 16);
1779
    if (len >= 2 && 8 * len - 16 <= get_bits_left(&s->gb)) {
1780 1781 1782 1783 1784
        char *cbuf = av_malloc(len - 1);
        if (cbuf) {
            int i;
            for (i = 0; i < len - 2; i++)
                cbuf[i] = get_bits(&s->gb, 8);
1785 1786
            if (i > 0 && cbuf[i - 1] == '\n')
                cbuf[i - 1] = 0;
1787 1788 1789
            else
                cbuf[i] = 0;

1790
            if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1791
                av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf);
1792 1793

            /* buggy avid, it puts EOI only at every 10th frame */
1794
            if (!strncmp(cbuf, "AVID", 4)) {
1795
                parse_avid(s, cbuf, len);
1796 1797
            } else if (!strcmp(cbuf, "CS=ITU601"))
                s->cs_itu601 = 1;
1798
            else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) ||
1799
                     (!strncmp(cbuf, "Metasoft MJPEG Codec", 20)))
1800
                s->flipped = 1;
1801 1802 1803 1804 1805 1806 1807 1808 1809 1810

            av_free(cbuf);
        }
    }

    return 0;
}

/* return the 8 bit start code value and update the search
   state. Return -1 if no start code found */
Michael Niedermayer's avatar
Michael Niedermayer committed
1811
static int find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
1812
{
Michael Niedermayer's avatar
Michael Niedermayer committed
1813
    const uint8_t *buf_ptr;
1814 1815
    unsigned int v, v2;
    int val;
1816
    int skipped = 0;
1817 1818

    buf_ptr = *pbuf_ptr;
1819
    while (buf_end - buf_ptr > 1) {
1820
        v  = *buf_ptr++;
1821 1822 1823 1824 1825 1826 1827
        v2 = *buf_ptr;
        if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe) && buf_ptr < buf_end) {
            val = *buf_ptr++;
            goto found;
        }
        skipped++;
    }
1828
    buf_ptr = buf_end;
1829 1830
    val = -1;
found:
1831
    av_dlog(NULL, "find_marker skipped %d bytes\n", skipped);
1832 1833 1834 1835
    *pbuf_ptr = buf_ptr;
    return val;
}

1836 1837
int ff_mjpeg_find_marker(MJpegDecodeContext *s,
                         const uint8_t **buf_ptr, const uint8_t *buf_end,
1838 1839
                         const uint8_t **unescaped_buf_ptr,
                         int *unescaped_buf_size)
1840 1841
{
    int start_code;
1842
    start_code = find_marker(buf_ptr, buf_end);
1843

1844 1845 1846
    av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - *buf_ptr);
    if (!s->buffer)
        return AVERROR(ENOMEM);
1847

1848 1849 1850 1851
    /* unescape buffer of SOS, use special treatment for JPEG-LS */
    if (start_code == SOS && !s->ls) {
        const uint8_t *src = *buf_ptr;
        uint8_t *dst = s->buffer;
1852

1853 1854
        while (src < buf_end) {
            uint8_t x = *(src++);
1855

1856
            *(dst++) = x;
1857
            if (s->avctx->codec_id != AV_CODEC_ID_THP) {
1858 1859 1860
                if (x == 0xff) {
                    while (src < buf_end && x == 0xff)
                        x = *(src++);
1861

1862 1863 1864 1865
                    if (x >= 0xd0 && x <= 0xd7)
                        *(dst++) = x;
                    else if (x)
                        break;
1866
                }
1867 1868 1869 1870
            }
        }
        *unescaped_buf_ptr  = s->buffer;
        *unescaped_buf_size = dst - s->buffer;
1871 1872
        memset(s->buffer + *unescaped_buf_size, 0,
               FF_INPUT_BUFFER_PADDING_SIZE);
1873

1874
        av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %"PTRDIFF_SPECIFIER" bytes\n",
1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889
               (buf_end - *buf_ptr) - (dst - s->buffer));
    } else if (start_code == SOS && s->ls) {
        const uint8_t *src = *buf_ptr;
        uint8_t *dst  = s->buffer;
        int bit_count = 0;
        int t = 0, b = 0;
        PutBitContext pb;

        /* find marker */
        while (src + t < buf_end) {
            uint8_t x = src[t++];
            if (x == 0xff) {
                while ((src + t < buf_end) && x == 0xff)
                    x = src[t++];
                if (x & 0x80) {
1890
                    t -= FFMIN(2, t);
1891
                    break;
1892
                }
1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911
            }
        }
        bit_count = t * 8;
        init_put_bits(&pb, dst, t);

        /* unescape bitstream */
        while (b < t) {
            uint8_t x = src[b++];
            put_bits(&pb, 8, x);
            if (x == 0xFF) {
                x = src[b++];
                put_bits(&pb, 7, x);
                bit_count--;
            }
        }
        flush_put_bits(&pb);

        *unescaped_buf_ptr  = dst;
        *unescaped_buf_size = (bit_count + 7) >> 3;
1912 1913
        memset(s->buffer + *unescaped_buf_size, 0,
               FF_INPUT_BUFFER_PADDING_SIZE);
1914 1915 1916 1917
    } else {
        *unescaped_buf_ptr  = *buf_ptr;
        *unescaped_buf_size = buf_end - *buf_ptr;
    }
1918 1919 1920 1921

    return start_code;
}

1922
int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
1923
                          AVPacket *avpkt)
1924
{
1925
    AVFrame     *frame = data;
1926
    const uint8_t *buf = avpkt->data;
1927
    int buf_size       = avpkt->size;
1928 1929 1930
    MJpegDecodeContext *s = avctx->priv_data;
    const uint8_t *buf_end, *buf_ptr;
    const uint8_t *unescaped_buf_ptr;
1931
    int hshift, vshift;
1932 1933
    int unescaped_buf_size;
    int start_code;
1934
    int i, index;
1935
    int ret = 0;
1936
    int is16bit;
1937

1938
    av_dict_free(&s->exif_metadata);
1939
    av_freep(&s->stereo3d);
1940
    s->adobe_transform = -1;
1941

1942 1943 1944 1945 1946
    buf_ptr = buf;
    buf_end = buf + buf_size;
    while (buf_ptr < buf_end) {
        /* find start next marker */
        start_code = ff_mjpeg_find_marker(s, &buf_ptr, buf_end,
1947 1948 1949 1950
                                          &unescaped_buf_ptr,
                                          &unescaped_buf_size);
        /* EOF */
        if (start_code < 0) {
1951
            break;
1952 1953 1954
        } else if (unescaped_buf_size > INT_MAX / 8) {
            av_log(avctx, AV_LOG_ERROR,
                   "MJPEG packet 0x%x too big (%d/%d), corrupt data?\n",
1955
                   start_code, unescaped_buf_size, buf_size);
1956
            return AVERROR_INVALIDDATA;
1957
        }
1958
        av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%"PTRDIFF_SPECIFIER"\n",
1959
               start_code, buf_end - buf_ptr);
1960

1961 1962 1963
        ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);

        if (ret < 0) {
1964 1965 1966
            av_log(avctx, AV_LOG_ERROR, "invalid buffer\n");
            goto fail;
        }
1967

1968 1969 1970
        s->start_code = start_code;
        if (s->avctx->debug & FF_DEBUG_STARTCODE)
            av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
1971

1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
        /* process markers */
        if (start_code >= 0xd0 && start_code <= 0xd7)
            av_log(avctx, AV_LOG_DEBUG,
                   "restart marker: %d\n", start_code & 0x0f);
            /* APP fields */
        else if (start_code >= APP0 && start_code <= APP15)
            mjpeg_decode_app(s);
            /* Comment */
        else if (start_code == COM)
            mjpeg_decode_com(s);

1983 1984
        ret = -1;

1985 1986 1987 1988 1989
        if (!CONFIG_JPEGLS_DECODER &&
            (start_code == SOF48 || start_code == LSE)) {
            av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n");
            return AVERROR(ENOSYS);
        }
1990

1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002
        switch (start_code) {
        case SOI:
            s->restart_interval = 0;
            s->restart_count    = 0;
            /* nothing to do on SOI */
            break;
        case DQT:
            ff_mjpeg_decode_dqt(s);
            break;
        case DHT:
            if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
                av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2003
                goto fail;
2004 2005 2006 2007 2008 2009 2010 2011
            }
            break;
        case SOF0:
        case SOF1:
            s->lossless    = 0;
            s->ls          = 0;
            s->progressive = 0;
            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2012
                goto fail;
2013 2014 2015 2016 2017 2018
            break;
        case SOF2:
            s->lossless    = 0;
            s->ls          = 0;
            s->progressive = 1;
            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2019
                goto fail;
2020 2021 2022 2023 2024 2025
            break;
        case SOF3:
            s->lossless    = 1;
            s->ls          = 0;
            s->progressive = 0;
            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2026
                goto fail;
2027 2028 2029 2030 2031 2032
            break;
        case SOF48:
            s->lossless    = 1;
            s->ls          = 1;
            s->progressive = 0;
            if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2033
                goto fail;
2034 2035 2036 2037
            break;
        case LSE:
            if (!CONFIG_JPEGLS_DECODER ||
                (ret = ff_jpegls_decode_lse(s)) < 0)
2038
                goto fail;
2039 2040
            break;
        case EOI:
2041
eoi_parser:
2042
            s->cur_scan = 0;
2043 2044 2045
            if (!s->got_picture) {
                av_log(avctx, AV_LOG_WARNING,
                       "Found EOI before any SOF, ignoring\n");
2046 2047
                break;
            }
2048 2049 2050 2051
            if (s->interlaced) {
                s->bottom_field ^= 1;
                /* if not bottom field, do not output image yet */
                if (s->bottom_field == !s->interlace_polarity)
2052
                    break;
2053
            }
2054
            if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2055 2056
                return ret;
            *got_frame = 1;
2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067
            s->got_picture = 0;

            if (!s->lossless) {
                int qp = FFMAX3(s->qscale[0],
                                s->qscale[1],
                                s->qscale[2]);
                int qpw = (s->width + 15) / 16;
                AVBufferRef *qp_table_buf = av_buffer_alloc(qpw);
                if (qp_table_buf) {
                    memset(qp_table_buf->data, qp, qpw);
                    av_frame_set_qp_table(data, qp_table_buf, 0, FF_QSCALE_TYPE_MPEG1);
2068
                }
2069

2070 2071
                if(avctx->debug & FF_DEBUG_QP)
                    av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2072
            }
2073

2074 2075
            goto the_end;
        case SOS:
2076
            s->cur_scan++;
2077
            if ((ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL)) < 0 &&
2078
                (avctx->err_recognition & AV_EF_EXPLODE))
2079
                goto fail;
2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096
            break;
        case DRI:
            mjpeg_decode_dri(s);
            break;
        case SOF5:
        case SOF6:
        case SOF7:
        case SOF9:
        case SOF10:
        case SOF11:
        case SOF13:
        case SOF14:
        case SOF15:
        case JPG:
            av_log(avctx, AV_LOG_ERROR,
                   "mjpeg: unsupported coding type (%x)\n", start_code);
            break;
2097
        }
2098 2099 2100 2101 2102 2103

        /* eof process start code */
        buf_ptr += (get_bits_count(&s->gb) + 7) / 8;
        av_log(avctx, AV_LOG_DEBUG,
               "marker parser used %d bytes (%d bits)\n",
               (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb));
2104
    }
2105
    if (s->got_picture && s->cur_scan) {
2106 2107 2108
        av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
        goto eoi_parser;
    }
2109
    av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2110
    return AVERROR_INVALIDDATA;
2111
fail:
2112
    s->got_picture = 0;
2113
    return ret;
2114
the_end:
2115 2116 2117

    is16bit = av_pix_fmt_desc_get(s->avctx->pix_fmt)->comp[0].step_minus1;

2118
    if (s->upscale_h) {
2119
        int p;
2120 2121 2122
        av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
                   avctx->pix_fmt == AV_PIX_FMT_YUV444P  ||
                   avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2123
                   avctx->pix_fmt == AV_PIX_FMT_YUV440P  ||
2124
                   avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2125 2126
                   avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
                   avctx->pix_fmt == AV_PIX_FMT_YUV420P  ||
2127
                   avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2128 2129
                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P  ||
                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2130
                   avctx->pix_fmt == AV_PIX_FMT_GBRP     ||
2131 2132
                   avctx->pix_fmt == AV_PIX_FMT_GBRAP
                  );
2133
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2134
        for (p = 0; p<4; p++) {
2135
            uint8_t *line = s->picture_ptr->data[p];
2136
            int w = s->width;
2137
            int h = s->height;
2138 2139
            if (!(s->upscale_h & (1<<p)))
                continue;
2140
            if (p==1 || p==2) {
2141
                w = FF_CEIL_RSHIFT(w, hshift);
2142 2143 2144 2145
                h = FF_CEIL_RSHIFT(h, vshift);
            }
            if (s->upscale_v & (1<<p))
                h = (h+1)>>1;
2146
            av_assert0(w > 0);
2147
            for (i = 0; i < h; i++) {
2148 2149 2150
                if (is16bit) ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 2];
                else                      line[w - 1] = line[(w - 1) / 2];
                for (index = w - 2; index > 0; index--) {
2151 2152 2153 2154 2155
                    if (is16bit)
                        ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
                    else
                        line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
                }
2156 2157
                line += s->linesize[p];
            }
2158 2159 2160
        }
    }
    if (s->upscale_v) {
2161
        int p;
2162 2163 2164
        av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
                   avctx->pix_fmt == AV_PIX_FMT_YUV444P  ||
                   avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2165
                   avctx->pix_fmt == AV_PIX_FMT_YUV422P  ||
2166 2167
                   avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
                   avctx->pix_fmt == AV_PIX_FMT_YUV420P  ||
2168 2169
                   avctx->pix_fmt == AV_PIX_FMT_YUV440P  ||
                   avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2170
                   avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2171 2172
                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P  ||
                   avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2173
                   avctx->pix_fmt == AV_PIX_FMT_GBRP     ||
2174 2175
                   avctx->pix_fmt == AV_PIX_FMT_GBRAP
                   );
2176
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
2177
        for (p = 0; p < 4; p++) {
2178
            uint8_t *dst;
2179
            int w = s->width;
2180
            int h = s->height;
2181 2182
            if (!(s->upscale_v & (1<<p)))
                continue;
2183
            if (p==1 || p==2) {
2184
                w = FF_CEIL_RSHIFT(w, hshift);
2185 2186 2187 2188
                h = FF_CEIL_RSHIFT(h, vshift);
            }
            dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
            for (i = h - 1; i; i--) {
2189 2190
                uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i / 2 * s->linesize[p]];
                uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) / 2 * s->linesize[p]];
2191
                if (src1 == src2 || i == h - 1) {
2192 2193 2194 2195 2196 2197
                    memcpy(dst, src1, w);
                } else {
                    for (index = 0; index < w; index++)
                        dst[index] = (src1[index] + src2[index]) >> 1;
                }
                dst -= s->linesize[p];
2198 2199 2200
            }
        }
    }
2201
    if (s->flipped) {
2202
        int j;
2203 2204 2205
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
        for (index=0; index<4; index++) {
            uint8_t *dst = s->picture_ptr->data[index];
2206 2207
            int w = s->picture_ptr->width;
            int h = s->picture_ptr->height;
2208
            if(index && index<3){
2209 2210
                w = FF_CEIL_RSHIFT(w, hshift);
                h = FF_CEIL_RSHIFT(h, vshift);
2211 2212
            }
            if(dst){
2213
                uint8_t *dst2 = dst + s->picture_ptr->linesize[index]*(h-1);
2214 2215 2216
                for (i=0; i<h/2; i++) {
                    for (j=0; j<w; j++)
                        FFSWAP(int, dst[j], dst2[j]);
2217 2218
                    dst  += s->picture_ptr->linesize[index];
                    dst2 -= s->picture_ptr->linesize[index];
2219 2220 2221
                }
            }
        }
2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243
    }
    if (s->adobe_transform == 0 && s->avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
        int w = s->picture_ptr->width;
        int h = s->picture_ptr->height;
        for (i=0; i<h; i++) {
            int j;
            uint8_t *dst[4];
            for (index=0; index<4; index++) {
                dst[index] =   s->picture_ptr->data[index]
                             + s->picture_ptr->linesize[index]*i;
            }
            for (j=0; j<w; j++) {
                int k = dst[3][j];
                int r = dst[0][j] * k;
                int g = dst[1][j] * k;
                int b = dst[2][j] * k;
                dst[0][j] = g*257 >> 16;
                dst[1][j] = b*257 >> 16;
                dst[2][j] = r*257 >> 16;
                dst[3][j] = 255;
            }
        }
2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265
    }
    if (s->adobe_transform == 2 && s->avctx->pix_fmt == AV_PIX_FMT_YUVA444P) {
        int w = s->picture_ptr->width;
        int h = s->picture_ptr->height;
        for (i=0; i<h; i++) {
            int j;
            uint8_t *dst[4];
            for (index=0; index<4; index++) {
                dst[index] =   s->picture_ptr->data[index]
                             + s->picture_ptr->linesize[index]*i;
            }
            for (j=0; j<w; j++) {
                int k = dst[3][j];
                int r = (255 - dst[0][j]) * k;
                int g = (128 - dst[1][j]) * k;
                int b = (128 - dst[2][j]) * k;
                dst[0][j] = r*257 >> 16;
                dst[1][j] = (g*257 >> 16) + 128;
                dst[2][j] = (b*257 >> 16) + 128;
                dst[3][j] = 255;
            }
        }
2266 2267
    }

2268 2269 2270 2271 2272 2273 2274 2275 2276
    if (s->stereo3d) {
        AVStereo3D *stereo = av_stereo3d_create_side_data(data);
        if (stereo) {
            stereo->type  = s->stereo3d->type;
            stereo->flags = s->stereo3d->flags;
        }
        av_freep(&s->stereo3d);
    }

2277 2278 2279
    av_dict_copy(avpriv_frame_get_metadatap(data), s->exif_metadata, 0);
    av_dict_free(&s->exif_metadata);

2280
    av_log(avctx, AV_LOG_DEBUG, "decode frame unused %"PTRDIFF_SPECIFIER" bytes\n",
2281 2282
           buf_end - buf_ptr);
//  return buf_end - buf_ptr;
2283 2284 2285
    return buf_ptr - buf;
}

2286
av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2287 2288 2289 2290
{
    MJpegDecodeContext *s = avctx->priv_data;
    int i, j;

2291 2292 2293 2294
    if (s->interlaced && s->bottom_field == !s->interlace_polarity && s->got_picture && !avctx->frame_number) {
        av_log(avctx, AV_LOG_INFO, "Single field\n");
    }

2295 2296 2297 2298
    if (s->picture) {
        av_frame_free(&s->picture);
        s->picture_ptr = NULL;
    } else if (s->picture_ptr)
2299
        av_frame_unref(s->picture_ptr);
2300

2301
    av_freep(&s->buffer);
2302
    av_freep(&s->stereo3d);
2303
    av_freep(&s->ljpeg_buffer);
2304
    s->ljpeg_buffer_size = 0;
2305

2306 2307
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++)
2308
            ff_free_vlc(&s->vlcs[i][j]);
2309
    }
2310
    for (i = 0; i < MAX_COMPONENTS; i++) {
Loren Merritt's avatar
Loren Merritt committed
2311 2312 2313
        av_freep(&s->blocks[i]);
        av_freep(&s->last_nnz[i]);
    }
2314
    av_dict_free(&s->exif_metadata);
2315 2316 2317
    return 0;
}

2318 2319 2320 2321 2322 2323
static void decode_flush(AVCodecContext *avctx)
{
    MJpegDecodeContext *s = avctx->priv_data;
    s->got_picture = 0;
}

2324
#if CONFIG_MJPEG_DECODER
2325 2326 2327
#define OFFSET(x) offsetof(MJpegDecodeContext, x)
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
static const AVOption options[] = {
2328
    { "extern_huff", "Use external huffman table.",
2329
      OFFSET(extern_huff), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VD },
2330 2331 2332 2333 2334 2335 2336 2337 2338 2339
    { NULL },
};

static const AVClass mjpegdec_class = {
    .class_name = "MJPEG decoder",
    .item_name  = av_default_item_name,
    .option     = options,
    .version    = LIBAVUTIL_VERSION_INT,
};

2340
AVCodec ff_mjpeg_decoder = {
2341
    .name           = "mjpeg",
2342
    .long_name      = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
2343
    .type           = AVMEDIA_TYPE_VIDEO,
2344
    .id             = AV_CODEC_ID_MJPEG,
2345 2346 2347 2348
    .priv_data_size = sizeof(MJpegDecodeContext),
    .init           = ff_mjpeg_decode_init,
    .close          = ff_mjpeg_decode_end,
    .decode         = ff_mjpeg_decode_frame,
2349
    .flush          = decode_flush,
2350
    .capabilities   = CODEC_CAP_DR1,
Michael Niedermayer's avatar
Michael Niedermayer committed
2351
    .max_lowres     = 3,
2352
    .priv_class     = &mjpegdec_class,
2353
};
2354 2355
#endif
#if CONFIG_THP_DECODER
2356
AVCodec ff_thp_decoder = {
2357
    .name           = "thp",
2358
    .long_name      = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
2359
    .type           = AVMEDIA_TYPE_VIDEO,
2360
    .id             = AV_CODEC_ID_THP,
2361 2362 2363 2364
    .priv_data_size = sizeof(MJpegDecodeContext),
    .init           = ff_mjpeg_decode_init,
    .close          = ff_mjpeg_decode_end,
    .decode         = ff_mjpeg_decode_frame,
2365
    .flush          = decode_flush,
2366
    .capabilities   = CODEC_CAP_DR1,
Michael Niedermayer's avatar
Michael Niedermayer committed
2367
    .max_lowres     = 3,
2368
};
2369
#endif