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
04217de4
Commit
04217de4
authored
Feb 21, 2012
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
swscale: K&R formatting cosmetics for PowerPC code (part I/II)
parent
3f486e0d
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
314 additions
and
303 deletions
+314
-303
swscale_altivec.c
libswscale/ppc/swscale_altivec.c
+226
-218
yuv2yuv_altivec.c
libswscale/ppc/yuv2yuv_altivec.c
+88
-85
No files found.
libswscale/ppc/swscale_altivec.c
View file @
04217de4
...
...
@@ -22,6 +22,7 @@
*/
#include <inttypes.h>
#include "config.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
...
...
@@ -30,8 +31,8 @@
#define vzero vec_splat_s32(0)
static
inline
void
altivec_packIntArrayToCharArray
(
int
*
val
,
uint8_t
*
dest
,
int
dstW
)
static
inline
void
altivec_packIntArrayToCharArray
(
int
*
val
,
uint8_t
*
dest
,
int
dstW
)
{
register
int
i
;
vector
unsigned
int
altivec_vectorShiftInt19
=
...
...
@@ -41,14 +42,14 @@ altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW)
/* and will handle load misalignment on val w/ vec_perm */
vector
unsigned
char
perm1
;
vector
signed
int
v1
;
for
(
i
=
0
;
(
i
<
dstW
)
&&
(((
uintptr_t
)
dest
+
i
)
%
16
)
;
i
++
)
{
for
(
i
=
0
;
(
i
<
dstW
)
&&
(((
uintptr_t
)
dest
+
i
)
%
16
)
;
i
++
)
{
int
t
=
val
[
i
]
>>
19
;
dest
[
i
]
=
(
t
<
0
)
?
0
:
((
t
>
255
)
?
255
:
t
);
}
perm1
=
vec_lvsl
(
i
<<
2
,
val
);
v1
=
vec_ld
(
i
<<
2
,
val
);
for
(
;
i
<
(
dstW
-
15
);
i
+=
16
)
{
for
(
;
i
<
(
dstW
-
15
);
i
+=
16
)
{
int
offset
=
i
<<
2
;
vector
signed
int
v2
=
vec_ld
(
offset
+
16
,
val
);
vector
signed
int
v3
=
vec_ld
(
offset
+
32
,
val
);
...
...
@@ -70,7 +71,7 @@ altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW)
v1
=
v5
;
}
}
else
{
// dest is properly aligned, great
for
(
i
=
0
;
i
<
(
dstW
-
15
);
i
+=
16
)
{
for
(
i
=
0
;
i
<
(
dstW
-
15
);
i
+=
16
)
{
int
offset
=
i
<<
2
;
vector
signed
int
v1
=
vec_ld
(
offset
,
val
);
vector
signed
int
v2
=
vec_ld
(
offset
+
16
,
val
);
...
...
@@ -86,22 +87,21 @@ altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW)
vec_st
(
vf
,
i
,
dest
);
}
}
for
(
;
i
<
dstW
;
i
++
)
{
for
(
;
i
<
dstW
;
i
++
)
{
int
t
=
val
[
i
]
>>
19
;
dest
[
i
]
=
(
t
<
0
)
?
0
:
((
t
>
255
)
?
255
:
t
);
}
}
//FIXME remove the usage of scratch buffers.
static
void
yuv2planeX_altivec
(
const
int16_t
*
filter
,
int
filterSize
,
// FIXME remove the usage of scratch buffers.
static
void
yuv2planeX_altivec
(
const
int16_t
*
filter
,
int
filterSize
,
const
int16_t
**
src
,
uint8_t
*
dest
,
int
dstW
,
const
uint8_t
*
dither
,
int
offset
)
{
register
int
i
,
j
;
DECLARE_ALIGNED
(
16
,
int
,
val
)[
dstW
];
for
(
i
=
0
;
i
<
dstW
;
i
++
)
for
(
i
=
0
;
i
<
dstW
;
i
++
)
val
[
i
]
=
dither
[(
i
+
offset
)
&
7
]
<<
12
;
for
(
j
=
0
;
j
<
filterSize
;
j
++
)
{
...
...
@@ -113,7 +113,7 @@ yuv2planeX_altivec(const int16_t *filter, int filterSize,
perm
=
vec_lvsl
(
0
,
src
[
j
]);
l1
=
vec_ld
(
0
,
src
[
j
]);
for
(
i
=
0
;
i
<
(
dstW
-
7
);
i
+=
8
)
{
for
(
i
=
0
;
i
<
(
dstW
-
7
);
i
+=
8
)
{
int
offset
=
i
<<
2
;
vector
signed
short
l2
=
vec_ld
((
i
<<
1
)
+
16
,
src
[
j
]);
...
...
@@ -136,10 +136,9 @@ yuv2planeX_altivec(const int16_t *filter, int filterSize,
l1
=
l2
;
}
for
(
;
i
<
dstW
;
i
++
)
{
for
(;
i
<
dstW
;
i
++
)
val
[
i
]
+=
src
[
j
][
i
]
*
filter
[
j
];
}
}
altivec_packIntArrayToCharArray
(
val
,
dest
,
dstW
);
}
...
...
@@ -151,20 +150,18 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
DECLARE_ALIGNED
(
16
,
int
,
tempo
)[
4
];
if
(
filterSize
%
4
)
{
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
register
int
j
;
register
int
srcPos
=
filterPos
[
i
];
register
int
val
=
0
;
for
(
j
=
0
;
j
<
filterSize
;
j
++
)
{
val
+=
((
int
)
src
[
srcPos
+
j
])
*
filter
[
filterSize
*
i
+
j
];
}
dst
[
i
]
=
FFMIN
(
val
>>
7
,
(
1
<<
15
)
-
1
);
for
(
j
=
0
;
j
<
filterSize
;
j
++
)
val
+=
((
int
)
src
[
srcPos
+
j
])
*
filter
[
filterSize
*
i
+
j
];
dst
[
i
]
=
FFMIN
(
val
>>
7
,
(
1
<<
15
)
-
1
);
}
}
else
}
else
switch
(
filterSize
)
{
case
4
:
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
register
int
srcPos
=
filterPos
[
i
];
vector
unsigned
char
src_v0
=
vec_ld
(
srcPos
,
src
);
...
...
@@ -196,12 +193,12 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
val_vEven
=
vec_mule
(
src_v
,
filter_v
);
val_s
=
vec_sums
(
val_vEven
,
vzero
);
vec_st
(
val_s
,
0
,
tempo
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
}
break
;
case
8
:
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
register
int
srcPos
=
filterPos
[
i
];
vector
unsigned
char
src_v0
=
vec_ld
(
srcPos
,
src
);
...
...
@@ -221,12 +218,12 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
val_v
=
vec_msums
(
src_v
,
filter_v
,
(
vector
signed
int
)
vzero
);
val_s
=
vec_sums
(
val_v
,
vzero
);
vec_st
(
val_s
,
0
,
tempo
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
}
break
;
case
16
:
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
register
int
srcPos
=
filterPos
[
i
];
vector
unsigned
char
src_v0
=
vec_ld
(
srcPos
,
src
);
...
...
@@ -248,12 +245,12 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
vector
signed
int
val_s
=
vec_sums
(
val_v
,
vzero
);
vec_st
(
val_s
,
0
,
tempo
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
}
break
;
default:
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
for
(
i
=
0
;
i
<
dstW
;
i
++
)
{
register
int
j
;
register
int
srcPos
=
filterPos
[
i
];
...
...
@@ -264,7 +261,7 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
vector
unsigned
char
src_v0
=
vec_ld
(
srcPos
,
src
);
vector
unsigned
char
permS
=
vec_lvsl
(
srcPos
,
src
);
for
(
j
=
0
;
j
<
filterSize
-
15
;
j
+=
16
)
{
for
(
j
=
0
;
j
<
filterSize
-
15
;
j
+=
16
)
{
vector
unsigned
char
src_v1
=
vec_ld
(
srcPos
+
j
+
16
,
src
);
vector
unsigned
char
src_vF
=
vec_perm
(
src_v0
,
src_v1
,
permS
);
...
...
@@ -285,9 +282,9 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
src_v0
=
src_v1
;
}
if
(
j
<
filterSize
-
7
)
{
if
(
j
<
filterSize
-
7
)
{
// loading src_v0 is useless, it's already done above
//
vector unsigned char src_v0 = vec_ld(srcPos + j, src);
//
vector unsigned char src_v0 = vec_ld(srcPos + j, src);
vector
unsigned
char
src_v1
,
src_vF
;
vector
signed
short
src_v
,
filter_v1R
,
filter_v
;
if
((((
uintptr_t
)
src
+
srcPos
)
%
16
)
>
8
)
{
...
...
@@ -298,7 +295,7 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
src_v
=
// vec_unpackh sign-extends...
(
vector
signed
short
)(
vec_mergeh
((
vector
unsigned
char
)
vzero
,
src_vF
));
// loading filter_v0R is useless, it's already done above
//
vector signed short filter_v0R = vec_ld((i * 2 * filterSize) + j, filter);
//
vector signed short filter_v0R = vec_ld((i * 2 * filterSize) + j, filter);
filter_v1R
=
vec_ld
((
i
*
2
*
filterSize
)
+
(
j
*
2
)
+
16
,
filter
);
filter_v
=
vec_perm
(
filter_v0R
,
filter_v1R
,
permF
);
...
...
@@ -308,9 +305,8 @@ static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
val_s
=
vec_sums
(
val_v
,
vzero
);
vec_st
(
val_s
,
0
,
tempo
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
dst
[
i
]
=
FFMIN
(
tempo
[
3
]
>>
7
,
(
1
<<
15
)
-
1
);
}
}
}
...
...
@@ -334,12 +330,24 @@ void ff_sws_init_swScale_altivec(SwsContext *c)
* match what's found in the body of ff_yuv2packedX_altivec() */
if
(
!
(
c
->
flags
&
(
SWS_BITEXACT
|
SWS_FULL_CHR_H_INT
))
&&
!
c
->
alpPixBuf
)
{
switch
(
c
->
dstFormat
)
{
case
PIX_FMT_ABGR
:
c
->
yuv2packedX
=
ff_yuv2abgr_X_altivec
;
break
;
case
PIX_FMT_BGRA
:
c
->
yuv2packedX
=
ff_yuv2bgra_X_altivec
;
break
;
case
PIX_FMT_ARGB
:
c
->
yuv2packedX
=
ff_yuv2argb_X_altivec
;
break
;
case
PIX_FMT_RGBA
:
c
->
yuv2packedX
=
ff_yuv2rgba_X_altivec
;
break
;
case
PIX_FMT_BGR24
:
c
->
yuv2packedX
=
ff_yuv2bgr24_X_altivec
;
break
;
case
PIX_FMT_RGB24
:
c
->
yuv2packedX
=
ff_yuv2rgb24_X_altivec
;
break
;
case
PIX_FMT_ABGR
:
c
->
yuv2packedX
=
ff_yuv2abgr_X_altivec
;
break
;
case
PIX_FMT_BGRA
:
c
->
yuv2packedX
=
ff_yuv2bgra_X_altivec
;
break
;
case
PIX_FMT_ARGB
:
c
->
yuv2packedX
=
ff_yuv2argb_X_altivec
;
break
;
case
PIX_FMT_RGBA
:
c
->
yuv2packedX
=
ff_yuv2rgba_X_altivec
;
break
;
case
PIX_FMT_BGR24
:
c
->
yuv2packedX
=
ff_yuv2bgr24_X_altivec
;
break
;
case
PIX_FMT_RGB24
:
c
->
yuv2packedX
=
ff_yuv2rgb24_X_altivec
;
break
;
}
}
}
libswscale/ppc/yuv2yuv_altivec.c
View file @
04217de4
...
...
@@ -22,18 +22,20 @@
*/
#include <inttypes.h>
#include "config.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#include "libavutil/cpu.h"
static
int
yv12toyuy2_unscaled_altivec
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
static
int
yv12toyuy2_unscaled_altivec
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride_a
[])
{
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride_a
[
0
]
*
srcSliceY
;
// yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]);
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride_a
[
0
]
*
srcSliceY
;
// yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH,
// srcStride[0], srcStride[1], dstStride[0]);
const
uint8_t
*
ysrc
=
src
[
0
];
const
uint8_t
*
usrc
=
src
[
1
];
const
uint8_t
*
vsrc
=
src
[
2
];
...
...
@@ -47,16 +49,16 @@ static int yv12toyuy2_unscaled_altivec(SwsContext *c, const uint8_t* src[],
register
unsigned
int
y
;
/* This code assumes:
1) dst is 16 bytes-aligned
2) dstStride is a multiple of 16
3) width is a multiple of 16
4) lum & chrom stride are multiples of 8
*
*
1) dst is 16 bytes-aligned
*
2) dstStride is a multiple of 16
*
3) width is a multiple of 16
*
4) lum & chrom stride are multiples of 8
*/
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
y
=
0
;
y
<
height
;
y
++
)
{
int
i
;
for
(
i
=
0
;
i
<
width
-
31
;
i
+=
32
)
{
for
(
i
=
0
;
i
<
width
-
31
;
i
+=
32
)
{
const
unsigned
int
j
=
i
>>
1
;
vector
unsigned
char
v_yA
=
vec_ld
(
i
,
ysrc
);
vector
unsigned
char
v_yB
=
vec_ld
(
i
+
16
,
ysrc
);
...
...
@@ -91,7 +93,7 @@ static int yv12toyuy2_unscaled_altivec(SwsContext *c, const uint8_t* src[],
vec_st
(
v_yuy2_0
,
(
i
<<
1
),
dst
);
vec_st
(
v_yuy2_1
,
(
i
<<
1
)
+
16
,
dst
);
}
if
((
y
&
(
vertLumPerChroma
-
1
))
==
vertLumPerChroma
-
1
)
{
if
((
y
&
(
vertLumPerChroma
-
1
))
==
vertLumPerChroma
-
1
)
{
usrc
+=
chromStride
;
vsrc
+=
chromStride
;
}
...
...
@@ -102,13 +104,14 @@ static int yv12toyuy2_unscaled_altivec(SwsContext *c, const uint8_t* src[],
return
srcSliceH
;
}
static
int
yv12touyvy_unscaled_altivec
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
static
int
yv12touyvy_unscaled_altivec
(
SwsContext
*
c
,
const
uint8_t
*
src
[],
int
srcStride
[],
int
srcSliceY
,
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
srcSliceH
,
uint8_t
*
dstParam
[],
int
dstStride_a
[])
{
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride_a
[
0
]
*
srcSliceY
;
// yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]);
uint8_t
*
dst
=
dstParam
[
0
]
+
dstStride_a
[
0
]
*
srcSliceY
;
// yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH,
// srcStride[0], srcStride[1], dstStride[0]);
const
uint8_t
*
ysrc
=
src
[
0
];
const
uint8_t
*
usrc
=
src
[
1
];
const
uint8_t
*
vsrc
=
src
[
2
];
...
...
@@ -122,16 +125,16 @@ static int yv12touyvy_unscaled_altivec(SwsContext *c, const uint8_t* src[],
register
unsigned
int
y
;
/* This code assumes:
1) dst is 16 bytes-aligned
2) dstStride is a multiple of 16
3) width is a multiple of 16
4) lum & chrom stride are multiples of 8
*
*
1) dst is 16 bytes-aligned
*
2) dstStride is a multiple of 16
*
3) width is a multiple of 16
*
4) lum & chrom stride are multiples of 8
*/
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
y
=
0
;
y
<
height
;
y
++
)
{
int
i
;
for
(
i
=
0
;
i
<
width
-
31
;
i
+=
32
)
{
for
(
i
=
0
;
i
<
width
-
31
;
i
+=
32
)
{
const
unsigned
int
j
=
i
>>
1
;
vector
unsigned
char
v_yA
=
vec_ld
(
i
,
ysrc
);
vector
unsigned
char
v_yB
=
vec_ld
(
i
+
16
,
ysrc
);
...
...
@@ -166,7 +169,7 @@ static int yv12touyvy_unscaled_altivec(SwsContext *c, const uint8_t* src[],
vec_st
(
v_uyvy_0
,
(
i
<<
1
),
dst
);
vec_st
(
v_uyvy_1
,
(
i
<<
1
)
+
16
,
dst
);
}
if
((
y
&
(
vertLumPerChroma
-
1
))
==
vertLumPerChroma
-
1
)
{
if
((
y
&
(
vertLumPerChroma
-
1
))
==
vertLumPerChroma
-
1
)
{
usrc
+=
chromStride
;
vsrc
+=
chromStride
;
}
...
...
@@ -184,8 +187,8 @@ void ff_swscale_get_unscaled_altivec(SwsContext *c)
// unscaled YV12 -> packed YUV, we want speed
if
(
dstFormat
==
PIX_FMT_YUYV422
)
c
->
swScale
=
yv12toyuy2_unscaled_altivec
;
c
->
swScale
=
yv12toyuy2_unscaled_altivec
;
else
if
(
dstFormat
==
PIX_FMT_UYVY422
)
c
->
swScale
=
yv12touyvy_unscaled_altivec
;
c
->
swScale
=
yv12touyvy_unscaled_altivec
;
}
}
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