FFmpeg  4.4.8
agm.c
Go to the documentation of this file.
1 /*
2  * Amuse Graphics Movie decoder
3  *
4  * Copyright (c) 2018 Paul B Mahol
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 
27 #define BITSTREAM_READER_LE
28 
29 #include "libavutil/mem_internal.h"
30 
31 #include "avcodec.h"
32 #include "bytestream.h"
33 #include "copy_block.h"
34 #include "get_bits.h"
35 #include "idctdsp.h"
36 #include "internal.h"
37 
38 static const uint8_t unscaled_luma[64] = {
39  16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19,
40  26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56,
41  14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56,
42  68,109,103, 77, 24, 35, 55, 64, 81,104,113, 92,
43  49, 64, 78, 87,103,121,120,101, 72, 92, 95, 98,
44  112,100,103,99
45 };
46 
47 static const uint8_t unscaled_chroma[64] = {
48  17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66,
49  99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99,
50  47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
51  99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
52  99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
53  99, 99, 99, 99
54 };
55 
56 typedef struct MotionVector {
57  int16_t x, y;
58 } MotionVector;
59 
60 typedef struct AGMContext {
61  const AVClass *class;
65 
66  int key_frame;
69  int blocks_w;
70  int blocks_h;
71  int size[3];
72  int plus;
73  int dct;
74  int rgb;
75  unsigned flags;
76  unsigned fflags;
77 
80  unsigned output_size;
81 
83  unsigned mvectors_size;
84 
86 
88 
91 
93  DECLARE_ALIGNED(32, int16_t, block)[64];
94 
95  int16_t *wblocks;
96  unsigned wblocks_size;
97 
98  int *map;
99  unsigned map_size;
100 
102 } AGMContext;
103 
104 static int read_code(GetBitContext *gb, int *oskip, int *level, int *map, int mode)
105 {
106  int len = 0, skip = 0, max;
107 
108  if (get_bits_left(gb) < 2)
109  return AVERROR_INVALIDDATA;
110 
111  if (show_bits(gb, 2)) {
112  switch (show_bits(gb, 4)) {
113  case 1:
114  case 9:
115  len = 1;
116  skip = 3;
117  break;
118  case 2:
119  len = 3;
120  skip = 4;
121  break;
122  case 3:
123  len = 7;
124  skip = 4;
125  break;
126  case 5:
127  case 13:
128  len = 2;
129  skip = 3;
130  break;
131  case 6:
132  len = 4;
133  skip = 4;
134  break;
135  case 7:
136  len = 8;
137  skip = 4;
138  break;
139  case 10:
140  len = 5;
141  skip = 4;
142  break;
143  case 11:
144  len = 9;
145  skip = 4;
146  break;
147  case 14:
148  len = 6;
149  skip = 4;
150  break;
151  case 15:
152  len = ((show_bits(gb, 5) & 0x10) | 0xA0) >> 4;
153  skip = 5;
154  break;
155  default:
156  return AVERROR_INVALIDDATA;
157  }
158 
159  skip_bits(gb, skip);
160  *level = get_bits(gb, len);
161  *map = 1;
162  *oskip = 0;
163  max = 1 << (len - 1);
164  if (*level < max)
165  *level = -(max + *level);
166  } else if (show_bits(gb, 3) & 4) {
167  skip_bits(gb, 3);
168  if (mode == 1) {
169  if (show_bits(gb, 4)) {
170  if (show_bits(gb, 4) == 1) {
171  skip_bits(gb, 4);
172  *oskip = get_bits(gb, 16);
173  } else {
174  *oskip = get_bits(gb, 4);
175  }
176  } else {
177  skip_bits(gb, 4);
178  *oskip = get_bits(gb, 10);
179  }
180  } else if (mode == 0) {
181  *oskip = get_bits(gb, 10);
182  }
183  *level = 0;
184  } else {
185  skip_bits(gb, 3);
186  if (mode == 0)
187  *oskip = get_bits(gb, 4);
188  else if (mode == 1)
189  *oskip = 0;
190  *level = 0;
191  }
192 
193  return 0;
194 }
195 
197  const int *quant_matrix, int *skip, int *dc_level)
198 {
199  const uint8_t *scantable = s->scantable.permutated;
200  int level, ret, map = 0;
201 
202  memset(s->wblocks, 0, s->wblocks_size);
203 
204  for (int i = 0; i < 64; i++) {
205  int16_t *block = s->wblocks + scantable[i];
206 
207  for (int j = 0; j < s->blocks_w;) {
208  if (*skip > 0) {
209  int rskip;
210 
211  rskip = FFMIN(*skip, s->blocks_w - j);
212  j += rskip;
213  if (i == 0) {
214  for (int k = 0; k < rskip; k++)
215  block[64 * k] = *dc_level * quant_matrix[0];
216  }
217  block += rskip * 64;
218  *skip -= rskip;
219  } else {
220  ret = read_code(gb, skip, &level, &map, s->flags & 1);
221  if (ret < 0)
222  return ret;
223 
224  if (i == 0)
225  *dc_level += level;
226 
227  block[0] = (i == 0 ? *dc_level : level) * quant_matrix[i];
228  block += 64;
229  j++;
230  }
231  }
232  }
233 
234  return 0;
235 }
236 
238  const int *quant_matrix, int *skip,
239  int *map)
240 {
241  const uint8_t *scantable = s->scantable.permutated;
242  int level, ret;
243 
244  memset(s->wblocks, 0, s->wblocks_size);
245  memset(s->map, 0, s->map_size);
246 
247  for (int i = 0; i < 64; i++) {
248  int16_t *block = s->wblocks + scantable[i];
249 
250  for (int j = 0; j < s->blocks_w;) {
251  if (*skip > 0) {
252  int rskip;
253 
254  rskip = FFMIN(*skip, s->blocks_w - j);
255  j += rskip;
256  block += rskip * 64;
257  *skip -= rskip;
258  } else {
259  ret = read_code(gb, skip, &level, &map[j], s->flags & 1);
260  if (ret < 0)
261  return ret;
262 
263  block[0] = level * quant_matrix[i];
264  block += 64;
265  j++;
266  }
267  }
268  }
269 
270  return 0;
271 }
272 
274  const int *quant_matrix, int *skip, int *dc_level)
275 {
276  const uint8_t *scantable = s->scantable.permutated;
277  const int offset = s->plus ? 0 : 1024;
278  int16_t *block = s->block;
279  int level, ret, map = 0;
280 
281  memset(block, 0, sizeof(s->block));
282 
283  if (*skip > 0) {
284  (*skip)--;
285  } else {
286  ret = read_code(gb, skip, &level, &map, s->flags & 1);
287  if (ret < 0)
288  return ret;
289  *dc_level += level;
290  }
291  block[scantable[0]] = offset + *dc_level * quant_matrix[0];
292 
293  for (int i = 1; i < 64;) {
294  if (*skip > 0) {
295  int rskip;
296 
297  rskip = FFMIN(*skip, 64 - i);
298  i += rskip;
299  *skip -= rskip;
300  } else {
301  ret = read_code(gb, skip, &level, &map, s->flags & 1);
302  if (ret < 0)
303  return ret;
304 
305  block[scantable[i]] = level * quant_matrix[i];
306  i++;
307  }
308  }
309 
310  return 0;
311 }
312 
314  const int *quant_matrix, AVFrame *frame,
315  int plane)
316 {
317  int ret, skip = 0, dc_level = 0;
318  const int offset = s->plus ? 0 : 1024;
319 
320  if ((ret = init_get_bits8(gb, s->gbyte.buffer, size)) < 0)
321  return ret;
322 
323  if (s->flags & 1) {
324  av_fast_padded_malloc(&s->wblocks, &s->wblocks_size,
325  64 * s->blocks_w * sizeof(*s->wblocks));
326  if (!s->wblocks)
327  return AVERROR(ENOMEM);
328 
329  for (int y = 0; y < s->blocks_h; y++) {
330  ret = decode_intra_blocks(s, gb, quant_matrix, &skip, &dc_level);
331  if (ret < 0)
332  return ret;
333 
334  for (int x = 0; x < s->blocks_w; x++) {
335  s->wblocks[64 * x] += offset;
336  s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
337  frame->linesize[plane], s->wblocks + 64 * x);
338  }
339  }
340  } else {
341  for (int y = 0; y < s->blocks_h; y++) {
342  for (int x = 0; x < s->blocks_w; x++) {
343  ret = decode_intra_block(s, gb, quant_matrix, &skip, &dc_level);
344  if (ret < 0)
345  return ret;
346 
347  s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
348  frame->linesize[plane], s->block);
349  }
350  }
351  }
352 
353  align_get_bits(gb);
354  if (get_bits_left(gb) < 0)
355  av_log(s->avctx, AV_LOG_WARNING, "overread\n");
356  if (get_bits_left(gb) > 0)
357  av_log(s->avctx, AV_LOG_WARNING, "underread: %d\n", get_bits_left(gb));
358 
359  return 0;
360 }
361 
363  const int *quant_matrix, int *skip,
364  int *map)
365 {
366  const uint8_t *scantable = s->scantable.permutated;
367  int16_t *block = s->block;
368  int level, ret;
369 
370  memset(block, 0, sizeof(s->block));
371 
372  for (int i = 0; i < 64;) {
373  if (*skip > 0) {
374  int rskip;
375 
376  rskip = FFMIN(*skip, 64 - i);
377  i += rskip;
378  *skip -= rskip;
379  } else {
380  ret = read_code(gb, skip, &level, map, s->flags & 1);
381  if (ret < 0)
382  return ret;
383 
384  block[scantable[i]] = level * quant_matrix[i];
385  i++;
386  }
387  }
388 
389  return 0;
390 }
391 
393  const int *quant_matrix, AVFrame *frame,
394  AVFrame *prev, int plane)
395 {
396  int ret, skip = 0;
397 
398  if ((ret = init_get_bits8(gb, s->gbyte.buffer, size)) < 0)
399  return ret;
400 
401  if (s->flags == 3) {
402  av_fast_padded_malloc(&s->wblocks, &s->wblocks_size,
403  64 * s->blocks_w * sizeof(*s->wblocks));
404  if (!s->wblocks)
405  return AVERROR(ENOMEM);
406 
407  av_fast_padded_malloc(&s->map, &s->map_size,
408  s->blocks_w * sizeof(*s->map));
409  if (!s->map)
410  return AVERROR(ENOMEM);
411 
412  for (int y = 0; y < s->blocks_h; y++) {
413  ret = decode_inter_blocks(s, gb, quant_matrix, &skip, s->map);
414  if (ret < 0)
415  return ret;
416 
417  for (int x = 0; x < s->blocks_w; x++) {
418  int shift = plane == 0;
419  int mvpos = (y >> shift) * (s->blocks_w >> shift) + (x >> shift);
420  int orig_mv_x = s->mvectors[mvpos].x;
421  int mv_x = s->mvectors[mvpos].x / (1 + !shift);
422  int mv_y = s->mvectors[mvpos].y / (1 + !shift);
423  int h = s->avctx->coded_height >> !shift;
424  int w = s->avctx->coded_width >> !shift;
425  int map = s->map[x];
426 
427  if (orig_mv_x >= -32) {
428  int src_y = (s->blocks_h - 1 - y) * 8 - mv_y;
429  int src_x = x * 8 + mv_x;
430  if (src_y < 0 || src_y + 8 > h ||
431  src_x < 0 || src_x + 8 > w)
432  return AVERROR_INVALIDDATA;
433 
434  copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
435  prev->data[plane] + src_y * prev->linesize[plane] + src_x,
436  frame->linesize[plane], prev->linesize[plane], 8);
437  if (map) {
438  s->idsp.idct(s->wblocks + x * 64);
439  for (int i = 0; i < 64; i++)
440  s->wblocks[i + x * 64] = (s->wblocks[i + x * 64] + 1) & 0xFFFC;
441  s->idsp.add_pixels_clamped(&s->wblocks[x*64], frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
442  frame->linesize[plane]);
443  }
444  } else if (map) {
445  s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
446  frame->linesize[plane], s->wblocks + x * 64);
447  }
448  }
449  }
450  } else if (s->flags & 2) {
451  for (int y = 0; y < s->blocks_h; y++) {
452  for (int x = 0; x < s->blocks_w; x++) {
453  int shift = plane == 0;
454  int mvpos = (y >> shift) * (s->blocks_w >> shift) + (x >> shift);
455  int orig_mv_x = s->mvectors[mvpos].x;
456  int mv_x = s->mvectors[mvpos].x / (1 + !shift);
457  int mv_y = s->mvectors[mvpos].y / (1 + !shift);
458  int h = s->avctx->coded_height >> !shift;
459  int w = s->avctx->coded_width >> !shift;
460  int map = 0;
461 
462  ret = decode_inter_block(s, gb, quant_matrix, &skip, &map);
463  if (ret < 0)
464  return ret;
465 
466  if (orig_mv_x >= -32) {
467  int src_y = (s->blocks_h - 1 - y) * 8 - mv_y;
468  int src_x = x * 8 + mv_x;
469  if (src_y < 0 || src_y + 8 > h ||
470  src_x < 0 || src_x + 8 > w)
471  return AVERROR_INVALIDDATA;
472 
473  copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
474  prev->data[plane] + src_y * prev->linesize[plane] + src_x,
475  frame->linesize[plane], prev->linesize[plane], 8);
476  if (map) {
477  s->idsp.idct(s->block);
478  for (int i = 0; i < 64; i++)
479  s->block[i] = (s->block[i] + 1) & 0xFFFC;
480  s->idsp.add_pixels_clamped(s->block, frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
481  frame->linesize[plane]);
482  }
483  } else if (map) {
484  s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
485  frame->linesize[plane], s->block);
486  }
487  }
488  }
489  } else if (s->flags & 1) {
490  av_fast_padded_malloc(&s->wblocks, &s->wblocks_size,
491  64 * s->blocks_w * sizeof(*s->wblocks));
492  if (!s->wblocks)
493  return AVERROR(ENOMEM);
494 
495  av_fast_padded_malloc(&s->map, &s->map_size,
496  s->blocks_w * sizeof(*s->map));
497  if (!s->map)
498  return AVERROR(ENOMEM);
499 
500  for (int y = 0; y < s->blocks_h; y++) {
501  ret = decode_inter_blocks(s, gb, quant_matrix, &skip, s->map);
502  if (ret < 0)
503  return ret;
504 
505  for (int x = 0; x < s->blocks_w; x++) {
506  if (!s->map[x])
507  continue;
508  s->idsp.idct_add(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
509  frame->linesize[plane], s->wblocks + 64 * x);
510  }
511  }
512  } else {
513  for (int y = 0; y < s->blocks_h; y++) {
514  for (int x = 0; x < s->blocks_w; x++) {
515  int map = 0;
516 
517  ret = decode_inter_block(s, gb, quant_matrix, &skip, &map);
518  if (ret < 0)
519  return ret;
520 
521  if (!map)
522  continue;
523  s->idsp.idct_add(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
524  frame->linesize[plane], s->block);
525  }
526  }
527  }
528 
529  align_get_bits(gb);
530  if (get_bits_left(gb) < 0)
531  av_log(s->avctx, AV_LOG_WARNING, "overread\n");
532  if (get_bits_left(gb) > 0)
533  av_log(s->avctx, AV_LOG_WARNING, "underread: %d\n", get_bits_left(gb));
534 
535  return 0;
536 }
537 
538 static void compute_quant_matrix(AGMContext *s, double qscale)
539 {
540  int luma[64], chroma[64];
541  double f = 1.0 - fabs(qscale);
542 
543  if (!s->key_frame && (s->flags & 2)) {
544  if (qscale >= 0.0) {
545  for (int i = 0; i < 64; i++) {
546  luma[i] = FFMAX(1, 16 * f);
547  chroma[i] = FFMAX(1, 16 * f);
548  }
549  } else {
550  for (int i = 0; i < 64; i++) {
551  luma[i] = FFMAX(1, 16 - qscale * 32);
552  chroma[i] = FFMAX(1, 16 - qscale * 32);
553  }
554  }
555  } else {
556  if (qscale >= 0.0) {
557  for (int i = 0; i < 64; i++) {
558  luma[i] = FFMAX(1, unscaled_luma [(i & 7) * 8 + (i >> 3)] * f);
559  chroma[i] = FFMAX(1, unscaled_chroma[(i & 7) * 8 + (i >> 3)] * f);
560  }
561  } else {
562  for (int i = 0; i < 64; i++) {
563  luma[i] = FFMAX(1, 255.0 - (255 - unscaled_luma [(i & 7) * 8 + (i >> 3)]) * f);
564  chroma[i] = FFMAX(1, 255.0 - (255 - unscaled_chroma[(i & 7) * 8 + (i >> 3)]) * f);
565  }
566  }
567  }
568 
569  for (int i = 0; i < 64; i++) {
570  int pos = ff_zigzag_direct[i];
571 
572  s->luma_quant_matrix[i] = luma[pos] * ((pos / 8) & 1 ? -1 : 1);
573  s->chroma_quant_matrix[i] = chroma[pos] * ((pos / 8) & 1 ? -1 : 1);
574  }
575 }
576 
578 {
579  uint8_t *dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
580  uint8_t r = 0, g = 0, b = 0;
581 
582  if (bytestream2_get_bytes_left(gbyte) < 3 * avctx->width * avctx->height)
583  return AVERROR_INVALIDDATA;
584 
585  for (int y = 0; y < avctx->height; y++) {
586  for (int x = 0; x < avctx->width; x++) {
587  dst[x*3+0] = bytestream2_get_byteu(gbyte) + r;
588  r = dst[x*3+0];
589  dst[x*3+1] = bytestream2_get_byteu(gbyte) + g;
590  g = dst[x*3+1];
591  dst[x*3+2] = bytestream2_get_byteu(gbyte) + b;
592  b = dst[x*3+2];
593  }
594  dst -= frame->linesize[0];
595  }
596 
597  return 0;
598 }
599 
601  uint8_t **u, uint8_t **v,
602  int ylinesize, int ulinesize, int vlinesize,
603  uint8_t *fill,
604  int *nx, int *ny, int *np, int w, int h)
605 {
606  uint8_t *y0dst = *y0;
607  uint8_t *y1dst = *y1;
608  uint8_t *udst = *u;
609  uint8_t *vdst = *v;
610  int x = *nx, y = *ny, pos = *np;
611 
612  if (pos == 0) {
613  y0dst[2*x+0] += fill[0];
614  y0dst[2*x+1] += fill[1];
615  y1dst[2*x+0] += fill[2];
616  y1dst[2*x+1] += fill[3];
617  pos++;
618  } else if (pos == 1) {
619  udst[x] += fill[0];
620  vdst[x] += fill[1];
621  x++;
622  if (x >= w) {
623  x = 0;
624  y++;
625  if (y >= h)
626  return 1;
627  y0dst -= 2*ylinesize;
628  y1dst -= 2*ylinesize;
629  udst -= ulinesize;
630  vdst -= vlinesize;
631  }
632  y0dst[2*x+0] += fill[2];
633  y0dst[2*x+1] += fill[3];
634  pos++;
635  } else if (pos == 2) {
636  y1dst[2*x+0] += fill[0];
637  y1dst[2*x+1] += fill[1];
638  udst[x] += fill[2];
639  vdst[x] += fill[3];
640  x++;
641  if (x >= w) {
642  x = 0;
643  y++;
644  if (y >= h)
645  return 1;
646  y0dst -= 2*ylinesize;
647  y1dst -= 2*ylinesize;
648  udst -= ulinesize;
649  vdst -= vlinesize;
650  }
651  pos = 0;
652  }
653 
654  *y0 = y0dst;
655  *y1 = y1dst;
656  *u = udst;
657  *v = vdst;
658  *np = pos;
659  *nx = x;
660  *ny = y;
661 
662  return 0;
663 }
664 
666 {
667  uint8_t *dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
668  int runlen, y = 0, x = 0;
669  uint8_t fill[4];
670  unsigned code;
671 
672  while (bytestream2_get_bytes_left(gbyte) > 0) {
673  code = bytestream2_peek_le32(gbyte);
674  runlen = code & 0xFFFFFF;
675 
676  if (code >> 24 == 0x77) {
677  bytestream2_skip(gbyte, 4);
678 
679  for (int i = 0; i < 4; i++)
680  fill[i] = bytestream2_get_byte(gbyte);
681 
682  while (runlen > 0) {
683  runlen--;
684 
685  for (int i = 0; i < 4; i++) {
686  dst[x] += fill[i];
687  x++;
688  if (x >= frame->width * 3) {
689  x = 0;
690  y++;
691  dst -= frame->linesize[0];
692  if (y >= frame->height)
693  return 0;
694  }
695  }
696  }
697  } else {
698  for (int i = 0; i < 4; i++)
699  fill[i] = bytestream2_get_byte(gbyte);
700 
701  for (int i = 0; i < 4; i++) {
702  dst[x] += fill[i];
703  x++;
704  if (x >= frame->width * 3) {
705  x = 0;
706  y++;
707  dst -= frame->linesize[0];
708  if (y >= frame->height)
709  return 0;
710  }
711  }
712  }
713  }
714 
715  return 0;
716 }
717 
719 {
720  uint8_t *y0dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
721  uint8_t *y1dst = y0dst - frame->linesize[0];
722  uint8_t *udst = frame->data[1] + ((avctx->height >> 1) - 1) * frame->linesize[1];
723  uint8_t *vdst = frame->data[2] + ((avctx->height >> 1) - 1) * frame->linesize[2];
724  int runlen, y = 0, x = 0, pos = 0;
725  uint8_t fill[4];
726  unsigned code;
727 
728  while (bytestream2_get_bytes_left(gbyte) > 0) {
729  code = bytestream2_peek_le32(gbyte);
730  runlen = code & 0xFFFFFF;
731 
732  if (code >> 24 == 0x77) {
733  bytestream2_skip(gbyte, 4);
734 
735  for (int i = 0; i < 4; i++)
736  fill[i] = bytestream2_get_byte(gbyte);
737 
738  while (runlen > 0) {
739  runlen--;
740 
741  if (fill_pixels(&y0dst, &y1dst, &udst, &vdst,
742  frame->linesize[0],
743  frame->linesize[1],
744  frame->linesize[2],
745  fill, &x, &y, &pos,
746  avctx->width / 2,
747  avctx->height / 2))
748  return 0;
749  }
750  } else {
751  for (int i = 0; i < 4; i++)
752  fill[i] = bytestream2_get_byte(gbyte);
753 
754  if (fill_pixels(&y0dst, &y1dst, &udst, &vdst,
755  frame->linesize[0],
756  frame->linesize[1],
757  frame->linesize[2],
758  fill, &x, &y, &pos,
759  avctx->width / 2,
760  avctx->height / 2))
761  return 0;
762  }
763  }
764 
765  return 0;
766 }
767 
769 {
770  uint8_t *y0dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
771  uint8_t *y1dst = y0dst - frame->linesize[0];
772  uint8_t *udst = frame->data[1] + ((avctx->height >> 1) - 1) * frame->linesize[1];
773  uint8_t *vdst = frame->data[2] + ((avctx->height >> 1) - 1) * frame->linesize[2];
774  uint8_t ly0 = 0, ly1 = 0, ly2 = 0, ly3 = 0, lu = 0, lv = 0;
775 
776  for (int y = 0; y < avctx->height / 2; y++) {
777  for (int x = 0; x < avctx->width / 2; x++) {
778  y0dst[x*2+0] = bytestream2_get_byte(gbyte) + ly0;
779  ly0 = y0dst[x*2+0];
780  y0dst[x*2+1] = bytestream2_get_byte(gbyte) + ly1;
781  ly1 = y0dst[x*2+1];
782  y1dst[x*2+0] = bytestream2_get_byte(gbyte) + ly2;
783  ly2 = y1dst[x*2+0];
784  y1dst[x*2+1] = bytestream2_get_byte(gbyte) + ly3;
785  ly3 = y1dst[x*2+1];
786  udst[x] = bytestream2_get_byte(gbyte) + lu;
787  lu = udst[x];
788  vdst[x] = bytestream2_get_byte(gbyte) + lv;
789  lv = vdst[x];
790  }
791 
792  y0dst -= 2*frame->linesize[0];
793  y1dst -= 2*frame->linesize[0];
794  udst -= frame->linesize[1];
795  vdst -= frame->linesize[2];
796  }
797 
798  return 0;
799 }
800 
802 {
803  AGMContext *s = avctx->priv_data;
804  int ret;
805 
806  compute_quant_matrix(s, (2 * s->compression - 100) / 100.0);
807 
808  s->blocks_w = avctx->coded_width >> 3;
809  s->blocks_h = avctx->coded_height >> 3;
810 
811  ret = decode_intra_plane(s, gb, s->size[0], s->luma_quant_matrix, frame, 0);
812  if (ret < 0)
813  return ret;
814 
815  bytestream2_skip(&s->gbyte, s->size[0]);
816 
817  s->blocks_w = avctx->coded_width >> 4;
818  s->blocks_h = avctx->coded_height >> 4;
819 
820  ret = decode_intra_plane(s, gb, s->size[1], s->chroma_quant_matrix, frame, 2);
821  if (ret < 0)
822  return ret;
823 
824  bytestream2_skip(&s->gbyte, s->size[1]);
825 
826  s->blocks_w = avctx->coded_width >> 4;
827  s->blocks_h = avctx->coded_height >> 4;
828 
829  ret = decode_intra_plane(s, gb, s->size[2], s->chroma_quant_matrix, frame, 1);
830  if (ret < 0)
831  return ret;
832 
833  return 0;
834 }
835 
837 {
838  AGMContext *s = avctx->priv_data;
839  int nb_mvs = ((avctx->coded_height + 15) >> 4) * ((avctx->coded_width + 15) >> 4);
840  int ret, skip = 0, value, map;
841 
842  av_fast_padded_malloc(&s->mvectors, &s->mvectors_size,
843  nb_mvs * sizeof(*s->mvectors));
844  if (!s->mvectors)
845  return AVERROR(ENOMEM);
846 
847  if ((ret = init_get_bits8(gb, s->gbyte.buffer, bytestream2_get_bytes_left(&s->gbyte) -
848  (s->size[0] + s->size[1] + s->size[2]))) < 0)
849  return ret;
850 
851  memset(s->mvectors, 0, sizeof(*s->mvectors) * nb_mvs);
852 
853  for (int i = 0; i < nb_mvs; i++) {
854  ret = read_code(gb, &skip, &value, &map, 1);
855  if (ret < 0)
856  return ret;
857  s->mvectors[i].x = value;
858  i += skip;
859  }
860 
861  for (int i = 0; i < nb_mvs; i++) {
862  ret = read_code(gb, &skip, &value, &map, 1);
863  if (ret < 0)
864  return ret;
865  s->mvectors[i].y = value;
866  i += skip;
867  }
868 
869  if (get_bits_left(gb) <= 0)
870  return AVERROR_INVALIDDATA;
871  skip = (get_bits_count(gb) >> 3) + 1;
872  bytestream2_skip(&s->gbyte, skip);
873 
874  return 0;
875 }
876 
878  AVFrame *frame, AVFrame *prev)
879 {
880  AGMContext *s = avctx->priv_data;
881  int ret;
882 
883  compute_quant_matrix(s, (2 * s->compression - 100) / 100.0);
884 
885  if (s->flags & 2) {
886  ret = decode_motion_vectors(avctx, gb);
887  if (ret < 0)
888  return ret;
889  }
890 
891  s->blocks_w = avctx->coded_width >> 3;
892  s->blocks_h = avctx->coded_height >> 3;
893 
894  ret = decode_inter_plane(s, gb, s->size[0], s->luma_quant_matrix, frame, prev, 0);
895  if (ret < 0)
896  return ret;
897 
898  bytestream2_skip(&s->gbyte, s->size[0]);
899 
900  s->blocks_w = avctx->coded_width >> 4;
901  s->blocks_h = avctx->coded_height >> 4;
902 
903  ret = decode_inter_plane(s, gb, s->size[1], s->chroma_quant_matrix, frame, prev, 2);
904  if (ret < 0)
905  return ret;
906 
907  bytestream2_skip(&s->gbyte, s->size[1]);
908 
909  s->blocks_w = avctx->coded_width >> 4;
910  s->blocks_h = avctx->coded_height >> 4;
911 
912  ret = decode_inter_plane(s, gb, s->size[2], s->chroma_quant_matrix, frame, prev, 1);
913  if (ret < 0)
914  return ret;
915 
916  return 0;
917 }
918 
919 typedef struct Node {
920  int parent;
921  int child[2];
922 } Node;
923 
924 static void get_tree_codes(uint32_t *codes, Node *nodes, int idx, uint32_t pfx, int bitpos)
925 {
926  if (idx < 256 && idx >= 0) {
927  codes[idx] = pfx;
928  } else if (idx >= 0) {
929  get_tree_codes(codes, nodes, nodes[idx].child[0], pfx + (0 << bitpos), bitpos + 1);
930  get_tree_codes(codes, nodes, nodes[idx].child[1], pfx + (1U << bitpos), bitpos + 1);
931  }
932 }
933 
934 static int make_new_tree(const uint8_t *bitlens, uint32_t *codes)
935 {
936  int zlcount = 0, curlen, idx, nindex, last, llast;
937  int blcounts[32] = { 0 };
938  int syms[8192];
939  Node nodes[512];
940  int node_idx[1024];
941  int old_idx[512];
942 
943  for (int i = 0; i < 256; i++) {
944  int bitlen = bitlens[i];
945  int blcount = blcounts[bitlen];
946 
947  zlcount += bitlen < 1;
948  syms[(bitlen << 8) + blcount] = i;
949  blcounts[bitlen]++;
950  }
951 
952  for (int i = 0; i < 512; i++) {
953  nodes[i].child[0] = -1;
954  nodes[i].child[1] = -1;
955  }
956 
957  for (int i = 0; i < 256; i++) {
958  node_idx[i] = 257 + i;
959  }
960 
961  curlen = 1;
962  node_idx[512] = 256;
963  last = 255;
964  nindex = 1;
965 
966  for (curlen = 1; curlen < 32; curlen++) {
967  if (blcounts[curlen] > 0) {
968  int max_zlcount = zlcount + blcounts[curlen];
969 
970  for (int i = 0; zlcount < 256 && zlcount < max_zlcount; zlcount++, i++) {
971  int p = node_idx[nindex - 1 + 512];
972  int ch = syms[256 * curlen + i];
973 
974  if (nindex <= 0)
975  return AVERROR_INVALIDDATA;
976 
977  if (nodes[p].child[0] == -1) {
978  nodes[p].child[0] = ch;
979  } else {
980  nodes[p].child[1] = ch;
981  nindex--;
982  }
983  nodes[ch].parent = p;
984  }
985  }
986  llast = last - 1;
987  idx = 0;
988  while (nindex > 0) {
989  int p, ch;
990 
991  last = llast - idx;
992  p = node_idx[nindex - 1 + 512];
993  ch = node_idx[last];
994  if (nodes[p].child[0] == -1) {
995  nodes[p].child[0] = ch;
996  } else {
997  nodes[p].child[1] = ch;
998  nindex--;
999  }
1000  old_idx[idx] = ch;
1001  nodes[ch].parent = p;
1002  if (idx == llast)
1003  goto next;
1004  idx++;
1005  if (nindex <= 0) {
1006  for (int i = 0; i < idx; i++)
1007  node_idx[512 + i] = old_idx[i];
1008  }
1009  }
1010  nindex = idx;
1011  }
1012 
1013 next:
1014 
1015  get_tree_codes(codes, nodes, 256, 0, 0);
1016  return 0;
1017 }
1018 
1019 static int build_huff(const uint8_t *bitlen, VLC *vlc)
1020 {
1021  uint32_t new_codes[256];
1022  uint8_t bits[256];
1023  uint8_t symbols[256];
1024  uint32_t codes[256];
1025  int nb_codes = 0;
1026 
1027  int ret = make_new_tree(bitlen, new_codes);
1028  if (ret < 0)
1029  return ret;
1030 
1031  for (int i = 0; i < 256; i++) {
1032  if (bitlen[i]) {
1033  bits[nb_codes] = bitlen[i];
1034  codes[nb_codes] = new_codes[i];
1035  symbols[nb_codes] = i;
1036  nb_codes++;
1037  }
1038  }
1039 
1040  ff_free_vlc(vlc);
1041  return ff_init_vlc_sparse(vlc, 13, nb_codes,
1042  bits, 1, 1,
1043  codes, 4, 4,
1044  symbols, 1, 1,
1045  INIT_VLC_LE);
1046 }
1047 
1048 static int decode_huffman2(AVCodecContext *avctx, int header, int size)
1049 {
1050  AGMContext *s = avctx->priv_data;
1051  GetBitContext *gb = &s->gb;
1052  uint8_t lens[256];
1053  int ret, x, len;
1054 
1055  if ((ret = init_get_bits8(gb, s->gbyte.buffer,
1056  bytestream2_get_bytes_left(&s->gbyte))) < 0)
1057  return ret;
1058 
1059  s->output_size = get_bits_long(gb, 32);
1060 
1061  if (s->output_size > avctx->width * avctx->height * 9LL + 10000)
1062  return AVERROR_INVALIDDATA;
1063 
1064  av_fast_padded_malloc(&s->output, &s->padded_output_size, s->output_size);
1065  if (!s->output)
1066  return AVERROR(ENOMEM);
1067 
1068  x = get_bits(gb, 1);
1069  len = 4 + get_bits(gb, 1);
1070  if (x) {
1071  int cb[8] = { 0 };
1072  int count = get_bits(gb, 3) + 1;
1073 
1074  for (int i = 0; i < count; i++)
1075  cb[i] = get_bits(gb, len);
1076 
1077  for (int i = 0; i < 256; i++) {
1078  int idx = get_bits(gb, 3);
1079  lens[i] = cb[idx];
1080  }
1081  } else {
1082  for (int i = 0; i < 256; i++)
1083  lens[i] = get_bits(gb, len);
1084  }
1085 
1086  if ((ret = build_huff(lens, &s->vlc)) < 0)
1087  return ret;
1088 
1089  x = 0;
1090  while (get_bits_left(gb) > 0 && x < s->output_size) {
1091  int val = get_vlc2(gb, s->vlc.table, s->vlc.bits, 3);
1092  if (val < 0)
1093  return AVERROR_INVALIDDATA;
1094  s->output[x++] = val;
1095  }
1096 
1097  return 0;
1098 }
1099 
1100 static int decode_frame(AVCodecContext *avctx, void *data,
1101  int *got_frame, AVPacket *avpkt)
1102 {
1103  AGMContext *s = avctx->priv_data;
1104  GetBitContext *gb = &s->gb;
1105  GetByteContext *gbyte = &s->gbyte;
1106  AVFrame *frame = data;
1107  int w, h, width, height, header;
1108  unsigned compressed_size;
1109  long skip;
1110  int ret;
1111 
1112  if (!avpkt->size)
1113  return 0;
1114 
1115  bytestream2_init(gbyte, avpkt->data, avpkt->size);
1116 
1117  header = bytestream2_get_le32(gbyte);
1118  s->fflags = bytestream2_get_le32(gbyte);
1119  s->bitstream_size = s->fflags & 0x1FFFFFFF;
1120  s->fflags >>= 29;
1121  av_log(avctx, AV_LOG_DEBUG, "fflags: %X\n", s->fflags);
1122  if (avpkt->size < s->bitstream_size + 8)
1123  return AVERROR_INVALIDDATA;
1124 
1125  s->key_frame = (avpkt->flags & AV_PKT_FLAG_KEY);
1126  frame->key_frame = s->key_frame;
1128 
1129  if (!s->key_frame) {
1130  if (!s->prev_frame->data[0]) {
1131  av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1132  return AVERROR_INVALIDDATA;
1133  }
1134  }
1135 
1136  if (header) {
1137  if (avctx->codec_tag == MKTAG('A', 'G', 'M', '0') ||
1138  avctx->codec_tag == MKTAG('A', 'G', 'M', '1'))
1139  return AVERROR_PATCHWELCOME;
1140  else
1141  ret = decode_huffman2(avctx, header, (avpkt->size - s->bitstream_size) - 8);
1142  if (ret < 0)
1143  return ret;
1144  bytestream2_init(gbyte, s->output, s->output_size);
1145  } else if (!s->dct) {
1146  bytestream2_skip(gbyte, 4);
1147  }
1148 
1149  if (s->dct) {
1150  s->flags = 0;
1151  w = bytestream2_get_le32(gbyte);
1152  h = bytestream2_get_le32(gbyte);
1153  if (w == INT32_MIN || h == INT32_MIN)
1154  return AVERROR_INVALIDDATA;
1155  if (w < 0) {
1156  w = -w;
1157  s->flags |= 2;
1158  }
1159  if (h < 0) {
1160  h = -h;
1161  s->flags |= 1;
1162  }
1163 
1164  width = avctx->width;
1165  height = avctx->height;
1166  if (w < width || h < height || w & 7 || h & 7)
1167  return AVERROR_INVALIDDATA;
1168 
1169  ret = ff_set_dimensions(avctx, w, h);
1170  if (ret < 0)
1171  return ret;
1172  avctx->width = width;
1173  avctx->height = height;
1174 
1175  s->compression = bytestream2_get_le32(gbyte);
1176  if (s->compression < 0 || s->compression > 100)
1177  return AVERROR_INVALIDDATA;
1178 
1179  for (int i = 0; i < 3; i++)
1180  s->size[i] = bytestream2_get_le32(gbyte);
1181  if (header) {
1182  compressed_size = s->output_size;
1183  skip = 8LL;
1184  } else {
1185  compressed_size = avpkt->size;
1186  skip = 32LL;
1187  }
1188  if (s->size[0] < 0 || s->size[1] < 0 || s->size[2] < 0 ||
1189  skip + s->size[0] + s->size[1] + s->size[2] > compressed_size) {
1190  return AVERROR_INVALIDDATA;
1191  }
1192  }
1193 
1194  if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
1195  return ret;
1196 
1197  if (frame->key_frame) {
1198  if (!s->dct && !s->rgb)
1199  ret = decode_raw_intra(avctx, gbyte, frame);
1200  else if (!s->dct && s->rgb)
1201  ret = decode_raw_intra_rgb(avctx, gbyte, frame);
1202  else
1203  ret = decode_intra(avctx, gb, frame);
1204  } else {
1205  if (s->prev_frame-> width != frame->width ||
1206  s->prev_frame->height != frame->height)
1207  return AVERROR_INVALIDDATA;
1208 
1209  if (!(s->flags & 2)) {
1210  ret = av_frame_copy(frame, s->prev_frame);
1211  if (ret < 0)
1212  return ret;
1213  }
1214 
1215  if (s->dct) {
1216  ret = decode_inter(avctx, gb, frame, s->prev_frame);
1217  } else if (!s->dct && !s->rgb) {
1218  ret = decode_runlen(avctx, gbyte, frame);
1219  } else {
1220  ret = decode_runlen_rgb(avctx, gbyte, frame);
1221  }
1222  }
1223  if (ret < 0)
1224  return ret;
1225 
1226  av_frame_unref(s->prev_frame);
1227  if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
1228  return ret;
1229 
1230  frame->crop_top = avctx->coded_height - avctx->height;
1231  frame->crop_left = avctx->coded_width - avctx->width;
1232 
1233  *got_frame = 1;
1234 
1235  return avpkt->size;
1236 }
1237 
1239 {
1240  AGMContext *s = avctx->priv_data;
1241 
1242  s->rgb = avctx->codec_tag == MKTAG('A', 'G', 'M', '4');
1243  avctx->pix_fmt = s->rgb ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_YUV420P;
1244  s->avctx = avctx;
1245  s->plus = avctx->codec_tag == MKTAG('A', 'G', 'M', '3') ||
1246  avctx->codec_tag == MKTAG('A', 'G', 'M', '7');
1247 
1248  s->dct = avctx->codec_tag != MKTAG('A', 'G', 'M', '4') &&
1249  avctx->codec_tag != MKTAG('A', 'G', 'M', '5');
1250 
1251  if (!s->rgb && !s->dct) {
1252  if ((avctx->width & 1) || (avctx->height & 1))
1253  return AVERROR_INVALIDDATA;
1254  }
1255 
1256  avctx->idct_algo = FF_IDCT_SIMPLE;
1257  ff_idctdsp_init(&s->idsp, avctx);
1258  ff_init_scantable(s->idsp.idct_permutation, &s->scantable, ff_zigzag_direct);
1259 
1260  s->prev_frame = av_frame_alloc();
1261  if (!s->prev_frame)
1262  return AVERROR(ENOMEM);
1263 
1264  return 0;
1265 }
1266 
1267 static void decode_flush(AVCodecContext *avctx)
1268 {
1269  AGMContext *s = avctx->priv_data;
1270 
1271  av_frame_unref(s->prev_frame);
1272 }
1273 
1275 {
1276  AGMContext *s = avctx->priv_data;
1277 
1278  ff_free_vlc(&s->vlc);
1279  av_frame_free(&s->prev_frame);
1280  av_freep(&s->mvectors);
1281  s->mvectors_size = 0;
1282  av_freep(&s->wblocks);
1283  s->wblocks_size = 0;
1284  av_freep(&s->output);
1285  s->padded_output_size = 0;
1286  av_freep(&s->map);
1287  s->map_size = 0;
1288 
1289  return 0;
1290 }
1291 
1293  .name = "agm",
1294  .long_name = NULL_IF_CONFIG_SMALL("Amuse Graphics Movie"),
1295  .type = AVMEDIA_TYPE_VIDEO,
1296  .id = AV_CODEC_ID_AGM,
1297  .priv_data_size = sizeof(AGMContext),
1298  .init = decode_init,
1299  .close = decode_close,
1300  .decode = decode_frame,
1301  .flush = decode_flush,
1302  .capabilities = AV_CODEC_CAP_DR1,
1303  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
1306 };
static void flush(AVCodecContext *avctx)
static double val(void *priv, double ch)
Definition: aeval.c:76
static int decode_motion_vectors(AVCodecContext *avctx, GetBitContext *gb)
Definition: agm.c:836
static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
Definition: agm.c:801
static int decode_inter(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame, AVFrame *prev)
Definition: agm.c:877
static int decode_intra_plane(AGMContext *s, GetBitContext *gb, int size, const int *quant_matrix, AVFrame *frame, int plane)
Definition: agm.c:313
static const uint8_t unscaled_luma[64]
Definition: agm.c:38
static const uint8_t unscaled_chroma[64]
Definition: agm.c:47
static int decode_huffman2(AVCodecContext *avctx, int header, int size)
Definition: agm.c:1048
static av_cold int decode_close(AVCodecContext *avctx)
Definition: agm.c:1274
static void get_tree_codes(uint32_t *codes, Node *nodes, int idx, uint32_t pfx, int bitpos)
Definition: agm.c:924
static int decode_runlen_rgb(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
Definition: agm.c:665
static int make_new_tree(const uint8_t *bitlens, uint32_t *codes)
Definition: agm.c:934
static av_cold int decode_init(AVCodecContext *avctx)
Definition: agm.c:1238
static int decode_intra_block(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *dc_level)
Definition: agm.c:273
static int decode_inter_block(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *map)
Definition: agm.c:362
static int decode_raw_intra_rgb(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
Definition: agm.c:577
static int decode_inter_blocks(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *map)
Definition: agm.c:237
static int decode_intra_blocks(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *dc_level)
Definition: agm.c:196
AVCodec ff_agm_decoder
Definition: agm.c:1292
static int decode_runlen(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
Definition: agm.c:718
static int decode_raw_intra(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
Definition: agm.c:768
static void decode_flush(AVCodecContext *avctx)
Definition: agm.c:1267
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: agm.c:1100
static av_always_inline int fill_pixels(uint8_t **y0, uint8_t **y1, uint8_t **u, uint8_t **v, int ylinesize, int ulinesize, int vlinesize, uint8_t *fill, int *nx, int *ny, int *np, int w, int h)
Definition: agm.c:600
static int build_huff(const uint8_t *bitlen, VLC *vlc)
Definition: agm.c:1019
static int read_code(GetBitContext *gb, int *oskip, int *level, int *map, int mode)
Definition: agm.c:104
static int decode_inter_plane(AGMContext *s, GetBitContext *gb, int size, const int *quant_matrix, AVFrame *frame, AVFrame *prev, int plane)
Definition: agm.c:392
static void compute_quant_matrix(AGMContext *s, double qscale)
Definition: agm.c:538
#define av_always_inline
Definition: attributes.h:45
#define av_cold
Definition: attributes.h:88
uint8_t
Libavcodec external API header.
#define FF_IDCT_SIMPLE
Definition: avcodec.h:1726
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Definition: bitstream.c:323
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:431
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:264
#define s(width, name)
Definition: cbs_vp9.c:257
#define f(width, name)
Definition: cbs_vp9.c:255
#define FFMIN(a, b)
Definition: common.h:105
#define MKTAG(a, b, c, d)
Definition: common.h:478
#define FFMAX(a, b)
Definition: common.h:103
static void copy_block8(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
Definition: copy_block.h:47
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
#define max(a, b)
Definition: cuda_runtime.h:33
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1900
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
static AVFrame * frame
mode
Use these values in ebur128_init (or'ed).
Definition: ebur128.h:83
double value
Definition: eval.c:100
bitstream reader API header.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:797
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:693
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:514
@ AV_CODEC_ID_AGM
Definition: codec_id.h:293
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:50
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:410
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define AVERROR(e)
Definition: error.h:43
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:553
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:443
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:203
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:190
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition: frame.c:799
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:117
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
for(j=16;j >0;--j)
const VDPAUPixFmtMap * map
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition: idctdsp.c:238
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: idctdsp.c:29
int i
Definition: input.c:407
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
Definition: internal.h:67
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:41
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: internal.h:49
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:84
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
uint8_t w
Definition: llviddspenc.c:39
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:98
const char data[16]
Definition: mxf.c:142
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
static const uint8_t header[24]
Definition: sdr2.c:67
static int shift(int a, int b)
Definition: sonic.c:82
const uint8_t * code
Definition: spdifenc.c:413
unsigned int pos
Definition: spdifenc.c:412
Definition: agm.c:60
int key_frame
Definition: agm.c:66
int compression
Definition: agm.c:68
int chroma_quant_matrix[64]
Definition: agm.c:90
MotionVector * mvectors
Definition: agm.c:82
unsigned padded_output_size
Definition: agm.c:79
int * map
Definition: agm.c:98
unsigned flags
Definition: agm.c:75
AVCodecContext * avctx
Definition: agm.c:62
int bitstream_size
Definition: agm.c:67
unsigned wblocks_size
Definition: agm.c:96
unsigned fflags
Definition: agm.c:76
ScanTable scantable
Definition: agm.c:92
unsigned map_size
Definition: agm.c:99
int plus
Definition: agm.c:72
unsigned output_size
Definition: agm.c:80
AVFrame * prev_frame
Definition: agm.c:87
uint8_t * output
Definition: agm.c:78
int16_t * wblocks
Definition: agm.c:95
GetBitContext gb
Definition: agm.c:63
int blocks_h
Definition: agm.c:70
int dct
Definition: agm.c:73
IDCTDSPContext idsp
Definition: agm.c:101
int blocks_w
Definition: agm.c:69
unsigned mvectors_size
Definition: agm.c:83
int16_t block[64]
Definition: agm.c:93
int rgb
Definition: agm.c:74
GetByteContext gbyte
Definition: agm.c:64
VLC vlc
Definition: agm.c:85
int luma_quant_matrix[64]
Definition: agm.c:89
int size[3]
Definition: agm.c:71
Describe the class of an AVClass context structure.
Definition: log.h:67
main external API structure.
Definition: avcodec.h:536
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:746
int width
picture width / height.
Definition: avcodec.h:709
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:561
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
Definition: avcodec.h:1723
int coded_height
Definition: avcodec.h:724
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:724
void * priv_data
Definition: avcodec.h:563
AVCodec.
Definition: codec.h:197
const char * name
Name of the codec implementation.
Definition: codec.h:204
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:332
int width
Definition: frame.h:376
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:396
int height
Definition: frame.h:376
size_t crop_top
Definition: frame.h:678
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:349
size_t crop_left
Definition: frame.h:680
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:401
This structure stores compressed data.
Definition: packet.h:346
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:375
int size
Definition: packet.h:370
uint8_t * data
Definition: packet.h:369
int16_t x
Definition: agm.c:57
int16_t y
Definition: agm.c:57
Definition: agm.c:919
int parent
Definition: agm.c:920
int child[2]
Definition: agm.c:921
Scantable.
Definition: idctdsp.h:31
Definition: vlc.h:26
uint8_t level
Definition: svq3.c:206
#define av_freep(p)
#define av_log(a,...)
static int16_t block[64]
Definition: dct.c:116
#define height
#define width
int size
const char * b
Definition: vf_curves.c:119
const char * g
Definition: vf_curves.c:118
const char * r
Definition: vf_curves.c:117
static double cb(void *priv, double x, double y)
Definition: vf_geq.c:216
if(ret< 0)
Definition: vf_mcdeint.c:282
static const uint8_t offset[127][2]
Definition: vf_spp.c:107
static av_always_inline void chroma(WaveformContext *s, AVFrame *in, AVFrame *out, int component, int intensity, int offset_y, int offset_x, int column, int mirror, int jobnr, int nb_jobs)
Definition: vf_waveform.c:1625
#define INIT_VLC_LE
Definition: vlc.h:94
int len
uint8_t bits
Definition: vp3data.h:141