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
6fba14ee
Commit
6fba14ee
authored
Jun 28, 2011
by
Ronald Bultje
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
swscale: split yuv2packed[12X]_c() remainders into small functions.
This is part of the Great Evil Plan to simplify swscale.
parent
dc179ec8
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
402 additions
and
296 deletions
+402
-296
swscale.c
libswscale/swscale.c
+402
-296
No files found.
libswscale/swscale.c
View file @
6fba14ee
...
@@ -885,53 +885,321 @@ YUV2PACKEDWRAPPER(yuv2, rgb48, rgb48be, PIX_FMT_RGB48BE);
...
@@ -885,53 +885,321 @@ YUV2PACKEDWRAPPER(yuv2, rgb48, rgb48be, PIX_FMT_RGB48BE);
YUV2PACKEDWRAPPER
(
yuv2
,
rgb48
,
bgr48be
,
PIX_FMT_BGR48BE
);
YUV2PACKEDWRAPPER
(
yuv2
,
rgb48
,
bgr48be
,
PIX_FMT_BGR48BE
);
//YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48le, PIX_FMT_BGR48LE);
//YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48le, PIX_FMT_BGR48LE);
#define YSCALE_YUV_2_RGBX_C(type,alpha) \
static
av_always_inline
void
for (i=0; i<(dstW>>1); i++) {\
yuv2rgb_write
(
uint8_t
*
_dest
,
int
i
,
int
Y1
,
int
Y2
,
int j;\
int
U
,
int
V
,
int
A1
,
int
A2
,
int Y1 = 1<<18;\
const
void
*
_r
,
const
void
*
_g
,
const
void
*
_b
,
int
y
,
int Y2 = 1<<18;\
enum
PixelFormat
target
,
int
hasAlpha
)
int U = 1<<18;\
{
int V = 1<<18;\
if
(
target
==
PIX_FMT_ARGB
||
target
==
PIX_FMT_RGBA
||
int av_unused A1, A2;\
target
==
PIX_FMT_ABGR
||
target
==
PIX_FMT_BGRA
)
{
type av_unused *r, *b, *g;\
uint32_t
*
dest
=
(
uint32_t
*
)
_dest
;
const int i2= 2*i;\
const
uint32_t
*
r
=
(
const
uint32_t
*
)
_r
;
const
uint32_t
*
g
=
(
const
uint32_t
*
)
_g
;
const
uint32_t
*
b
=
(
const
uint32_t
*
)
_b
;
#if CONFIG_SMALL
int
sh
=
hasAlpha
?
((
fmt
==
PIX_FMT_RGB32_1
||
fmt
==
PIX_FMT_BGR32_1
)
?
0
:
24
)
:
0
;
dest
[
i
*
2
+
0
]
=
r
[
Y1
]
+
g
[
Y1
]
+
b
[
Y1
]
+
(
hasAlpha
?
A1
<<
sh
:
0
);
dest
[
i
*
2
+
1
]
=
r
[
Y2
]
+
g
[
Y2
]
+
b
[
Y2
]
+
(
hasAlpha
?
A2
<<
sh
:
0
);
#else
if
(
hasAlpha
)
{
int
sh
=
(
target
==
PIX_FMT_RGB32_1
||
target
==
PIX_FMT_BGR32_1
)
?
0
:
24
;
dest
[
i
*
2
+
0
]
=
r
[
Y1
]
+
g
[
Y1
]
+
b
[
Y1
]
+
(
A1
<<
sh
);
dest
[
i
*
2
+
1
]
=
r
[
Y2
]
+
g
[
Y2
]
+
b
[
Y2
]
+
(
A2
<<
sh
);
}
else
{
dest
[
i
*
2
+
0
]
=
r
[
Y1
]
+
g
[
Y1
]
+
b
[
Y1
];
dest
[
i
*
2
+
1
]
=
r
[
Y2
]
+
g
[
Y2
]
+
b
[
Y2
];
}
#endif
}
else
if
(
target
==
PIX_FMT_RGB24
||
target
==
PIX_FMT_BGR24
)
{
uint8_t
*
dest
=
(
uint8_t
*
)
_dest
;
const
uint8_t
*
r
=
(
const
uint8_t
*
)
_r
;
const
uint8_t
*
g
=
(
const
uint8_t
*
)
_g
;
const
uint8_t
*
b
=
(
const
uint8_t
*
)
_b
;
#define r_b ((target == PIX_FMT_RGB24) ? r : b)
#define b_r ((target == PIX_FMT_RGB24) ? b : r)
dest
[
i
*
6
+
0
]
=
r_b
[
Y1
];
dest
[
i
*
6
+
1
]
=
g
[
Y1
];
dest
[
i
*
6
+
2
]
=
b_r
[
Y1
];
dest
[
i
*
6
+
3
]
=
r_b
[
Y2
];
dest
[
i
*
6
+
4
]
=
g
[
Y2
];
dest
[
i
*
6
+
5
]
=
b_r
[
Y2
];
#undef r_b
#undef b_r
}
else
if
(
target
==
PIX_FMT_RGB565
||
target
==
PIX_FMT_BGR565
||
target
==
PIX_FMT_RGB555
||
target
==
PIX_FMT_BGR555
||
target
==
PIX_FMT_RGB444
||
target
==
PIX_FMT_BGR444
)
{
uint16_t
*
dest
=
(
uint16_t
*
)
_dest
;
const
uint16_t
*
r
=
(
const
uint16_t
*
)
_r
;
const
uint16_t
*
g
=
(
const
uint16_t
*
)
_g
;
const
uint16_t
*
b
=
(
const
uint16_t
*
)
_b
;
int
dr1
,
dg1
,
db1
,
dr2
,
dg2
,
db2
;
if
(
target
==
PIX_FMT_RGB565
||
target
==
PIX_FMT_BGR565
)
{
dr1
=
dither_2x2_8
[
y
&
1
][
0
];
dg1
=
dither_2x2_4
[
y
&
1
][
0
];
db1
=
dither_2x2_8
[(
y
&
1
)
^
1
][
0
];
dr2
=
dither_2x2_8
[
y
&
1
][
1
];
dg2
=
dither_2x2_4
[
y
&
1
][
1
];
db2
=
dither_2x2_8
[(
y
&
1
)
^
1
][
1
];
}
else
if
(
target
==
PIX_FMT_RGB555
||
target
==
PIX_FMT_BGR555
)
{
dr1
=
dither_2x2_8
[
y
&
1
][
0
];
dg1
=
dither_2x2_8
[
y
&
1
][
1
];
db1
=
dither_2x2_8
[(
y
&
1
)
^
1
][
0
];
dr2
=
dither_2x2_8
[
y
&
1
][
1
];
dg2
=
dither_2x2_8
[
y
&
1
][
0
];
db2
=
dither_2x2_8
[(
y
&
1
)
^
1
][
1
];
}
else
{
dr1
=
dither_4x4_16
[
y
&
3
][
0
];
dg1
=
dither_4x4_16
[
y
&
3
][
1
];
db1
=
dither_4x4_16
[(
y
&
3
)
^
3
][
0
];
dr2
=
dither_4x4_16
[
y
&
3
][
1
];
dg2
=
dither_4x4_16
[
y
&
3
][
0
];
db2
=
dither_4x4_16
[(
y
&
3
)
^
3
][
1
];
}
dest
[
i
*
2
+
0
]
=
r
[
Y1
+
dr1
]
+
g
[
Y1
+
dg1
]
+
b
[
Y1
+
db1
];
dest
[
i
*
2
+
1
]
=
r
[
Y2
+
dr2
]
+
g
[
Y2
+
dg2
]
+
b
[
Y2
+
db2
];
}
else
/* 8/4-bit */
{
uint8_t
*
dest
=
(
uint8_t
*
)
_dest
;
const
uint8_t
*
r
=
(
const
uint8_t
*
)
_r
;
const
uint8_t
*
g
=
(
const
uint8_t
*
)
_g
;
const
uint8_t
*
b
=
(
const
uint8_t
*
)
_b
;
int
dr1
,
dg1
,
db1
,
dr2
,
dg2
,
db2
;
if
(
target
==
PIX_FMT_RGB8
||
target
==
PIX_FMT_BGR8
)
{
const
uint8_t
*
const
d64
=
dither_8x8_73
[
y
&
7
];
const
uint8_t
*
const
d32
=
dither_8x8_32
[
y
&
7
];
dr1
=
dg1
=
d32
[(
i
*
2
+
0
)
&
7
];
db1
=
d64
[(
i
*
2
+
0
)
&
7
];
dr2
=
dg2
=
d32
[(
i
*
2
+
1
)
&
7
];
db2
=
d64
[(
i
*
2
+
1
)
&
7
];
}
else
{
const
uint8_t
*
const
d64
=
dither_8x8_73
[
y
&
7
];
const
uint8_t
*
const
d128
=
dither_8x8_220
[
y
&
7
];
dr1
=
db1
=
d128
[(
i
*
2
+
0
)
&
7
];
dg1
=
d64
[(
i
*
2
+
0
)
&
7
];
dr2
=
db2
=
d128
[(
i
*
2
+
1
)
&
7
];
dg2
=
d64
[(
i
*
2
+
1
)
&
7
];
}
if
(
target
==
PIX_FMT_RGB4
||
target
==
PIX_FMT_BGR4
)
{
dest
[
i
]
=
r
[
Y1
+
dr1
]
+
g
[
Y1
+
dg1
]
+
b
[
Y1
+
db1
]
+
((
r
[
Y2
+
dr2
]
+
g
[
Y2
+
dg2
]
+
b
[
Y2
+
db2
])
<<
4
);
}
else
{
dest
[
i
*
2
+
0
]
=
r
[
Y1
+
dr1
]
+
g
[
Y1
+
dg1
]
+
b
[
Y1
+
db1
];
dest
[
i
*
2
+
1
]
=
r
[
Y2
+
dr2
]
+
g
[
Y2
+
dg2
]
+
b
[
Y2
+
db2
];
}
}
}
static
av_always_inline
void
yuv2rgb_X_c_template
(
SwsContext
*
c
,
const
int16_t
*
lumFilter
,
const
int16_t
**
lumSrc
,
int
lumFilterSize
,
const
int16_t
*
chrFilter
,
const
int16_t
**
chrUSrc
,
const
int16_t
**
chrVSrc
,
int
chrFilterSize
,
const
int16_t
**
alpSrc
,
uint8_t
*
dest
,
int
dstW
,
int
y
,
enum
PixelFormat
target
,
int
hasAlpha
)
{
int
i
;
for
(
i
=
0
;
i
<
(
dstW
>>
1
);
i
++
)
{
int
j
;
int
Y1
=
1
<<
18
;
int
Y2
=
1
<<
18
;
int
U
=
1
<<
18
;
int
V
=
1
<<
18
;
int
av_unused
A1
,
A2
;
const
void
*
r
,
*
g
,
*
b
;
for
(
j
=
0
;
j
<
lumFilterSize
;
j
++
)
{
Y1
+=
lumSrc
[
j
][
i
*
2
]
*
lumFilter
[
j
];
Y2
+=
lumSrc
[
j
][
i
*
2
+
1
]
*
lumFilter
[
j
];
}
for
(
j
=
0
;
j
<
chrFilterSize
;
j
++
)
{
U
+=
chrUSrc
[
j
][
i
]
*
chrFilter
[
j
];
V
+=
chrVSrc
[
j
][
i
]
*
chrFilter
[
j
];
}
Y1
>>=
19
;
Y2
>>=
19
;
U
>>=
19
;
V
>>=
19
;
if
((
Y1
|
Y2
|
U
|
V
)
&
0x100
)
{
Y1
=
av_clip_uint8
(
Y1
);
Y2
=
av_clip_uint8
(
Y2
);
U
=
av_clip_uint8
(
U
);
V
=
av_clip_uint8
(
V
);
}
if
(
hasAlpha
)
{
\
A1
=
1
<<
18
;
A2
=
1
<<
18
;
for
(
j
=
0
;
j
<
lumFilterSize
;
j
++
)
{
A1
+=
alpSrc
[
j
][
i
*
2
]
*
lumFilter
[
j
];
A2
+=
alpSrc
[
j
][
i
*
2
+
1
]
*
lumFilter
[
j
];
}
A1
>>=
19
;
A2
>>=
19
;
if
((
A1
|
A2
)
&
0x100
)
{
A1
=
av_clip_uint8
(
A1
);
A2
=
av_clip_uint8
(
A2
);
}
}
/* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/
r
=
c
->
table_rV
[
V
];
g
=
(
c
->
table_gU
[
U
]
+
c
->
table_gV
[
V
]);
b
=
c
->
table_bU
[
U
];
yuv2rgb_write
(
dest
,
i
,
Y1
,
Y2
,
U
,
V
,
hasAlpha
?
A1
:
0
,
hasAlpha
?
A2
:
0
,
r
,
g
,
b
,
y
,
target
,
hasAlpha
);
}
}
static
av_always_inline
void
yuv2rgb_2_c_template
(
SwsContext
*
c
,
const
uint16_t
*
buf0
,
const
uint16_t
*
buf1
,
const
uint16_t
*
ubuf0
,
const
uint16_t
*
ubuf1
,
const
uint16_t
*
vbuf0
,
const
uint16_t
*
vbuf1
,
const
uint16_t
*
abuf0
,
const
uint16_t
*
abuf1
,
uint8_t
*
dest
,
int
dstW
,
int
yalpha
,
int
uvalpha
,
int
y
,
enum
PixelFormat
target
,
int
hasAlpha
)
{
int
yalpha1
=
4095
-
yalpha
;
int
uvalpha1
=
4095
-
uvalpha
;
int
i
;
for
(
i
=
0
;
i
<
(
dstW
>>
1
);
i
++
)
{
int
Y1
=
(
buf0
[
i
*
2
]
*
yalpha1
+
buf1
[
i
*
2
]
*
yalpha
)
>>
19
;
int
Y2
=
(
buf0
[
i
*
2
+
1
]
*
yalpha1
+
buf1
[
i
*
2
+
1
]
*
yalpha
)
>>
19
;
int
U
=
(
ubuf0
[
i
]
*
uvalpha1
+
ubuf1
[
i
]
*
uvalpha
)
>>
19
;
int
V
=
(
vbuf0
[
i
]
*
uvalpha1
+
vbuf1
[
i
]
*
uvalpha
)
>>
19
;
int
A1
,
A2
;
const
void
*
r
=
c
->
table_rV
[
V
],
*
g
=
(
c
->
table_gU
[
U
]
+
c
->
table_gV
[
V
]),
*
b
=
c
->
table_bU
[
U
];
if
(
hasAlpha
)
{
A1
=
(
abuf0
[
i
*
2
]
*
yalpha1
+
abuf1
[
i
*
2
]
*
yalpha
)
>>
19
;
A2
=
(
abuf0
[
i
*
2
+
1
]
*
yalpha1
+
abuf1
[
i
*
2
+
1
]
*
yalpha
)
>>
19
;
}
yuv2rgb_write
(
dest
,
i
,
Y1
,
Y2
,
U
,
V
,
hasAlpha
?
A1
:
0
,
hasAlpha
?
A2
:
0
,
r
,
g
,
b
,
y
,
target
,
hasAlpha
);
}
}
static
av_always_inline
void
yuv2rgb_1_c_template
(
SwsContext
*
c
,
const
uint16_t
*
buf0
,
const
uint16_t
*
ubuf0
,
const
uint16_t
*
ubuf1
,
const
uint16_t
*
vbuf0
,
const
uint16_t
*
vbuf1
,
const
uint16_t
*
abuf0
,
uint8_t
*
dest
,
int
dstW
,
int
uvalpha
,
enum
PixelFormat
dstFormat
,
int
flags
,
int
y
,
enum
PixelFormat
target
,
int
hasAlpha
)
{
int
i
;
if
(
uvalpha
<
2048
)
{
for
(
i
=
0
;
i
<
(
dstW
>>
1
);
i
++
)
{
int
Y1
=
buf0
[
i
*
2
]
>>
7
;
int
Y2
=
buf0
[
i
*
2
+
1
]
>>
7
;
int
U
=
ubuf1
[
i
]
>>
7
;
int
V
=
vbuf1
[
i
]
>>
7
;
int
A1
,
A2
;
const
void
*
r
=
c
->
table_rV
[
V
],
*
g
=
(
c
->
table_gU
[
U
]
+
c
->
table_gV
[
V
]),
*
b
=
c
->
table_bU
[
U
];
if
(
hasAlpha
)
{
A1
=
abuf0
[
i
*
2
]
>>
7
;
A2
=
abuf0
[
i
*
2
+
1
]
>>
7
;
}
yuv2rgb_write
(
dest
,
i
,
Y1
,
Y2
,
U
,
V
,
hasAlpha
?
A1
:
0
,
hasAlpha
?
A2
:
0
,
r
,
g
,
b
,
y
,
target
,
hasAlpha
);
}
}
else
{
for
(
i
=
0
;
i
<
(
dstW
>>
1
);
i
++
)
{
int
Y1
=
buf0
[
i
*
2
]
>>
7
;
int
Y2
=
buf0
[
i
*
2
+
1
]
>>
7
;
int
U
=
(
ubuf0
[
i
]
+
ubuf1
[
i
])
>>
8
;
int
V
=
(
vbuf0
[
i
]
+
vbuf1
[
i
])
>>
8
;
int
A1
,
A2
;
const
void
*
r
=
c
->
table_rV
[
V
],
*
g
=
(
c
->
table_gU
[
U
]
+
c
->
table_gV
[
V
]),
*
b
=
c
->
table_bU
[
U
];
if
(
hasAlpha
)
{
A1
=
abuf0
[
i
*
2
]
>>
7
;
A2
=
abuf0
[
i
*
2
+
1
]
>>
7
;
}
yuv2rgb_write
(
dest
,
i
,
Y1
,
Y2
,
U
,
V
,
hasAlpha
?
A1
:
0
,
hasAlpha
?
A2
:
0
,
r
,
g
,
b
,
y
,
target
,
hasAlpha
);
}
}
}
#define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
const int16_t **lumSrc, int lumFilterSize, \
const int16_t *chrFilter, const int16_t **chrUSrc, \
const int16_t **chrVSrc, int chrFilterSize, \
const int16_t **alpSrc, uint8_t *dest, int dstW, \
int y) \
{ \
name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
alpSrc, dest, dstW, y, fmt, hasAlpha); \
} \
\
\
for (j=0; j<lumFilterSize; j++) {\
static void name ## ext ## _2_c(SwsContext *c, const uint16_t *buf0, \
Y1 += lumSrc[j][i2] * lumFilter[j];\
const uint16_t *buf1, const uint16_t *ubuf0, \
Y2 += lumSrc[j][i2+1] * lumFilter[j];\
const uint16_t *ubuf1, const uint16_t *vbuf0, \
}\
const uint16_t *vbuf1, const uint16_t *abuf0, \
for (j=0; j<chrFilterSize; j++) {\
const uint16_t *abuf1, uint8_t *dest, int dstW, \
U += chrUSrc[j][i] * chrFilter[j];\
int yalpha, int uvalpha, int y) \
V += chrVSrc[j][i] * chrFilter[j];\
{ \
}\
name ## base ## _2_c_template(c, buf0, buf1, ubuf0, ubuf1, \
Y1>>=19;\
vbuf0, vbuf1, abuf0, abuf1, \
Y2>>=19;\
dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
U >>=19;\
} \
V >>=19;\
\
if ((Y1|Y2|U|V)&0x100) {\
static void name ## ext ## _1_c(SwsContext *c, const uint16_t *buf0, \
Y1 = av_clip_uint8(Y1); \
const uint16_t *ubuf0, const uint16_t *ubuf1, \
Y2 = av_clip_uint8(Y2); \
const uint16_t *vbuf0, const uint16_t *vbuf1, \
U = av_clip_uint8(U); \
const uint16_t *abuf0, uint8_t *dest, int dstW, \
V = av_clip_uint8(V); \
int uvalpha, enum PixelFormat dstFormat, \
}\
int flags, int y) \
if (alpha) {\
{ \
A1 = 1<<18;\
name ## base ## _1_c_template(c, buf0, ubuf0, ubuf1, vbuf0, \
A2 = 1<<18;\
vbuf1, abuf0, dest, dstW, uvalpha, \
for (j=0; j<lumFilterSize; j++) {\
dstFormat, flags, y, fmt, hasAlpha); \
A1 += alpSrc[j][i2 ] * lumFilter[j];\
}
A2 += alpSrc[j][i2+1] * lumFilter[j];\
}\
#if CONFIG_SMALL
A1>>=19;\
YUV2RGBWRAPPER
(
yuv2rgb
,,
32
_1
,
PIX_FMT_RGB32_1
,
CONFIG_SWSCALE_ALPHA
&&
c
->
alpPixBuf
);
A2>>=19;\
YUV2RGBWRAPPER
(
yuv2rgb
,,
32
,
PIX_FMT_RGB32
,
CONFIG_SWSCALE_ALPHA
&&
c
->
alpPixBuf
);
if ((A1|A2)&0x100) {\
#else
A1 = av_clip_uint8(A1); \
#if CONFIG_SWSCALE_ALPHA
A2 = av_clip_uint8(A2); \
YUV2RGBWRAPPER
(
yuv2rgb
,,
a32_1
,
PIX_FMT_RGB32_1
,
1
);
}\
YUV2RGBWRAPPER
(
yuv2rgb
,,
a32
,
PIX_FMT_RGB32
,
1
);
}\
#endif
/* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/
\
YUV2RGBWRAPPER
(
yuv2rgb
,,
x32_1
,
PIX_FMT_RGB32_1
,
0
);
r = (type *)c->table_rV[V]; \
YUV2RGBWRAPPER
(
yuv2rgb
,,
x32
,
PIX_FMT_RGB32
,
0
);
g = (type *)(c->table_gU[U] + c->table_gV[V]); \
#endif
b = (type *)c->table_bU[U];
YUV2RGBWRAPPER
(
yuv2
,
rgb
,
rgb24
,
PIX_FMT_RGB24
,
0
);
YUV2RGBWRAPPER
(
yuv2
,
rgb
,
bgr24
,
PIX_FMT_BGR24
,
0
);
YUV2RGBWRAPPER
(
yuv2rgb
,,
16
,
PIX_FMT_RGB565
,
0
);
YUV2RGBWRAPPER
(
yuv2rgb
,,
15
,
PIX_FMT_RGB555
,
0
);
YUV2RGBWRAPPER
(
yuv2rgb
,,
12
,
PIX_FMT_RGB444
,
0
);
YUV2RGBWRAPPER
(
yuv2rgb
,,
8
,
PIX_FMT_RGB8
,
0
);
YUV2RGBWRAPPER
(
yuv2rgb
,,
4
,
PIX_FMT_RGB4
,
0
);
YUV2RGBWRAPPER
(
yuv2rgb
,,
4
b
,
PIX_FMT_RGB4_BYTE
,
0
);
#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \
#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \
for (i=0; i<dstW; i++) {\
for (i=0; i<dstW; i++) {\
...
@@ -972,215 +1240,6 @@ YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE);
...
@@ -972,215 +1240,6 @@ YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE);
B = av_clip_uintp2(B, 30); \
B = av_clip_uintp2(B, 30); \
}
}
#define YSCALE_YUV_2_RGB2_C(type,alpha) \
for (i=0; i<(dstW>>1); i++) { \
const int i2= 2*i; \
int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19; \
int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>19; \
int U= (ubuf0[i]*uvalpha1+ubuf1[i]*uvalpha)>>19; \
int V= (vbuf0[i]*uvalpha1+vbuf1[i]*uvalpha)>>19; \
type av_unused *r, *b, *g; \
int av_unused A1, A2; \
if (alpha) {\
A1= (abuf0[i2 ]*yalpha1+abuf1[i2 ]*yalpha)>>19; \
A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19; \
}\
r = (type *)c->table_rV[V];\
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
b = (type *)c->table_bU[U];
#define YSCALE_YUV_2_RGB1_C(type,alpha) \
for (i=0; i<(dstW>>1); i++) {\
const int i2= 2*i;\
int Y1= buf0[i2 ]>>7;\
int Y2= buf0[i2+1]>>7;\
int U= (ubuf1[i])>>7;\
int V= (vbuf1[i])>>7;\
type av_unused *r, *b, *g;\
int av_unused A1, A2;\
if (alpha) {\
A1= abuf0[i2 ]>>7;\
A2= abuf0[i2+1]>>7;\
}\
r = (type *)c->table_rV[V];\
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
b = (type *)c->table_bU[U];
#define YSCALE_YUV_2_RGB1B_C(type,alpha) \
for (i=0; i<(dstW>>1); i++) {\
const int i2= 2*i;\
int Y1= buf0[i2 ]>>7;\
int Y2= buf0[i2+1]>>7;\
int U= (ubuf0[i] + ubuf1[i])>>8;\
int V= (vbuf0[i] + vbuf1[i])>>8;\
type av_unused *r, *b, *g;\
int av_unused A1, A2;\
if (alpha) {\
A1= abuf0[i2 ]>>7;\
A2= abuf0[i2+1]>>7;\
}\
r = (type *)c->table_rV[V];\
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
b = (type *)c->table_bU[U];
#define YSCALE_YUV_2_ANYRGB_C(func)\
switch(c->dstFormat) {\
case PIX_FMT_RGBA:\
case PIX_FMT_BGRA:\
if (CONFIG_SMALL) {\
int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\
func(uint32_t,needAlpha)\
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? (A1<<24) : 0);\
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? (A2<<24) : 0);\
}\
} else {\
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {\
func(uint32_t,1)\
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (A1<<24);\
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (A2<<24);\
}\
} else {\
func(uint32_t,0)\
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
}\
}\
}\
break;\
case PIX_FMT_ARGB:\
case PIX_FMT_ABGR:\
if (CONFIG_SMALL) {\
int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\
func(uint32_t,needAlpha)\
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? A1 : 0);\
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? A2 : 0);\
}\
} else {\
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {\
func(uint32_t,1)\
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + A1;\
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + A2;\
}\
} else {\
func(uint32_t,0)\
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
}\
}\
} \
break;\
case PIX_FMT_RGB24:\
func(uint8_t,0)\
((uint8_t*)dest)[0]= r[Y1];\
((uint8_t*)dest)[1]= g[Y1];\
((uint8_t*)dest)[2]= b[Y1];\
((uint8_t*)dest)[3]= r[Y2];\
((uint8_t*)dest)[4]= g[Y2];\
((uint8_t*)dest)[5]= b[Y2];\
dest+=6;\
}\
break;\
case PIX_FMT_BGR24:\
func(uint8_t,0)\
((uint8_t*)dest)[0]= b[Y1];\
((uint8_t*)dest)[1]= g[Y1];\
((uint8_t*)dest)[2]= r[Y1];\
((uint8_t*)dest)[3]= b[Y2];\
((uint8_t*)dest)[4]= g[Y2];\
((uint8_t*)dest)[5]= r[Y2];\
dest+=6;\
}\
break;\
case PIX_FMT_RGB565:\
case PIX_FMT_BGR565:\
{\
const int dr1= dither_2x2_8[y&1 ][0];\
const int dg1= dither_2x2_4[y&1 ][0];\
const int db1= dither_2x2_8[(y&1)^1][0];\
const int dr2= dither_2x2_8[y&1 ][1];\
const int dg2= dither_2x2_4[y&1 ][1];\
const int db2= dither_2x2_8[(y&1)^1][1];\
func(uint16_t,0)\
((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
}\
}\
break;\
case PIX_FMT_RGB555:\
case PIX_FMT_BGR555:\
{\
const int dr1= dither_2x2_8[y&1 ][0];\
const int dg1= dither_2x2_8[y&1 ][1];\
const int db1= dither_2x2_8[(y&1)^1][0];\
const int dr2= dither_2x2_8[y&1 ][1];\
const int dg2= dither_2x2_8[y&1 ][0];\
const int db2= dither_2x2_8[(y&1)^1][1];\
func(uint16_t,0)\
((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
}\
}\
break;\
case PIX_FMT_RGB444:\
case PIX_FMT_BGR444:\
{\
const int dr1= dither_4x4_16[y&3 ][0];\
const int dg1= dither_4x4_16[y&3 ][1];\
const int db1= dither_4x4_16[(y&3)^3][0];\
const int dr2= dither_4x4_16[y&3 ][1];\
const int dg2= dither_4x4_16[y&3 ][0];\
const int db2= dither_4x4_16[(y&3)^3][1];\
func(uint16_t,0)\
((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
}\
}\
break;\
case PIX_FMT_RGB8:\
case PIX_FMT_BGR8:\
{\
const uint8_t * const d64= dither_8x8_73[y&7];\
const uint8_t * const d32= dither_8x8_32[y&7];\
func(uint8_t,0)\
((uint8_t*)dest)[i2+0]= r[Y1+d32[(i2+0)&7]] + g[Y1+d32[(i2+0)&7]] + b[Y1+d64[(i2+0)&7]];\
((uint8_t*)dest)[i2+1]= r[Y2+d32[(i2+1)&7]] + g[Y2+d32[(i2+1)&7]] + b[Y2+d64[(i2+1)&7]];\
}\
}\
break;\
case PIX_FMT_RGB4:\
case PIX_FMT_BGR4:\
{\
const uint8_t * const d64= dither_8x8_73 [y&7];\
const uint8_t * const d128=dither_8x8_220[y&7];\
func(uint8_t,0)\
((uint8_t*)dest)[i]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]]\
+ ((r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]])<<4);\
}\
}\
break;\
case PIX_FMT_RGB4_BYTE:\
case PIX_FMT_BGR4_BYTE:\
{\
const uint8_t * const d64= dither_8x8_73 [y&7];\
const uint8_t * const d128=dither_8x8_220[y&7];\
func(uint8_t,0)\
((uint8_t*)dest)[i2+0]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]];\
((uint8_t*)dest)[i2+1]= r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]];\
}\
}\
break;\
}
static
void
yuv2packedX_c
(
SwsContext
*
c
,
const
int16_t
*
lumFilter
,
const
int16_t
**
lumSrc
,
int
lumFilterSize
,
const
int16_t
*
chrFilter
,
const
int16_t
**
chrUSrc
,
const
int16_t
**
chrVSrc
,
int
chrFilterSize
,
const
int16_t
**
alpSrc
,
uint8_t
*
dest
,
int
dstW
,
int
y
)
{
int
i
;
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGBX_C
)
}
static
void
yuv2rgbX_c_full
(
SwsContext
*
c
,
const
int16_t
*
lumFilter
,
static
void
yuv2rgbX_c_full
(
SwsContext
*
c
,
const
int16_t
*
lumFilter
,
const
int16_t
**
lumSrc
,
int
lumFilterSize
,
const
int16_t
**
lumSrc
,
int
lumFilterSize
,
const
int16_t
*
chrFilter
,
const
int16_t
**
chrUSrc
,
const
int16_t
*
chrFilter
,
const
int16_t
**
chrUSrc
,
...
@@ -1267,42 +1326,6 @@ static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
...
@@ -1267,42 +1326,6 @@ static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
}
}
}
}
/**
* vertical bilinear scale YV12 to RGB
*/
static
void
yuv2packed2_c
(
SwsContext
*
c
,
const
uint16_t
*
buf0
,
const
uint16_t
*
buf1
,
const
uint16_t
*
ubuf0
,
const
uint16_t
*
ubuf1
,
const
uint16_t
*
vbuf0
,
const
uint16_t
*
vbuf1
,
const
uint16_t
*
abuf0
,
const
uint16_t
*
abuf1
,
uint8_t
*
dest
,
int
dstW
,
int
yalpha
,
int
uvalpha
,
int
y
)
{
int
yalpha1
=
4095
-
yalpha
;
int
uvalpha1
=
4095
-
uvalpha
;
int
i
;
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB2_C
)
}
/**
* YV12 to RGB without scaling or interpolating
*/
static
void
yuv2packed1_c
(
SwsContext
*
c
,
const
uint16_t
*
buf0
,
const
uint16_t
*
ubuf0
,
const
uint16_t
*
ubuf1
,
const
uint16_t
*
vbuf0
,
const
uint16_t
*
vbuf1
,
const
uint16_t
*
abuf0
,
uint8_t
*
dest
,
int
dstW
,
int
uvalpha
,
enum
PixelFormat
dstFormat
,
int
flags
,
int
y
)
{
int
i
;
if
(
uvalpha
<
2048
)
{
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB1_C
)
}
else
{
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB1B_C
)
}
}
static
av_always_inline
void
fillPlane
(
uint8_t
*
plane
,
int
stride
,
static
av_always_inline
void
fillPlane
(
uint8_t
*
plane
,
int
stride
,
int
width
,
int
height
,
int
width
,
int
height
,
int
y
,
uint8_t
val
)
int
y
,
uint8_t
val
)
...
@@ -2008,10 +2031,93 @@ find_c_packed_planar_out_funcs(SwsContext *c,
...
@@ -2008,10 +2031,93 @@ find_c_packed_planar_out_funcs(SwsContext *c,
*
yuv2packed2
=
yuv2bgr48be_2_c
;
*
yuv2packed2
=
yuv2bgr48be_2_c
;
*
yuv2packedX
=
yuv2bgr48be_X_c
;
*
yuv2packedX
=
yuv2bgr48be_X_c
;
break
;
break
;
default:
case
PIX_FMT_RGB32
:
*
yuv2packed1
=
yuv2packed1_c
;
case
PIX_FMT_BGR32
:
*
yuv2packed2
=
yuv2packed2_c
;
#if CONFIG_SMALL
*
yuv2packedX
=
yuv2packedX_c
;
*
yuv2packed1
=
yuv2rgb32_1_c
;
*
yuv2packed2
=
yuv2rgb32_2_c
;
*
yuv2packedX
=
yuv2rgb32_X_c
;
#else
#if CONFIG_SWSCALE_ALPHA
if
(
c
->
alpPixBuf
)
{
*
yuv2packed1
=
yuv2rgba32_1_c
;
*
yuv2packed2
=
yuv2rgba32_2_c
;
*
yuv2packedX
=
yuv2rgba32_X_c
;
}
else
#endif
/* CONFIG_SWSCALE_ALPHA */
{
*
yuv2packed1
=
yuv2rgbx32_1_c
;
*
yuv2packed2
=
yuv2rgbx32_2_c
;
*
yuv2packedX
=
yuv2rgbx32_X_c
;
}
#endif
/* !CONFIG_SMALL */
break
;
case
PIX_FMT_RGB32_1
:
case
PIX_FMT_BGR32_1
:
#if CONFIG_SMALL
*
yuv2packed1
=
yuv2rgb32_1_1_c
;
*
yuv2packed2
=
yuv2rgb32_1_2_c
;
*
yuv2packedX
=
yuv2rgb32_1_X_c
;
#else
#if CONFIG_SWSCALE_ALPHA
if
(
c
->
alpPixBuf
)
{
*
yuv2packed1
=
yuv2rgba32_1_1_c
;
*
yuv2packed2
=
yuv2rgba32_1_2_c
;
*
yuv2packedX
=
yuv2rgba32_1_X_c
;
}
else
#endif
/* CONFIG_SWSCALE_ALPHA */
{
*
yuv2packed1
=
yuv2rgbx32_1_1_c
;
*
yuv2packed2
=
yuv2rgbx32_1_2_c
;
*
yuv2packedX
=
yuv2rgbx32_1_X_c
;
}
#endif
/* !CONFIG_SMALL */
break
;
case
PIX_FMT_RGB24
:
*
yuv2packed1
=
yuv2rgb24_1_c
;
*
yuv2packed2
=
yuv2rgb24_2_c
;
*
yuv2packedX
=
yuv2rgb24_X_c
;
break
;
case
PIX_FMT_BGR24
:
*
yuv2packed1
=
yuv2bgr24_1_c
;
*
yuv2packed2
=
yuv2bgr24_2_c
;
*
yuv2packedX
=
yuv2bgr24_X_c
;
break
;
case
PIX_FMT_RGB565
:
case
PIX_FMT_BGR565
:
*
yuv2packed1
=
yuv2rgb16_1_c
;
*
yuv2packed2
=
yuv2rgb16_2_c
;
*
yuv2packedX
=
yuv2rgb16_X_c
;
break
;
case
PIX_FMT_RGB555
:
case
PIX_FMT_BGR555
:
*
yuv2packed1
=
yuv2rgb15_1_c
;
*
yuv2packed2
=
yuv2rgb15_2_c
;
*
yuv2packedX
=
yuv2rgb15_X_c
;
break
;
case
PIX_FMT_RGB444
:
case
PIX_FMT_BGR444
:
*
yuv2packed1
=
yuv2rgb12_1_c
;
*
yuv2packed2
=
yuv2rgb12_2_c
;
*
yuv2packedX
=
yuv2rgb12_X_c
;
break
;
case
PIX_FMT_RGB8
:
case
PIX_FMT_BGR8
:
*
yuv2packed1
=
yuv2rgb8_1_c
;
*
yuv2packed2
=
yuv2rgb8_2_c
;
*
yuv2packedX
=
yuv2rgb8_X_c
;
break
;
case
PIX_FMT_RGB4
:
case
PIX_FMT_BGR4
:
*
yuv2packed1
=
yuv2rgb4_1_c
;
*
yuv2packed2
=
yuv2rgb4_2_c
;
*
yuv2packedX
=
yuv2rgb4_X_c
;
break
;
case
PIX_FMT_RGB4_BYTE
:
case
PIX_FMT_BGR4_BYTE
:
*
yuv2packed1
=
yuv2rgb4b_1_c
;
*
yuv2packed2
=
yuv2rgb4b_2_c
;
*
yuv2packedX
=
yuv2rgb4b_X_c
;
break
;
break
;
}
}
}
}
...
...
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