2 * Microsoft Screen 4 (aka Microsoft Expression Encoder Screen) decoder
3 * Copyright (c) 2012 Konstantin Shishkov
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Microsoft Screen 4 (aka Microsoft Titanium Screen 2,
25 * aka Microsoft Expression Encoder Screen) decoder
29 #include "bytestream.h"
55 static const uint8_t mss4_dc_vlc_lens[2][16] = {
56 { 0, 1, 5, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
57 { 0, 3, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0 }
60 static const uint8_t mss4_ac_vlc_lens[2][16] = {
61 { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125 },
62 { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119 }
65 static const uint8_t mss4_ac_vlc_syms[2][162] = {
66 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
67 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
68 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08,
69 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0,
70 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16,
71 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28,
72 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
73 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
74 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
75 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
76 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
77 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
78 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
79 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
80 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
81 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5,
82 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4,
83 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
84 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
85 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
87 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
88 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
89 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
90 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0,
91 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34,
92 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26,
93 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38,
94 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
95 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
96 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
97 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
98 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
99 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
100 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5,
101 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4,
102 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3,
103 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2,
104 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA,
105 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
106 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
110 static const uint8_t vec_len_syms[2][4] = {
115 static const uint8_t mss4_vec_entry_vlc_lens[2][16] = {
116 { 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
117 { 0, 1, 5, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
120 static const uint8_t mss4_vec_entry_vlc_syms[2][9] = {
121 { 0, 7, 6, 5, 8, 4, 3, 1, 2 },
122 { 0, 2, 3, 4, 5, 6, 7, 1, 8 }
125 #define MAX_ENTRIES 162
127 typedef struct MSS4Context {
130 VLC dc_vlc[2], ac_vlc[2];
131 VLC vec_entry_vlc[2];
133 uint8_t imgbuf[3][16 * 16];
136 uint16_t quant_mat[2][64];
139 ptrdiff_t dc_stride[3];
145 static av_cold int mss4_init_vlc(VLC *vlc, const uint8_t *lens,
148 uint8_t bits[MAX_ENTRIES];
152 for (i = 0; i < 16; i++) {
153 for (j = 0; j < lens[i]; j++) {
159 return ff_init_vlc_from_lengths(vlc, FFMIN(bits[idx - 1], 9), idx,
160 bits, 1, syms, 1, 1, 0, 0, NULL);
163 static av_cold int mss4_init_vlcs(MSS4Context *ctx)
167 for (i = 0; i < 2; i++) {
168 ret = mss4_init_vlc(&ctx->dc_vlc[i], mss4_dc_vlc_lens[i], NULL);
171 ret = mss4_init_vlc(&ctx->ac_vlc[i], mss4_ac_vlc_lens[i],
172 mss4_ac_vlc_syms[i]);
175 ret = mss4_init_vlc(&ctx->vec_entry_vlc[i], mss4_vec_entry_vlc_lens[i],
176 mss4_vec_entry_vlc_syms[i]);
183 static av_cold void mss4_free_vlcs(MSS4Context *ctx)
187 for (i = 0; i < 2; i++) {
188 ff_free_vlc(&ctx->dc_vlc[i]);
189 ff_free_vlc(&ctx->ac_vlc[i]);
190 ff_free_vlc(&ctx->vec_entry_vlc[i]);
194 /* This function returns values in the range
195 * (-range + 1; -range/2] U [range/2; range - 1)
199 * nbits = 2 -> -3, -2, 2, 3
201 static av_always_inline int get_coeff_bits(GetBitContext *gb, int nbits)
208 val = get_bits(gb, nbits);
209 if (val < (1 << (nbits - 1)))
210 val -= (1 << nbits) - 1;
215 static inline int get_coeff(GetBitContext *gb, VLC *vlc)
217 int val = get_vlc2(gb, vlc->table, vlc->bits, 2);
219 return get_coeff_bits(gb, val);
222 static int mss4_decode_dct(GetBitContext *gb, VLC *dc_vlc, VLC *ac_vlc,
223 int *block, int *dc_cache,
224 int bx, int by, uint16_t *quant_mat)
226 int skip, val, pos = 1, zz_pos, dc;
228 memset(block, 0, sizeof(*block) * 64);
230 dc = get_coeff(gb, dc_vlc);
231 // DC prediction is the same as in MSS3
237 tl = dc_cache[TOP_LEFT];
240 if (FFABS(t - tl) <= FFABS(l - tl))
248 dc += dc_cache[LEFT];
251 block[0] = dc * quant_mat[0];
254 val = get_vlc2(gb, ac_vlc->table, 9, 2);
264 val = get_coeff_bits(gb, val & 0xF);
269 zz_pos = ff_zigzag_direct[pos];
270 block[zz_pos] = val * quant_mat[zz_pos];
274 return pos == 64 ? 0 : -1;
277 static int mss4_decode_dct_block(MSS4Context *c, GetBitContext *gb,
278 uint8_t *dst[3], int mb_x, int mb_y)
281 uint8_t *out = dst[0];
283 for (j = 0; j < 2; j++) {
284 for (i = 0; i < 2; i++) {
285 int xpos = mb_x * 2 + i;
286 c->dc_cache[j][TOP_LEFT] = c->dc_cache[j][TOP];
287 c->dc_cache[j][TOP] = c->prev_dc[0][mb_x * 2 + i];
288 ret = mss4_decode_dct(gb, c->dc_vlc, c->ac_vlc, c->block,
290 xpos, mb_y * 2 + j, c->quant_mat[0]);
293 c->prev_dc[0][mb_x * 2 + i] = c->dc_cache[j][LEFT];
295 ff_mss34_dct_put(out + xpos * 8, c->pic->linesize[0],
298 out += 8 * c->pic->linesize[0];
301 for (i = 1; i < 3; i++) {
302 c->dc_cache[i + 1][TOP_LEFT] = c->dc_cache[i + 1][TOP];
303 c->dc_cache[i + 1][TOP] = c->prev_dc[i][mb_x];
304 ret = mss4_decode_dct(gb, c->dc_vlc + 1, c->ac_vlc + 1,
305 c->block, c->dc_cache[i + 1], mb_x, mb_y,
309 c->prev_dc[i][mb_x] = c->dc_cache[i + 1][LEFT];
311 ff_mss34_dct_put(c->imgbuf[i], 8, c->block);
312 out = dst[i] + mb_x * 16;
313 // Since the DCT block is coded as YUV420 and the whole frame as YUV444,
314 // we need to scale chroma.
315 for (j = 0; j < 16; j++) {
316 for (k = 0; k < 8; k++)
317 AV_WN16A(out + k * 2, c->imgbuf[i][k + (j & ~1) * 4] * 0x101);
318 out += c->pic->linesize[i];
325 static void read_vec_pos(GetBitContext *gb, int *vec_pos, int *sel_flag,
326 int *sel_len, int *prev)
330 for (i = 2; i >= 0; i--) {
335 if ((!i && !y_flag) || get_bits1(gb)) {
336 if (sel_len[i] > 0) {
338 vec_pos[i] = get_bits(gb, sel_len[i]);
339 if (vec_pos[i] >= pval)
342 vec_pos[i] = !prev[i];
346 vec_pos[i] = prev[i];
351 static int get_value_cached(GetBitContext *gb, int vec_pos, uint8_t *vec,
352 int vec_size, int component, int shift, int *prev)
354 if (vec_pos < vec_size)
357 return prev[component];
358 prev[component] = get_bits(gb, 8 - shift) << shift;
359 return prev[component];
362 #define MKVAL(vals) ((vals)[0] | ((vals)[1] << 3) | ((vals)[2] << 6))
364 /* Image mode - the hardest to comprehend MSS4 coding mode.
366 * In this mode all three 16x16 blocks are coded together with a method
367 * remotely similar to the methods employed in MSS1-MSS3.
368 * The idea is that every component has a vector of 1-4 most common symbols
369 * and an escape mode for reading new value from the bitstream. Decoding
370 * consists of retrieving pixel values from the vector or reading new ones
371 * from the bitstream; depending on flags read from the bitstream, these vector
372 * positions can be updated or reused from the state of the previous line
375 static int mss4_decode_image_block(MSS4Context *ctx, GetBitContext *gb,
376 uint8_t *picdst[3], int mb_x, int mb_y)
380 int sel_len[3], sel_flag[3];
381 int i, j, k, mode, split;
382 int prev_vec1 = 0, prev_split = 0;
384 int prev_pix[3] = { 0 };
385 int prev_mode[16] = { 0 };
388 const int val_shift = ctx->quality == 100 ? 0 : 2;
390 for (i = 0; i < 3; i++)
391 dst[i] = ctx->imgbuf[i];
393 for (i = 0; i < 3; i++) {
394 vec_len[i] = vec_len_syms[!!i][get_unary(gb, 0, 3)];
395 for (j = 0; j < vec_len[i]; j++) {
396 vec[i][j] = get_coeff(gb, &ctx->vec_entry_vlc[!!i]);
397 vec[i][j] += ctx->prev_vec[i][j];
398 ctx->prev_vec[i][j] = vec[i][j];
400 sel_flag[i] = vec_len[i] > 1;
401 sel_len[i] = vec_len[i] > 2 ? vec_len[i] - 2 : 0;
404 for (j = 0; j < 16; j++) {
409 vals[0] = vals[1] = vals[2] = 0;
412 mode = get_bits1(gb);
414 split = get_bits(gb, 4);
416 for (i = 0; i < 16; i++) {
418 vals[0] = prev_mode[i] & 7;
419 vals[1] = (prev_mode[i] >> 3) & 7;
420 vals[2] = prev_mode[i] >> 6;
421 if (mode == 1 && i == split) {
422 read_vec_pos(gb, vals, sel_flag, sel_len, vals);
424 } else if (mode == 2) {
426 read_vec_pos(gb, vals, sel_flag, sel_len, vals);
428 for (k = 0; k < 3; k++)
429 *dst[k]++ = get_value_cached(gb, vals[k], vec[k],
431 val_shift, prev_pix);
432 prev_mode[i] = MKVAL(vals);
436 split = get_bits(gb, 4);
437 if (split >= prev_split)
444 vals[0] = prev_mode[0] & 7;
445 vals[1] = (prev_mode[0] >> 3) & 7;
446 vals[2] = prev_mode[0] >> 6;
447 for (i = 0; i < 3; i++) {
448 for (k = 0; k < split; k++) {
449 *dst[i]++ = get_value_cached(gb, vals[i], vec[i],
450 vec_len[i], i, val_shift,
452 prev_mode[k] = MKVAL(vals);
458 vals[0] = prev_vec1 & 7;
459 vals[1] = (prev_vec1 >> 3) & 7;
460 vals[2] = prev_vec1 >> 6;
462 read_vec_pos(gb, vals, sel_flag, sel_len, vals);
463 prev_vec1 = MKVAL(vals);
465 for (i = 0; i < 3; i++) {
466 for (k = 0; k < 16 - split; k++) {
467 *dst[i]++ = get_value_cached(gb, vals[i], vec[i],
468 vec_len[i], i, val_shift,
470 prev_mode[split + k] = MKVAL(vals);
477 for (i = 0; i < 3; i++)
478 for (j = 0; j < 16; j++)
479 memcpy(picdst[i] + mb_x * 16 + j * ctx->pic->linesize[i],
480 ctx->imgbuf[i] + j * 16, 16);
485 static inline void mss4_update_dc_cache(MSS4Context *c, int mb_x)
489 c->dc_cache[0][TOP] = c->prev_dc[0][mb_x * 2 + 1];
490 c->dc_cache[0][LEFT] = 0;
491 c->dc_cache[1][TOP] = 0;
492 c->dc_cache[1][LEFT] = 0;
494 for (i = 0; i < 2; i++)
495 c->prev_dc[0][mb_x * 2 + i] = 0;
497 for (i = 1; i < 3; i++) {
498 c->dc_cache[i + 1][TOP] = c->prev_dc[i][mb_x];
499 c->dc_cache[i + 1][LEFT] = 0;
500 c->prev_dc[i][mb_x] = 0;
504 static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
507 const uint8_t *buf = avpkt->data;
508 int buf_size = avpkt->size;
509 MSS4Context *c = avctx->priv_data;
513 int width, height, quality, frame_type;
514 int x, y, i, mb_width, mb_height, blk_type;
517 if (buf_size < HEADER_SIZE) {
518 av_log(avctx, AV_LOG_ERROR,
519 "Frame should have at least %d bytes, got %d instead\n",
520 HEADER_SIZE, buf_size);
521 return AVERROR_INVALIDDATA;
524 bytestream2_init(&bc, buf, buf_size);
525 width = bytestream2_get_be16(&bc);
526 height = bytestream2_get_be16(&bc);
527 bytestream2_skip(&bc, 2);
528 quality = bytestream2_get_byte(&bc);
529 frame_type = bytestream2_get_byte(&bc);
531 if (width > avctx->width ||
532 height != avctx->height) {
533 av_log(avctx, AV_LOG_ERROR, "Invalid frame dimensions %dx%d\n",
535 return AVERROR_INVALIDDATA;
537 if (quality < 1 || quality > 100) {
538 av_log(avctx, AV_LOG_ERROR, "Invalid quality setting %d\n", quality);
539 return AVERROR_INVALIDDATA;
541 if ((frame_type & ~3) || frame_type == 3) {
542 av_log(avctx, AV_LOG_ERROR, "Invalid frame type %d\n", frame_type);
543 return AVERROR_INVALIDDATA;
546 if (frame_type != SKIP_FRAME && !bytestream2_get_bytes_left(&bc)) {
547 av_log(avctx, AV_LOG_ERROR,
548 "Empty frame found but it is not a skip frame.\n");
549 return AVERROR_INVALIDDATA;
551 mb_width = FFALIGN(width, 16) >> 4;
552 mb_height = FFALIGN(height, 16) >> 4;
554 if (frame_type != SKIP_FRAME && 8*buf_size < 8*HEADER_SIZE + mb_width*mb_height)
555 return AVERROR_INVALIDDATA;
557 if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
559 c->pic->key_frame = (frame_type == INTRA_FRAME);
560 c->pic->pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I
562 if (frame_type == SKIP_FRAME) {
564 if ((ret = av_frame_ref(data, c->pic)) < 0)
570 if (c->quality != quality) {
571 c->quality = quality;
572 for (i = 0; i < 2; i++)
573 ff_mss34_gen_quant_mat(c->quant_mat[i], quality, !i);
576 if ((ret = init_get_bits8(&gb, buf + HEADER_SIZE, buf_size - HEADER_SIZE)) < 0)
578 dst[0] = c->pic->data[0];
579 dst[1] = c->pic->data[1];
580 dst[2] = c->pic->data[2];
582 memset(c->prev_vec, 0, sizeof(c->prev_vec));
583 for (y = 0; y < mb_height; y++) {
584 memset(c->dc_cache, 0, sizeof(c->dc_cache));
585 for (x = 0; x < mb_width; x++) {
586 blk_type = decode012(&gb);
589 if (mss4_decode_dct_block(c, &gb, dst, x, y) < 0) {
590 av_log(avctx, AV_LOG_ERROR,
591 "Error decoding DCT block %d,%d\n",
593 return AVERROR_INVALIDDATA;
597 if (mss4_decode_image_block(c, &gb, dst, x, y) < 0) {
598 av_log(avctx, AV_LOG_ERROR,
599 "Error decoding VQ block %d,%d\n",
601 return AVERROR_INVALIDDATA;
605 if (frame_type == INTRA_FRAME) {
606 av_log(avctx, AV_LOG_ERROR, "Skip block in intra frame\n");
607 return AVERROR_INVALIDDATA;
611 if (blk_type != DCT_BLOCK)
612 mss4_update_dc_cache(c, x);
614 dst[0] += c->pic->linesize[0] * 16;
615 dst[1] += c->pic->linesize[1] * 16;
616 dst[2] += c->pic->linesize[2] * 16;
619 if ((ret = av_frame_ref(data, c->pic)) < 0)
627 static av_cold int mss4_decode_end(AVCodecContext *avctx)
629 MSS4Context * const c = avctx->priv_data;
632 av_frame_free(&c->pic);
633 for (i = 0; i < 3; i++)
634 av_freep(&c->prev_dc[i]);
640 static av_cold int mss4_decode_init(AVCodecContext *avctx)
642 MSS4Context * const c = avctx->priv_data;
645 if (mss4_init_vlcs(c)) {
646 av_log(avctx, AV_LOG_ERROR, "Cannot initialise VLCs\n");
647 return AVERROR(ENOMEM);
649 for (i = 0; i < 3; i++) {
650 c->dc_stride[i] = FFALIGN(avctx->width, 16) >> (2 + !!i);
651 c->prev_dc[i] = av_malloc_array(c->dc_stride[i], sizeof(**c->prev_dc));
652 if (!c->prev_dc[i]) {
653 av_log(avctx, AV_LOG_ERROR, "Cannot allocate buffer\n");
654 return AVERROR(ENOMEM);
658 c->pic = av_frame_alloc();
660 return AVERROR(ENOMEM);
662 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
667 AVCodec ff_mts2_decoder = {
669 .long_name = NULL_IF_CONFIG_SMALL("MS Expression Encoder Screen"),
670 .type = AVMEDIA_TYPE_VIDEO,
671 .id = AV_CODEC_ID_MTS2,
672 .priv_data_size = sizeof(MSS4Context),
673 .init = mss4_decode_init,
674 .close = mss4_decode_end,
675 .decode = mss4_decode_frame,
676 .capabilities = AV_CODEC_CAP_DR1,
677 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_INIT_THREADSAFE,