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
6054cd25
Commit
6054cd25
authored
Jun 02, 2011
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ac3enc: add int32_t array clipping function to DSPUtil, including x86 versions.
parent
8a8d0ce2
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
171 additions
and
0 deletions
+171
-0
dsputil.c
libavcodec/dsputil.c
+17
-0
dsputil.h
libavcodec/dsputil.h
+16
-0
dsputil_mmx.c
libavcodec/x86/dsputil_mmx.c
+23
-0
dsputil_yasm.asm
libavcodec/x86/dsputil_yasm.asm
+115
-0
No files found.
libavcodec/dsputil.c
View file @
6054cd25
...
...
@@ -2676,6 +2676,22 @@ static void apply_window_int16_c(int16_t *output, const int16_t *input,
}
}
static
void
vector_clip_int32_c
(
int32_t
*
dst
,
const
int32_t
*
src
,
int32_t
min
,
int32_t
max
,
unsigned
int
len
)
{
do
{
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
*
dst
++
=
av_clip
(
*
src
++
,
min
,
max
);
len
-=
8
;
}
while
(
len
>
0
);
}
#define W0 2048
#define W1 2841
/* 2048*sqrt (2)*cos (1*pi/16) */
#define W2 2676
/* 2048*sqrt (2)*cos (2*pi/16) */
...
...
@@ -3122,6 +3138,7 @@ av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx)
c
->
scalarproduct_int16
=
scalarproduct_int16_c
;
c
->
scalarproduct_and_madd_int16
=
scalarproduct_and_madd_int16_c
;
c
->
apply_window_int16
=
apply_window_int16_c
;
c
->
vector_clip_int32
=
vector_clip_int32_c
;
c
->
scalarproduct_float
=
scalarproduct_float_c
;
c
->
butterflies_float
=
butterflies_float_c
;
c
->
vector_fmul_scalar
=
vector_fmul_scalar_c
;
...
...
libavcodec/dsputil.h
View file @
6054cd25
...
...
@@ -555,6 +555,22 @@ typedef struct DSPContext {
void
(
*
apply_window_int16
)(
int16_t
*
output
,
const
int16_t
*
input
,
const
int16_t
*
window
,
unsigned
int
len
);
/**
* Clip each element in an array of int32_t to a given minimum and maximum value.
* @param dst destination array
* constraints: 16-byte aligned
* @param src source array
* constraints: 16-byte aligned
* @param min minimum value
* constraints: must in the the range [-(1<<24), 1<<24]
* @param max maximum value
* constraints: must in the the range [-(1<<24), 1<<24]
* @param len number of elements in the array
* constraints: multiple of 32 greater than zero
*/
void
(
*
vector_clip_int32
)(
int32_t
*
dst
,
const
int32_t
*
src
,
int32_t
min
,
int32_t
max
,
unsigned
int
len
);
/* rv30 functions */
qpel_mc_func
put_rv30_tpel_pixels_tab
[
4
][
16
];
qpel_mc_func
avg_rv30_tpel_pixels_tab
[
4
][
16
];
...
...
libavcodec/x86/dsputil_mmx.c
View file @
6054cd25
...
...
@@ -2429,6 +2429,15 @@ int ff_add_hfyu_left_prediction_sse4(uint8_t *dst, const uint8_t *src, int w, i
float
ff_scalarproduct_float_sse
(
const
float
*
v1
,
const
float
*
v2
,
int
order
);
void
ff_vector_clip_int32_mmx
(
int32_t
*
dst
,
const
int32_t
*
src
,
int32_t
min
,
int32_t
max
,
unsigned
int
len
);
void
ff_vector_clip_int32_sse2
(
int32_t
*
dst
,
const
int32_t
*
src
,
int32_t
min
,
int32_t
max
,
unsigned
int
len
);
void
ff_vector_clip_int32_sse2_int
(
int32_t
*
dst
,
const
int32_t
*
src
,
int32_t
min
,
int32_t
max
,
unsigned
int
len
);
void
ff_vector_clip_int32_sse41
(
int32_t
*
dst
,
const
int32_t
*
src
,
int32_t
min
,
int32_t
max
,
unsigned
int
len
);
void
dsputil_init_mmx
(
DSPContext
*
c
,
AVCodecContext
*
avctx
)
{
int
mm_flags
=
av_get_cpu_flags
();
...
...
@@ -2570,6 +2579,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
c
->
put_rv40_chroma_pixels_tab
[
0
]
=
ff_put_rv40_chroma_mc8_mmx
;
c
->
put_rv40_chroma_pixels_tab
[
1
]
=
ff_put_rv40_chroma_mc4_mmx
;
c
->
vector_clip_int32
=
ff_vector_clip_int32_mmx
;
#endif
if
(
mm_flags
&
AV_CPU_FLAG_MMX2
)
{
...
...
@@ -2855,6 +2866,11 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
#if HAVE_YASM
c
->
scalarproduct_int16
=
ff_scalarproduct_int16_sse2
;
c
->
scalarproduct_and_madd_int16
=
ff_scalarproduct_and_madd_int16_sse2
;
if
(
mm_flags
&
AV_CPU_FLAG_ATOM
)
{
c
->
vector_clip_int32
=
ff_vector_clip_int32_sse2_int
;
}
else
{
c
->
vector_clip_int32
=
ff_vector_clip_int32_sse2
;
}
if
(
avctx
->
flags
&
CODEC_FLAG_BITEXACT
)
{
c
->
apply_window_int16
=
ff_apply_window_int16_sse2_ba
;
}
else
{
...
...
@@ -2880,6 +2896,13 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
}
#endif
}
if
(
mm_flags
&
AV_CPU_FLAG_SSE4
&&
HAVE_SSE
)
{
#if HAVE_YASM
c
->
vector_clip_int32
=
ff_vector_clip_int32_sse41
;
#endif
}
#if HAVE_AVX && HAVE_YASM
if
(
mm_flags
&
AV_CPU_FLAG_AVX
)
{
if
(
bit_depth
==
10
)
{
...
...
libavcodec/x86/dsputil_yasm.asm
View file @
6054cd25
...
...
@@ -1048,3 +1048,118 @@ emu_edge sse
%ifdef
ARCH_X86_32
emu_edge
mmx
%endif
;-----------------------------------------------------------------------------
; void ff_vector_clip_int32(int32_t *dst, const int32_t *src, int32_t min,
; int32_t max, unsigned int len)
;-----------------------------------------------------------------------------
%macro
PMINSD_MMX
3
; dst, src, tmp
mova
%3
,
%2
pcmpgtd
%3
,
%1
pxor
%1
,
%2
pand
%1
,
%3
pxor
%1
,
%2
%endmacro
%macro
PMAXSD_MMX
3
; dst, src, tmp
mova
%3
,
%1
pcmpgtd
%3
,
%2
pand
%1
,
%3
pandn
%3
,
%2
por
%1
,
%3
%endmacro
%macro
CLIPD_MMX
3
-
4
; src/dst, min, max, tmp
PMINSD_MMX
%1
,
%3
,
%4
PMAXSD_MMX
%1
,
%2
,
%4
%endmacro
%macro
CLIPD_SSE2
3
-
4
; src/dst, min (float), max (float), unused
cvtdq2ps
%1
,
%1
minps
%1
,
%3
maxps
%1
,
%2
cvtps2dq
%1
,
%1
%endmacro
%macro
CLIPD_SSE41
3
-
4
; src/dst, min, max, unused
pminsd
%1
,
%3
pmaxsd
%1
,
%2
%endmacro
%macro
SPLATD_MMX
1
punpckldq
%1
,
%1
%endmacro
%macro
SPLATD_SSE2
1
pshufd
%1
,
%1
,
0
%endmacro
%macro
VECTOR_CLIP_INT32
4
cglobal
vector_clip_int32_
%1
,
5
,
5
,
%2
,
dst
,
src
,
min
,
max
,
len
%ifidn
%1
,
sse2
cvtsi2ss
m4
,
minm
cvtsi2ss
m5
,
maxm
%else
movd
m4
,
minm
movd
m5
,
maxm
%endif
SPLATD
m4
SPLATD
m5
.
loop
:
%assign
%%
i
1
%rep
%3
mova
m0
,
[
srcq
+
mmsize
*
0
*
%%
i
]
mova
m1
,
[
srcq
+
mmsize
*
1
*
%%
i
]
mova
m2
,
[
srcq
+
mmsize
*
2
*
%%
i
]
mova
m3
,
[
srcq
+
mmsize
*
3
*
%%
i
]
%if
%4
mova
m7
,
[
srcq
+
mmsize
*
4
*
%%
i
]
mova
m8
,
[
srcq
+
mmsize
*
5
*
%%
i
]
mova
m9
,
[
srcq
+
mmsize
*
6
*
%%
i
]
mova
m10
,
[
srcq
+
mmsize
*
7
*
%%
i
]
%endif
CLIPD
m0
,
m4
,
m5
,
m6
CLIPD
m1
,
m4
,
m5
,
m6
CLIPD
m2
,
m4
,
m5
,
m6
CLIPD
m3
,
m4
,
m5
,
m6
%if
%4
CLIPD
m7
,
m4
,
m5
,
m6
CLIPD
m8
,
m4
,
m5
,
m6
CLIPD
m9
,
m4
,
m5
,
m6
CLIPD
m10
,
m4
,
m5
,
m6
%endif
mova
[
dstq
+
mmsize
*
0
*
%%
i
]
,
m0
mova
[
dstq
+
mmsize
*
1
*
%%
i
]
,
m1
mova
[
dstq
+
mmsize
*
2
*
%%
i
]
,
m2
mova
[
dstq
+
mmsize
*
3
*
%%
i
]
,
m3
%if
%4
mova
[
dstq
+
mmsize
*
4
*
%%
i
]
,
m7
mova
[
dstq
+
mmsize
*
5
*
%%
i
]
,
m8
mova
[
dstq
+
mmsize
*
6
*
%%
i
]
,
m9
mova
[
dstq
+
mmsize
*
7
*
%%
i
]
,
m10
%endif
%assign
%%
i
%%
i
+
1
%endrep
add
srcq
,
mmsize
*
4
*
(
%3
+
%4
)
add
dstq
,
mmsize
*
4
*
(
%3
+
%4
)
sub
lend
,
mmsize
*
(
%3
+
%4
)
jg
.
loop
REP_RET
%endmacro
INIT_MMX
%define
SPLATD
SPLATD_MMX
%define
CLIPD
CLIPD_MMX
VECTOR_CLIP_INT32
mmx
,
0
,
1
,
0
INIT_XMM
%define
SPLATD
SPLATD_SSE2
VECTOR_CLIP_INT32
sse2_int
,
6
,
1
,
0
%define
CLIPD
CLIPD_SSE2
VECTOR_CLIP_INT32
sse2
,
6
,
2
,
0
%define
CLIPD
CLIPD_SSE41
%ifdef
m8
VECTOR_CLIP_INT32
sse41
,
11
,
1
,
1
%else
VECTOR_CLIP_INT32
sse41
,
6
,
1
,
0
%endif
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