FFmpeg
dct.c
Go to the documentation of this file.
1 /*
2  * (c) 2001 Fabrice Bellard
3  * 2007 Marc Hoffman <marc.hoffman@analog.com>
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  * DCT test (c) 2001 Fabrice Bellard
25  * Started from sample code by Juan J. Sierralta P.
26  */
27 
28 #include "config.h"
29 #include "config_components.h"
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <string.h>
33 #if HAVE_UNISTD_H
34 #include <unistd.h>
35 #endif
36 #include <math.h>
37 
38 #include "libavutil/cpu.h"
39 #include "libavutil/common.h"
40 #include "libavutil/emms.h"
41 #include "libavutil/internal.h"
42 #include "libavutil/lfg.h"
43 #include "libavutil/mem_internal.h"
44 #include "libavutil/time.h"
45 
46 #include "libavcodec/dct.h"
47 #include "libavcodec/fdctdsp.h"
48 #include "libavcodec/idctdsp.h"
49 #include "libavcodec/simple_idct.h"
50 #include "libavcodec/xvididct.h"
51 #include "libavcodec/aandcttab.h"
52 #include "libavcodec/faandct.h"
53 #include "libavcodec/faanidct.h"
54 #include "libavcodec/dctref.h"
55 #include "libavcodec/proresdsp.c"
56 
57 struct algo {
58  const char *name;
59  void (*func)(int16_t *block);
61  int cpu_flag;
62  int nonspec;
63 };
64 
65 static const struct algo fdct_tab[] = {
66  { "REF-DBL", ff_ref_fdct, FF_IDCT_PERM_NONE },
67  { "IJG-AAN-INT", ff_fdct_ifast, FF_IDCT_PERM_NONE },
68  { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, FF_IDCT_PERM_NONE },
69 #if CONFIG_FAANDCT
70  { "FAAN", ff_faandct, FF_IDCT_PERM_NONE },
71 #endif /* CONFIG_FAANDCT */
72 };
73 
74 static void ff_prores_idct_wrap(int16_t *dst){
75  LOCAL_ALIGNED(16, int16_t, qmat, [64]);
76  int i;
77 
78  for(i=0; i<64; i++){
79  qmat[i]=4;
80  }
81  prores_idct_10(dst, qmat);
82  for(i=0; i<64; i++) {
83  dst[i] -= 512;
84  }
85 }
86 
87 static const struct algo idct_tab[] = {
88  { "REF-DBL", ff_ref_idct, FF_IDCT_PERM_NONE },
92  { "SIMPLE-C12", ff_simple_idct_int16_12bit, FF_IDCT_PERM_NONE, 0, 1 },
93  { "PR-C", ff_prores_idct_wrap, FF_IDCT_PERM_NONE, 0, 1 },
94 #if CONFIG_FAANIDCT
95  { "FAANI", ff_faanidct, FF_IDCT_PERM_NONE },
96 #endif /* CONFIG_FAANIDCT */
97 #if CONFIG_MPEG4_DECODER
98  { "XVID", ff_xvid_idct, FF_IDCT_PERM_NONE, 0, 1 },
99 #endif /* CONFIG_MPEG4_DECODER */
100 };
101 
102 #if ARCH_AARCH64
103 #include "aarch64/dct.c"
104 #elif ARCH_ARM
105 #include "arm/dct.c"
106 #elif ARCH_PPC
107 #include "ppc/dct.c"
108 #elif ARCH_X86
109 #include "x86/dct.c"
110 #else
111 static const struct algo fdct_tab_arch[] = { { 0 } };
112 static const struct algo idct_tab_arch[] = { { 0 } };
113 #endif
114 
115 #define AANSCALE_BITS 12
116 
117 #define NB_ITS 20000
118 #define NB_ITS_SPEED 50000
119 
120 DECLARE_ALIGNED(16, static int16_t, block)[64];
121 DECLARE_ALIGNED(8, static int16_t, block1)[64];
122 
123 static void init_block(int16_t block[64], int test, int is_idct, AVLFG *prng, int vals)
124 {
125  int i, j;
126 
127  memset(block, 0, 64 * sizeof(*block));
128 
129  switch (test) {
130  case 0:
131  for (i = 0; i < 64; i++)
132  block[i] = (av_lfg_get(prng) % (2*vals)) -vals;
133  if (is_idct) {
135  for (i = 0; i < 64; i++)
136  block[i] >>= 3;
137  }
138  break;
139  case 1:
140  j = av_lfg_get(prng) % 10 + 1;
141  for (i = 0; i < j; i++) {
142  int idx = av_lfg_get(prng) % 64;
143  block[idx] = av_lfg_get(prng) % (2*vals) -vals;
144  }
145  break;
146  case 2:
147  block[ 0] = av_lfg_get(prng) % (16*vals) - (8*vals);
148  block[63] = (block[0] & 1) ^ 1;
149  break;
150  }
151 }
152 
153 static void permute(int16_t dst[64], const int16_t src[64],
155 {
156  int i;
157 
158 #if ARCH_X86
159  if (permute_x86(dst, src, perm_type))
160  return;
161 #endif
162 
163  switch (perm_type) {
165  for (i = 0; i < 64; i++)
166  dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i];
167  break;
169  for (i = 0; i < 64; i++)
170  dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i];
171  break;
173  for (i = 0; i < 64; i++)
174  dst[(i>>3) | ((i<<3)&0x38)] = src[i];
175  break;
176  default:
177  for (i = 0; i < 64; i++)
178  dst[i] = src[i];
179  break;
180  }
181 }
182 
183 static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
184 {
185  void (*ref)(int16_t *block) = is_idct ? ff_ref_idct : ff_ref_fdct;
186  int it, i, scale;
187  int err_inf, v;
188  int64_t err2, ti, ti1, it1, err_sum = 0;
189  int64_t sysErr[64], sysErrMax = 0;
190  int64_t err2_matrix[64], err2_max = 0;
191  int maxout = 0;
192  int blockSumErrMax = 0, blockSumErr;
193  AVLFG prng;
194  const int vals=1<<bits;
195  double omse, ome;
196  int spec_err;
197 
198  av_lfg_init(&prng, 1);
199 
200  err_inf = 0;
201  err2 = 0;
202  for (i = 0; i < 64; i++)
203  err2_matrix[i] = sysErr[i] = 0;
204  for (it = 0; it < NB_ITS; it++) {
205  init_block(block1, test, is_idct, &prng, vals);
206  permute(block, block1, dct->perm_type);
207 
208  dct->func(block);
209  emms_c();
210 
211  if (!strcmp(dct->name, "IJG-AAN-INT")) {
212  for (i = 0; i < 64; i++) {
213  scale = 8 * (1 << (AANSCALE_BITS + 11)) / ff_aanscales[i];
214  block[i] = (block[i] * scale) >> AANSCALE_BITS;
215  }
216  }
217 
218  ref(block1);
219  if (!strcmp(dct->name, "PR-SSE2"))
220  for (i = 0; i < 64; i++)
221  block1[i] = av_clip(block1[i], 4-512, 1019-512);
222 
223  blockSumErr = 0;
224  for (i = 0; i < 64; i++) {
225  int err = block[i] - block1[i];
226  err_sum += err;
227  v = abs(err);
228  if (v > err_inf)
229  err_inf = v;
230  err2_matrix[i] += v * (int64_t)v;
231  err2 += v * (int64_t)v;
232  sysErr[i] += block[i] - block1[i];
233  blockSumErr += v;
234  if (abs(block[i]) > maxout)
235  maxout = abs(block[i]);
236  }
237  if (blockSumErrMax < blockSumErr)
238  blockSumErrMax = blockSumErr;
239  }
240  for (i = 0; i < 64; i++) {
241  sysErrMax = FFMAX(sysErrMax, FFABS(sysErr[i]));
242  err2_max = FFMAX(err2_max , FFABS(err2_matrix[i]));
243  }
244 
245  for (i = 0; i < 64; i++) {
246  if (i % 8 == 0)
247  printf("\n");
248  printf("%7d ", (int) sysErr[i]);
249  }
250  printf("\n");
251 
252  omse = (double) err2 / NB_ITS / 64;
253  ome = (double) err_sum / NB_ITS / 64;
254 
255  spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015);
256  if (test < 2)
257  spec_err = is_idct && ((double) err2_max / NB_ITS > 0.06 || (double) sysErrMax / NB_ITS > 0.015);
258 
259  printf("%s %s: max_err=%d omse=%0.8f ome=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
260  is_idct ? "IDCT" : "DCT", dct->name, err_inf,
261  omse, ome, (double) sysErrMax / NB_ITS,
262  maxout, blockSumErrMax);
263 
264  if (spec_err && !dct->nonspec) {
265  printf("Failed!\n");
266  return 1;
267  }
268 
269  if (!speed)
270  return 0;
271 
272  /* speed test */
273 
274  init_block(block, test, is_idct, &prng, vals);
275  permute(block1, block, dct->perm_type);
276 
277  ti = av_gettime_relative();
278  it1 = 0;
279  do {
280  for (it = 0; it < NB_ITS_SPEED; it++) {
281  memcpy(block, block1, sizeof(block));
282  dct->func(block);
283  }
284  emms_c();
285  it1 += NB_ITS_SPEED;
286  ti1 = av_gettime_relative() - ti;
287  } while (ti1 < 1000000);
288 
289  printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", dct->name,
290  (double) it1 * 1000.0 / (double) ti1);
291 
292  return 0;
293 }
294 
295 DECLARE_ALIGNED(8, static uint8_t, img_dest)[64];
296 DECLARE_ALIGNED(8, static uint8_t, img_dest1)[64];
297 
298 static void idct248_ref(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
299 {
300  static int init;
301  static double c8[8][8];
302  static double c4[4][4];
303  double block1[64], block2[64], block3[64];
304  double s, sum, v;
305  int i, j, k;
306 
307  if (!init) {
308  init = 1;
309 
310  for (i = 0; i < 8; i++) {
311  sum = 0;
312  for (j = 0; j < 8; j++) {
313  s = (i == 0) ? sqrt(1.0 / 8.0) : sqrt(1.0 / 4.0);
314  c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
315  sum += c8[i][j] * c8[i][j];
316  }
317  }
318 
319  for (i = 0; i < 4; i++) {
320  sum = 0;
321  for (j = 0; j < 4; j++) {
322  s = (i == 0) ? sqrt(1.0 / 4.0) : sqrt(1.0 / 2.0);
323  c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
324  sum += c4[i][j] * c4[i][j];
325  }
326  }
327  }
328 
329  /* butterfly */
330  s = 0.5 * sqrt(2.0);
331  for (i = 0; i < 4; i++) {
332  for (j = 0; j < 8; j++) {
333  block1[8 * (2 * i) + j] =
334  (block[8 * (2 * i) + j] + block[8 * (2 * i + 1) + j]) * s;
335  block1[8 * (2 * i + 1) + j] =
336  (block[8 * (2 * i) + j] - block[8 * (2 * i + 1) + j]) * s;
337  }
338  }
339 
340  /* idct8 on lines */
341  for (i = 0; i < 8; i++) {
342  for (j = 0; j < 8; j++) {
343  sum = 0;
344  for (k = 0; k < 8; k++)
345  sum += c8[k][j] * block1[8 * i + k];
346  block2[8 * i + j] = sum;
347  }
348  }
349 
350  /* idct4 */
351  for (i = 0; i < 8; i++) {
352  for (j = 0; j < 4; j++) {
353  /* top */
354  sum = 0;
355  for (k = 0; k < 4; k++)
356  sum += c4[k][j] * block2[8 * (2 * k) + i];
357  block3[8 * (2 * j) + i] = sum;
358 
359  /* bottom */
360  sum = 0;
361  for (k = 0; k < 4; k++)
362  sum += c4[k][j] * block2[8 * (2 * k + 1) + i];
363  block3[8 * (2 * j + 1) + i] = sum;
364  }
365  }
366 
367  /* clamp and store the result */
368  for (i = 0; i < 8; i++) {
369  for (j = 0; j < 8; j++) {
370  v = block3[8 * i + j];
371  if (v < 0) v = 0;
372  else if (v > 255) v = 255;
373  dest[i * linesize + j] = (int) rint(v);
374  }
375  }
376 }
377 
378 static void idct248_error(const char *name,
379  void (*idct248_put)(uint8_t *dest,
380  ptrdiff_t line_size,
381  int16_t *block),
382  int speed)
383 {
384  int it, i, it1, ti, ti1, err_max, v;
385  AVLFG prng;
386 
387  av_lfg_init(&prng, 1);
388 
389  /* just one test to see if code is correct (precision is less
390  important here) */
391  err_max = 0;
392  for (it = 0; it < NB_ITS; it++) {
393  /* XXX: use forward transform to generate values */
394  for (i = 0; i < 64; i++)
395  block1[i] = av_lfg_get(&prng) % 256 - 128;
396  block1[0] += 1024;
397 
398  for (i = 0; i < 64; i++)
399  block[i] = block1[i];
401 
402  for (i = 0; i < 64; i++)
403  block[i] = block1[i];
404  idct248_put(img_dest, 8, block);
405 
406  for (i = 0; i < 64; i++) {
407  v = abs((int) img_dest[i] - (int) img_dest1[i]);
408  if (v == 255)
409  printf("%d %d\n", img_dest[i], img_dest1[i]);
410  if (v > err_max)
411  err_max = v;
412  }
413 #if 0
414  printf("ref=\n");
415  for(i=0;i<8;i++) {
416  int j;
417  for(j=0;j<8;j++) {
418  printf(" %3d", img_dest1[i*8+j]);
419  }
420  printf("\n");
421  }
422 
423  printf("out=\n");
424  for(i=0;i<8;i++) {
425  int j;
426  for(j=0;j<8;j++) {
427  printf(" %3d", img_dest[i*8+j]);
428  }
429  printf("\n");
430  }
431 #endif
432  }
433  printf("%s %s: err_inf=%d\n", 1 ? "IDCT248" : "DCT248", name, err_max);
434 
435  if (!speed)
436  return;
437 
438  ti = av_gettime_relative();
439  it1 = 0;
440  do {
441  for (it = 0; it < NB_ITS_SPEED; it++) {
442  for (i = 0; i < 64; i++)
443  block[i] = block1[i];
444  idct248_put(img_dest, 8, block);
445  }
446  emms_c();
447  it1 += NB_ITS_SPEED;
448  ti1 = av_gettime_relative() - ti;
449  } while (ti1 < 1000000);
450 
451  printf("%s %s: %0.1f kdct/s\n", 1 ? "IDCT248" : "DCT248", name,
452  (double) it1 * 1000.0 / (double) ti1);
453 }
454 
455 static void help(void)
456 {
457  printf("dct-test [-i] [<test-number>] [<bits>]\n"
458  "test-number 0 -> test with random matrixes\n"
459  " 1 -> test with random sparse matrixes\n"
460  " 2 -> do 3. test from MPEG-4 std\n"
461  "bits Number of time domain bits to use, 8 is default\n"
462  "-i test IDCT implementations\n"
463  "-4 test IDCT248 implementations\n"
464  "-t speed test\n");
465 }
466 
467 #if !HAVE_GETOPT
468 #include "compat/getopt.c"
469 #endif
470 
471 int main(int argc, char **argv)
472 {
473  int test_idct = 0, test_248_dct = 0;
474  int c, i;
475  int test = 1;
476  int speed = 0;
477  int err = 0;
478  int bits=8;
479 
480  ff_ref_dct_init();
481 
482  for (;;) {
483  c = getopt(argc, argv, "ih4t");
484  if (c == -1)
485  break;
486  switch (c) {
487  case 'i':
488  test_idct = 1;
489  break;
490  case '4':
491  test_248_dct = 1;
492  break;
493  case 't':
494  speed = 1;
495  break;
496  default:
497  case 'h':
498  help();
499  return 0;
500  }
501  }
502 
503  if (optind < argc)
504  test = atoi(argv[optind]);
505  if(optind+1 < argc) bits= atoi(argv[optind+1]);
506 
507  printf("ffmpeg DCT/IDCT test\n");
508 
509  if (test_248_dct) {
510  idct248_error("SIMPLE-C", ff_simple_idct248_put, speed);
511  } else {
512  const int cpu_flags = av_get_cpu_flags();
513  if (test_idct) {
514  for (i = 0; i < FF_ARRAY_ELEMS(idct_tab); i++)
515  err |= dct_error(&idct_tab[i], test, test_idct, speed, bits);
516 
517  for (i = 0; idct_tab_arch[i].name; i++)
518  if (!(~cpu_flags & idct_tab_arch[i].cpu_flag))
519  err |= dct_error(&idct_tab_arch[i], test, test_idct, speed, bits);
520  }
521 #if CONFIG_FDCTDSP
522  else {
523  for (i = 0; i < FF_ARRAY_ELEMS(fdct_tab); i++)
524  err |= dct_error(&fdct_tab[i], test, test_idct, speed, bits);
525 
526  for (i = 0; fdct_tab_arch[i].name; i++)
527  if (!(~cpu_flags & fdct_tab_arch[i].cpu_flag))
528  err |= dct_error(&fdct_tab_arch[i], test, test_idct, speed, bits);
529  }
530 #endif /* CONFIG_FDCTDSP */
531  }
532 
533  if (err)
534  printf("Error: %d.\n", err);
535 
536  return !!err;
537 }
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
av_clip
#define av_clip
Definition: common.h:100
mem_internal.h
av_lfg_init
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition: lfg.c:32
ff_ref_dct_init
av_cold void ff_ref_dct_init(void)
Initialize the double precision discrete cosine transform functions fdct & idct.
Definition: dctref.c:41
algo::nonspec
int nonspec
Definition: dct.c:62
dct.c
int64_t
long long int64_t
Definition: coverity.c:34
AANSCALE_BITS
#define AANSCALE_BITS
Definition: dct.c:115
permute
static void permute(int16_t dst[64], const int16_t src[64], enum idct_permutation_type perm_type)
Definition: dct.c:153
test
Definition: idctdsp.c:35
permute_x86
static int permute_x86(int16_t dst[64], const int16_t src[64], enum idct_permutation_type perm_type)
Definition: dct.c:109
fdct_tab
static const struct algo fdct_tab[]
Definition: dct.c:65
cpu_flag
int cpu_flag
Definition: checkasm.c:403
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_get_cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition: cpu.c:109
cpu_flags
static atomic_int cpu_flags
Definition: cpu.c:56
img_dest1
static uint8_t img_dest1[64]
Definition: dct.c:296
ff_simple_idct_int16_10bit
void ff_simple_idct_int16_10bit(int16_t *block)
faandct.h
Floating point AAN DCT.
prores_idct_10
static void prores_idct_10(int16_t *restrict block, const int16_t *restrict qmat)
Special version of ff_simple_idct_int16_10bit() which does dequantization and scales by a factor of 2...
Definition: proresdsp.c:49
ff_simple_idct248_put
void ff_simple_idct248_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
Definition: simple_idct.c:100
proresdsp.c
help
static void help(void)
Definition: dct.c:455
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
dct.h
init_block
static void init_block(int16_t block[64], int test, int is_idct, AVLFG *prng, int vals)
Definition: dct.c:123
getopt
static int getopt(int argc, char *argv[], char *opts)
Definition: getopt.c:41
LOCAL_ALIGNED
#define LOCAL_ALIGNED(a, t, v,...)
Definition: mem_internal.h:124
emms_c
#define emms_c()
Definition: emms.h:63
main
int main(int argc, char **argv)
Definition: dct.c:471
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_lfg_get
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition: lfg.h:53
ff_xvid_idct
void ff_xvid_idct(int16_t *const in)
Definition: xvididct.c:291
lfg.h
ff_faanidct
void ff_faanidct(int16_t block[64])
Definition: faanidct.c:128
bits
uint8_t bits
Definition: vp3data.h:128
simple_idct.h
idct248_error
static void idct248_error(const char *name, void(*idct248_put)(uint8_t *dest, ptrdiff_t line_size, int16_t *block), int speed)
Definition: dct.c:378
xvididct.h
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
algo::cpu_flag
int cpu_flag
Definition: dct.c:61
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
rint
#define rint
Definition: tablegen.h:41
aandcttab.h
ff_faandct
void ff_faandct(int16_t *data)
Definition: faandct.c:115
dct_error
static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
Definition: dct.c:183
double
double
Definition: af_crystalizer.c:132
time.h
abs
#define abs(x)
Definition: cuda_runtime.h:35
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_prores_idct_wrap
static void ff_prores_idct_wrap(int16_t *dst)
Definition: dct.c:74
AVLFG
Context structure for the Lagged Fibonacci PRNG.
Definition: lfg.h:33
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
NB_ITS
#define NB_ITS
Definition: dct.c:117
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:104
block
static int16_t block[64]
Definition: dct.c:120
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
cpu.h
FF_IDCT_PERM_NONE
@ FF_IDCT_PERM_NONE
Definition: idctdsp.h:28
fdct_tab_arch
static const struct algo fdct_tab_arch[]
Definition: dct.c:111
printf
printf("static const uint8_t my_array[100] = {\n")
dct.c
block1
static int16_t block1[64]
Definition: dct.c:121
algo::func
void(* func)(int16_t *block)
Definition: dct.c:59
idct248_ref
static void idct248_ref(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
Definition: dct.c:298
faanidct.h
M_PI
#define M_PI
Definition: mathematics.h:67
emms.h
ff_simple_idct_int16_8bit
void ff_simple_idct_int16_8bit(int16_t *block)
NB_ITS_SPEED
#define NB_ITS_SPEED
Definition: dct.c:118
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ff_jpeg_fdct_islow_8
void ff_jpeg_fdct_islow_8(int16_t *data)
algo
Definition: dct.c:57
internal.h
common.h
dct
static void dct(AudioRNNContext *s, float *out, const float *in)
Definition: af_arnndn.c:1010
fdctdsp.h
optind
static int optind
Definition: getopt.c:37
idctdsp.h
ff_j_rev_dct
void ff_j_rev_dct(int16_t *data)
FF_IDCT_PERM_TRANSPOSE
@ FF_IDCT_PERM_TRANSPOSE
Definition: idctdsp.h:31
ff_fdct_ifast
void ff_fdct_ifast(int16_t *data)
Definition: jfdctfst.c:207
getopt.c
img_dest
static uint8_t img_dest[64]
Definition: dct.c:295
idct_tab
static const struct algo idct_tab[]
Definition: dct.c:87
FF_IDCT_PERM_PARTTRANS
@ FF_IDCT_PERM_PARTTRANS
Definition: idctdsp.h:32
ff_simple_idct_int16_12bit
void ff_simple_idct_int16_12bit(int16_t *block)
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
ff_ref_fdct
void ff_ref_fdct(short *block)
Transform 8x8 block of data with a double precision forward DCT This is a reference implementation.
Definition: dctref.c:59
idct_permutation_type
idct_permutation_type
Definition: idctdsp.h:27
dctref.h
idct_tab_arch
static const struct algo idct_tab_arch[]
Definition: dct.c:112
it
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s it
Definition: writing_filters.txt:31
ff_ref_idct
void ff_ref_idct(short *block)
Transform 8x8 block of data with a double precision inverse DCT This is a reference implementation.
Definition: dctref.c:95
algo::perm_type
enum idct_permutation_type perm_type
Definition: dct.c:60
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:291
algo::name
const char * name
Definition: dct.c:58
dct.c
dct.c
src
#define src
Definition: vp8dsp.c:248
FF_IDCT_PERM_LIBMPEG2
@ FF_IDCT_PERM_LIBMPEG2
Definition: idctdsp.h:29
ff_aanscales
const uint16_t ff_aanscales[64]
Definition: aandcttab.c:26