1 /*
2 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
24 */
25
32
42
44 {
45 while ((c->
high >> 15) - (c->
low >> 15) < 2) {
46 if ((c->
low ^ c->
high) & 0x10000) {
50 }
51 c->
high = c->
high << 8 & 0xFFFFFF | 0xFF;
53 c->
low = c->
low << 8 & 0xFFFFFF;
54 }
55 }
56
58
59 /* L. Stuiver and A. Moffat: "Piecewise Integer Mapping for Arithmetic Coding."
60 * In Proc. 8th Data Compression Conference (DCC '98), pp. 3-12, Mar. 1998 */
61
63 {
64 int split = (n << 1) - range;
65
66 if (value > split)
67 return split + (value - split >> 1);
68 else
70 }
71
73 int low, int high, int n)
74 {
75 int split = (n << 1) - range;
76
77 if (high > split)
78 c->
high = split + (high - split << 1);
79 else
81
83
84 if (low > split)
85 c->
low += split + (low - split << 1);
86 else
88 }
89
91 {
92 int range = c->
high - c->
low + 1;
94 int val;
95
96 if (n << scale > range)
97 scale--;
98
100
102
104
106
107 return val;
108 }
109
111 {
112 int range = c->
high - c->
low + 1, n = *probs;
114 int i = 0, val;
115
116 if (n << scale > range)
117 scale--;
118
120
122 while (probs[++i] > val) ;
123
125 probs[i] << scale, probs[i - 1] << scale, n);
126
127 return i;
128 }
129
131
133 {
134 int diff = (c->high >> 16) - (c->low >> 16);
137
138 while (!(diff & 0x80)) {
139 bits++;
140 diff <<= 1;
141 }
142
143 return (bits + bp + 7 >> 3) + ((c->low >> 16) + 1 == c->high >> 16);
144 }
145
147 {
150 c->
value = bytestream2_get_be24(gB);
154 }
155
157 {
158 int i, ncol;
160
162 return 0;
163
164 ncol = *buf++;
165 if (ncol > ctx->
free_colours || buf_size < 2 + ncol * 3)
166 return -1;
167 for (i = 0; i < ncol; i++)
169
170 return 1 + ncol * 3;
171 }
172
174 int keyframe, int w, int h)
175 {
176 int last_symbol = 0, repeat = 0, prev_avail = 0;
177
178 if (!keyframe) {
179 int x, y, endx, endy,
t;
180
181 #define READ_PAIR(a, b) \
182 a = bytestream2_get_byte(gB) << 4; \
183 t = bytestream2_get_byte(gB); \
184 a |= t >> 4; \
185 b = (t & 0xF) << 8; \
186 b |= bytestream2_get_byte(gB); \
187
190
191 if (endx >= w || endy >= h || x > endx || y > endy)
192 return -1;
193 dst += x + stride * y;
194 w = endx - x + 1;
195 h = endy - y + 1;
196 if (y)
197 prev_avail = 1;
198 }
199
200 do {
202 do {
203 if (repeat-- < 1) {
204 int b = bytestream2_get_byte(gB);
205 if (b < 128)
206 last_symbol = b << 8 | bytestream2_get_byte(gB);
207 else if (b > 129) {
208 repeat = 0;
209 while (b-- > 130)
210 repeat = (repeat << 8) + bytestream2_get_byte(gB) + 1;
211 if (last_symbol == -2) {
212 int skip =
FFMIN((
unsigned)repeat, dst + w - p);
213 repeat -= skip;
214 p += skip;
215 }
216 } else
217 last_symbol = 127 -
b;
218 }
219 if (last_symbol >= 0)
220 *p = last_symbol;
221 else if (last_symbol == -1 && prev_avail)
223 } while (++p < dst + w);
225 prev_avail = 1;
226 } while (--h);
227
228 return 0;
229 }
230
232 uint8_t *rgb_dst,
int rgb_stride, uint32_t *pal,
233 int keyframe, int kf_slipt, int slice, int w, int h)
234 {
236 uint32_t codes[270];
238
239 int current_length = 0, read_codes = 0, next_code = 0, current_codes = 0;
240 int remaining_codes, surplus_codes, i;
241
242 const int alphabet_size = 270 - keyframe;
243
244 int last_symbol = 0, repeat = 0, prev_avail = 0;
245
246 if (!keyframe) {
247 int x, y, clipw, cliph;
248
253
254 if (x + clipw > w || y + cliph > h)
256 pal_dst += pal_stride * y + x;
257 rgb_dst += rgb_stride * y + x * 3;
258 w = clipw;
259 h = cliph;
260 if (y)
261 prev_avail = 1;
262 } else {
263 if (slice > 0) {
264 pal_dst += pal_stride * kf_slipt;
265 rgb_dst += rgb_stride * kf_slipt;
266 prev_avail = 1;
267 h -= kf_slipt;
268 } else
269 h = kf_slipt;
270 }
271
272 /* read explicit codes */
273 do {
274 while (current_codes--) {
276 if (symbol >= 204 - keyframe)
277 symbol += 14 - keyframe;
278 else if (symbol > 189)
279 symbol =
get_bits1(gb) + (symbol << 1) - 190;
280 if (bits[symbol])
282 bits[symbol] = current_length;
283 codes[symbol] = next_code++;
284 read_codes++;
285 }
286 current_length++;
287 next_code <<= 1;
288 remaining_codes = (1 << current_length) - next_code;
289 current_codes =
get_bits(gb, av_ceil_log2(remaining_codes + 1));
290 if (current_length > 22 || current_codes > remaining_codes)
292 } while (current_codes != remaining_codes);
293
294 remaining_codes = alphabet_size - read_codes;
295
296 /* determine the minimum length to fit the rest of the alphabet */
297 while ((surplus_codes = (2 << current_length) -
298 (next_code << 1) - remaining_codes) < 0) {
299 current_length++;
300 next_code <<= 1;
301 }
302
303 /* add the rest of the symbols lexicographically */
304 for (i = 0; i < alphabet_size; i++)
305 if (!bits[i]) {
306 if (surplus_codes-- == 0) {
307 current_length++;
308 next_code <<= 1;
309 }
310 bits[i] = current_length;
311 codes[i] = next_code++;
312 }
313
314 if (next_code != 1 << current_length)
316
317 if (i =
init_vlc(&vlc, 9, alphabet_size, bits, 1, 1, codes, 4, 4, 0))
318 return i;
319
320 /* frame decode */
321 do {
324 do {
325 if (repeat-- < 1) {
327 if (b < 256)
329 else if (b < 268) {
330 b -= 256;
331 if (b == 11)
333
334 if (!b)
335 repeat = 0;
336 else
338
339 repeat += (1 <<
b) - 1;
340
341 if (last_symbol == -2) {
342 int skip =
FFMIN(repeat, pal_dst + w - pp);
343 repeat -= skip;
344 pp += skip;
345 rp += skip * 3;
346 }
347 } else
348 last_symbol = 267 -
b;
349 }
350 if (last_symbol >= 0) {
351 *pp = last_symbol;
353 } else if (last_symbol == -1 && prev_avail) {
354 *pp = *(pp - pal_stride);
355 memcpy(rp, rp - rgb_stride, 3);
356 }
357 rp += 3;
358 } while (++pp < pal_dst + w);
359 pal_dst += pal_stride;
360 rgb_dst += rgb_stride;
361 prev_avail = 1;
362 } while (--h);
363
365 return 0;
366 }
367
369 int x, int y, int w, int h, int wmv9_mask)
370 {
376
378
381 if (i < 0)
382 return -1;
384 }
385
387
389
393 }
394
398 }
399
401
405 return -1;
406 }
407
409
410 v->
bits = buf_size * 8;
411
418
420
422
424
426
433 "Asymmetric WMV9 rectangle subsampling\n");
434
436
437 if (wmv9_mask != -1)
444 w, h);
445 else
450 w, h);
451
453
454 return 0;
455 }
456
460
461 #define MAX_WMV9_RECTANGLES 20
462 #define ARITH2_PADDING 2
463
466 {
468 int buf_size = avpkt->
size;
474
475 int keyframe, has_wmv9, has_mv, is_rle, is_555, ret;
476
478 int used_rects = 0, i, implicit_rect = 0,
av_uninit(wmv9_mask);
479
482
484
498 else
500 } else
502 } else {
503 if (keyframe)
505 }
506 } else
508
512
516
517 if (buf_size < 1)
519
522
526
527 if (has_wmv9) {
530
531 implicit_rect = !arith2_get_bit(&acoder);
532
533 while (arith2_get_bit(&acoder)) {
536 r = &wmv9rects[used_rects];
537 if (!used_rects)
539 else
541 wmv9rects[used_rects - 1].
x) +
542 wmv9rects[used_rects - 1].
x;
546 used_rects++;
547 }
548
549 if (implicit_rect && used_rects) {
552 }
553
554 if (implicit_rect) {
557 wmv9rects[0].
w = avctx->
width;
558 wmv9rects[0].
h = avctx->
height;
559
560 used_rects = 1;
561 }
562 for (i = 0; i < used_rects; i++) {
563 if (!implicit_rect && arith2_get_bit(&acoder)) {
566 }
567 if (!i) {
568 wmv9_mask = arith2_get_bit(&acoder) - 1;
569 if (!wmv9_mask)
571 }
573 }
574
577 if (buf_size < 1)
579 }
580
582 if (keyframe && !is_555) {
585 buf += i;
586 buf_size -= i;
587 } else if (has_mv) {
588 buf += 4;
589 buf_size -= 4;
590 if (buf_size < 1)
594 }
595
596 if (c->
mvX < 0 || c->
mvY < 0) {
599
602
608
611 return ret;
612 }
613
618 } else {
620 return -1;
621 }
622 } else {
625
631
634 return ret;
635 }
636
638 }
642
645
646 if (is_555) {
648
652
654 } else {
655 if (keyframe) {
660 }
661 if (is_rle) {
667 return ret;
669
675 return ret;
676
680 } else if (!implicit_rect || wmv9_mask != -1) {
690
694 if (buf_size < 1)
703
706 }
707 } else
709 }
710
711 if (has_wmv9) {
712 for (i = 0; i < used_rects; i++) {
713 int x = wmv9rects[i].
x;
714 int y = wmv9rects[i].
y;
715 int w = wmv9rects[i].
w;
716 int h = wmv9rects[i].
h;
717 if (wmv9rects[i].coded) {
718 int WMV9codedFrameSize;
719 if (buf_size < 4 || !(WMV9codedFrameSize =
AV_RL24(buf)))
721 if (ret =
decode_wmv9(avctx, buf + 3, buf_size - 3,
722 x, y, w, h, wmv9_mask))
723 return ret;
724 buf += WMV9codedFrameSize + 3;
725 buf_size -= WMV9codedFrameSize + 3;
726 } else {
728 if (wmv9_mask != -1) {
730 wmv9_mask,
733 w, h);
734 } else {
735 do {
736 memset(dst, 0x80, w * 3);
738 } while (--h);
739 }
740 }
741 }
742 }
743
744 if (buf_size)
746
747 *got_frame = 1;
749
751 }
752
754 {
756
760
763
765 return -1;
767
769
774
777
781
783
785
788
790
792
795
798
800
802
804
807 return -1;
808
809 /* error concealment */
812
813 return 0;
814 }
815
817 {
819
824
829
830 return 0;
831 }
832
834 {
837 int ret;
841 return ret;
848 }
851 return ret;
852 }
854
857
858 return 0;
859 }
860
871 };