29#include "config_components.h"
54#if CONFIG_PRORES_DECODER
75#if CONFIG_PRORES_DECODER
76static void ff_prores_idct_wrap(int16_t *
dst){
96#if CONFIG_PRORES_DECODER
102#if CONFIG_MPEG4_DECODER
120#define AANSCALE_BITS 12
123#define NB_ITS_SPEED 50000
136 for (
i = 0;
i < 64;
i++)
140 for (
i = 0;
i < 64;
i++)
146 for (
i = 0;
i < j;
i++) {
170 for (
i = 0;
i < 64;
i++)
171 dst[(
i & 0x38) | ((
i & 6) >> 1) | ((
i & 1) << 2)] =
src[
i];
174 for (
i = 0;
i < 64;
i++)
175 dst[(
i & 0x24) | ((
i & 3) << 3) | ((
i >> 3) & 3)] =
src[
i];
178 for (
i = 0;
i < 64;
i++)
182 for (
i = 0;
i < 64;
i++)
193 int64_t err2, ti, ti1, it1, err_sum = 0;
194 int64_t sysErr[64], sysErrMax = 0;
195 int64_t err2_matrix[64], err2_max = 0;
197 int blockSumErrMax = 0, blockSumErr;
199 const int vals=1<<
bits;
207 for (
i = 0;
i < 64;
i++)
208 err2_matrix[
i] = sysErr[
i] = 0;
209 for (it = 0; it <
NB_ITS; it++) {
215 if (!strcmp(
dct->name,
"IJG-AAN-INT")) {
216 for (
i = 0;
i < 64;
i++) {
223 if (!strcmp(
dct->name,
"PR-SSE2"))
224 for (
i = 0;
i < 64;
i++)
228 for (
i = 0;
i < 64;
i++) {
241 if (blockSumErrMax < blockSumErr)
242 blockSumErrMax = blockSumErr;
244 for (
i = 0;
i < 64;
i++) {
246 err2_max =
FFMAX(err2_max ,
FFABS(err2_matrix[
i]));
249 for (
i = 0;
i < 64;
i++) {
252 printf(
"%7d ", (
int) sysErr[
i]);
259 spec_err = is_idct && (err_inf > 1 || omse > 0.02 ||
fabs(ome) > 0.0015);
263 printf(
"%s %s: max_err=%d omse=%0.8f ome=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
264 is_idct ?
"IDCT" :
"DCT",
dct->name, err_inf,
265 omse, ome, (
double) sysErrMax /
NB_ITS,
266 maxout, blockSumErrMax);
268 if (spec_err && !
dct->nonspec) {
290 }
while (ti1 < 1000000);
292 printf(
"%s %s: %0.1f kdct/s\n", is_idct ?
"IDCT" :
"DCT",
dct->name,
293 (
double) it1 * 1000.0 / (
double) ti1);
304 static double c8[8][8];
305 static double c4[4][4];
306 double block1[64], block2[64], block3[64];
313 for (
i = 0;
i < 8;
i++) {
315 for (j = 0; j < 8; j++) {
316 s = (
i == 0) ? sqrt(1.0 / 8.0) : sqrt(1.0 / 4.0);
317 c8[
i][j] =
s * cos(
M_PI *
i * (j + 0.5) / 8.0);
318 sum += c8[
i][j] * c8[
i][j];
322 for (
i = 0;
i < 4;
i++) {
324 for (j = 0; j < 4; j++) {
325 s = (
i == 0) ? sqrt(1.0 / 4.0) : sqrt(1.0 / 2.0);
326 c4[
i][j] =
s * cos(
M_PI *
i * (j + 0.5) / 4.0);
327 sum += c4[
i][j] * c4[
i][j];
334 for (
i = 0;
i < 4;
i++) {
335 for (j = 0; j < 8; j++) {
344 for (
i = 0;
i < 8;
i++) {
345 for (j = 0; j < 8; j++) {
347 for (k = 0; k < 8; k++)
348 sum += c8[k][j] *
block1[8 *
i + k];
349 block2[8 *
i + j] = sum;
354 for (
i = 0;
i < 8;
i++) {
355 for (j = 0; j < 4; j++) {
358 for (k = 0; k < 4; k++)
359 sum += c4[k][j] * block2[8 * (2 * k) +
i];
360 block3[8 * (2 * j) +
i] = sum;
364 for (k = 0; k < 4; k++)
365 sum += c4[k][j] * block2[8 * (2 * k + 1) +
i];
366 block3[8 * (2 * j + 1) +
i] = sum;
371 for (
i = 0;
i < 8;
i++) {
372 for (j = 0; j < 8; j++) {
373 v = block3[8 *
i + j];
375 else if (v > 255) v = 255;
376 dest[
i * linesize + j] = (int)
rint(v);
382 void (*idct248_put)(uint8_t *dest,
387 int it,
i, it1, ti, ti1, err_max, v;
395 for (it = 0; it <
NB_ITS; it++) {
397 for (
i = 0;
i < 64;
i++)
401 for (
i = 0;
i < 64;
i++)
405 for (
i = 0;
i < 64;
i++)
409 for (
i = 0;
i < 64;
i++) {
436 printf(
"%s %s: err_inf=%d\n", 1 ?
"IDCT248" :
"DCT248",
name, err_max);
445 for (
i = 0;
i < 64;
i++)
451 }
while (ti1 < 1000000);
453 printf(
"%s %s: %0.1f kdct/s\n", 1 ?
"IDCT248" :
"DCT248",
name,
454 (
double) it1 * 1000.0 / (
double) ti1);
459 printf(
"dct-test [-i] [<test-number>] [<bits>]\n"
460 "test-number 0 -> test with random matrixes\n"
461 " 1 -> test with random sparse matrixes\n"
462 " 2 -> do 3. test from MPEG-4 std\n"
463 "bits Number of time domain bits to use, 8 is default\n"
464 "-i test IDCT implementations\n"
465 "-4 test IDCT248 implementations\n"
475 int test_idct = 0, test_248_dct = 0;
485 c =
getopt(argc, argv,
"ih4t");
509 printf(
"ffmpeg DCT/IDCT test\n");
536 printf(
"Error: %d.\n", err);
const uint16_t ff_aanscales[64]
AAN (Arai, Agui and Nakajima) (I)DCT tables.
static const struct algo fdct_tab_arch[]
static const struct algo idct_tab_arch[]
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static void dct(AudioRNNContext *s, float *out, const float *in)
#define i(width, name, range_min, range_max)
common internal and external API header
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
__device__ int printf(const char *,...)
static __device__ float fabs(float a)
static void idct248_error(const char *name, void(*idct248_put)(uint8_t *dest, ptrdiff_t line_size, int16_t *block), int speed)
static const struct algo fdct_tab[]
static void idct248_ref(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
static uint8_t img_dest1[64]
static void init_block(int16_t block[64], int test, int is_idct, AVLFG *prng, int vals)
static void permute(int16_t dst[64], const int16_t src[64], enum idct_permutation_type perm_type)
static const struct algo idct_tab[]
static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
static int16_t block1[64]
static uint8_t img_dest[64]
void ff_j_rev_dct(int16_t data[64])
av_cold void ff_ref_dct_init(void)
Initialize the double precision discrete cosine transform functions fdct & idct.
void ff_ref_idct(short *block)
Transform 8x8 block of data with a double precision inverse DCT This is a reference implementation.
void ff_ref_fdct(short *block)
Transform 8x8 block of data with a double precision forward DCT This is a reference implementation.
int(* init)(AVBSFContext *ctx)
void ff_faandct(int16_t *data)
void ff_faanidct(int16_t block[64])
static const uint8_t bits[8]
void ff_fdct_ifast(int16_t *data)
void ff_jpeg_fdct_islow_8(int16_t *data)
static int getopt(int argc, char *argv[], const char *opts)
static void scale(int *out, const int *in, const int w, const int h, const int shift)
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
static atomic_int cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
common internal API header
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
#define LOCAL_ALIGNED(a, t, v,...)
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...
void ff_simple_idct248_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
void ff_simple_idct_int16_8bit(int16_t *block)
void ff_simple_idct_int16_12bit(int16_t *block)
void ff_simple_idct_int16_10bit(int16_t *block)
#define FF_ARRAY_ELEMS(a)
Context structure for the Lagged Fibonacci PRNG.
enum idct_permutation_type perm_type
void(* func)(int16_t *block)
static void prng(CheckasmRand *restrict xs, uint8_t *restrict buf, size_t size)
static int ref[MAX_W *MAX_W]
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
static int permute_x86(int16_t dst[64], const int16_t src[64], enum idct_permutation_type perm_type)
void ff_xvid_idct(int16_t *const in)