mss3.c
Go to the documentation of this file.
1 /*
2  * Microsoft Screen 3 (aka Microsoft ATC 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 3 (aka Microsoft ATC Screen) decoder
25  */
26 
27 #include "avcodec.h"
28 #include "bytestream.h"
29 #include "dsputil.h"
30 #include "internal.h"
31 #include "mss34dsp.h"
32 
33 #define HEADER_SIZE 27
34 
35 #define MODEL2_SCALE 13
36 #define MODEL_SCALE 15
37 #define MODEL256_SEC_SCALE 9
38 
39 typedef struct Model2 {
43 } Model2;
44 
45 typedef struct Model {
46  int weights[16], freqs[16];
47  int num_syms;
49  int upd_val, max_upd_val, till_rescale;
50 } Model;
51 
52 typedef struct Model256 {
53  int weights[256], freqs[256];
55  int secondary[68];
56  int sec_size;
57  int upd_val, max_upd_val, till_rescale;
58 } Model256;
59 
60 #define RAC_BOTTOM 0x01000000
61 typedef struct RangeCoder {
62  const uint8_t *src, *src_end;
63 
64  uint32_t range, low;
65  int got_error;
66 } RangeCoder;
67 
68 enum BlockType {
74 };
75 
76 typedef struct BlockTypeContext {
77  int last_type;
78  Model bt_model[5];
80 
81 typedef struct FillBlockCoder {
82  int fill_val;
85 
86 typedef struct ImageBlockCoder {
89  Model vq_model[125];
91 
92 typedef struct DCTBlockCoder {
93  int *prev_dc;
96  int quality;
97  uint16_t qmat[64];
101 } DCTBlockCoder;
102 
103 typedef struct HaarBlockCoder {
108 
109 typedef struct MSS3Context {
112 
116  FillBlockCoder fill_coder[3];
117  ImageBlockCoder image_coder[3];
118  DCTBlockCoder dct_coder[3];
119  HaarBlockCoder haar_coder[3];
120 
121  int dctblock[64];
122  int hblock[16 * 16];
123 } MSS3Context;
124 
125 
126 static void model2_reset(Model2 *m)
127 {
128  m->zero_weight = 1;
129  m->total_weight = 2;
130  m->zero_freq = 0x1000;
131  m->total_freq = 0x2000;
132  m->upd_val = 4;
133  m->till_rescale = 4;
134 }
135 
136 static void model2_update(Model2 *m, int bit)
137 {
138  unsigned scale;
139 
140  if (!bit)
141  m->zero_weight++;
142  m->till_rescale--;
143  if (m->till_rescale)
144  return;
145 
146  m->total_weight += m->upd_val;
147  if (m->total_weight > 0x2000) {
148  m->total_weight = (m->total_weight + 1) >> 1;
149  m->zero_weight = (m->zero_weight + 1) >> 1;
150  if (m->total_weight == m->zero_weight)
151  m->total_weight = m->zero_weight + 1;
152  }
153  m->upd_val = m->upd_val * 5 >> 2;
154  if (m->upd_val > 64)
155  m->upd_val = 64;
156  scale = 0x80000000u / m->total_weight;
157  m->zero_freq = m->zero_weight * scale >> 18;
158  m->total_freq = m->total_weight * scale >> 18;
159  m->till_rescale = m->upd_val;
160 }
161 
162 static void model_update(Model *m, int val)
163 {
164  int i, sum = 0;
165  unsigned scale;
166 
167  m->weights[val]++;
168  m->till_rescale--;
169  if (m->till_rescale)
170  return;
171  m->tot_weight += m->upd_val;
172 
173  if (m->tot_weight > 0x8000) {
174  m->tot_weight = 0;
175  for (i = 0; i < m->num_syms; i++) {
176  m->weights[i] = (m->weights[i] + 1) >> 1;
177  m->tot_weight += m->weights[i];
178  }
179  }
180  scale = 0x80000000u / m->tot_weight;
181  for (i = 0; i < m->num_syms; i++) {
182  m->freqs[i] = sum * scale >> 16;
183  sum += m->weights[i];
184  }
185 
186  m->upd_val = m->upd_val * 5 >> 2;
187  if (m->upd_val > m->max_upd_val)
188  m->upd_val = m->max_upd_val;
189  m->till_rescale = m->upd_val;
190 }
191 
192 static void model_reset(Model *m)
193 {
194  int i;
195 
196  m->tot_weight = 0;
197  for (i = 0; i < m->num_syms - 1; i++)
198  m->weights[i] = 1;
199  m->weights[m->num_syms - 1] = 0;
200 
201  m->upd_val = m->num_syms;
202  m->till_rescale = 1;
203  model_update(m, m->num_syms - 1);
204  m->till_rescale =
205  m->upd_val = (m->num_syms + 6) >> 1;
206 }
207 
208 static av_cold void model_init(Model *m, int num_syms)
209 {
210  m->num_syms = num_syms;
211  m->max_upd_val = 8 * num_syms + 48;
212 
213  model_reset(m);
214 }
215 
216 static void model256_update(Model256 *m, int val)
217 {
218  int i, sum = 0;
219  unsigned scale;
220  int send, sidx = 1;
221 
222  m->weights[val]++;
223  m->till_rescale--;
224  if (m->till_rescale)
225  return;
226  m->tot_weight += m->upd_val;
227 
228  if (m->tot_weight > 0x8000) {
229  m->tot_weight = 0;
230  for (i = 0; i < 256; i++) {
231  m->weights[i] = (m->weights[i] + 1) >> 1;
232  m->tot_weight += m->weights[i];
233  }
234  }
235  scale = 0x80000000u / m->tot_weight;
236  m->secondary[0] = 0;
237  for (i = 0; i < 256; i++) {
238  m->freqs[i] = sum * scale >> 16;
239  sum += m->weights[i];
240  send = m->freqs[i] >> MODEL256_SEC_SCALE;
241  while (sidx <= send)
242  m->secondary[sidx++] = i - 1;
243  }
244  while (sidx < m->sec_size)
245  m->secondary[sidx++] = 255;
246 
247  m->upd_val = m->upd_val * 5 >> 2;
248  if (m->upd_val > m->max_upd_val)
249  m->upd_val = m->max_upd_val;
250  m->till_rescale = m->upd_val;
251 }
252 
253 static void model256_reset(Model256 *m)
254 {
255  int i;
256 
257  for (i = 0; i < 255; i++)
258  m->weights[i] = 1;
259  m->weights[255] = 0;
260 
261  m->tot_weight = 0;
262  m->upd_val = 256;
263  m->till_rescale = 1;
264  model256_update(m, 255);
265  m->till_rescale =
266  m->upd_val = (256 + 6) >> 1;
267 }
268 
270 {
271  m->max_upd_val = 8 * 256 + 48;
272  m->sec_size = (1 << 6) + 2;
273 
274  model256_reset(m);
275 }
276 
277 static void rac_init(RangeCoder *c, const uint8_t *src, int size)
278 {
279  int i;
280 
281  c->src = src;
282  c->src_end = src + size;
283  c->low = 0;
284  for (i = 0; i < FFMIN(size, 4); i++)
285  c->low = (c->low << 8) | *c->src++;
286  c->range = 0xFFFFFFFF;
287  c->got_error = 0;
288 }
289 
291 {
292  for (;;) {
293  c->range <<= 8;
294  c->low <<= 8;
295  if (c->src < c->src_end) {
296  c->low |= *c->src++;
297  } else if (!c->low) {
298  c->got_error = 1;
299  c->low = 1;
300  }
301  if (c->range >= RAC_BOTTOM)
302  return;
303  }
304 }
305 
307 {
308  int bit;
309 
310  c->range >>= 1;
311 
312  bit = (c->range <= c->low);
313  if (bit)
314  c->low -= c->range;
315 
316  if (c->range < RAC_BOTTOM)
317  rac_normalise(c);
318 
319  return bit;
320 }
321 
322 static int rac_get_bits(RangeCoder *c, int nbits)
323 {
324  int val;
325 
326  c->range >>= nbits;
327  val = c->low / c->range;
328  c->low -= c->range * val;
329 
330  if (c->range < RAC_BOTTOM)
331  rac_normalise(c);
332 
333  return val;
334 }
335 
337 {
338  int bit, helper;
339 
340  helper = m->zero_freq * (c->range >> MODEL2_SCALE);
341  bit = (c->low >= helper);
342  if (bit) {
343  c->low -= helper;
344  c->range -= helper;
345  } else {
346  c->range = helper;
347  }
348 
349  if (c->range < RAC_BOTTOM)
350  rac_normalise(c);
351 
352  model2_update(m, bit);
353 
354  return bit;
355 }
356 
358 {
359  int prob, prob2, helper, val;
360  int end, end2;
361 
362  prob = 0;
363  prob2 = c->range;
364  c->range >>= MODEL_SCALE;
365  val = 0;
366  end = m->num_syms >> 1;
367  end2 = m->num_syms;
368  do {
369  helper = m->freqs[end] * c->range;
370  if (helper <= c->low) {
371  val = end;
372  prob = helper;
373  } else {
374  end2 = end;
375  prob2 = helper;
376  }
377  end = (end2 + val) >> 1;
378  } while (end != val);
379  c->low -= prob;
380  c->range = prob2 - prob;
381  if (c->range < RAC_BOTTOM)
382  rac_normalise(c);
383 
384  model_update(m, val);
385 
386  return val;
387 }
388 
390 {
391  int prob, prob2, helper, val;
392  int start, end;
393  int ssym;
394 
395  prob2 = c->range;
396  c->range >>= MODEL_SCALE;
397 
398  helper = c->low / c->range;
399  ssym = helper >> MODEL256_SEC_SCALE;
400  val = m->secondary[ssym];
401 
402  end = start = m->secondary[ssym + 1] + 1;
403  while (end > val + 1) {
404  ssym = (end + val) >> 1;
405  if (m->freqs[ssym] <= helper) {
406  end = start;
407  val = ssym;
408  } else {
409  end = (end + val) >> 1;
410  start = ssym;
411  }
412  }
413  prob = m->freqs[val] * c->range;
414  if (val != 255)
415  prob2 = m->freqs[val + 1] * c->range;
416 
417  c->low -= prob;
418  c->range = prob2 - prob;
419  if (c->range < RAC_BOTTOM)
420  rac_normalise(c);
421 
422  model256_update(m, val);
423 
424  return val;
425 }
426 
428 {
429  bt->last_type = rac_get_model_sym(c, &bt->bt_model[bt->last_type]);
430 
431  return bt->last_type;
432 }
433 
435 {
436  int val, sign;
437 
438  val = rac_get_model_sym(c, m);
439  if (val) {
440  sign = rac_get_bit(c);
441  if (val > 1) {
442  val--;
443  val = (1 << val) + rac_get_bits(c, val);
444  }
445  if (!sign)
446  val = -val;
447  }
448 
449  return val;
450 }
451 
453  uint8_t *dst, int stride, int block_size)
454 {
455  int i;
456 
457  fc->fill_val += decode_coeff(c, &fc->coef_model);
458 
459  for (i = 0; i < block_size; i++, dst += stride)
460  memset(dst, fc->fill_val, block_size);
461 }
462 
464  uint8_t *dst, int stride, int block_size)
465 {
466  int i, j;
467  int vec_size;
468  int vec[4];
469  int prev_line[16];
470  int A, B, C;
471 
472  vec_size = rac_get_model_sym(c, &ic->vec_size_model) + 2;
473  for (i = 0; i < vec_size; i++)
474  vec[i] = rac_get_model256_sym(c, &ic->vec_entry_model);
475  for (; i < 4; i++)
476  vec[i] = 0;
477  memset(prev_line, 0, sizeof(prev_line));
478 
479  for (j = 0; j < block_size; j++) {
480  A = 0;
481  B = 0;
482  for (i = 0; i < block_size; i++) {
483  C = B;
484  B = prev_line[i];
485  A = rac_get_model_sym(c, &ic->vq_model[A + B * 5 + C * 25]);
486 
487  prev_line[i] = A;
488  if (A < 4)
489  dst[i] = vec[A];
490  else
491  dst[i] = rac_get_model256_sym(c, &ic->esc_model);
492  }
493  dst += stride;
494  }
495 }
496 
497 static int decode_dct(RangeCoder *c, DCTBlockCoder *bc, int *block,
498  int bx, int by)
499 {
500  int skip, val, sign, pos = 1, zz_pos, dc;
501  int blk_pos = bx + by * bc->prev_dc_stride;
502 
503  memset(block, 0, sizeof(*block) * 64);
504 
505  dc = decode_coeff(c, &bc->dc_model);
506  if (by) {
507  if (bx) {
508  int l, tl, t;
509 
510  l = bc->prev_dc[blk_pos - 1];
511  tl = bc->prev_dc[blk_pos - 1 - bc->prev_dc_stride];
512  t = bc->prev_dc[blk_pos - bc->prev_dc_stride];
513 
514  if (FFABS(t - tl) <= FFABS(l - tl))
515  dc += l;
516  else
517  dc += t;
518  } else {
519  dc += bc->prev_dc[blk_pos - bc->prev_dc_stride];
520  }
521  } else if (bx) {
522  dc += bc->prev_dc[bx - 1];
523  }
524  bc->prev_dc[blk_pos] = dc;
525  block[0] = dc * bc->qmat[0];
526 
527  while (pos < 64) {
528  val = rac_get_model256_sym(c, &bc->ac_model);
529  if (!val)
530  return 0;
531  if (val == 0xF0) {
532  pos += 16;
533  continue;
534  }
535  skip = val >> 4;
536  val = val & 0xF;
537  if (!val)
538  return -1;
539  pos += skip;
540  if (pos >= 64)
541  return -1;
542 
543  sign = rac_get_model2_sym(c, &bc->sign_model);
544  if (val > 1) {
545  val--;
546  val = (1 << val) + rac_get_bits(c, val);
547  }
548  if (!sign)
549  val = -val;
550 
551  zz_pos = ff_zigzag_direct[pos];
552  block[zz_pos] = val * bc->qmat[zz_pos];
553  pos++;
554  }
555 
556  return pos == 64 ? 0 : -1;
557 }
558 
560  uint8_t *dst, int stride, int block_size,
561  int *block, int mb_x, int mb_y)
562 {
563  int i, j;
564  int bx, by;
565  int nblocks = block_size >> 3;
566 
567  bx = mb_x * nblocks;
568  by = mb_y * nblocks;
569 
570  for (j = 0; j < nblocks; j++) {
571  for (i = 0; i < nblocks; i++) {
572  if (decode_dct(c, bc, block, bx + i, by + j)) {
573  c->got_error = 1;
574  return;
575  }
576  ff_mss34_dct_put(dst + i * 8, stride, block);
577  }
578  dst += 8 * stride;
579  }
580 }
581 
583  uint8_t *dst, int stride, int block_size,
584  int *block)
585 {
586  const int hsize = block_size >> 1;
587  int A, B, C, D, t1, t2, t3, t4;
588  int i, j;
589 
590  for (j = 0; j < block_size; j++) {
591  for (i = 0; i < block_size; i++) {
592  if (i < hsize && j < hsize)
593  block[i] = rac_get_model256_sym(c, &hc->coef_model);
594  else
595  block[i] = decode_coeff(c, &hc->coef_hi_model);
596  block[i] *= hc->scale;
597  }
598  block += block_size;
599  }
600  block -= block_size * block_size;
601 
602  for (j = 0; j < hsize; j++) {
603  for (i = 0; i < hsize; i++) {
604  A = block[i];
605  B = block[i + hsize];
606  C = block[i + hsize * block_size];
607  D = block[i + hsize * block_size + hsize];
608 
609  t1 = A - B;
610  t2 = C - D;
611  t3 = A + B;
612  t4 = C + D;
613  dst[i * 2] = av_clip_uint8(t1 - t2);
614  dst[i * 2 + stride] = av_clip_uint8(t1 + t2);
615  dst[i * 2 + 1] = av_clip_uint8(t3 - t4);
616  dst[i * 2 + 1 + stride] = av_clip_uint8(t3 + t4);
617  }
618  block += block_size;
619  dst += stride * 2;
620  }
621 }
622 
623 static void reset_coders(MSS3Context *ctx, int quality)
624 {
625  int i, j;
626 
627  for (i = 0; i < 3; i++) {
628  ctx->btype[i].last_type = SKIP_BLOCK;
629  for (j = 0; j < 5; j++)
630  model_reset(&ctx->btype[i].bt_model[j]);
631  ctx->fill_coder[i].fill_val = 0;
636  for (j = 0; j < 125; j++)
637  model_reset(&ctx->image_coder[i].vq_model[j]);
638  if (ctx->dct_coder[i].quality != quality) {
639  ctx->dct_coder[i].quality = quality;
640  ff_mss34_gen_quant_mat(ctx->dct_coder[i].qmat, quality, !i);
641  }
642  memset(ctx->dct_coder[i].prev_dc, 0,
643  sizeof(*ctx->dct_coder[i].prev_dc) *
644  ctx->dct_coder[i].prev_dc_stride *
645  ctx->dct_coder[i].prev_dc_height);
646  model_reset(&ctx->dct_coder[i].dc_model);
649  if (ctx->haar_coder[i].quality != quality) {
650  ctx->haar_coder[i].quality = quality;
651  ctx->haar_coder[i].scale = 17 - 7 * quality / 50;
652  }
655  }
656 }
657 
658 static av_cold void init_coders(MSS3Context *ctx)
659 {
660  int i, j;
661 
662  for (i = 0; i < 3; i++) {
663  for (j = 0; j < 5; j++)
664  model_init(&ctx->btype[i].bt_model[j], 5);
665  model_init(&ctx->fill_coder[i].coef_model, 12);
669  for (j = 0; j < 125; j++)
670  model_init(&ctx->image_coder[i].vq_model[j], 5);
671  model_init(&ctx->dct_coder[i].dc_model, 12);
672  model256_init(&ctx->dct_coder[i].ac_model);
673  model_init(&ctx->haar_coder[i].coef_hi_model, 12);
675  }
676 }
677 
678 static int mss3_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
679  AVPacket *avpkt)
680 {
681  const uint8_t *buf = avpkt->data;
682  int buf_size = avpkt->size;
683  MSS3Context *c = avctx->priv_data;
684  RangeCoder *acoder = &c->coder;
685  GetByteContext gb;
686  uint8_t *dst[3];
687  int dec_width, dec_height, dec_x, dec_y, quality, keyframe;
688  int x, y, i, mb_width, mb_height, blk_size, btype;
689  int ret;
690 
691  if (buf_size < HEADER_SIZE) {
692  av_log(avctx, AV_LOG_ERROR,
693  "Frame should have at least %d bytes, got %d instead\n",
694  HEADER_SIZE, buf_size);
695  return AVERROR_INVALIDDATA;
696  }
697 
698  bytestream2_init(&gb, buf, buf_size);
699  keyframe = bytestream2_get_be32(&gb);
700  if (keyframe & ~0x301) {
701  av_log(avctx, AV_LOG_ERROR, "Invalid frame type %X\n", keyframe);
702  return AVERROR_INVALIDDATA;
703  }
704  keyframe = !(keyframe & 1);
705  bytestream2_skip(&gb, 6);
706  dec_x = bytestream2_get_be16(&gb);
707  dec_y = bytestream2_get_be16(&gb);
708  dec_width = bytestream2_get_be16(&gb);
709  dec_height = bytestream2_get_be16(&gb);
710 
711  if (dec_x + dec_width > avctx->width ||
712  dec_y + dec_height > avctx->height ||
713  (dec_width | dec_height) & 0xF) {
714  av_log(avctx, AV_LOG_ERROR, "Invalid frame dimensions %dx%d +%d,%d\n",
715  dec_width, dec_height, dec_x, dec_y);
716  return AVERROR_INVALIDDATA;
717  }
718  bytestream2_skip(&gb, 4);
719  quality = bytestream2_get_byte(&gb);
720  if (quality < 1 || quality > 100) {
721  av_log(avctx, AV_LOG_ERROR, "Invalid quality setting %d\n", quality);
722  return AVERROR_INVALIDDATA;
723  }
724  bytestream2_skip(&gb, 4);
725 
726  if (keyframe && !bytestream2_get_bytes_left(&gb)) {
727  av_log(avctx, AV_LOG_ERROR, "Keyframe without data found\n");
728  return AVERROR_INVALIDDATA;
729  }
730  if (!keyframe && c->got_error)
731  return buf_size;
732  c->got_error = 0;
733 
734  if ((ret = ff_reget_buffer(avctx, &c->pic)) < 0)
735  return ret;
736  c->pic.key_frame = keyframe;
738  if (!bytestream2_get_bytes_left(&gb)) {
739  if ((ret = av_frame_ref(data, &c->pic)) < 0)
740  return ret;
741  *got_frame = 1;
742 
743  return buf_size;
744  }
745 
746  reset_coders(c, quality);
747 
748  rac_init(acoder, buf + HEADER_SIZE, buf_size - HEADER_SIZE);
749 
750  mb_width = dec_width >> 4;
751  mb_height = dec_height >> 4;
752  dst[0] = c->pic.data[0] + dec_x + dec_y * c->pic.linesize[0];
753  dst[1] = c->pic.data[1] + dec_x / 2 + (dec_y / 2) * c->pic.linesize[1];
754  dst[2] = c->pic.data[2] + dec_x / 2 + (dec_y / 2) * c->pic.linesize[2];
755  for (y = 0; y < mb_height; y++) {
756  for (x = 0; x < mb_width; x++) {
757  for (i = 0; i < 3; i++) {
758  blk_size = 8 << !i;
759 
760  btype = decode_block_type(acoder, c->btype + i);
761  switch (btype) {
762  case FILL_BLOCK:
763  decode_fill_block(acoder, c->fill_coder + i,
764  dst[i] + x * blk_size,
765  c->pic.linesize[i], blk_size);
766  break;
767  case IMAGE_BLOCK:
768  decode_image_block(acoder, c->image_coder + i,
769  dst[i] + x * blk_size,
770  c->pic.linesize[i], blk_size);
771  break;
772  case DCT_BLOCK:
773  decode_dct_block(acoder, c->dct_coder + i,
774  dst[i] + x * blk_size,
775  c->pic.linesize[i], blk_size,
776  c->dctblock, x, y);
777  break;
778  case HAAR_BLOCK:
779  decode_haar_block(acoder, c->haar_coder + i,
780  dst[i] + x * blk_size,
781  c->pic.linesize[i], blk_size,
782  c->hblock);
783  break;
784  }
785  if (c->got_error || acoder->got_error) {
786  av_log(avctx, AV_LOG_ERROR, "Error decoding block %d,%d\n",
787  x, y);
788  c->got_error = 1;
789  return AVERROR_INVALIDDATA;
790  }
791  }
792  }
793  dst[0] += c->pic.linesize[0] * 16;
794  dst[1] += c->pic.linesize[1] * 8;
795  dst[2] += c->pic.linesize[2] * 8;
796  }
797 
798  if ((ret = av_frame_ref(data, &c->pic)) < 0)
799  return ret;
800 
801  *got_frame = 1;
802 
803  return buf_size;
804 }
805 
807 {
808  MSS3Context * const c = avctx->priv_data;
809  int i;
810 
811  c->avctx = avctx;
812 
813  if ((avctx->width & 0xF) || (avctx->height & 0xF)) {
814  av_log(avctx, AV_LOG_ERROR,
815  "Image dimensions should be a multiple of 16.\n");
816  return AVERROR_INVALIDDATA;
817  }
818 
819  c->got_error = 0;
820  for (i = 0; i < 3; i++) {
821  int b_width = avctx->width >> (2 + !!i);
822  int b_height = avctx->height >> (2 + !!i);
823  c->dct_coder[i].prev_dc_stride = b_width;
824  c->dct_coder[i].prev_dc_height = b_height;
825  c->dct_coder[i].prev_dc = av_malloc(sizeof(*c->dct_coder[i].prev_dc) *
826  b_width * b_height);
827  if (!c->dct_coder[i].prev_dc) {
828  av_log(avctx, AV_LOG_ERROR, "Cannot allocate buffer\n");
829  while (i >= 0) {
830  av_freep(&c->dct_coder[i].prev_dc);
831  i--;
832  }
833  return AVERROR(ENOMEM);
834  }
835  }
836 
837  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
838 
839  init_coders(c);
840 
841  return 0;
842 }
843 
845 {
846  MSS3Context * const c = avctx->priv_data;
847  int i;
848 
849  av_frame_unref(&c->pic);
850  for (i = 0; i < 3; i++)
851  av_freep(&c->dct_coder[i].prev_dc);
852 
853  return 0;
854 }
855 
857  .name = "msa1",
858  .type = AVMEDIA_TYPE_VIDEO,
859  .id = AV_CODEC_ID_MSA1,
860  .priv_data_size = sizeof(MSS3Context),
864  .capabilities = CODEC_CAP_DR1,
865  .long_name = NULL_IF_CONFIG_SMALL("MS ATC Screen"),
866 };
struct Model256 Model256
void ff_mss34_gen_quant_mat(uint16_t *qmat, int quality, int luma)
Generate quantisation matrix for given quality.
Definition: mss34dsp.c:48
int * prev_dc
Definition: mss3.c:93
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int scale
Definition: mss3.c:104
int sec_size
Definition: mss3.c:56
unsigned total_freq
Definition: mss3.c:42
static int decode_block_type(RangeCoder *c, BlockTypeContext *bt)
Definition: mss3.c:427
uint32_t low
Definition: mss3.c:64
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
struct BlockTypeContext BlockTypeContext
struct MSS3Context MSS3Context
#define MODEL256_SEC_SCALE
Definition: mss3.c:37
static void decode_haar_block(RangeCoder *c, HaarBlockCoder *hc, uint8_t *dst, int stride, int block_size, int *block)
Definition: mss3.c:582
#define C
static void model2_reset(Model2 *m)
Definition: mss3.c:126
struct RangeCoder RangeCoder
#define B
Definition: dsputil.c:2025
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
Model256 ac_model
Definition: mss3.c:100
void ff_mss34_dct_put(uint8_t *dst, int stride, int *block)
Transform and output DCT block.
Definition: mss34dsp.c:90
Definition: mss12.h:40
ImageBlockCoder image_coder[3]
Definition: mss3.c:117
struct FillBlockCoder FillBlockCoder
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:130
int16_t weights[MODEL_MAX_SYMS+1]
Definition: mss12.h:42
int till_rescale
Definition: mss3.c:57
uint32_t range
Definition: mss3.c:64
static int mss3_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: mss3.c:678
int stride
Definition: mace.c:144
#define MODEL2_SCALE
Definition: mss3.c:35
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
Definition: mss3.c:71
struct Model Model
struct Model2 Model2
AVCodecContext * avctx
Definition: mss3.c:110
uint8_t
#define av_cold
Definition: attributes.h:78
window constants for m
static void decode_fill_block(RangeCoder *c, FillBlockCoder *fc, uint8_t *dst, int stride, int block_size)
Definition: mss3.c:452
end end
static void rac_normalise(RangeCoder *c)
Definition: mss3.c:290
#define HEADER_SIZE
Definition: mss3.c:33
static int decode_dct(RangeCoder *c, DCTBlockCoder *bc, int *block, int bx, int by)
Definition: mss3.c:497
Model256 esc_model
Definition: mss3.c:87
D(D(float, sse)
int quality
Definition: mss3.c:104
static void reset_coders(MSS3Context *ctx, int quality)
Definition: mss3.c:623
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int weights[256]
Definition: mss3.c:53
static void rac_init(RangeCoder *c, const uint8_t *src, int size)
Definition: mss3.c:277
uint8_t * data
static void model256_update(Model256 *m, int val)
Definition: mss3.c:216
uint16_t qmat[64]
Definition: mss3.c:97
int got_error
Definition: mss3.c:65
#define A(x)
Model coef_model
Definition: mss3.c:83
Discrete Time axis x
static av_cold void model_init(Model *m, int num_syms)
Definition: mss3.c:208
Definition: mss3.c:39
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:159
int freqs[256]
Definition: mss3.c:53
int till_rescale
Definition: mss3.c:40
Model vq_model[125]
Definition: mss3.c:89
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int tot_weight
Definition: mss3.c:54
int quality
Definition: mss3.c:96
Spectrum Plot time data
DCTBlockCoder dct_coder[3]
Definition: mss3.c:118
#define t1
Definition: regdef.h:29
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:149
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define t3
Definition: regdef.h:31
struct HaarBlockCoder HaarBlockCoder
external API header
static av_cold void model256_init(Model256 *m)
Definition: mss3.c:269
int size
HaarBlockCoder haar_coder[3]
Definition: mss3.c:119
int upd_val
Definition: mss3.c:40
int secondary[68]
Definition: mss3.c:55
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
Identical in function to av_frame_make_writable(), except it uses ff_get_buffer() to allocate the buf...
unsigned zero_weight
Definition: mss3.c:41
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
unsigned total_weight
Definition: mss3.c:42
#define FFMIN(a, b)
Definition: common.h:58
static av_cold int mss3_decode_init(AVCodecContext *avctx)
Definition: mss3.c:806
const uint8_t * src_end
Definition: mss3.c:62
ret
Definition: avfilter.c:821
int width
picture width / height.
int upd_val
Definition: mss3.c:57
t
Definition: genspecsines3.m:6
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
static int rac_get_bits(RangeCoder *c, int nbits)
Definition: mss3.c:322
#define FFABS(a)
Definition: common.h:53
float u
int prev_dc_height
Definition: mss3.c:95
struct DCTBlockCoder DCTBlockCoder
unsigned zero_freq
Definition: mss3.c:41
int hblock[16 *16]
Definition: mss3.c:122
int upd_val
Definition: mss3.c:49
const uint8_t * src
Definition: mss3.c:62
static void model_reset(Model *m)
Definition: mss3.c:192
static int rac_get_model256_sym(RangeCoder *c, Model256 *m)
Definition: mss3.c:389
Definition: mss3.c:52
AVS_Value src
Definition: avisynth_c.h:523
static int rac_get_model_sym(RangeCoder *c, Model *m)
Definition: mss3.c:357
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
main external API structure.
int num_syms
Definition: mss12.h:44
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
FIXME Range Coding of cr are mx and my are Motion Vector 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 Predicton block[y][x] dc[1]
Definition: snow.txt:392
static void model_update(Model *m, int val)
Definition: mss3.c:162
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static av_cold void init_coders(MSS3Context *ctx)
Definition: mss3.c:658
void * buf
Definition: avisynth_c.h:594
#define MODEL_SCALE
Definition: mss3.c:36
int tot_weight
Definition: mss3.c:48
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
static int rac_get_bit(RangeCoder *c)
Definition: mss3.c:306
synthesis window for stochastic i
AVFrame pic
Definition: mss3.c:111
int dctblock[64]
Definition: mss3.c:121
static void model256_reset(Model256 *m)
Definition: mss3.c:253
static void decode_image_block(RangeCoder *c, ImageBlockCoder *ic, uint8_t *dst, int stride, int block_size)
Definition: mss3.c:463
Model2 sign_model
Definition: mss3.c:99
int got_error
Definition: mss3.c:113
int freqs[16]
Definition: mss3.c:46
Model256 coef_model
Definition: mss3.c:105
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:330
FillBlockCoder fill_coder[3]
Definition: mss3.c:116
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
BlockType
Definition: mss3.c:68
static av_cold int mss3_decode_end(AVCodecContext *avctx)
Definition: mss3.c:844
struct ImageBlockCoder ImageBlockCoder
int av_frame_ref(AVFrame *dst, AVFrame *src)
Setup a new reference to the data described by an given frame.
Definition: frame.c:228
#define RAC_BOTTOM
Definition: mss3.c:60
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
Model256 vec_entry_model
Definition: mss3.c:87
RangeCoder coder
Definition: mss3.c:114
int max_upd_val
Definition: mss3.c:57
static void model2_update(Model2 *m, int bit)
Definition: mss3.c:136
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
int till_rescale
Definition: mss3.c:49
common internal api header.
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
static int decode_coeff(RangeCoder *c, Model *m)
Definition: mss3.c:434
static double c[64]
int max_upd_val
Definition: mss3.c:49
AVCodec ff_msa1_decoder
Definition: mss3.c:856
Same thing on a dB scale
function y
Definition: D.m:1
DSP utils.
#define t4
Definition: regdef.h:32
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int fill_val
Definition: mss3.c:82
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
Model bt_model[5]
Definition: mss3.c:78
void INT64 start
Definition: avisynth_c.h:594
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
BlockTypeContext btype[3]
Definition: mss3.c:115
int last_type
Definition: mss3.c:77
int prev_dc_stride
Definition: mss3.c:94
static int rac_get_model2_sym(RangeCoder *c, Model2 *m)
Definition: mss3.c:336
This structure stores compressed data.
static void decode_dct_block(RangeCoder *c, DCTBlockCoder *bc, uint8_t *dst, int stride, int block_size, int *block, int mb_x, int mb_y)
Definition: mss3.c:559
#define t2
Definition: regdef.h:30
Model dc_model
Definition: mss3.c:98
Predicted.
Definition: avutil.h:217
Model vec_size_model
Definition: mss3.c:88
Model coef_hi_model
Definition: mss3.c:106