Go to the documentation of this file. 1 /*
2 * Microsoft Screen 4 (aka Microsoft Expression Encoder Screen) decoder
3 * Copyright (c) 2012 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
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.
11 *
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.
16 *
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
20 */
21
22 /**
23 * @file
24 * Microsoft Screen 4 (aka Microsoft Titanium Screen 2,
25 * aka Microsoft Expression Encoder Screen) decoder
26 */
27
31
40
42
47 };
48
53 };
54
59 };
60
62 { 0, 1, 5, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
63 { 0, 3, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0 }
64 };
65
67 { 4, 2, 3, 1 },
68 { 4, 1, 2, 3 }
69 };
70
72 { 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
73 { 0, 1, 5, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
74 };
75
77 { 0, 7, 6, 5, 8, 4, 3, 1, 2 },
78 { 0, 2, 3, 4, 5, 6, 7, 1, 8 }
79 };
80
81 #define MAX_ENTRIES 162
82
85
88
91
95
98
101
103 const uint8_t *lens, const uint8_t *syms)
104 {
108 int idx = 0;
109
110 for (
i = 0;
i < 16;
i++) {
111 for (j = 0; j < lens[
i]; j++) {
113 idx++;
114 }
115 }
116
123 }
124
126 {
127 for (
unsigned i = 0,
offset = 0;
i < 2;
i++) {
136 }
137 }
138
139 /* This function returns values in the range
140 * (-range + 1; -range/2] U [range/2; range - 1)
141 * i.e.
142 * nbits = 0 -> 0
143 * nbits = 1 -> -1, 1
144 * nbits = 2 -> -3, -2, 2, 3
145 */
147 {
149
150 if (!nbits)
151 return 0;
152
154 if (
val < (1 << (nbits - 1)))
155 val -= (1 << nbits) - 1;
156
158 }
159
161 int nb_bits, int max_depth)
162 {
164
166 }
167
169 int *
block,
int *dc_cache,
170 int bx, int by, uint16_t *quant_mat)
171 {
173
175
177 // DC prediction is the same as in MSS3
178 if (by) {
179 if (bx) {
180 int l, tl, t;
181
185
188 else
190 } else {
192 }
193 } else if (bx) {
195 }
198
202 return 0;
204 return -1;
207 continue;
208 }
213 return -1;
214
216 block[zz_pos] =
val * quant_mat[zz_pos];
218 }
219
220 return pos == 64 ? 0 : -1;
221 }
222
224 uint8_t *
dst[3],
int mb_x,
int mb_y)
225 {
228
229 for (j = 0; j < 2; j++) {
230 for (
i = 0;
i < 2;
i++) {
231 int xpos = mb_x * 2 +
i;
233 c->dc_cache[j][
TOP] =
c->prev_dc[0][mb_x * 2 +
i];
236 xpos, mb_y * 2 + j,
c->quant_mat[0]);
239 c->prev_dc[0][mb_x * 2 +
i] =
c->dc_cache[j][
LEFT];
240
243 }
244 out += 8 *
c->pic->linesize[0];
245 }
246
247 for (
i = 1;
i < 3;
i++) {
249 c->dc_cache[
i + 1][
TOP] =
c->prev_dc[
i][mb_x];
251 c->block,
c->dc_cache[
i + 1], mb_x, mb_y,
255 c->prev_dc[
i][mb_x] =
c->dc_cache[
i + 1][
LEFT];
256
259 // Since the DCT block is coded as YUV420 and the whole frame as YUV444,
260 // we need to scale chroma.
261 for (j = 0; j < 16; j++) {
262 for (k = 0; k < 8; k++)
263 AV_WN16A(
out + k * 2,
c->imgbuf[
i][k + (j & ~1) * 4] * 0x101);
264 out +=
c->pic->linesize[
i];
265 }
266 }
267
268 return 0;
269 }
270
272 int *sel_len, int *prev)
273 {
275
276 for (
i = 2;
i >= 0;
i--) {
279 continue;
280 }
282 if (sel_len[
i] > 0) {
285 if (vec_pos[
i] >= pval)
287 } else {
288 vec_pos[
i] = !prev[
i];
289 }
290 y_flag = 1;
291 } else {
292 vec_pos[
i] = prev[
i];
293 }
294 }
295 }
296
298 int vec_size,
int component,
int shift,
int *prev)
299 {
300 if (vec_pos < vec_size)
301 return vec[vec_pos];
303 return prev[component];
305 return prev[component];
306 }
307
308 #define MKVAL(vals) ((vals)[0] | ((vals)[1] << 3) | ((vals)[2] << 6))
309
310 /* Image mode - the hardest to comprehend MSS4 coding mode.
311 *
312 * In this mode all three 16x16 blocks are coded together with a method
313 * remotely similar to the methods employed in MSS1-MSS3.
314 * The idea is that every component has a vector of 1-4 most common symbols
315 * and an escape mode for reading new value from the bitstream. Decoding
316 * consists of retrieving pixel values from the vector or reading new ones
317 * from the bitstream; depending on flags read from the bitstream, these vector
318 * positions can be updated or reused from the state of the previous line
319 * or previous pixel.
320 */
322 uint8_t *picdst[3], int mb_x, int mb_y)
323 {
324 uint8_t vec[3][4];
325 int vec_len[3];
326 int sel_len[3], sel_flag[3];
328 int prev_vec1 = 0, prev_split = 0;
329 int vals[3] = { 0 };
330 int prev_pix[3] = { 0 };
331 int prev_mode[16] = { 0 };
333
334 const int val_shift =
ctx->quality == 100 ? 0 : 2;
335
336 for (
i = 0;
i < 3;
i++)
338
341 for (j = 0; j < vec_len[
i]; j++) {
343 vec[
i][j] +=
ctx->prev_vec[
i][j];
344 ctx->prev_vec[
i][j] = vec[
i][j];
345 }
346 sel_flag[
i] = vec_len[
i] > 1;
347 sel_len[
i] = vec_len[
i] > 2 ? vec_len[
i] - 2 : 0;
348 }
349
350 for (j = 0; j < 16; j++) {
354 prev_mode[0] = 0;
355 vals[0] = vals[1] = vals[2] = 0;
357 } else {
361 }
362 for (
i = 0;
i < 16;
i++) {
364 vals[0] = prev_mode[
i] & 7;
365 vals[1] = (prev_mode[
i] >> 3) & 7;
366 vals[2] = prev_mode[
i] >> 6;
369 }
370 }
else if (
mode == 2) {
373 }
374 for (k = 0; k < 3; k++)
376 vec_len[k], k,
377 val_shift, prev_pix);
378 prev_mode[
i] =
MKVAL(vals);
379 }
380 } else {
383 if (
split >= prev_split)
386 } else {
388 }
390 vals[0] = prev_mode[0] & 7;
391 vals[1] = (prev_mode[0] >> 3) & 7;
392 vals[2] = prev_mode[0] >> 6;
393 for (
i = 0;
i < 3;
i++) {
394 for (k = 0; k <
split; k++) {
396 vec_len[
i],
i, val_shift,
397 prev_pix);
398 prev_mode[k] =
MKVAL(vals);
399 }
400 }
401 }
402
404 vals[0] = prev_vec1 & 7;
405 vals[1] = (prev_vec1 >> 3) & 7;
406 vals[2] = prev_vec1 >> 6;
409 prev_vec1 =
MKVAL(vals);
410 }
411 for (
i = 0;
i < 3;
i++) {
412 for (k = 0; k < 16 -
split; k++) {
414 vec_len[
i],
i, val_shift,
415 prev_pix);
417 }
418 }
419 }
420 }
421 }
422
423 for (
i = 0;
i < 3;
i++)
424 for (j = 0; j < 16; j++)
425 memcpy(picdst[
i] + mb_x * 16 + j *
ctx->pic->linesize[
i],
426 ctx->imgbuf[
i] + j * 16, 16);
427
428 return 0;
429 }
430
432 {
434
435 c->dc_cache[0][
TOP] =
c->prev_dc[0][mb_x * 2 + 1];
436 c->dc_cache[0][
LEFT] = 0;
437 c->dc_cache[1][
TOP] = 0;
438 c->dc_cache[1][
LEFT] = 0;
439
440 for (
i = 0;
i < 2;
i++)
441 c->prev_dc[0][mb_x * 2 +
i] = 0;
442
444 c->dc_cache[
i + 1][
TOP] =
c->prev_dc[
i][mb_x];
445 c->dc_cache[
i + 1][
LEFT] = 0;
446 c->prev_dc[
i][mb_x] = 0;
447 }
448 }
449
452 {
453 const uint8_t *buf = avpkt->
data;
454 int buf_size = avpkt->
size;
460 int x, y,
i, mb_width, mb_height, blk_type;
462
465 "Frame should have at least %d bytes, got %d instead\n",
468 }
469
471 width = bytestream2_get_be16(&bc);
472 height = bytestream2_get_be16(&bc);
474 quality = bytestream2_get_byte(&bc);
476
482 }
485
486 if (quality < 1 || quality > 100) {
489 }
493 }
494
497 "Empty frame found but it is not a skip frame.\n");
499 }
502
505
510 else
515 *got_frame = 1;
518
519 return buf_size;
520 }
521
524 for (
i = 0;
i < 2;
i++)
526 }
527
530 dst[0] =
c->pic->data[0];
531 dst[1] =
c->pic->data[1];
532 dst[2] =
c->pic->data[2];
533
534 memset(
c->prev_vec, 0,
sizeof(
c->prev_vec));
535 for (y = 0; y < mb_height; y++) {
536 memset(
c->dc_cache, 0,
sizeof(
c->dc_cache));
537 for (x = 0; x < mb_width; x++) {
539 switch (blk_type) {
543 "Error decoding DCT block %d,%d\n",
544 x, y);
546 }
547 break;
551 "Error decoding VQ block %d,%d\n",
552 x, y);
554 }
555 break;
560 }
561 break;
562 }
565 }
566 dst[0] +=
c->pic->linesize[0] * 16;
567 dst[1] +=
c->pic->linesize[1] * 16;
568 dst[2] +=
c->pic->linesize[2] * 16;
569 }
570
573
574 *got_frame = 1;
575
576 return buf_size;
577 }
578
580 {
583
585 for (
i = 0;
i < 3;
i++)
587
588 return 0;
589 }
590
592 {
596
597 for (
i = 0;
i < 3;
i++) {
600 if (!
c->prev_dc[
i]) {
603 }
604 }
605
609
611
613
614 return 0;
615 }
616
628 };
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]