annotate ffmpeg/libavcodec/mss2.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
yading@10 3 *
yading@10 4 * This file is part of FFmpeg.
yading@10 5 *
yading@10 6 * FFmpeg is free software; you can redistribute it and/or
yading@10 7 * modify it under the terms of the GNU Lesser General Public
yading@10 8 * License as published by the Free Software Foundation; either
yading@10 9 * version 2.1 of the License, or (at your option) any later version.
yading@10 10 *
yading@10 11 * FFmpeg is distributed in the hope that it will be useful,
yading@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 14 * Lesser General Public License for more details.
yading@10 15 *
yading@10 16 * You should have received a copy of the GNU Lesser General Public
yading@10 17 * License along with FFmpeg; if not, write to the Free Software
yading@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 19 */
yading@10 20
yading@10 21 /**
yading@10 22 * @file
yading@10 23 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
yading@10 24 */
yading@10 25
yading@10 26 #include "libavutil/avassert.h"
yading@10 27 #include "error_resilience.h"
yading@10 28 #include "internal.h"
yading@10 29 #include "msmpeg4data.h"
yading@10 30 #include "vc1.h"
yading@10 31 #include "mss12.h"
yading@10 32 #include "mss2dsp.h"
yading@10 33
yading@10 34 typedef struct MSS2Context {
yading@10 35 VC1Context v;
yading@10 36 int split_position;
yading@10 37 AVFrame last_pic;
yading@10 38 MSS12Context c;
yading@10 39 MSS2DSPContext dsp;
yading@10 40 SliceContext sc[2];
yading@10 41 } MSS2Context;
yading@10 42
yading@10 43 static void arith2_normalise(ArithCoder *c)
yading@10 44 {
yading@10 45 while ((c->high >> 15) - (c->low >> 15) < 2) {
yading@10 46 if ((c->low ^ c->high) & 0x10000) {
yading@10 47 c->high ^= 0x8000;
yading@10 48 c->value ^= 0x8000;
yading@10 49 c->low ^= 0x8000;
yading@10 50 }
yading@10 51 c->high = c->high << 8 & 0xFFFFFF | 0xFF;
yading@10 52 c->value = c->value << 8 & 0xFFFFFF | bytestream2_get_byte(c->gbc.gB);
yading@10 53 c->low = c->low << 8 & 0xFFFFFF;
yading@10 54 }
yading@10 55 }
yading@10 56
yading@10 57 ARITH_GET_BIT(2)
yading@10 58
yading@10 59 /* L. Stuiver and A. Moffat: "Piecewise Integer Mapping for Arithmetic Coding."
yading@10 60 * In Proc. 8th Data Compression Conference (DCC '98), pp. 3-12, Mar. 1998 */
yading@10 61
yading@10 62 static int arith2_get_scaled_value(int value, int n, int range)
yading@10 63 {
yading@10 64 int split = (n << 1) - range;
yading@10 65
yading@10 66 if (value > split)
yading@10 67 return split + (value - split >> 1);
yading@10 68 else
yading@10 69 return value;
yading@10 70 }
yading@10 71
yading@10 72 static void arith2_rescale_interval(ArithCoder *c, int range,
yading@10 73 int low, int high, int n)
yading@10 74 {
yading@10 75 int split = (n << 1) - range;
yading@10 76
yading@10 77 if (high > split)
yading@10 78 c->high = split + (high - split << 1);
yading@10 79 else
yading@10 80 c->high = high;
yading@10 81
yading@10 82 c->high += c->low - 1;
yading@10 83
yading@10 84 if (low > split)
yading@10 85 c->low += split + (low - split << 1);
yading@10 86 else
yading@10 87 c->low += low;
yading@10 88 }
yading@10 89
yading@10 90 static int arith2_get_number(ArithCoder *c, int n)
yading@10 91 {
yading@10 92 int range = c->high - c->low + 1;
yading@10 93 int scale = av_log2(range) - av_log2(n);
yading@10 94 int val;
yading@10 95
yading@10 96 if (n << scale > range)
yading@10 97 scale--;
yading@10 98
yading@10 99 n <<= scale;
yading@10 100
yading@10 101 val = arith2_get_scaled_value(c->value - c->low, n, range) >> scale;
yading@10 102
yading@10 103 arith2_rescale_interval(c, range, val << scale, (val + 1) << scale, n);
yading@10 104
yading@10 105 arith2_normalise(c);
yading@10 106
yading@10 107 return val;
yading@10 108 }
yading@10 109
yading@10 110 static int arith2_get_prob(ArithCoder *c, int16_t *probs)
yading@10 111 {
yading@10 112 int range = c->high - c->low + 1, n = *probs;
yading@10 113 int scale = av_log2(range) - av_log2(n);
yading@10 114 int i = 0, val;
yading@10 115
yading@10 116 if (n << scale > range)
yading@10 117 scale--;
yading@10 118
yading@10 119 n <<= scale;
yading@10 120
yading@10 121 val = arith2_get_scaled_value(c->value - c->low, n, range) >> scale;
yading@10 122 while (probs[++i] > val) ;
yading@10 123
yading@10 124 arith2_rescale_interval(c, range,
yading@10 125 probs[i] << scale, probs[i - 1] << scale, n);
yading@10 126
yading@10 127 return i;
yading@10 128 }
yading@10 129
yading@10 130 ARITH_GET_MODEL_SYM(2)
yading@10 131
yading@10 132 static int arith2_get_consumed_bytes(ArithCoder *c)
yading@10 133 {
yading@10 134 int diff = (c->high >> 16) - (c->low >> 16);
yading@10 135 int bp = bytestream2_tell(c->gbc.gB) - 3 << 3;
yading@10 136 int bits = 1;
yading@10 137
yading@10 138 while (!(diff & 0x80)) {
yading@10 139 bits++;
yading@10 140 diff <<= 1;
yading@10 141 }
yading@10 142
yading@10 143 return (bits + bp + 7 >> 3) + ((c->low >> 16) + 1 == c->high >> 16);
yading@10 144 }
yading@10 145
yading@10 146 static void arith2_init(ArithCoder *c, GetByteContext *gB)
yading@10 147 {
yading@10 148 c->low = 0;
yading@10 149 c->high = 0xFFFFFF;
yading@10 150 c->value = bytestream2_get_be24(gB);
yading@10 151 c->gbc.gB = gB;
yading@10 152 c->get_model_sym = arith2_get_model_sym;
yading@10 153 c->get_number = arith2_get_number;
yading@10 154 }
yading@10 155
yading@10 156 static int decode_pal_v2(MSS12Context *ctx, const uint8_t *buf, int buf_size)
yading@10 157 {
yading@10 158 int i, ncol;
yading@10 159 uint32_t *pal = ctx->pal + 256 - ctx->free_colours;
yading@10 160
yading@10 161 if (!ctx->free_colours)
yading@10 162 return 0;
yading@10 163
yading@10 164 ncol = *buf++;
yading@10 165 if (ncol > ctx->free_colours || buf_size < 2 + ncol * 3)
yading@10 166 return AVERROR_INVALIDDATA;
yading@10 167 for (i = 0; i < ncol; i++)
yading@10 168 *pal++ = AV_RB24(buf + 3 * i);
yading@10 169
yading@10 170 return 1 + ncol * 3;
yading@10 171 }
yading@10 172
yading@10 173 static int decode_555(GetByteContext *gB, uint16_t *dst, int stride,
yading@10 174 int keyframe, int w, int h)
yading@10 175 {
yading@10 176 int last_symbol = 0, repeat = 0, prev_avail = 0;
yading@10 177
yading@10 178 if (!keyframe) {
yading@10 179 int x, y, endx, endy, t;
yading@10 180
yading@10 181 #define READ_PAIR(a, b) \
yading@10 182 a = bytestream2_get_byte(gB) << 4; \
yading@10 183 t = bytestream2_get_byte(gB); \
yading@10 184 a |= t >> 4; \
yading@10 185 b = (t & 0xF) << 8; \
yading@10 186 b |= bytestream2_get_byte(gB); \
yading@10 187
yading@10 188 READ_PAIR(x, endx)
yading@10 189 READ_PAIR(y, endy)
yading@10 190
yading@10 191 if (endx >= w || endy >= h || x > endx || y > endy)
yading@10 192 return AVERROR_INVALIDDATA;
yading@10 193 dst += x + stride * y;
yading@10 194 w = endx - x + 1;
yading@10 195 h = endy - y + 1;
yading@10 196 if (y)
yading@10 197 prev_avail = 1;
yading@10 198 }
yading@10 199
yading@10 200 do {
yading@10 201 uint16_t *p = dst;
yading@10 202 do {
yading@10 203 if (repeat-- < 1) {
yading@10 204 int b = bytestream2_get_byte(gB);
yading@10 205 if (b < 128)
yading@10 206 last_symbol = b << 8 | bytestream2_get_byte(gB);
yading@10 207 else if (b > 129) {
yading@10 208 repeat = 0;
yading@10 209 while (b-- > 130)
yading@10 210 repeat = (repeat << 8) + bytestream2_get_byte(gB) + 1;
yading@10 211 if (last_symbol == -2) {
yading@10 212 int skip = FFMIN((unsigned)repeat, dst + w - p);
yading@10 213 repeat -= skip;
yading@10 214 p += skip;
yading@10 215 }
yading@10 216 } else
yading@10 217 last_symbol = 127 - b;
yading@10 218 }
yading@10 219 if (last_symbol >= 0)
yading@10 220 *p = last_symbol;
yading@10 221 else if (last_symbol == -1 && prev_avail)
yading@10 222 *p = *(p - stride);
yading@10 223 } while (++p < dst + w);
yading@10 224 dst += stride;
yading@10 225 prev_avail = 1;
yading@10 226 } while (--h);
yading@10 227
yading@10 228 return 0;
yading@10 229 }
yading@10 230
yading@10 231 static int decode_rle(GetBitContext *gb, uint8_t *pal_dst, int pal_stride,
yading@10 232 uint8_t *rgb_dst, int rgb_stride, uint32_t *pal,
yading@10 233 int keyframe, int kf_slipt, int slice, int w, int h)
yading@10 234 {
yading@10 235 uint8_t bits[270] = { 0 };
yading@10 236 uint32_t codes[270];
yading@10 237 VLC vlc;
yading@10 238
yading@10 239 int current_length = 0, read_codes = 0, next_code = 0, current_codes = 0;
yading@10 240 int remaining_codes, surplus_codes, i;
yading@10 241
yading@10 242 const int alphabet_size = 270 - keyframe;
yading@10 243
yading@10 244 int last_symbol = 0, repeat = 0, prev_avail = 0;
yading@10 245
yading@10 246 if (!keyframe) {
yading@10 247 int x, y, clipw, cliph;
yading@10 248
yading@10 249 x = get_bits(gb, 12);
yading@10 250 y = get_bits(gb, 12);
yading@10 251 clipw = get_bits(gb, 12) + 1;
yading@10 252 cliph = get_bits(gb, 12) + 1;
yading@10 253
yading@10 254 if (x + clipw > w || y + cliph > h)
yading@10 255 return AVERROR_INVALIDDATA;
yading@10 256 pal_dst += pal_stride * y + x;
yading@10 257 rgb_dst += rgb_stride * y + x * 3;
yading@10 258 w = clipw;
yading@10 259 h = cliph;
yading@10 260 if (y)
yading@10 261 prev_avail = 1;
yading@10 262 } else {
yading@10 263 if (slice > 0) {
yading@10 264 pal_dst += pal_stride * kf_slipt;
yading@10 265 rgb_dst += rgb_stride * kf_slipt;
yading@10 266 prev_avail = 1;
yading@10 267 h -= kf_slipt;
yading@10 268 } else
yading@10 269 h = kf_slipt;
yading@10 270 }
yading@10 271
yading@10 272 /* read explicit codes */
yading@10 273 do {
yading@10 274 while (current_codes--) {
yading@10 275 int symbol = get_bits(gb, 8);
yading@10 276 if (symbol >= 204 - keyframe)
yading@10 277 symbol += 14 - keyframe;
yading@10 278 else if (symbol > 189)
yading@10 279 symbol = get_bits1(gb) + (symbol << 1) - 190;
yading@10 280 if (bits[symbol])
yading@10 281 return AVERROR_INVALIDDATA;
yading@10 282 bits[symbol] = current_length;
yading@10 283 codes[symbol] = next_code++;
yading@10 284 read_codes++;
yading@10 285 }
yading@10 286 current_length++;
yading@10 287 next_code <<= 1;
yading@10 288 remaining_codes = (1 << current_length) - next_code;
yading@10 289 current_codes = get_bits(gb, av_ceil_log2(remaining_codes + 1));
yading@10 290 if (current_length > 22 || current_codes > remaining_codes)
yading@10 291 return AVERROR_INVALIDDATA;
yading@10 292 } while (current_codes != remaining_codes);
yading@10 293
yading@10 294 remaining_codes = alphabet_size - read_codes;
yading@10 295
yading@10 296 /* determine the minimum length to fit the rest of the alphabet */
yading@10 297 while ((surplus_codes = (2 << current_length) -
yading@10 298 (next_code << 1) - remaining_codes) < 0) {
yading@10 299 current_length++;
yading@10 300 next_code <<= 1;
yading@10 301 }
yading@10 302
yading@10 303 /* add the rest of the symbols lexicographically */
yading@10 304 for (i = 0; i < alphabet_size; i++)
yading@10 305 if (!bits[i]) {
yading@10 306 if (surplus_codes-- == 0) {
yading@10 307 current_length++;
yading@10 308 next_code <<= 1;
yading@10 309 }
yading@10 310 bits[i] = current_length;
yading@10 311 codes[i] = next_code++;
yading@10 312 }
yading@10 313
yading@10 314 if (next_code != 1 << current_length)
yading@10 315 return AVERROR_INVALIDDATA;
yading@10 316
yading@10 317 if (i = init_vlc(&vlc, 9, alphabet_size, bits, 1, 1, codes, 4, 4, 0))
yading@10 318 return i;
yading@10 319
yading@10 320 /* frame decode */
yading@10 321 do {
yading@10 322 uint8_t *pp = pal_dst;
yading@10 323 uint8_t *rp = rgb_dst;
yading@10 324 do {
yading@10 325 if (repeat-- < 1) {
yading@10 326 int b = get_vlc2(gb, vlc.table, 9, 3);
yading@10 327 if (b < 256)
yading@10 328 last_symbol = b;
yading@10 329 else if (b < 268) {
yading@10 330 b -= 256;
yading@10 331 if (b == 11)
yading@10 332 b = get_bits(gb, 4) + 10;
yading@10 333
yading@10 334 if (!b)
yading@10 335 repeat = 0;
yading@10 336 else
yading@10 337 repeat = get_bits(gb, b);
yading@10 338
yading@10 339 repeat += (1 << b) - 1;
yading@10 340
yading@10 341 if (last_symbol == -2) {
yading@10 342 int skip = FFMIN(repeat, pal_dst + w - pp);
yading@10 343 repeat -= skip;
yading@10 344 pp += skip;
yading@10 345 rp += skip * 3;
yading@10 346 }
yading@10 347 } else
yading@10 348 last_symbol = 267 - b;
yading@10 349 }
yading@10 350 if (last_symbol >= 0) {
yading@10 351 *pp = last_symbol;
yading@10 352 AV_WB24(rp, pal[last_symbol]);
yading@10 353 } else if (last_symbol == -1 && prev_avail) {
yading@10 354 *pp = *(pp - pal_stride);
yading@10 355 memcpy(rp, rp - rgb_stride, 3);
yading@10 356 }
yading@10 357 rp += 3;
yading@10 358 } while (++pp < pal_dst + w);
yading@10 359 pal_dst += pal_stride;
yading@10 360 rgb_dst += rgb_stride;
yading@10 361 prev_avail = 1;
yading@10 362 } while (--h);
yading@10 363
yading@10 364 ff_free_vlc(&vlc);
yading@10 365 return 0;
yading@10 366 }
yading@10 367
yading@10 368 static int decode_wmv9(AVCodecContext *avctx, const uint8_t *buf, int buf_size,
yading@10 369 int x, int y, int w, int h, int wmv9_mask)
yading@10 370 {
yading@10 371 MSS2Context *ctx = avctx->priv_data;
yading@10 372 MSS12Context *c = &ctx->c;
yading@10 373 VC1Context *v = avctx->priv_data;
yading@10 374 MpegEncContext *s = &v->s;
yading@10 375 AVFrame *f;
yading@10 376 int ret;
yading@10 377
yading@10 378 ff_mpeg_flush(avctx);
yading@10 379
yading@10 380 if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
yading@10 381 int i = ff_find_unused_picture(s, 0);
yading@10 382 if (i < 0)
yading@10 383 return i;
yading@10 384 s->current_picture_ptr = &s->picture[i];
yading@10 385 }
yading@10 386
yading@10 387 init_get_bits(&s->gb, buf, buf_size * 8);
yading@10 388
yading@10 389 s->loop_filter = avctx->skip_loop_filter < AVDISCARD_ALL;
yading@10 390
yading@10 391 if (ff_vc1_parse_frame_header(v, &s->gb) == -1) {
yading@10 392 av_log(v->s.avctx, AV_LOG_ERROR, "header error\n");
yading@10 393 return AVERROR_INVALIDDATA;
yading@10 394 }
yading@10 395
yading@10 396 if (s->pict_type != AV_PICTURE_TYPE_I) {
yading@10 397 av_log(v->s.avctx, AV_LOG_ERROR, "expected I-frame\n");
yading@10 398 return AVERROR_INVALIDDATA;
yading@10 399 }
yading@10 400
yading@10 401 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
yading@10 402
yading@10 403 if ((ret = ff_MPV_frame_start(s, avctx)) < 0) {
yading@10 404 av_log(v->s.avctx, AV_LOG_ERROR, "ff_MPV_frame_start error\n");
yading@10 405 avctx->pix_fmt = AV_PIX_FMT_RGB24;
yading@10 406 return ret;
yading@10 407 }
yading@10 408
yading@10 409 ff_mpeg_er_frame_start(s);
yading@10 410
yading@10 411 v->bits = buf_size * 8;
yading@10 412
yading@10 413 v->end_mb_x = (w + 15) >> 4;
yading@10 414 s->end_mb_y = (h + 15) >> 4;
yading@10 415 if (v->respic & 1)
yading@10 416 v->end_mb_x = v->end_mb_x + 1 >> 1;
yading@10 417 if (v->respic & 2)
yading@10 418 s->end_mb_y = s->end_mb_y + 1 >> 1;
yading@10 419
yading@10 420 ff_vc1_decode_blocks(v);
yading@10 421
yading@10 422 ff_er_frame_end(&s->er);
yading@10 423
yading@10 424 ff_MPV_frame_end(s);
yading@10 425
yading@10 426 f = &s->current_picture.f;
yading@10 427
yading@10 428 if (v->respic == 3) {
yading@10 429 ctx->dsp.upsample_plane(f->data[0], f->linesize[0], w, h);
yading@10 430 ctx->dsp.upsample_plane(f->data[1], f->linesize[1], w >> 1, h >> 1);
yading@10 431 ctx->dsp.upsample_plane(f->data[2], f->linesize[2], w >> 1, h >> 1);
yading@10 432 } else if (v->respic)
yading@10 433 avpriv_request_sample(v->s.avctx,
yading@10 434 "Asymmetric WMV9 rectangle subsampling");
yading@10 435
yading@10 436 av_assert0(f->linesize[1] == f->linesize[2]);
yading@10 437
yading@10 438 if (wmv9_mask != -1)
yading@10 439 ctx->dsp.mss2_blit_wmv9_masked(c->rgb_pic + y * c->rgb_stride + x * 3,
yading@10 440 c->rgb_stride, wmv9_mask,
yading@10 441 c->pal_pic + y * c->pal_stride + x,
yading@10 442 c->pal_stride,
yading@10 443 f->data[0], f->linesize[0],
yading@10 444 f->data[1], f->data[2], f->linesize[1],
yading@10 445 w, h);
yading@10 446 else
yading@10 447 ctx->dsp.mss2_blit_wmv9(c->rgb_pic + y * c->rgb_stride + x * 3,
yading@10 448 c->rgb_stride,
yading@10 449 f->data[0], f->linesize[0],
yading@10 450 f->data[1], f->data[2], f->linesize[1],
yading@10 451 w, h);
yading@10 452
yading@10 453 avctx->pix_fmt = AV_PIX_FMT_RGB24;
yading@10 454
yading@10 455 return 0;
yading@10 456 }
yading@10 457
yading@10 458 typedef struct Rectangle {
yading@10 459 int coded, x, y, w, h;
yading@10 460 } Rectangle;
yading@10 461
yading@10 462 #define MAX_WMV9_RECTANGLES 20
yading@10 463 #define ARITH2_PADDING 2
yading@10 464
yading@10 465 static int mss2_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
yading@10 466 AVPacket *avpkt)
yading@10 467 {
yading@10 468 const uint8_t *buf = avpkt->data;
yading@10 469 int buf_size = avpkt->size;
yading@10 470 MSS2Context *ctx = avctx->priv_data;
yading@10 471 MSS12Context *c = &ctx->c;
yading@10 472 AVFrame *frame = data;
yading@10 473 GetBitContext gb;
yading@10 474 GetByteContext gB;
yading@10 475 ArithCoder acoder;
yading@10 476
yading@10 477 int keyframe, has_wmv9, has_mv, is_rle, is_555, ret;
yading@10 478
yading@10 479 Rectangle wmv9rects[MAX_WMV9_RECTANGLES], *r;
yading@10 480 int used_rects = 0, i, implicit_rect = 0, av_uninit(wmv9_mask);
yading@10 481
yading@10 482 av_assert0(FF_INPUT_BUFFER_PADDING_SIZE >=
yading@10 483 ARITH2_PADDING + (MIN_CACHE_BITS + 7) / 8);
yading@10 484
yading@10 485 init_get_bits(&gb, buf, buf_size * 8);
yading@10 486
yading@10 487 if (keyframe = get_bits1(&gb))
yading@10 488 skip_bits(&gb, 7);
yading@10 489 has_wmv9 = get_bits1(&gb);
yading@10 490 has_mv = keyframe ? 0 : get_bits1(&gb);
yading@10 491 is_rle = get_bits1(&gb);
yading@10 492 is_555 = is_rle && get_bits1(&gb);
yading@10 493 if (c->slice_split > 0)
yading@10 494 ctx->split_position = c->slice_split;
yading@10 495 else if (c->slice_split < 0) {
yading@10 496 if (get_bits1(&gb)) {
yading@10 497 if (get_bits1(&gb)) {
yading@10 498 if (get_bits1(&gb))
yading@10 499 ctx->split_position = get_bits(&gb, 16);
yading@10 500 else
yading@10 501 ctx->split_position = get_bits(&gb, 12);
yading@10 502 } else
yading@10 503 ctx->split_position = get_bits(&gb, 8) << 4;
yading@10 504 } else {
yading@10 505 if (keyframe)
yading@10 506 ctx->split_position = avctx->height / 2;
yading@10 507 }
yading@10 508 } else
yading@10 509 ctx->split_position = avctx->height;
yading@10 510
yading@10 511 if (c->slice_split && (ctx->split_position < 1 - is_555 ||
yading@10 512 ctx->split_position > avctx->height - 1))
yading@10 513 return AVERROR_INVALIDDATA;
yading@10 514
yading@10 515 align_get_bits(&gb);
yading@10 516 buf += get_bits_count(&gb) >> 3;
yading@10 517 buf_size -= get_bits_count(&gb) >> 3;
yading@10 518
yading@10 519 if (buf_size < 1)
yading@10 520 return AVERROR_INVALIDDATA;
yading@10 521
yading@10 522 if (is_555 && (has_wmv9 || has_mv || c->slice_split && ctx->split_position))
yading@10 523 return AVERROR_INVALIDDATA;
yading@10 524
yading@10 525 avctx->pix_fmt = is_555 ? AV_PIX_FMT_RGB555 : AV_PIX_FMT_RGB24;
yading@10 526 if (ctx->last_pic.format != avctx->pix_fmt)
yading@10 527 av_frame_unref(&ctx->last_pic);
yading@10 528
yading@10 529 if (has_wmv9) {
yading@10 530 bytestream2_init(&gB, buf, buf_size + ARITH2_PADDING);
yading@10 531 arith2_init(&acoder, &gB);
yading@10 532
yading@10 533 implicit_rect = !arith2_get_bit(&acoder);
yading@10 534
yading@10 535 while (arith2_get_bit(&acoder)) {
yading@10 536 if (used_rects == MAX_WMV9_RECTANGLES)
yading@10 537 return AVERROR_INVALIDDATA;
yading@10 538 r = &wmv9rects[used_rects];
yading@10 539 if (!used_rects)
yading@10 540 r->x = arith2_get_number(&acoder, avctx->width);
yading@10 541 else
yading@10 542 r->x = arith2_get_number(&acoder, avctx->width -
yading@10 543 wmv9rects[used_rects - 1].x) +
yading@10 544 wmv9rects[used_rects - 1].x;
yading@10 545 r->y = arith2_get_number(&acoder, avctx->height);
yading@10 546 r->w = arith2_get_number(&acoder, avctx->width - r->x) + 1;
yading@10 547 r->h = arith2_get_number(&acoder, avctx->height - r->y) + 1;
yading@10 548 used_rects++;
yading@10 549 }
yading@10 550
yading@10 551 if (implicit_rect && used_rects) {
yading@10 552 av_log(avctx, AV_LOG_ERROR, "implicit_rect && used_rects > 0\n");
yading@10 553 return AVERROR_INVALIDDATA;
yading@10 554 }
yading@10 555
yading@10 556 if (implicit_rect) {
yading@10 557 wmv9rects[0].x = 0;
yading@10 558 wmv9rects[0].y = 0;
yading@10 559 wmv9rects[0].w = avctx->width;
yading@10 560 wmv9rects[0].h = avctx->height;
yading@10 561
yading@10 562 used_rects = 1;
yading@10 563 }
yading@10 564 for (i = 0; i < used_rects; i++) {
yading@10 565 if (!implicit_rect && arith2_get_bit(&acoder)) {
yading@10 566 av_log(avctx, AV_LOG_ERROR, "Unexpected grandchildren\n");
yading@10 567 return AVERROR_INVALIDDATA;
yading@10 568 }
yading@10 569 if (!i) {
yading@10 570 wmv9_mask = arith2_get_bit(&acoder) - 1;
yading@10 571 if (!wmv9_mask)
yading@10 572 wmv9_mask = arith2_get_number(&acoder, 256);
yading@10 573 }
yading@10 574 wmv9rects[i].coded = arith2_get_number(&acoder, 2);
yading@10 575 }
yading@10 576
yading@10 577 buf += arith2_get_consumed_bytes(&acoder);
yading@10 578 buf_size -= arith2_get_consumed_bytes(&acoder);
yading@10 579 if (buf_size < 1)
yading@10 580 return AVERROR_INVALIDDATA;
yading@10 581 }
yading@10 582
yading@10 583 c->mvX = c->mvY = 0;
yading@10 584 if (keyframe && !is_555) {
yading@10 585 if ((i = decode_pal_v2(c, buf, buf_size)) < 0)
yading@10 586 return AVERROR_INVALIDDATA;
yading@10 587 buf += i;
yading@10 588 buf_size -= i;
yading@10 589 } else if (has_mv) {
yading@10 590 buf += 4;
yading@10 591 buf_size -= 4;
yading@10 592 if (buf_size < 1)
yading@10 593 return AVERROR_INVALIDDATA;
yading@10 594 c->mvX = AV_RB16(buf - 4) - avctx->width;
yading@10 595 c->mvY = AV_RB16(buf - 2) - avctx->height;
yading@10 596 }
yading@10 597
yading@10 598 if (c->mvX < 0 || c->mvY < 0) {
yading@10 599 FFSWAP(uint8_t *, c->pal_pic, c->last_pal_pic);
yading@10 600
yading@10 601 if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
yading@10 602 return ret;
yading@10 603
yading@10 604 if (ctx->last_pic.data[0]) {
yading@10 605 av_assert0(frame->linesize[0] == ctx->last_pic.linesize[0]);
yading@10 606 c->last_rgb_pic = ctx->last_pic.data[0] +
yading@10 607 ctx->last_pic.linesize[0] * (avctx->height - 1);
yading@10 608 } else {
yading@10 609 av_log(avctx, AV_LOG_ERROR, "Missing keyframe\n");
yading@10 610 return AVERROR_INVALIDDATA;
yading@10 611 }
yading@10 612 } else {
yading@10 613 if ((ret = ff_reget_buffer(avctx, &ctx->last_pic)) < 0)
yading@10 614 return ret;
yading@10 615 if ((ret = av_frame_ref(frame, &ctx->last_pic)) < 0)
yading@10 616 return ret;
yading@10 617
yading@10 618 c->last_rgb_pic = NULL;
yading@10 619 }
yading@10 620 c->rgb_pic = frame->data[0] +
yading@10 621 frame->linesize[0] * (avctx->height - 1);
yading@10 622 c->rgb_stride = -frame->linesize[0];
yading@10 623
yading@10 624 frame->key_frame = keyframe;
yading@10 625 frame->pict_type = keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
yading@10 626
yading@10 627 if (is_555) {
yading@10 628 bytestream2_init(&gB, buf, buf_size);
yading@10 629
yading@10 630 if (decode_555(&gB, (uint16_t *)c->rgb_pic, c->rgb_stride >> 1,
yading@10 631 keyframe, avctx->width, avctx->height))
yading@10 632 return AVERROR_INVALIDDATA;
yading@10 633
yading@10 634 buf_size -= bytestream2_tell(&gB);
yading@10 635 } else {
yading@10 636 if (keyframe) {
yading@10 637 c->corrupted = 0;
yading@10 638 ff_mss12_slicecontext_reset(&ctx->sc[0]);
yading@10 639 if (c->slice_split)
yading@10 640 ff_mss12_slicecontext_reset(&ctx->sc[1]);
yading@10 641 }
yading@10 642 if (is_rle) {
yading@10 643 init_get_bits(&gb, buf, buf_size * 8);
yading@10 644 if (ret = decode_rle(&gb, c->pal_pic, c->pal_stride,
yading@10 645 c->rgb_pic, c->rgb_stride, c->pal, keyframe,
yading@10 646 ctx->split_position, 0,
yading@10 647 avctx->width, avctx->height))
yading@10 648 return ret;
yading@10 649 align_get_bits(&gb);
yading@10 650
yading@10 651 if (c->slice_split)
yading@10 652 if (ret = decode_rle(&gb, c->pal_pic, c->pal_stride,
yading@10 653 c->rgb_pic, c->rgb_stride, c->pal, keyframe,
yading@10 654 ctx->split_position, 1,
yading@10 655 avctx->width, avctx->height))
yading@10 656 return ret;
yading@10 657
yading@10 658 align_get_bits(&gb);
yading@10 659 buf += get_bits_count(&gb) >> 3;
yading@10 660 buf_size -= get_bits_count(&gb) >> 3;
yading@10 661 } else if (!implicit_rect || wmv9_mask != -1) {
yading@10 662 if (c->corrupted)
yading@10 663 return AVERROR_INVALIDDATA;
yading@10 664 bytestream2_init(&gB, buf, buf_size + ARITH2_PADDING);
yading@10 665 arith2_init(&acoder, &gB);
yading@10 666 c->keyframe = keyframe;
yading@10 667 if (c->corrupted = ff_mss12_decode_rect(&ctx->sc[0], &acoder, 0, 0,
yading@10 668 avctx->width,
yading@10 669 ctx->split_position))
yading@10 670 return AVERROR_INVALIDDATA;
yading@10 671
yading@10 672 buf += arith2_get_consumed_bytes(&acoder);
yading@10 673 buf_size -= arith2_get_consumed_bytes(&acoder);
yading@10 674 if (c->slice_split) {
yading@10 675 if (buf_size < 1)
yading@10 676 return AVERROR_INVALIDDATA;
yading@10 677 bytestream2_init(&gB, buf, buf_size + ARITH2_PADDING);
yading@10 678 arith2_init(&acoder, &gB);
yading@10 679 if (c->corrupted = ff_mss12_decode_rect(&ctx->sc[1], &acoder, 0,
yading@10 680 ctx->split_position,
yading@10 681 avctx->width,
yading@10 682 avctx->height - ctx->split_position))
yading@10 683 return AVERROR_INVALIDDATA;
yading@10 684
yading@10 685 buf += arith2_get_consumed_bytes(&acoder);
yading@10 686 buf_size -= arith2_get_consumed_bytes(&acoder);
yading@10 687 }
yading@10 688 } else
yading@10 689 memset(c->pal_pic, 0, c->pal_stride * avctx->height);
yading@10 690 }
yading@10 691
yading@10 692 if (has_wmv9) {
yading@10 693 for (i = 0; i < used_rects; i++) {
yading@10 694 int x = wmv9rects[i].x;
yading@10 695 int y = wmv9rects[i].y;
yading@10 696 int w = wmv9rects[i].w;
yading@10 697 int h = wmv9rects[i].h;
yading@10 698 if (wmv9rects[i].coded) {
yading@10 699 int WMV9codedFrameSize;
yading@10 700 if (buf_size < 4 || !(WMV9codedFrameSize = AV_RL24(buf)))
yading@10 701 return AVERROR_INVALIDDATA;
yading@10 702 if (ret = decode_wmv9(avctx, buf + 3, buf_size - 3,
yading@10 703 x, y, w, h, wmv9_mask))
yading@10 704 return ret;
yading@10 705 buf += WMV9codedFrameSize + 3;
yading@10 706 buf_size -= WMV9codedFrameSize + 3;
yading@10 707 } else {
yading@10 708 uint8_t *dst = c->rgb_pic + y * c->rgb_stride + x * 3;
yading@10 709 if (wmv9_mask != -1) {
yading@10 710 ctx->dsp.mss2_gray_fill_masked(dst, c->rgb_stride,
yading@10 711 wmv9_mask,
yading@10 712 c->pal_pic + y * c->pal_stride + x,
yading@10 713 c->pal_stride,
yading@10 714 w, h);
yading@10 715 } else {
yading@10 716 do {
yading@10 717 memset(dst, 0x80, w * 3);
yading@10 718 dst += c->rgb_stride;
yading@10 719 } while (--h);
yading@10 720 }
yading@10 721 }
yading@10 722 }
yading@10 723 }
yading@10 724
yading@10 725 if (buf_size)
yading@10 726 av_log(avctx, AV_LOG_WARNING, "buffer not fully consumed\n");
yading@10 727
yading@10 728 if (c->mvX < 0 || c->mvY < 0) {
yading@10 729 av_frame_unref(&ctx->last_pic);
yading@10 730 ret = av_frame_ref(&ctx->last_pic, frame);
yading@10 731 if (ret < 0)
yading@10 732 return ret;
yading@10 733 }
yading@10 734
yading@10 735 *got_frame = 1;
yading@10 736
yading@10 737 return avpkt->size;
yading@10 738 }
yading@10 739
yading@10 740 static av_cold int wmv9_init(AVCodecContext *avctx)
yading@10 741 {
yading@10 742 VC1Context *v = avctx->priv_data;
yading@10 743 int ret;
yading@10 744
yading@10 745 v->s.avctx = avctx;
yading@10 746 avctx->flags |= CODEC_FLAG_EMU_EDGE;
yading@10 747 v->s.flags |= CODEC_FLAG_EMU_EDGE;
yading@10 748
yading@10 749 if ((ret = ff_vc1_init_common(v)) < 0)
yading@10 750 return ret;
yading@10 751 ff_vc1dsp_init(&v->vc1dsp);
yading@10 752
yading@10 753 v->profile = PROFILE_MAIN;
yading@10 754
yading@10 755 v->zz_8x4 = ff_wmv2_scantableA;
yading@10 756 v->zz_4x8 = ff_wmv2_scantableB;
yading@10 757 v->res_y411 = 0;
yading@10 758 v->res_sprite = 0;
yading@10 759
yading@10 760 v->frmrtq_postproc = 7;
yading@10 761 v->bitrtq_postproc = 31;
yading@10 762
yading@10 763 v->res_x8 = 0;
yading@10 764 v->multires = 0;
yading@10 765 v->res_fasttx = 1;
yading@10 766
yading@10 767 v->fastuvmc = 0;
yading@10 768
yading@10 769 v->extended_mv = 0;
yading@10 770
yading@10 771 v->dquant = 1;
yading@10 772 v->vstransform = 1;
yading@10 773
yading@10 774 v->res_transtab = 0;
yading@10 775
yading@10 776 v->overlap = 0;
yading@10 777
yading@10 778 v->s.resync_marker = 0;
yading@10 779 v->rangered = 0;
yading@10 780
yading@10 781 v->s.max_b_frames = avctx->max_b_frames = 0;
yading@10 782 v->quantizer_mode = 0;
yading@10 783
yading@10 784 v->finterpflag = 0;
yading@10 785
yading@10 786 v->res_rtm_flag = 1;
yading@10 787
yading@10 788 ff_vc1_init_transposed_scantables(v);
yading@10 789
yading@10 790 if ((ret = ff_msmpeg4_decode_init(avctx)) < 0 ||
yading@10 791 (ret = ff_vc1_decode_init_alloc_tables(v)) < 0)
yading@10 792 return ret;
yading@10 793
yading@10 794 /* error concealment */
yading@10 795 v->s.me.qpel_put = v->s.dsp.put_qpel_pixels_tab;
yading@10 796 v->s.me.qpel_avg = v->s.dsp.avg_qpel_pixels_tab;
yading@10 797
yading@10 798 return 0;
yading@10 799 }
yading@10 800
yading@10 801 static av_cold int mss2_decode_end(AVCodecContext *avctx)
yading@10 802 {
yading@10 803 MSS2Context *const ctx = avctx->priv_data;
yading@10 804
yading@10 805 av_frame_unref(&ctx->last_pic);
yading@10 806
yading@10 807 ff_mss12_decode_end(&ctx->c);
yading@10 808 av_freep(&ctx->c.pal_pic);
yading@10 809 av_freep(&ctx->c.last_pal_pic);
yading@10 810 ff_vc1_decode_end(avctx);
yading@10 811
yading@10 812 return 0;
yading@10 813 }
yading@10 814
yading@10 815 static av_cold int mss2_decode_init(AVCodecContext *avctx)
yading@10 816 {
yading@10 817 MSS2Context * const ctx = avctx->priv_data;
yading@10 818 MSS12Context *c = &ctx->c;
yading@10 819 int ret;
yading@10 820 c->avctx = avctx;
yading@10 821 if (ret = ff_mss12_decode_init(c, 1, &ctx->sc[0], &ctx->sc[1]))
yading@10 822 return ret;
yading@10 823 c->pal_stride = c->mask_stride;
yading@10 824 c->pal_pic = av_mallocz(c->pal_stride * avctx->height);
yading@10 825 c->last_pal_pic = av_mallocz(c->pal_stride * avctx->height);
yading@10 826 if (!c->pal_pic || !c->last_pal_pic) {
yading@10 827 mss2_decode_end(avctx);
yading@10 828 return AVERROR(ENOMEM);
yading@10 829 }
yading@10 830 if (ret = wmv9_init(avctx)) {
yading@10 831 mss2_decode_end(avctx);
yading@10 832 return ret;
yading@10 833 }
yading@10 834 ff_mss2dsp_init(&ctx->dsp);
yading@10 835
yading@10 836 avctx->pix_fmt = c->free_colours == 127 ? AV_PIX_FMT_RGB555
yading@10 837 : AV_PIX_FMT_RGB24;
yading@10 838
yading@10 839 return 0;
yading@10 840 }
yading@10 841
yading@10 842 AVCodec ff_mss2_decoder = {
yading@10 843 .name = "mss2",
yading@10 844 .type = AVMEDIA_TYPE_VIDEO,
yading@10 845 .id = AV_CODEC_ID_MSS2,
yading@10 846 .priv_data_size = sizeof(MSS2Context),
yading@10 847 .init = mss2_decode_init,
yading@10 848 .close = mss2_decode_end,
yading@10 849 .decode = mss2_decode_frame,
yading@10 850 .capabilities = CODEC_CAP_DR1,
yading@10 851 .long_name = NULL_IF_CONFIG_SMALL("MS Windows Media Video V9 Screen"),
yading@10 852 };