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
33
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;
95
96 if (n << scale > range)
97 scale--;
98
100
102
104
106
108 }
109
111 {
112 int range = c->
high - c->
low + 1,
n = *probs;
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)
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)
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 {
201 uint16_t *p = dst;
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 {
377
379
382 if (i < 0)
383 return i;
385 }
386
388
390
394 }
395
399 }
400
402
407 }
408
410
411 v->
bits = buf_size * 8;
412
419
421
423
425
427
434 "Asymmetric WMV9 rectangle subsampling");
435
437
438 if (wmv9_mask != -1)
445 w, h);
446 else
451 w, h);
452
454
455 return 0;
456 }
457
461
462 #define MAX_WMV9_RECTANGLES 20
463 #define ARITH2_PADDING 2
464
467 {
469 int buf_size = avpkt->
size;
476
477 int keyframe, has_wmv9, has_mv, is_rle, is_555,
ret;
478
480 int used_rects = 0, i, implicit_rect = 0,
av_uninit(wmv9_mask);
481
484
486
500 else
502 } else
504 } else {
505 if (keyframe)
507 }
508 } else
510
514
518
519 if (buf_size < 1)
521
524
528
529 if (has_wmv9) {
532
533 implicit_rect = !arith2_get_bit(&acoder);
534
535 while (arith2_get_bit(&acoder)) {
538 r = &wmv9rects[used_rects];
539 if (!used_rects)
541 else
543 wmv9rects[used_rects - 1].
x) +
544 wmv9rects[used_rects - 1].
x;
548 used_rects++;
549 }
550
551 if (implicit_rect && used_rects) {
554 }
555
556 if (implicit_rect) {
559 wmv9rects[0].
w = avctx->
width;
560 wmv9rects[0].
h = avctx->
height;
561
562 used_rects = 1;
563 }
564 for (i = 0; i < used_rects; i++) {
565 if (!implicit_rect && arith2_get_bit(&acoder)) {
568 }
569 if (!i) {
570 wmv9_mask = arith2_get_bit(&acoder) - 1;
571 if (!wmv9_mask)
573 }
575 }
576
579 if (buf_size < 1)
581 }
582
584 if (keyframe && !is_555) {
587 buf += i;
588 buf_size -= i;
589 } else if (has_mv) {
590 buf += 4;
591 buf_size -= 4;
592 if (buf_size < 1)
596 }
597
598 if (c->
mvX < 0 || c->
mvY < 0) {
600
603
608 } else {
611 }
612 } else {
617
619 }
623
626
627 if (is_555) {
629
633
635 } else {
636 if (keyframe) {
641 }
642 if (is_rle) {
650
657
661 } else if (!implicit_rect || wmv9_mask != -1) {
671
675 if (buf_size < 1)
684
687 }
688 } else
690 }
691
692 if (has_wmv9) {
693 for (i = 0; i < used_rects; i++) {
694 int x = wmv9rects[i].
x;
695 int y = wmv9rects[i].
y;
696 int w = wmv9rects[i].
w;
697 int h = wmv9rects[i].
h;
698 if (wmv9rects[i].coded) {
699 int WMV9codedFrameSize;
700 if (buf_size < 4 || !(WMV9codedFrameSize =
AV_RL24(buf)))
702 if (ret =
decode_wmv9(avctx, buf + 3, buf_size - 3,
703 x, y, w, h, wmv9_mask))
705 buf += WMV9codedFrameSize + 3;
706 buf_size -= WMV9codedFrameSize + 3;
707 } else {
709 if (wmv9_mask != -1) {
711 wmv9_mask,
714 w, h);
715 } else {
716 do {
717 memset(dst, 0x80, w * 3);
719 } while (--h);
720 }
721 }
722 }
723 }
724
725 if (buf_size)
727
728 if (c->
mvX < 0 || c->
mvY < 0) {
731 if (ret < 0)
733 }
734
735 *got_frame = 1;
736
738 }
739
741 {
744
748
752
754
759
762
766
768
770
773
775
777
780
783
785
787
789
793
794 /* error concealment */
797
798 return 0;
799 }
800
802 {
804
806
811
812 return 0;
813 }
814
816 {
829 }
833 }
835
838
839 return 0;
840 }
841
852 };