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
5b658bcc
Commit
5b658bcc
authored
Sep 03, 2015
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avfilter/vf_waveform: 9 and 10 bit depth support for lowpass & color filter
Signed-off-by:
Paul B Mahol
<
onemda@gmail.com
>
parent
9ee2ddd7
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
320 additions
and
11 deletions
+320
-11
vf_waveform.c
libavfilter/vf_waveform.c
+320
-11
No files found.
libavfilter/vf_waveform.c
View file @
5b658bcc
...
...
@@ -54,6 +54,7 @@ typedef struct WaveformContext {
int
*
emin
[
4
][
4
];
int
*
peak
;
int
filter
;
int
bits
;
int
size
;
void
(
*
waveform
)(
struct
WaveformContext
*
s
,
AVFrame
*
in
,
AVFrame
*
out
,
int
component
,
int
intensity
,
int
offset
,
int
column
);
...
...
@@ -68,8 +69,8 @@ static const AVOption waveform_options[] = {
{
"m"
,
"set mode"
,
OFFSET
(
mode
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
0
,
1
,
FLAGS
,
"mode"
},
{
"row"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0
},
0
,
0
,
FLAGS
,
"mode"
},
{
"column"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
1
},
0
,
0
,
FLAGS
,
"mode"
},
{
"intensity"
,
"set intensity"
,
OFFSET
(
intensity
),
AV_OPT_TYPE_INT
,
{.
i64
=
10
},
1
,
255
,
FLAGS
},
{
"i"
,
"set intensity"
,
OFFSET
(
intensity
),
AV_OPT_TYPE_INT
,
{.
i64
=
10
},
1
,
255
,
FLAGS
},
{
"intensity"
,
"set intensity"
,
OFFSET
(
intensity
),
AV_OPT_TYPE_INT
,
{.
i64
=
10
},
1
,
1023
,
FLAGS
},
{
"i"
,
"set intensity"
,
OFFSET
(
intensity
),
AV_OPT_TYPE_INT
,
{.
i64
=
10
},
1
,
1023
,
FLAGS
},
{
"mirror"
,
"set mirroring"
,
OFFSET
(
mirror
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
0
,
1
,
FLAGS
},
{
"r"
,
"set mirroring"
,
OFFSET
(
mirror
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
0
,
1
,
FLAGS
},
{
"display"
,
"set display mode"
,
OFFSET
(
display
),
AV_OPT_TYPE_INT
,
{.
i64
=
1
},
0
,
1
,
FLAGS
,
"display"
},
...
...
@@ -99,6 +100,7 @@ AVFILTER_DEFINE_CLASS(waveform);
static
const
enum
AVPixelFormat
lowpass_pix_fmts
[]
=
{
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GBRAP
,
AV_PIX_FMT_GBRP9
,
AV_PIX_FMT_GBRP10
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV440P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV410P
,
...
...
@@ -106,6 +108,10 @@ static const enum AVPixelFormat lowpass_pix_fmts[] = {
AV_PIX_FMT_YUVJ422P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUVA444P
,
AV_PIX_FMT_YUVA422P
,
AV_PIX_FMT_YUVA420P
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_YUV444P9
,
AV_PIX_FMT_YUV422P9
,
AV_PIX_FMT_YUV420P9
,
AV_PIX_FMT_YUVA444P9
,
AV_PIX_FMT_YUVA422P9
,
AV_PIX_FMT_YUVA420P9
,
AV_PIX_FMT_YUV444P10
,
AV_PIX_FMT_YUV422P10
,
AV_PIX_FMT_YUV420P10
,
AV_PIX_FMT_YUVA444P10
,
AV_PIX_FMT_YUVA422P10
,
AV_PIX_FMT_YUVA420P10
,
AV_PIX_FMT_NONE
};
...
...
@@ -115,7 +121,10 @@ static const enum AVPixelFormat flat_pix_fmts[] = {
static
const
enum
AVPixelFormat
color_pix_fmts
[]
=
{
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GBRAP
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_NONE
AV_PIX_FMT_GBRP9
,
AV_PIX_FMT_GBRP10
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUV444P9
,
AV_PIX_FMT_YUV444P10
,
AV_PIX_FMT_NONE
};
static
int
query_formats
(
AVFilterContext
*
ctx
)
...
...
@@ -139,6 +148,57 @@ static int query_formats(AVFilterContext *ctx)
return
ff_set_common_formats
(
ctx
,
fmts_list
);
}
static
void
envelope_instant16
(
WaveformContext
*
s
,
AVFrame
*
out
,
int
plane
,
int
component
)
{
const
int
dst_linesize
=
out
->
linesize
[
component
]
/
2
;
const
int
bg
=
s
->
bg_color
[
component
]
*
(
s
->
size
/
256
);
const
int
limit
=
s
->
size
-
1
;
const
int
is_chroma
=
(
component
==
1
||
component
==
2
);
const
int
shift_w
=
(
is_chroma
?
s
->
desc
->
log2_chroma_w
:
0
);
const
int
shift_h
=
(
is_chroma
?
s
->
desc
->
log2_chroma_h
:
0
);
const
int
dst_h
=
FF_CEIL_RSHIFT
(
out
->
height
,
shift_h
);
const
int
dst_w
=
FF_CEIL_RSHIFT
(
out
->
width
,
shift_w
);
const
int
start
=
s
->
estart
[
plane
];
const
int
end
=
s
->
eend
[
plane
];
uint16_t
*
dst
;
int
x
,
y
;
if
(
s
->
mode
)
{
for
(
x
=
0
;
x
<
dst_w
;
x
++
)
{
for
(
y
=
start
;
y
<
end
;
y
++
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
+
x
;
if
(
dst
[
0
]
!=
bg
)
{
dst
[
0
]
=
limit
;
break
;
}
}
for
(
y
=
end
-
1
;
y
>=
start
;
y
--
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
+
x
;
if
(
dst
[
0
]
!=
bg
)
{
dst
[
0
]
=
limit
;
break
;
}
}
}
}
else
{
for
(
y
=
0
;
y
<
dst_h
;
y
++
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
;
for
(
x
=
start
;
x
<
end
;
x
++
)
{
if
(
dst
[
x
]
!=
bg
)
{
dst
[
x
]
=
limit
;
break
;
}
}
for
(
x
=
end
-
1
;
x
>=
start
;
x
--
)
{
if
(
dst
[
x
]
!=
bg
)
{
dst
[
x
]
=
limit
;
break
;
}
}
}
}
}
static
void
envelope_instant
(
WaveformContext
*
s
,
AVFrame
*
out
,
int
plane
,
int
component
)
{
const
int
dst_linesize
=
out
->
linesize
[
component
];
...
...
@@ -189,10 +249,83 @@ static void envelope_instant(WaveformContext *s, AVFrame *out, int plane, int co
}
}
static
void
envelope_peak16
(
WaveformContext
*
s
,
AVFrame
*
out
,
int
plane
,
int
component
)
{
const
int
dst_linesize
=
out
->
linesize
[
component
]
/
2
;
const
int
bg
=
s
->
bg_color
[
component
]
*
(
s
->
size
/
256
);
const
int
limit
=
s
->
size
-
1
;
const
int
is_chroma
=
(
component
==
1
||
component
==
2
);
const
int
shift_w
=
(
is_chroma
?
s
->
desc
->
log2_chroma_w
:
0
);
const
int
shift_h
=
(
is_chroma
?
s
->
desc
->
log2_chroma_h
:
0
);
const
int
dst_h
=
FF_CEIL_RSHIFT
(
out
->
height
,
shift_h
);
const
int
dst_w
=
FF_CEIL_RSHIFT
(
out
->
width
,
shift_w
);
const
int
start
=
s
->
estart
[
plane
];
const
int
end
=
s
->
eend
[
plane
];
int
*
emax
=
s
->
emax
[
plane
][
component
];
int
*
emin
=
s
->
emin
[
plane
][
component
];
uint16_t
*
dst
;
int
x
,
y
;
if
(
s
->
mode
)
{
for
(
x
=
0
;
x
<
dst_w
;
x
++
)
{
for
(
y
=
start
;
y
<
end
&&
y
<
emin
[
x
];
y
++
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
+
x
;
if
(
dst
[
0
]
!=
bg
)
{
emin
[
x
]
=
y
;
break
;
}
}
for
(
y
=
end
-
1
;
y
>=
start
&&
y
>=
emax
[
x
];
y
--
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
+
x
;
if
(
dst
[
0
]
!=
bg
)
{
emax
[
x
]
=
y
;
break
;
}
}
}
if
(
s
->
envelope
==
3
)
envelope_instant16
(
s
,
out
,
plane
,
component
);
for
(
x
=
0
;
x
<
dst_w
;
x
++
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
emin
[
x
]
*
dst_linesize
+
x
;
dst
[
0
]
=
limit
;
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
emax
[
x
]
*
dst_linesize
+
x
;
dst
[
0
]
=
limit
;
}
}
else
{
for
(
y
=
0
;
y
<
dst_h
;
y
++
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
;
for
(
x
=
start
;
x
<
end
&&
x
<
emin
[
y
];
x
++
)
{
if
(
dst
[
x
]
!=
bg
)
{
emin
[
y
]
=
x
;
break
;
}
}
for
(
x
=
end
-
1
;
x
>=
start
&&
x
>=
emax
[
y
];
x
--
)
{
if
(
dst
[
x
]
!=
bg
)
{
emax
[
y
]
=
x
;
break
;
}
}
}
if
(
s
->
envelope
==
3
)
envelope_instant16
(
s
,
out
,
plane
,
component
);
for
(
y
=
0
;
y
<
dst_h
;
y
++
)
{
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
+
emin
[
y
];
dst
[
0
]
=
limit
;
dst
=
(
uint16_t
*
)
out
->
data
[
component
]
+
y
*
dst_linesize
+
emax
[
y
];
dst
[
0
]
=
limit
;
}
}
}
static
void
envelope_peak
(
WaveformContext
*
s
,
AVFrame
*
out
,
int
plane
,
int
component
)
{
const
int
dst_linesize
=
out
->
linesize
[
component
];
const
uint8_
t
bg
=
s
->
bg_color
[
component
];
const
in
t
bg
=
s
->
bg_color
[
component
];
const
int
is_chroma
=
(
component
==
1
||
component
==
2
);
const
int
shift_w
=
(
is_chroma
?
s
->
desc
->
log2_chroma_w
:
0
);
const
int
shift_h
=
(
is_chroma
?
s
->
desc
->
log2_chroma_h
:
0
);
...
...
@@ -261,6 +394,17 @@ static void envelope_peak(WaveformContext *s, AVFrame *out, int plane, int compo
}
}
static
void
envelope16
(
WaveformContext
*
s
,
AVFrame
*
out
,
int
plane
,
int
component
)
{
if
(
s
->
envelope
==
0
)
{
return
;
}
else
if
(
s
->
envelope
==
1
)
{
envelope_instant16
(
s
,
out
,
plane
,
component
);
}
else
{
envelope_peak16
(
s
,
out
,
plane
,
component
);
}
}
static
void
envelope
(
WaveformContext
*
s
,
AVFrame
*
out
,
int
plane
,
int
component
)
{
if
(
s
->
envelope
==
0
)
{
...
...
@@ -272,6 +416,14 @@ static void envelope(WaveformContext *s, AVFrame *out, int plane, int component)
}
}
static
void
update16
(
uint16_t
*
target
,
int
max
,
int
intensity
,
int
limit
)
{
if
(
*
target
<=
max
)
*
target
+=
intensity
;
else
*
target
=
limit
;
}
static
void
update
(
uint8_t
*
target
,
int
max
,
int
intensity
)
{
if
(
*
target
<=
max
)
...
...
@@ -280,6 +432,56 @@ static void update(uint8_t *target, int max, int intensity)
*
target
=
255
;
}
static
void
lowpass16
(
WaveformContext
*
s
,
AVFrame
*
in
,
AVFrame
*
out
,
int
component
,
int
intensity
,
int
offset
,
int
column
)
{
const
int
plane
=
s
->
desc
->
comp
[
component
].
plane
;
const
int
mirror
=
s
->
mirror
;
const
int
is_chroma
=
(
component
==
1
||
component
==
2
);
const
int
shift_w
=
(
is_chroma
?
s
->
desc
->
log2_chroma_w
:
0
);
const
int
shift_h
=
(
is_chroma
?
s
->
desc
->
log2_chroma_h
:
0
);
const
int
src_linesize
=
in
->
linesize
[
plane
]
/
2
;
const
int
dst_linesize
=
out
->
linesize
[
plane
]
/
2
;
const
int
dst_signed_linesize
=
dst_linesize
*
(
mirror
==
1
?
-
1
:
1
);
const
int
limit
=
s
->
size
-
1
;
const
int
max
=
limit
-
intensity
;
const
int
src_h
=
FF_CEIL_RSHIFT
(
in
->
height
,
shift_h
);
const
int
src_w
=
FF_CEIL_RSHIFT
(
in
->
width
,
shift_w
);
const
uint16_t
*
src_data
=
(
const
uint16_t
*
)
in
->
data
[
plane
];
uint16_t
*
dst_data
=
(
uint16_t
*
)
out
->
data
[
plane
]
+
(
column
?
(
offset
>>
shift_h
)
*
dst_linesize
:
offset
>>
shift_w
);
uint16_t
*
const
dst_bottom_line
=
dst_data
+
dst_linesize
*
((
s
->
size
>>
shift_h
)
-
1
);
uint16_t
*
const
dst_line
=
(
mirror
?
dst_bottom_line
:
dst_data
);
const
uint16_t
*
p
;
int
y
;
if
(
!
column
&&
mirror
)
dst_data
+=
s
->
size
>>
shift_w
;
for
(
y
=
0
;
y
<
src_h
;
y
++
)
{
const
uint16_t
*
src_data_end
=
src_data
+
src_w
;
uint16_t
*
dst
=
dst_line
;
for
(
p
=
src_data
;
p
<
src_data_end
;
p
++
)
{
uint16_t
*
target
;
int
v
=
FFMIN
(
*
p
,
limit
);
if
(
column
)
{
target
=
dst
++
+
dst_signed_linesize
*
(
v
>>
shift_h
);
}
else
{
if
(
mirror
)
target
=
dst_data
-
(
v
>>
shift_w
)
-
1
;
else
target
=
dst_data
+
(
v
>>
shift_w
);
}
update16
(
target
,
max
,
intensity
,
limit
);
}
src_data
+=
src_linesize
;
dst_data
+=
dst_linesize
;
}
envelope16
(
s
,
out
,
plane
,
plane
);
}
static
void
lowpass
(
WaveformContext
*
s
,
AVFrame
*
in
,
AVFrame
*
out
,
int
component
,
int
intensity
,
int
offset
,
int
column
)
{
...
...
@@ -777,6 +979,97 @@ static void achroma(WaveformContext *s, AVFrame *in, AVFrame *out,
envelope
(
s
,
out
,
plane
,
(
plane
+
2
)
%
s
->
ncomp
);
}
static
void
color16
(
WaveformContext
*
s
,
AVFrame
*
in
,
AVFrame
*
out
,
int
component
,
int
intensity
,
int
offset
,
int
column
)
{
const
int
plane
=
s
->
desc
->
comp
[
component
].
plane
;
const
int
mirror
=
s
->
mirror
;
const
int
limit
=
s
->
size
-
1
;
const
uint16_t
*
c0_data
=
(
const
uint16_t
*
)
in
->
data
[
plane
+
0
];
const
uint16_t
*
c1_data
=
(
const
uint16_t
*
)
in
->
data
[(
plane
+
1
)
%
s
->
ncomp
];
const
uint16_t
*
c2_data
=
(
const
uint16_t
*
)
in
->
data
[(
plane
+
2
)
%
s
->
ncomp
];
const
int
c0_linesize
=
in
->
linesize
[
plane
+
0
]
/
2
;
const
int
c1_linesize
=
in
->
linesize
[(
plane
+
1
)
%
s
->
ncomp
]
/
2
;
const
int
c2_linesize
=
in
->
linesize
[(
plane
+
2
)
%
s
->
ncomp
]
/
2
;
const
int
d0_linesize
=
out
->
linesize
[
plane
+
0
]
/
2
;
const
int
d1_linesize
=
out
->
linesize
[(
plane
+
1
)
%
s
->
ncomp
]
/
2
;
const
int
d2_linesize
=
out
->
linesize
[(
plane
+
2
)
%
s
->
ncomp
]
/
2
;
const
int
src_h
=
in
->
height
;
const
int
src_w
=
in
->
width
;
int
x
,
y
;
if
(
s
->
mode
)
{
const
int
d0_signed_linesize
=
d0_linesize
*
(
mirror
==
1
?
-
1
:
1
);
const
int
d1_signed_linesize
=
d1_linesize
*
(
mirror
==
1
?
-
1
:
1
);
const
int
d2_signed_linesize
=
d2_linesize
*
(
mirror
==
1
?
-
1
:
1
);
uint16_t
*
d0_data
=
(
uint16_t
*
)
out
->
data
[
plane
]
+
offset
*
d0_linesize
;
uint16_t
*
d1_data
=
(
uint16_t
*
)
out
->
data
[(
plane
+
1
)
%
s
->
ncomp
]
+
offset
*
d1_linesize
;
uint16_t
*
d2_data
=
(
uint16_t
*
)
out
->
data
[(
plane
+
2
)
%
s
->
ncomp
]
+
offset
*
d2_linesize
;
uint16_t
*
const
d0_bottom_line
=
d0_data
+
d0_linesize
*
(
s
->
size
-
1
);
uint16_t
*
const
d0
=
(
mirror
?
d0_bottom_line
:
d0_data
);
uint16_t
*
const
d1_bottom_line
=
d1_data
+
d1_linesize
*
(
s
->
size
-
1
);
uint16_t
*
const
d1
=
(
mirror
?
d1_bottom_line
:
d1_data
);
uint16_t
*
const
d2_bottom_line
=
d2_data
+
d2_linesize
*
(
s
->
size
-
1
);
uint16_t
*
const
d2
=
(
mirror
?
d2_bottom_line
:
d2_data
);
for
(
y
=
0
;
y
<
src_h
;
y
++
)
{
for
(
x
=
0
;
x
<
src_w
;
x
++
)
{
const
int
c0
=
FFMIN
(
c0_data
[
x
],
limit
);
const
int
c1
=
c1_data
[
x
];
const
int
c2
=
c2_data
[
x
];
*
(
d0
+
d0_signed_linesize
*
c0
+
x
)
=
c0
;
*
(
d1
+
d1_signed_linesize
*
c0
+
x
)
=
c1
;
*
(
d2
+
d2_signed_linesize
*
c0
+
x
)
=
c2
;
}
c0_data
+=
c0_linesize
;
c1_data
+=
c1_linesize
;
c2_data
+=
c2_linesize
;
d0_data
+=
d0_linesize
;
d1_data
+=
d1_linesize
;
d2_data
+=
d2_linesize
;
}
}
else
{
uint16_t
*
d0_data
=
(
uint16_t
*
)
out
->
data
[
plane
]
+
offset
;
uint16_t
*
d1_data
=
(
uint16_t
*
)
out
->
data
[(
plane
+
1
)
%
s
->
ncomp
]
+
offset
;
uint16_t
*
d2_data
=
(
uint16_t
*
)
out
->
data
[(
plane
+
2
)
%
s
->
ncomp
]
+
offset
;
if
(
mirror
)
{
d0_data
+=
s
->
size
-
1
;
d1_data
+=
s
->
size
-
1
;
d2_data
+=
s
->
size
-
1
;
}
for
(
y
=
0
;
y
<
src_h
;
y
++
)
{
for
(
x
=
0
;
x
<
src_w
;
x
++
)
{
const
int
c0
=
FFMIN
(
c0_data
[
x
],
limit
);
const
int
c1
=
c1_data
[
x
];
const
int
c2
=
c2_data
[
x
];
if
(
mirror
)
{
*
(
d0_data
-
c0
)
=
c0
;
*
(
d1_data
-
c0
)
=
c1
;
*
(
d2_data
-
c0
)
=
c2
;
}
else
{
*
(
d0_data
+
c0
)
=
c0
;
*
(
d1_data
+
c0
)
=
c1
;
*
(
d2_data
+
c0
)
=
c2
;
}
}
c0_data
+=
c0_linesize
;
c1_data
+=
c1_linesize
;
c2_data
+=
c2_linesize
;
d0_data
+=
d0_linesize
;
d1_data
+=
d1_linesize
;
d2_data
+=
d2_linesize
;
}
}
envelope16
(
s
,
out
,
plane
,
plane
);
}
static
void
color
(
WaveformContext
*
s
,
AVFrame
*
in
,
AVFrame
*
out
,
int
component
,
int
intensity
,
int
offset
,
int
column
)
{
...
...
@@ -877,11 +1170,12 @@ static int config_input(AVFilterLink *inlink)
s
->
desc
=
av_pix_fmt_desc_get
(
inlink
->
format
);
s
->
ncomp
=
s
->
desc
->
nb_components
;
s
->
bits
=
s
->
desc
->
comp
[
0
].
depth_minus1
+
1
;
switch
(
s
->
filter
)
{
case
LOWPASS
:
s
->
size
=
256
;
s
->
waveform
=
lowpass
;
break
;
s
->
waveform
=
s
->
bits
>
8
?
lowpass16
:
lowpass
;
break
;
case
FLAT
:
s
->
size
=
256
*
3
;
s
->
waveform
=
flat
;
break
;
...
...
@@ -896,12 +1190,16 @@ static int config_input(AVFilterLink *inlink)
s
->
waveform
=
achroma
;
break
;
case
COLOR
:
s
->
size
=
256
;
s
->
waveform
=
color
;
break
;
s
->
waveform
=
s
->
bits
>
8
?
color16
:
color
;
break
;
}
s
->
size
=
s
->
size
<<
(
s
->
bits
-
8
);
switch
(
inlink
->
format
)
{
case
AV_PIX_FMT_GBRAP
:
case
AV_PIX_FMT_GBRP
:
case
AV_PIX_FMT_GBRP9
:
case
AV_PIX_FMT_GBRP10
:
s
->
bg_color
=
black_gbrp_color
;
break
;
default:
...
...
@@ -976,7 +1274,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
WaveformContext
*
s
=
ctx
->
priv
;
AVFilterLink
*
outlink
=
ctx
->
outputs
[
0
];
AVFrame
*
out
;
int
i
,
k
;
int
i
,
j
,
k
;
out
=
ff_get_video_buffer
(
outlink
,
outlink
->
w
,
outlink
->
h
);
if
(
!
out
)
{
...
...
@@ -989,10 +1287,21 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
const
int
is_chroma
=
(
k
==
1
||
k
==
2
);
const
int
dst_h
=
FF_CEIL_RSHIFT
(
outlink
->
h
,
(
is_chroma
?
s
->
desc
->
log2_chroma_h
:
0
));
const
int
dst_w
=
FF_CEIL_RSHIFT
(
outlink
->
w
,
(
is_chroma
?
s
->
desc
->
log2_chroma_w
:
0
));
for
(
i
=
0
;
i
<
dst_h
;
i
++
)
memset
(
out
->
data
[
s
->
desc
->
comp
[
k
].
plane
]
+
i
*
out
->
linesize
[
s
->
desc
->
comp
[
k
].
plane
],
s
->
bg_color
[
k
],
dst_w
);
if
(
s
->
bits
<=
8
)
{
for
(
i
=
0
;
i
<
dst_h
;
i
++
)
memset
(
out
->
data
[
s
->
desc
->
comp
[
k
].
plane
]
+
i
*
out
->
linesize
[
s
->
desc
->
comp
[
k
].
plane
],
s
->
bg_color
[
k
],
dst_w
);
}
else
{
const
int
mult
=
s
->
size
/
256
;
uint16_t
*
dst
=
(
uint16_t
*
)
out
->
data
[
s
->
desc
->
comp
[
k
].
plane
];
for
(
i
=
0
;
i
<
dst_h
;
i
++
)
{
for
(
j
=
0
;
j
<
dst_w
;
j
++
)
dst
[
j
]
=
s
->
bg_color
[
k
]
*
mult
;
dst
+=
out
->
linesize
[
s
->
desc
->
comp
[
k
].
plane
]
/
2
;
}
}
}
for
(
k
=
0
,
i
=
0
;
k
<
s
->
ncomp
;
k
++
)
{
...
...
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