46
47
const uint8_t *val_table, int nb_codes,
47
48
int use_static, int is_ac)
49
uint8_t huff_size[256];
50
uint8_t huff_size[256] = { 0 };
50
51
uint16_t huff_code[256];
51
52
uint16_t huff_sym[256];
54
55
assert(nb_codes <= 256);
56
memset(huff_size, 0, sizeof(huff_size));
57
57
ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table);
59
59
for (i = 0; i < 256; i++)
69
69
static void build_basic_mjpeg_vlc(MJpegDecodeContext *s)
71
build_vlc(&s->vlcs[0][0], ff_mjpeg_bits_dc_luminance,
72
ff_mjpeg_val_dc, 12, 0, 0);
73
build_vlc(&s->vlcs[0][1], ff_mjpeg_bits_dc_chrominance,
74
ff_mjpeg_val_dc, 12, 0, 0);
75
build_vlc(&s->vlcs[1][0], ff_mjpeg_bits_ac_luminance,
76
ff_mjpeg_val_ac_luminance, 251, 0, 1);
77
build_vlc(&s->vlcs[1][1], ff_mjpeg_bits_ac_chrominance,
78
ff_mjpeg_val_ac_chrominance, 251, 0, 1);
79
build_vlc(&s->vlcs[2][0], ff_mjpeg_bits_ac_luminance,
80
ff_mjpeg_val_ac_luminance, 251, 0, 0);
81
build_vlc(&s->vlcs[2][1], ff_mjpeg_bits_ac_chrominance,
82
ff_mjpeg_val_ac_chrominance, 251, 0, 0);
71
build_vlc(&s->vlcs[0][0], avpriv_mjpeg_bits_dc_luminance,
72
avpriv_mjpeg_val_dc, 12, 0, 0);
73
build_vlc(&s->vlcs[0][1], avpriv_mjpeg_bits_dc_chrominance,
74
avpriv_mjpeg_val_dc, 12, 0, 0);
75
build_vlc(&s->vlcs[1][0], avpriv_mjpeg_bits_ac_luminance,
76
avpriv_mjpeg_val_ac_luminance, 251, 0, 1);
77
build_vlc(&s->vlcs[1][1], avpriv_mjpeg_bits_ac_chrominance,
78
avpriv_mjpeg_val_ac_chrominance, 251, 0, 1);
79
build_vlc(&s->vlcs[2][0], avpriv_mjpeg_bits_ac_luminance,
80
avpriv_mjpeg_val_ac_luminance, 251, 0, 0);
81
build_vlc(&s->vlcs[2][1], avpriv_mjpeg_bits_ac_chrominance,
82
avpriv_mjpeg_val_ac_chrominance, 251, 0, 0);
85
85
av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
102
102
build_basic_mjpeg_vlc(s);
104
#if FF_API_MJPEG_GLOBAL_OPTS
105
if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
108
104
if (s->extern_huff) {
109
106
av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n");
110
107
init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8);
111
if (ff_mjpeg_decode_dht(s)) {
108
if ((ret = ff_mjpeg_decode_dht(s))) {
112
109
av_log(avctx, AV_LOG_ERROR,
113
110
"mjpeg: error using external huffman table\n");
114
return AVERROR_INVALIDDATA;
117
114
if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
118
115
s->interlace_polarity = 1; /* bottom field first */
119
116
av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n");
121
if (avctx->codec->id == CODEC_ID_AMV)
118
if (avctx->codec->id == AV_CODEC_ID_AMV)
164
161
int len, index, i, class, n, v, code_max;
165
162
uint8_t bits_table[17];
166
163
uint8_t val_table[256];
168
166
len = get_bits(&s->gb, 16) - 2;
170
168
while (len > 0) {
170
return AVERROR_INVALIDDATA;
173
171
class = get_bits(&s->gb, 4);
173
return AVERROR_INVALIDDATA;
176
174
index = get_bits(&s->gb, 4);
176
return AVERROR_INVALIDDATA;
180
178
for (i = 1; i <= 16; i++) {
181
179
bits_table[i] = get_bits(&s->gb, 8);
198
196
ff_free_vlc(&s->vlcs[class][index]);
199
197
av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
200
198
class, index, code_max + 1);
201
if (build_vlc(&s->vlcs[class][index], bits_table, val_table,
202
code_max + 1, 0, class > 0) < 0)
199
if ((ret = build_vlc(&s->vlcs[class][index], bits_table, val_table,
200
code_max + 1, 0, class > 0)) < 0)
206
204
ff_free_vlc(&s->vlcs[2][index]);
207
if (build_vlc(&s->vlcs[2][index], bits_table, val_table,
208
code_max + 1, 0, 0) < 0)
205
if ((ret = build_vlc(&s->vlcs[2][index], bits_table, val_table,
206
code_max + 1, 0, 0)) < 0)
240
238
av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
241
239
if (av_image_check_size(width, height, 0, s->avctx))
240
return AVERROR_INVALIDDATA;
244
242
nb_components = get_bits(&s->gb, 8);
245
243
if (nb_components <= 0 ||
246
244
nb_components > MAX_COMPONENTS)
246
if (s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
247
if (nb_components != s->nb_components) {
248
av_log(s->avctx, AV_LOG_ERROR,
249
"nb_components changing in interlaced picture\n");
250
return AVERROR_INVALIDDATA;
248
253
if (s->ls && !(s->bits <= 8 || nb_components == 1)) {
249
av_log(s->avctx, AV_LOG_ERROR,
250
"only <= 8 bits/component or 16-bit gray accepted for JPEG-LS\n");
254
av_log_missing_feature(s->avctx,
255
"For JPEG-LS anything except <= 8 bits/component"
256
" or 16-bit gray", 0);
257
return AVERROR_PATCHWELCOME;
253
259
s->nb_components = nb_components;
265
271
s->v_max = s->v_count[i];
266
272
s->quant_index[i] = get_bits(&s->gb, 8);
267
273
if (s->quant_index[i] >= 4)
274
return AVERROR_INVALIDDATA;
275
if (!s->h_count[i] || !s->v_count[i]) {
276
av_log(s->avctx, AV_LOG_ERROR,
277
"Invalid sampling factor in component %d %d:%d\n",
278
i, s->h_count[i], s->v_count[i]);
279
return AVERROR_INVALIDDATA;
269
282
av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
270
283
i, s->h_count[i], s->v_count[i],
271
284
s->component_id[i], s->quant_index[i]);
274
287
if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
275
av_log(s->avctx, AV_LOG_ERROR,
276
"Subsampling in JPEG-LS is not supported.\n");
288
av_log_missing_feature(s->avctx, "Subsampling in JPEG-LS", 0);
289
return AVERROR_PATCHWELCOME;
280
292
if (s->v_max == 1 && s->h_max == 1 && s->lossless == 1)
323
335
switch (pix_fmt_id) {
326
s->avctx->pix_fmt = PIX_FMT_BGRA;
338
s->avctx->pix_fmt = AV_PIX_FMT_BGRA;
328
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV444P : PIX_FMT_YUVJ444P;
340
s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
329
341
assert(s->nb_components == 3);
332
s->avctx->pix_fmt = PIX_FMT_GRAY8;
344
s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
335
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV440P : PIX_FMT_YUVJ440P;
347
s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
338
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P;
350
s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
341
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P;
353
s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
344
356
av_log(s->avctx, AV_LOG_ERROR, "Unhandled pixel format 0x%x\n", pix_fmt_id);
357
return AVERROR_PATCHWELCOME;
348
360
if (s->nb_components > 1)
349
s->avctx->pix_fmt = PIX_FMT_RGB24;
361
s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
350
362
else if (s->bits <= 8)
351
s->avctx->pix_fmt = PIX_FMT_GRAY8;
363
s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
353
s->avctx->pix_fmt = PIX_FMT_GRAY16;
365
s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
356
368
if (s->picture_ptr->data[0])
357
369
s->avctx->release_buffer(s->avctx, s->picture_ptr);
359
if (s->avctx->get_buffer(s->avctx, s->picture_ptr) < 0) {
371
if (ff_get_buffer(s->avctx, s->picture_ptr) < 0) {
360
372
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
367
379
for (i = 0; i < 3; i++)
368
380
s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
370
// printf("%d %d %d %d %d %d\n",
371
// s->width, s->height, s->linesize[0], s->linesize[1],
372
// s->interlaced, s->avctx->height);
382
av_dlog(s->avctx, "%d %d %d %d %d %d\n",
383
s->width, s->height, s->linesize[0], s->linesize[1],
384
s->interlaced, s->avctx->height);
374
386
if (len != (8 + (3 * nb_components)))
375
387
av_log(s->avctx, AV_LOG_DEBUG, "decode_sof0: error, len(%d) mismatch\n", len);
803
static av_always_inline void mjpeg_copy_block(uint8_t *dst, const uint8_t *src,
804
int linesize, int lowres)
807
case 0: copy_block8(dst, src, linesize, linesize, 8);
809
case 1: copy_block4(dst, src, linesize, linesize, 4);
811
case 2: copy_block2(dst, src, linesize, linesize, 2);
818
814
static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
819
815
int Al, const uint8_t *mb_bitmask,
820
816
const AVFrame *reference)
875
871
for (j = 0; j < n; j++) {
876
block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
877
(h * mb_x + x) * 8) >> s->avctx->lowres);
872
block_offset = ((linesize[c] * (v * mb_y + y) * 8) +
879
875
if (s->interlaced && s->bottom_field)
880
876
block_offset += linesize[c] >> 1;
881
877
ptr = data[c] + block_offset;
882
878
if (!s->progressive) {
884
mjpeg_copy_block(ptr, reference_data[c] + block_offset,
885
linesize[c], s->avctx->lowres);
880
copy_block8(ptr, reference_data[c] + block_offset,
881
linesize[c], linesize[c], 8);
887
883
s->dsp.clear_block(s->block);
888
884
if (decode_block(s, s->block, i,
890
886
s->quant_matrixes[s->quant_index[c]]) < 0) {
891
887
av_log(s->avctx, AV_LOG_ERROR,
892
888
"error y=%d x=%d\n", mb_y, mb_x);
889
return AVERROR_INVALIDDATA;
895
891
s->dsp.idct_put(ptr, linesize[c], s->block);
907
903
av_log(s->avctx, AV_LOG_ERROR,
908
904
"error y=%d x=%d\n", mb_y, mb_x);
905
return AVERROR_INVALIDDATA;
912
// av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n",
914
// av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d %d %d %d %d \n",
915
// mb_x, mb_y, x, y, c, s->bottom_field,
916
// (v * mb_y + y) * 8, (h * mb_x + x) * 8);
908
av_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
909
av_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
910
mb_x, mb_y, x, y, c, s->bottom_field,
911
(v * mb_y + y) * 8, (h * mb_x + x) * 8);
992
992
av_log(s->avctx, AV_LOG_ERROR,
993
993
"error y=%d x=%d\n", mb_y, mb_x);
994
return AVERROR_INVALIDDATA;
1000
mjpeg_copy_block(ptr, reference_data + block_offset,
1001
linesize, s->avctx->lowres);
1000
copy_block8(ptr, reference_data + block_offset,
1001
linesize, linesize, 8);
1003
1003
s->dsp.idct_put(ptr, linesize, *block);
1004
ptr += 8 >> s->avctx->lowres;
1023
1023
if (nb_components == 0 || nb_components > MAX_COMPONENTS) {
1024
1024
av_log(s->avctx, AV_LOG_ERROR,
1025
1025
"decode_sos: nb_components (%d) unsupported\n", nb_components);
1026
return AVERROR_PATCHWELCOME;
1028
1028
if (len != 6 + 2 * nb_components) {
1029
1029
av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1030
return AVERROR_INVALIDDATA;
1032
1032
for (i = 0; i < nb_components; i++) {
1033
1033
id = get_bits(&s->gb, 8) - 1;
1039
1039
if (index == s->nb_components) {
1040
1040
av_log(s->avctx, AV_LOG_ERROR,
1041
1041
"decode_sos: index(%d) out of components\n", index);
1042
return AVERROR_INVALIDDATA;
1044
1044
/* Metasoft MJPEG codec has Cb and Cr swapped */
1045
1045
if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1096
1093
for (i = s->mjpb_skiptosod; i > 0; i--)
1097
1094
skip_bits(&s->gb, 8);
1097
for (i = 0; i < nb_components; i++)
1098
s->last_dc[i] = 1024;
1099
1100
if (s->lossless) {
1100
1101
if (CONFIG_JPEGLS_DECODER && s->ls) {
1102
1103
// reset_ls_coding_parameters(s, 0);
1104
if (ff_jpegls_decode_picture(s, predictor, point_transform, ilv) < 0)
1105
if ((ret = ff_jpegls_decode_picture(s, predictor,
1106
point_transform, ilv)) < 0)
1108
if (ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
1110
if ((ret = ljpeg_decode_rgb_scan(s, predictor,
1111
point_transform)) < 0)
1111
if (ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
1114
if ((ret = ljpeg_decode_yuv_scan(s, predictor,
1116
nb_components)) < 0)
1116
1121
if (s->progressive && predictor) {
1117
if (mjpeg_decode_scan_progressive_ac(s, predictor, ilv, prev_shift,
1119
mb_bitmask, reference) < 0)
1122
if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor,
1122
if (mjpeg_decode_scan(s, nb_components, prev_shift, point_transform,
1123
mb_bitmask, reference) < 0)
1129
if ((ret = mjpeg_decode_scan(s, nb_components,
1130
prev_shift, point_transform,
1131
mb_bitmask, reference)) < 0)
1136
if (s->interlaced &&
1137
get_bits_left(&s->gb) > 32 &&
1138
show_bits(&s->gb, 8) == 0xFF) {
1139
GetBitContext bak = s->gb;
1140
align_get_bits(&bak);
1141
if (show_bits(&bak, 16) == 0xFFD1) {
1142
av_dlog(s->avctx, "AVRn interlaced picture marker found\n");
1144
skip_bits(&s->gb, 16);
1145
s->bottom_field ^= 1;
1130
1154
av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1155
return AVERROR_INVALIDDATA;
1134
1158
static int mjpeg_decode_dri(MJpegDecodeContext *s)
1136
1160
if (get_bits(&s->gb, 16) != 4)
1161
return AVERROR_INVALIDDATA;
1138
1162
s->restart_interval = get_bits(&s->gb, 16);
1139
1163
s->restart_count = 0;
1140
1164
av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
1308
1328
/* buggy avid, it puts EOI only at every 10th frame */
1309
1329
if (!strcmp(cbuf, "AVID")) {
1310
1330
s->buggy_avid = 1;
1311
// if (s->first_picture)
1312
// printf("mjpeg: workarounding buggy AVID\n");
1313
1331
} else if (!strcmp(cbuf, "CS=ITU601"))
1314
1332
s->cs_itu601 = 1;
1315
1333
else if ((len > 20 && !strncmp(cbuf, "Intel(R) JPEG Library", 21)) ||
1361
1379
int start_code;
1362
1380
start_code = find_marker(buf_ptr, buf_end);
1364
if ((buf_end - *buf_ptr) > s->buffer_size) {
1366
s->buffer_size = buf_end - *buf_ptr;
1367
s->buffer = av_malloc(s->buffer_size + FF_INPUT_BUFFER_PADDING_SIZE);
1368
av_log(s->avctx, AV_LOG_DEBUG,
1369
"buffer too small, expanding to %d bytes\n", s->buffer_size);
1382
av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - *buf_ptr);
1384
return AVERROR(ENOMEM);
1372
1386
/* unescape buffer of SOS, use special treatment for JPEG-LS */
1373
1387
if (start_code == SOS && !s->ls) {
1393
1407
*unescaped_buf_ptr = s->buffer;
1394
1408
*unescaped_buf_size = dst - s->buffer;
1409
memset(s->buffer + *unescaped_buf_size, 0,
1410
FF_INPUT_BUFFER_PADDING_SIZE);
1396
1412
av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
1397
1413
(buf_end - *buf_ptr) - (dst - s->buffer));
1465
1484
if (start_code < 0) {
1467
} else if (unescaped_buf_size > (1U<<29)) {
1468
av_log(avctx, AV_LOG_ERROR, "MJPEG packet 0x%x too big (0x%x/0x%x), corrupt data?\n",
1469
start_code, unescaped_buf_ptr, buf_size);
1486
} else if (unescaped_buf_size > INT_MAX / 8) {
1487
av_log(avctx, AV_LOG_ERROR,
1488
"MJPEG packet 0x%x too big (%d/%d), corrupt data?\n",
1489
start_code, unescaped_buf_size, buf_size);
1470
1490
return AVERROR_INVALIDDATA;
1472
1492
av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n",
1473
1493
start_code, buf_end - buf_ptr);
1475
init_get_bits(&s->gb, unescaped_buf_ptr, unescaped_buf_size * 8);
1495
ret = init_get_bits(&s->gb, unescaped_buf_ptr,
1496
unescaped_buf_size * 8);
1477
1501
s->start_code = start_code;
1478
1502
if (s->avctx->debug & FF_DEBUG_STARTCODE)
1509
1539
s->lossless = 0;
1511
1541
s->progressive = 0;
1512
if (ff_mjpeg_decode_sof(s) < 0)
1542
if ((ret = ff_mjpeg_decode_sof(s)) < 0)
1516
1546
s->lossless = 0;
1518
1548
s->progressive = 1;
1519
if (ff_mjpeg_decode_sof(s) < 0)
1549
if ((ret = ff_mjpeg_decode_sof(s)) < 0)
1523
1553
s->lossless = 1;
1525
1555
s->progressive = 0;
1526
if (ff_mjpeg_decode_sof(s) < 0)
1556
if ((ret = ff_mjpeg_decode_sof(s)) < 0)
1530
1560
s->lossless = 1;
1532
1562
s->progressive = 0;
1533
if (ff_mjpeg_decode_sof(s) < 0)
1563
if ((ret = ff_mjpeg_decode_sof(s)) < 0)
1537
if (!CONFIG_JPEGLS_DECODER || ff_jpegls_decode_lse(s) < 0)
1567
if (!CONFIG_JPEGLS_DECODER ||
1568
(ret = ff_jpegls_decode_lse(s)) < 0)
1541
1572
s->cur_scan = 0;
1577
1608
"Can not process SOS before SOF, skipping\n");
1580
if (ff_mjpeg_decode_sos(s, NULL, NULL) < 0 &&
1611
if ((ret = ff_mjpeg_decode_sos(s, NULL, NULL)) < 0 &&
1581
1612
(avctx->err_recognition & AV_EF_EXPLODE))
1582
return AVERROR_INVALIDDATA;
1583
1614
/* buggy avid puts EOI every 10-20th frame */
1584
1615
/* if restart period is over process EOI */
1585
1616
if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1655
1683
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1656
1684
static const AVOption options[] = {
1657
1685
{ "extern_huff", "Use external huffman table.",
1658
OFFSET(extern_huff), AV_OPT_TYPE_INT, { 0 }, 0, 1, VD },
1686
OFFSET(extern_huff), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VD },
1669
1697
AVCodec ff_mjpeg_decoder = {
1670
1698
.name = "mjpeg",
1671
1699
.type = AVMEDIA_TYPE_VIDEO,
1672
.id = CODEC_ID_MJPEG,
1700
.id = AV_CODEC_ID_MJPEG,
1673
1701
.priv_data_size = sizeof(MJpegDecodeContext),
1674
1702
.init = ff_mjpeg_decode_init,
1675
1703
.close = ff_mjpeg_decode_end,
1676
1704
.decode = ff_mjpeg_decode_frame,
1677
1705
.capabilities = CODEC_CAP_DR1,
1679
1706
.long_name = NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
1680
1707
.priv_class = &mjpegdec_class,
1683
1710
AVCodec ff_thp_decoder = {
1685
1712
.type = AVMEDIA_TYPE_VIDEO,
1713
.id = AV_CODEC_ID_THP,
1687
1714
.priv_data_size = sizeof(MJpegDecodeContext),
1688
1715
.init = ff_mjpeg_decode_init,
1689
1716
.close = ff_mjpeg_decode_end,
1690
1717
.decode = ff_mjpeg_decode_frame,
1691
1718
.capabilities = CODEC_CAP_DR1,
1693
1719
.long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),