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
30
39
41
46 };
47
52 };
53
58 };
59
61 { 0, 1, 5, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
62 { 0, 3, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0 }
63 };
64
66 { 4, 2, 3, 1 },
67 { 4, 1, 2, 3 }
68 };
69
71 { 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
72 { 0, 1, 5, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
73 };
74
76 { 0, 7, 6, 5, 8, 4, 3, 1, 2 },
77 { 0, 2, 3, 4, 5, 6, 7, 1, 8 }
78 };
79
80 #define MAX_ENTRIES 162
81
84
87
90
94
97
100
102 const uint8_t *lens, const uint8_t *syms)
103 {
107 int idx = 0;
108
109 for (
i = 0;
i < 16;
i++) {
110 for (j = 0; j < lens[
i]; j++) {
112 idx++;
113 }
114 }
115
122 }
123
125 {
126 for (
unsigned i = 0,
offset = 0;
i < 2;
i++) {
135 }
136 }
137
138 /* This function returns values in the range
139 * (-range + 1; -range/2] U [range/2; range - 1)
140 * i.e.
141 * nbits = 0 -> 0
142 * nbits = 1 -> -1, 1
143 * nbits = 2 -> -3, -2, 2, 3
144 */
146 {
148
149 if (!nbits)
150 return 0;
151
153 if (
val < (1 << (nbits - 1)))
154 val -= (1 << nbits) - 1;
155
157 }
158
160 {
162
164 }
165
167 int *
block,
int *dc_cache,
168 int bx, int by, uint16_t *quant_mat)
169 {
171
173
175 // DC prediction is the same as in MSS3
176 if (by) {
177 if (bx) {
178 int l, tl, t;
179
183
186 else
188 } else {
190 }
191 } else if (bx) {
193 }
196
200 return 0;
202 return -1;
205 continue;
206 }
211 return -1;
212
214 block[zz_pos] =
val * quant_mat[zz_pos];
216 }
217
218 return pos == 64 ? 0 : -1;
219 }
220
222 uint8_t *dst[3], int mb_x, int mb_y)
223 {
225 uint8_t *
out = dst[0];
226
227 for (j = 0; j < 2; j++) {
228 for (
i = 0;
i < 2;
i++) {
229 int xpos = mb_x * 2 +
i;
231 c->dc_cache[j][
TOP] =
c->prev_dc[0][mb_x * 2 +
i];
234 xpos, mb_y * 2 + j,
c->quant_mat[0]);
237 c->prev_dc[0][mb_x * 2 +
i] =
c->dc_cache[j][
LEFT];
238
241 }
242 out += 8 *
c->pic->linesize[0];
243 }
244
245 for (
i = 1;
i < 3;
i++) {
247 c->dc_cache[
i + 1][
TOP] =
c->prev_dc[
i][mb_x];
249 c->block,
c->dc_cache[
i + 1], mb_x, mb_y,
253 c->prev_dc[
i][mb_x] =
c->dc_cache[
i + 1][
LEFT];
254
256 out = dst[
i] + mb_x * 16;
257 // Since the DCT block is coded as YUV420 and the whole frame as YUV444,
258 // we need to scale chroma.
259 for (j = 0; j < 16; j++) {
260 for (k = 0; k < 8; k++)
261 AV_WN16A(
out + k * 2,
c->imgbuf[
i][k + (j & ~1) * 4] * 0x101);
262 out +=
c->pic->linesize[
i];
263 }
264 }
265
266 return 0;
267 }
268
270 int *sel_len, int *prev)
271 {
273
274 for (
i = 2;
i >= 0;
i--) {
277 continue;
278 }
280 if (sel_len[
i] > 0) {
283 if (vec_pos[
i] >= pval)
285 } else {
286 vec_pos[
i] = !prev[
i];
287 }
288 y_flag = 1;
289 } else {
290 vec_pos[
i] = prev[
i];
291 }
292 }
293 }
294
296 int vec_size,
int component,
int shift,
int *prev)
297 {
298 if (vec_pos < vec_size)
299 return vec[vec_pos];
301 return prev[component];
303 return prev[component];
304 }
305
306 #define MKVAL(vals) ((vals)[0] | ((vals)[1] << 3) | ((vals)[2] << 6))
307
308 /* Image mode - the hardest to comprehend MSS4 coding mode.
309 *
310 * In this mode all three 16x16 blocks are coded together with a method
311 * remotely similar to the methods employed in MSS1-MSS3.
312 * The idea is that every component has a vector of 1-4 most common symbols
313 * and an escape mode for reading new value from the bitstream. Decoding
314 * consists of retrieving pixel values from the vector or reading new ones
315 * from the bitstream; depending on flags read from the bitstream, these vector
316 * positions can be updated or reused from the state of the previous line
317 * or previous pixel.
318 */
320 uint8_t *picdst[3], int mb_x, int mb_y)
321 {
322 uint8_t vec[3][4];
323 int vec_len[3];
324 int sel_len[3], sel_flag[3];
326 int prev_vec1 = 0, prev_split = 0;
327 int vals[3] = { 0 };
328 int prev_pix[3] = { 0 };
329 int prev_mode[16] = { 0 };
330 uint8_t *dst[3];
331
332 const int val_shift =
ctx->quality == 100 ? 0 : 2;
333
334 for (
i = 0;
i < 3;
i++)
335 dst[
i] =
ctx->imgbuf[
i];
336
339 for (j = 0; j < vec_len[
i]; j++) {
341 vec[
i][j] +=
ctx->prev_vec[
i][j];
342 ctx->prev_vec[
i][j] = vec[
i][j];
343 }
344 sel_flag[
i] = vec_len[
i] > 1;
345 sel_len[
i] = vec_len[
i] > 2 ? vec_len[
i] - 2 : 0;
346 }
347
348 for (j = 0; j < 16; j++) {
352 prev_mode[0] = 0;
353 vals[0] = vals[1] = vals[2] = 0;
355 } else {
359 }
360 for (
i = 0;
i < 16;
i++) {
362 vals[0] = prev_mode[
i] & 7;
363 vals[1] = (prev_mode[
i] >> 3) & 7;
364 vals[2] = prev_mode[
i] >> 6;
367 }
368 }
else if (
mode == 2) {
371 }
372 for (k = 0; k < 3; k++)
374 vec_len[k], k,
375 val_shift, prev_pix);
376 prev_mode[
i] =
MKVAL(vals);
377 }
378 } else {
381 if (
split >= prev_split)
384 } else {
386 }
388 vals[0] = prev_mode[0] & 7;
389 vals[1] = (prev_mode[0] >> 3) & 7;
390 vals[2] = prev_mode[0] >> 6;
391 for (
i = 0;
i < 3;
i++) {
392 for (k = 0; k <
split; k++) {
394 vec_len[
i],
i, val_shift,
395 prev_pix);
396 prev_mode[k] =
MKVAL(vals);
397 }
398 }
399 }
400
402 vals[0] = prev_vec1 & 7;
403 vals[1] = (prev_vec1 >> 3) & 7;
404 vals[2] = prev_vec1 >> 6;
407 prev_vec1 =
MKVAL(vals);
408 }
409 for (
i = 0;
i < 3;
i++) {
410 for (k = 0; k < 16 -
split; k++) {
412 vec_len[
i],
i, val_shift,
413 prev_pix);
415 }
416 }
417 }
418 }
419 }
420
421 for (
i = 0;
i < 3;
i++)
422 for (j = 0; j < 16; j++)
423 memcpy(picdst[
i] + mb_x * 16 + j *
ctx->pic->linesize[
i],
424 ctx->imgbuf[
i] + j * 16, 16);
425
426 return 0;
427 }
428
430 {
432
433 c->dc_cache[0][
TOP] =
c->prev_dc[0][mb_x * 2 + 1];
434 c->dc_cache[0][
LEFT] = 0;
435 c->dc_cache[1][
TOP] = 0;
436 c->dc_cache[1][
LEFT] = 0;
437
438 for (
i = 0;
i < 2;
i++)
439 c->prev_dc[0][mb_x * 2 +
i] = 0;
440
442 c->dc_cache[
i + 1][
TOP] =
c->prev_dc[
i][mb_x];
443 c->dc_cache[
i + 1][
LEFT] = 0;
444 c->prev_dc[
i][mb_x] = 0;
445 }
446 }
447
450 {
451 const uint8_t *buf = avpkt->
data;
452 int buf_size = avpkt->
size;
456 uint8_t *dst[3];
458 int x, y,
i, mb_width, mb_height, blk_type;
460
463 "Frame should have at least %d bytes, got %d instead\n",
466 }
467
469 width = bytestream2_get_be16(&bc);
470 height = bytestream2_get_be16(&bc);
472 quality = bytestream2_get_byte(&bc);
474
480 }
483
484 if (quality < 1 || quality > 100) {
487 }
491 }
492
495 "Empty frame found but it is not a skip frame.\n");
497 }
500
503
510 *got_frame = 1;
513
514 return buf_size;
515 }
516
519 for (
i = 0;
i < 2;
i++)
521 }
522
525 dst[0] =
c->pic->data[0];
526 dst[1] =
c->pic->data[1];
527 dst[2] =
c->pic->data[2];
528
529 memset(
c->prev_vec, 0,
sizeof(
c->prev_vec));
530 for (y = 0; y < mb_height; y++) {
531 memset(
c->dc_cache, 0,
sizeof(
c->dc_cache));
532 for (x = 0; x < mb_width; x++) {
534 switch (blk_type) {
538 "Error decoding DCT block %d,%d\n",
539 x, y);
541 }
542 break;
546 "Error decoding VQ block %d,%d\n",
547 x, y);
549 }
550 break;
555 }
556 break;
557 }
560 }
561 dst[0] +=
c->pic->linesize[0] * 16;
562 dst[1] +=
c->pic->linesize[1] * 16;
563 dst[2] +=
c->pic->linesize[2] * 16;
564 }
565
568
569 *got_frame = 1;
570
571 return buf_size;
572 }
573
575 {
578
580 for (
i = 0;
i < 3;
i++)
582
583 return 0;
584 }
585
587 {
591
592 for (
i = 0;
i < 3;
i++) {
595 if (!
c->prev_dc[
i]) {
598 }
599 }
600
604
606
608
609 return 0;
610 }
611
623 };
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]