Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
9e1586fc
Commit
9e1586fc
authored
Aug 07, 2001
by
Fabrice Bellard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
updated dct-test to test IDCTs too
Originally committed as revision 44 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
de1ee36a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
94 additions
and
14 deletions
+94
-14
dct-test.c
libavcodec/dct-test.c
+94
-14
No files found.
libavcodec/dct-test.c
View file @
9e1586fc
...
@@ -6,12 +6,21 @@
...
@@ -6,12 +6,21 @@
#include <string.h>
#include <string.h>
#include <sys/time.h>
#include <sys/time.h>
#include <unistd.h>
#include <unistd.h>
#include <getopt.h>
#include "dsputil.h"
#include "dsputil.h"
#include "i386/mmx.h"
/* reference fdct/idct */
extern
void
fdct
(
DCTELEM
*
block
);
extern
void
fdct
(
DCTELEM
*
block
);
extern
void
idct
(
DCTELEM
*
block
);
extern
void
init_fdct
();
extern
void
init_fdct
();
extern
void
j_rev_dct
(
DCTELEM
*
data
);
extern
void
ff_mmx_idct
(
DCTELEM
*
data
);
extern
void
ff_mmxext_idct
(
DCTELEM
*
data
);
#define AANSCALE_BITS 12
#define AANSCALE_BITS 12
static
const
unsigned
short
aanscales
[
64
]
=
{
static
const
unsigned
short
aanscales
[
64
]
=
{
/* precomputed values scaled up by 14 bits */
/* precomputed values scaled up by 14 bits */
...
@@ -35,11 +44,26 @@ INT64 gettime(void)
...
@@ -35,11 +44,26 @@ INT64 gettime(void)
#define NB_ITS 20000
#define NB_ITS 20000
#define NB_ITS_SPEED 50000
#define NB_ITS_SPEED 50000
void
dct_error
(
const
char
*
name
,
static
short
idct_mmx_perm
[
64
];
void
(
*
fdct_func
)(
DCTELEM
*
block
))
void
idct_mmx_init
(
void
)
{
int
i
;
/* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
for
(
i
=
0
;
i
<
64
;
i
++
)
{
idct_mmx_perm
[
i
]
=
(
i
&
0x38
)
|
((
i
&
6
)
>>
1
)
|
((
i
&
1
)
<<
2
);
}
}
static
DCTELEM
block
[
64
]
__attribute__
((
aligned
(
8
)));
static
DCTELEM
block1
[
64
]
__attribute__
((
aligned
(
8
)));
void
dct_error
(
const
char
*
name
,
int
is_idct
,
void
(
*
fdct_func
)(
DCTELEM
*
block
),
void
(
*
fdct_ref
)(
DCTELEM
*
block
))
{
{
int
it
,
i
,
scale
;
int
it
,
i
,
scale
;
DCTELEM
block
[
64
],
block1
[
64
];
int
err_inf
,
v
;
int
err_inf
,
v
;
INT64
err2
,
ti
,
ti1
,
it1
;
INT64
err2
,
ti
,
ti1
,
it1
;
...
@@ -50,9 +74,22 @@ void dct_error(const char *name,
...
@@ -50,9 +74,22 @@ void dct_error(const char *name,
for
(
it
=
0
;
it
<
NB_ITS
;
it
++
)
{
for
(
it
=
0
;
it
<
NB_ITS
;
it
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
block1
[
i
]
=
random
()
%
256
;
block1
[
i
]
=
random
()
%
256
;
memcpy
(
block
,
block1
,
sizeof
(
DCTELEM
)
*
64
);
/* for idct test, generate inverse idct data */
if
(
is_idct
)
fdct
(
block1
);
if
(
fdct_func
==
ff_mmx_idct
||
fdct_func
==
j_rev_dct
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
block
[
idct_mmx_perm
[
i
]]
=
block1
[
i
];
}
else
{
memcpy
(
block
,
block1
,
sizeof
(
DCTELEM
)
*
64
);
}
fdct_func
(
block
);
fdct_func
(
block
);
emms
();
/* for ff_mmx_idct */
if
(
fdct_func
==
jpeg_fdct_ifast
)
{
if
(
fdct_func
==
jpeg_fdct_ifast
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
scale
=
(
1
<<
(
AANSCALE_BITS
+
11
))
/
aanscales
[
i
];
scale
=
(
1
<<
(
AANSCALE_BITS
+
11
))
/
aanscales
[
i
];
...
@@ -60,7 +97,7 @@ void dct_error(const char *name,
...
@@ -60,7 +97,7 @@ void dct_error(const char *name,
}
}
}
}
fdct
(
block1
);
fdct
_ref
(
block1
);
for
(
i
=
0
;
i
<
64
;
i
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
v
=
abs
(
block
[
i
]
-
block1
[
i
]);
v
=
abs
(
block
[
i
]
-
block1
[
i
]);
...
@@ -69,13 +106,23 @@ void dct_error(const char *name,
...
@@ -69,13 +106,23 @@ void dct_error(const char *name,
err2
+=
v
*
v
;
err2
+=
v
*
v
;
}
}
}
}
printf
(
"DCT %s: err_inf=%d err2=%0.2f
\n
"
,
printf
(
"%s %s: err_inf=%d err2=%0.2f
\n
"
,
is_idct
?
"IDCT"
:
"DCT"
,
name
,
err_inf
,
(
double
)
err2
/
NB_ITS
/
64
.
0
);
name
,
err_inf
,
(
double
)
err2
/
NB_ITS
/
64
.
0
);
/* speed test */
/* speed test */
for
(
i
=
0
;
i
<
64
;
i
++
)
for
(
i
=
0
;
i
<
64
;
i
++
)
block1
[
i
]
=
255
-
63
+
i
;
block1
[
i
]
=
255
-
63
+
i
;
/* for idct test, generate inverse idct data */
if
(
is_idct
)
fdct
(
block1
);
if
(
fdct_func
==
ff_mmx_idct
||
fdct_func
==
j_rev_dct
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
block
[
idct_mmx_perm
[
i
]]
=
block1
[
i
];
}
ti
=
gettime
();
ti
=
gettime
();
it1
=
0
;
it1
=
0
;
do
{
do
{
...
@@ -86,20 +133,53 @@ void dct_error(const char *name,
...
@@ -86,20 +133,53 @@ void dct_error(const char *name,
it1
+=
NB_ITS_SPEED
;
it1
+=
NB_ITS_SPEED
;
ti1
=
gettime
()
-
ti
;
ti1
=
gettime
()
-
ti
;
}
while
(
ti1
<
1000000
);
}
while
(
ti1
<
1000000
);
emms
();
printf
(
"DCT %s: %0.1f kdct/s
\n
"
,
printf
(
"%s %s: %0.1f kdct/s
\n
"
,
is_idct
?
"IDCT"
:
"DCT"
,
name
,
(
double
)
it1
*
1000
.
0
/
(
double
)
ti1
);
name
,
(
double
)
it1
*
1000
.
0
/
(
double
)
ti1
);
}
}
void
help
(
void
)
{
printf
(
"dct-test [-i]
\n
"
"test DCT implementations
\n
"
);
exit
(
1
);
}
int
main
(
int
argc
,
char
**
argv
)
int
main
(
int
argc
,
char
**
argv
)
{
{
int
test_idct
=
0
;
int
c
;
init_fdct
();
init_fdct
();
idct_mmx_init
();
printf
(
"ffmpeg DCT test
\n
"
);
dct_error
(
"REF"
,
fdct
);
/* only to verify code ! */
for
(;;)
{
dct_error
(
"AAN"
,
jpeg_fdct_ifast
);
c
=
getopt
(
argc
,
argv
,
"ih"
);
dct_error
(
"MMX"
,
fdct_mmx
);
if
(
c
==
-
1
)
break
;
switch
(
c
)
{
case
'i'
:
test_idct
=
1
;
break
;
case
'h'
:
help
();
break
;
}
}
printf
(
"ffmpeg DCT/IDCT test
\n
"
);
if
(
!
test_idct
)
{
dct_error
(
"REF"
,
0
,
fdct
,
fdct
);
/* only to verify code ! */
dct_error
(
"AAN"
,
0
,
jpeg_fdct_ifast
,
fdct
);
dct_error
(
"MMX"
,
0
,
fdct_mmx
,
fdct
);
}
else
{
dct_error
(
"REF"
,
1
,
idct
,
idct
);
dct_error
(
"INT"
,
1
,
j_rev_dct
,
idct
);
dct_error
(
"MMX"
,
1
,
ff_mmx_idct
,
idct
);
// dct_error("MMX", 1, ff_mmxext_idct, idct);
}
return
0
;
return
0
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment