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
6b105e3e
Commit
6b105e3e
authored
Jun 09, 2011
by
Ronald S. Bultje
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
swscale: extract monowhite/black output from yuv2packed[12X]_c().
This is part of the Great Evil Plan to simplify swscale.
parent
6d4d483e
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
113 additions
and
59 deletions
+113
-59
swscale.c
libswscale/swscale.c
+113
-59
No files found.
libswscale/swscale.c
View file @
6b105e3e
...
...
@@ -528,6 +528,104 @@ static void name ## ext ## _1_c(SwsContext *c, const uint16_t *buf0, \
YUV2PACKEDWRAPPER
(
yuv2gray16
,
LE
,
PIX_FMT_GRAY16LE
);
YUV2PACKEDWRAPPER
(
yuv2gray16
,
BE
,
PIX_FMT_GRAY16BE
);
static
av_always_inline
void
yuv2mono_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
)
{
const
uint8_t
*
const
d128
=
dither_8x8_220
[
y
&
7
];
uint8_t
*
g
=
c
->
table_gU
[
128
]
+
c
->
table_gV
[
128
];
int
i
;
int
acc
=
0
;
#define output_pixel(pos, acc) \
if (target == PIX_FMT_MONOBLACK) { \
pos = acc; \
} else { \
pos = ~acc; \
}
for
(
i
=
0
;
i
<
dstW
-
1
;
i
+=
2
)
{
int
j
;
int
Y1
=
1
<<
18
;
int
Y2
=
1
<<
18
;
for
(
j
=
0
;
j
<
lumFilterSize
;
j
++
)
{
Y1
+=
lumSrc
[
j
][
i
]
*
lumFilter
[
j
];
Y2
+=
lumSrc
[
j
][
i
+
1
]
*
lumFilter
[
j
];
}
Y1
>>=
19
;
Y2
>>=
19
;
if
((
Y1
|
Y2
)
&
0x100
)
{
Y1
=
av_clip_uint8
(
Y1
);
Y2
=
av_clip_uint8
(
Y2
);
}
acc
+=
acc
+
g
[
Y1
+
d128
[(
i
+
0
)
&
7
]];
acc
+=
acc
+
g
[
Y2
+
d128
[(
i
+
1
)
&
7
]];
if
((
i
&
7
)
==
6
)
{
output_pixel
(
*
dest
++
,
acc
);
}
}
}
static
av_always_inline
void
yuv2mono_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
)
{
const
uint8_t
*
const
d128
=
dither_8x8_220
[
y
&
7
];
uint8_t
*
g
=
c
->
table_gU
[
128
]
+
c
->
table_gV
[
128
];
int
yalpha1
=
4095
-
yalpha
;
int
i
;
for
(
i
=
0
;
i
<
dstW
-
7
;
i
+=
8
)
{
int
acc
=
g
[((
buf0
[
i
]
*
yalpha1
+
buf1
[
i
]
*
yalpha
)
>>
19
)
+
d128
[
0
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
1
]
*
yalpha1
+
buf1
[
i
+
1
]
*
yalpha
)
>>
19
)
+
d128
[
1
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
2
]
*
yalpha1
+
buf1
[
i
+
2
]
*
yalpha
)
>>
19
)
+
d128
[
2
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
3
]
*
yalpha1
+
buf1
[
i
+
3
]
*
yalpha
)
>>
19
)
+
d128
[
3
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
4
]
*
yalpha1
+
buf1
[
i
+
4
]
*
yalpha
)
>>
19
)
+
d128
[
4
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
5
]
*
yalpha1
+
buf1
[
i
+
5
]
*
yalpha
)
>>
19
)
+
d128
[
5
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
6
]
*
yalpha1
+
buf1
[
i
+
6
]
*
yalpha
)
>>
19
)
+
d128
[
6
]];
acc
+=
acc
+
g
[((
buf0
[
i
+
7
]
*
yalpha1
+
buf1
[
i
+
7
]
*
yalpha
)
>>
19
)
+
d128
[
7
]];
output_pixel
(
*
dest
++
,
acc
);
}
}
static
av_always_inline
void
yuv2mono_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
)
{
const
uint8_t
*
const
d128
=
dither_8x8_220
[
y
&
7
];
uint8_t
*
g
=
c
->
table_gU
[
128
]
+
c
->
table_gV
[
128
];
int
i
;
for
(
i
=
0
;
i
<
dstW
-
7
;
i
+=
8
)
{
int
acc
=
g
[(
buf0
[
i
]
>>
7
)
+
d128
[
0
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
1
]
>>
7
)
+
d128
[
1
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
2
]
>>
7
)
+
d128
[
2
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
3
]
>>
7
)
+
d128
[
3
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
4
]
>>
7
)
+
d128
[
4
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
5
]
>>
7
)
+
d128
[
5
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
6
]
>>
7
)
+
d128
[
6
]];
acc
+=
acc
+
g
[(
buf0
[
i
+
7
]
>>
7
)
+
d128
[
7
]];
output_pixel
(
*
dest
++
,
acc
);
}
#undef output_pixel
}
YUV2PACKEDWRAPPER
(
yuv2mono
,
white
,
PIX_FMT_MONOWHITE
);
YUV2PACKEDWRAPPER
(
yuv2mono
,
black
,
PIX_FMT_MONOBLACK
);
#define YSCALE_YUV_2_PACKEDX_C(type,alpha) \
for (i=0; i<(dstW>>1); i++) {\
int j;\
...
...
@@ -677,51 +775,7 @@ YUV2PACKEDWRAPPER(yuv2gray16, BE, PIX_FMT_GRAY16BE);
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
b = (type *)c->table_bU[U];
#define YSCALE_YUV_2_MONO2_C \
const uint8_t * const d128=dither_8x8_220[y&7];\
uint8_t *g= c->table_gU[128] + c->table_gV[128];\
for (i=0; i<dstW-7; i+=8) {\
int acc;\
acc = g[((buf0[i ]*yalpha1+buf1[i ]*yalpha)>>19) + d128[0]];\
acc+= acc + g[((buf0[i+1]*yalpha1+buf1[i+1]*yalpha)>>19) + d128[1]];\
acc+= acc + g[((buf0[i+2]*yalpha1+buf1[i+2]*yalpha)>>19) + d128[2]];\
acc+= acc + g[((buf0[i+3]*yalpha1+buf1[i+3]*yalpha)>>19) + d128[3]];\
acc+= acc + g[((buf0[i+4]*yalpha1+buf1[i+4]*yalpha)>>19) + d128[4]];\
acc+= acc + g[((buf0[i+5]*yalpha1+buf1[i+5]*yalpha)>>19) + d128[5]];\
acc+= acc + g[((buf0[i+6]*yalpha1+buf1[i+6]*yalpha)>>19) + d128[6]];\
acc+= acc + g[((buf0[i+7]*yalpha1+buf1[i+7]*yalpha)>>19) + d128[7]];\
((uint8_t*)dest)[0]= c->dstFormat == PIX_FMT_MONOBLACK ? acc : ~acc;\
dest++;\
}
#define YSCALE_YUV_2_MONOX_C \
const uint8_t * const d128=dither_8x8_220[y&7];\
uint8_t *g= c->table_gU[128] + c->table_gV[128];\
int acc=0;\
for (i=0; i<dstW-1; i+=2) {\
int j;\
int Y1=1<<18;\
int Y2=1<<18;\
\
for (j=0; j<lumFilterSize; j++) {\
Y1 += lumSrc[j][i] * lumFilter[j];\
Y2 += lumSrc[j][i+1] * lumFilter[j];\
}\
Y1>>=19;\
Y2>>=19;\
if ((Y1|Y2)&0x100) {\
Y1 = av_clip_uint8(Y1); \
Y2 = av_clip_uint8(Y2); \
}\
acc+= acc + g[Y1+d128[(i+0)&7]];\
acc+= acc + g[Y2+d128[(i+1)&7]];\
if ((i&7)==6) {\
((uint8_t*)dest)[0]= c->dstFormat == PIX_FMT_MONOBLACK ? acc : ~acc;\
dest++;\
}\
}
#define YSCALE_YUV_2_ANYRGB_C(func, func2, func_monoblack)\
#define YSCALE_YUV_2_ANYRGB_C(func, func2)\
switch(c->dstFormat) {\
case PIX_FMT_RGB48BE:\
case PIX_FMT_RGB48LE:\
...
...
@@ -897,12 +951,6 @@ YUV2PACKEDWRAPPER(yuv2gray16, BE, PIX_FMT_GRAY16BE);
}\
}\
break;\
case PIX_FMT_MONOBLACK:\
case PIX_FMT_MONOWHITE:\
{\
func_monoblack\
}\
break;\
case PIX_FMT_YUYV422:\
func2\
((uint8_t*)dest)[2*i2+0]= Y1;\
...
...
@@ -928,7 +976,7 @@ static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter,
const
int16_t
**
alpSrc
,
uint8_t
*
dest
,
int
dstW
,
int
y
)
{
int
i
;
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGBX_C
,
YSCALE_YUV_2_PACKEDX_C
(
void
,
0
)
,
YSCALE_YUV_2_MONOX_C
)
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGBX_C
,
YSCALE_YUV_2_PACKEDX_C
(
void
,
0
))
}
static
void
yuv2rgbX_c_full
(
SwsContext
*
c
,
const
int16_t
*
lumFilter
,
...
...
@@ -1031,7 +1079,7 @@ static void yuv2packed2_c(SwsContext *c, const uint16_t *buf0,
int
uvalpha1
=
4095
-
uvalpha
;
int
i
;
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB2_C
,
YSCALE_YUV_2_PACKED2_C
(
void
,
0
)
,
YSCALE_YUV_2_MONO2_C
)
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB2_C
,
YSCALE_YUV_2_PACKED2_C
(
void
,
0
))
}
/**
...
...
@@ -1044,16 +1092,12 @@ static void yuv2packed1_c(SwsContext *c, const uint16_t *buf0,
int
uvalpha
,
enum
PixelFormat
dstFormat
,
int
flags
,
int
y
)
{
const
int
yalpha1
=
0
;
int
i
;
const
uint16_t
*
buf1
=
buf0
;
//FIXME needed for RGB1/BGR1
const
int
yalpha
=
4096
;
//FIXME ...
if
(
uvalpha
<
2048
)
{
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB1_C
,
YSCALE_YUV_2_PACKED1_C
(
void
,
0
)
,
YSCALE_YUV_2_MONO2_C
)
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB1_C
,
YSCALE_YUV_2_PACKED1_C
(
void
,
0
))
}
else
{
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB1B_C
,
YSCALE_YUV_2_PACKED1B_C
(
void
,
0
)
,
YSCALE_YUV_2_MONO2_C
)
YSCALE_YUV_2_ANYRGB_C
(
YSCALE_YUV_2_RGB1B_C
,
YSCALE_YUV_2_PACKED1B_C
(
void
,
0
))
}
}
...
...
@@ -1717,6 +1761,16 @@ find_c_packed_planar_out_funcs(SwsContext *c,
*
yuv2packed2
=
yuv2gray16LE_2_c
;
*
yuv2packedX
=
yuv2gray16LE_X_c
;
break
;
case
PIX_FMT_MONOWHITE
:
*
yuv2packed1
=
yuv2monowhite_1_c
;
*
yuv2packed2
=
yuv2monowhite_2_c
;
*
yuv2packedX
=
yuv2monowhite_X_c
;
break
;
case
PIX_FMT_MONOBLACK
:
*
yuv2packed1
=
yuv2monoblack_1_c
;
*
yuv2packed2
=
yuv2monoblack_2_c
;
*
yuv2packedX
=
yuv2monoblack_X_c
;
break
;
default:
*
yuv2packed1
=
yuv2packed1_c
;
*
yuv2packed2
=
yuv2packed2_c
;
...
...
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