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
a56fd051
Commit
a56fd051
authored
Apr 20, 2013
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi/stereo3d: support more formats for non-anaglyph outputs
Signed-off-by:
Paul B Mahol
<
onemda@gmail.com
>
parent
0dd25e46
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
96 additions
and
29 deletions
+96
-29
vf_stereo3d.c
libavfilter/vf_stereo3d.c
+96
-29
No files found.
libavfilter/vf_stereo3d.c
View file @
a56fd051
...
...
@@ -132,6 +132,9 @@ typedef struct Stereo3DContext {
int
width
,
height
;
int
row_step
;
int
ana_matrix
[
3
][
6
];
int
nb_planes
;
int
linesize
[
4
];
int
pixstep
[
4
];
}
Stereo3DContext
;
#define OFFSET(x) offsetof(Stereo3DContext, x)
...
...
@@ -179,11 +182,61 @@ static const AVOption stereo3d_options[] = {
AVFILTER_DEFINE_CLASS
(
stereo3d
);
static
const
enum
AVPixelFormat
anaglyph_pix_fmts
[]
=
{
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_NONE
};
static
const
enum
AVPixelFormat
other_pix_fmts
[]
=
{
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_BGR24
,
AV_PIX_FMT_RGB48BE
,
AV_PIX_FMT_BGR48BE
,
AV_PIX_FMT_RGB48LE
,
AV_PIX_FMT_BGR48LE
,
AV_PIX_FMT_RGBA64BE
,
AV_PIX_FMT_BGRA64BE
,
AV_PIX_FMT_RGBA64LE
,
AV_PIX_FMT_BGRA64LE
,
AV_PIX_FMT_RGBA
,
AV_PIX_FMT_BGRA
,
AV_PIX_FMT_ARGB
,
AV_PIX_FMT_ABGR
,
AV_PIX_FMT_RGB0
,
AV_PIX_FMT_BGR0
,
AV_PIX_FMT_0RGB
,
AV_PIX_FMT_0BGR
,
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GBRP9BE
,
AV_PIX_FMT_GBRP9LE
,
AV_PIX_FMT_GBRP10BE
,
AV_PIX_FMT_GBRP10LE
,
AV_PIX_FMT_GBRP12BE
,
AV_PIX_FMT_GBRP12LE
,
AV_PIX_FMT_GBRP14BE
,
AV_PIX_FMT_GBRP14LE
,
AV_PIX_FMT_GBRP16BE
,
AV_PIX_FMT_GBRP16LE
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUVA444P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUV444P9LE
,
AV_PIX_FMT_YUVA444P9LE
,
AV_PIX_FMT_YUV444P9BE
,
AV_PIX_FMT_YUVA444P9BE
,
AV_PIX_FMT_YUV444P10LE
,
AV_PIX_FMT_YUVA444P10LE
,
AV_PIX_FMT_YUV444P10BE
,
AV_PIX_FMT_YUVA444P10BE
,
AV_PIX_FMT_YUV444P12BE
,
AV_PIX_FMT_YUV444P12LE
,
AV_PIX_FMT_YUV444P14BE
,
AV_PIX_FMT_YUV444P14LE
,
AV_PIX_FMT_YUV444P16LE
,
AV_PIX_FMT_YUVA444P16LE
,
AV_PIX_FMT_YUV444P16BE
,
AV_PIX_FMT_YUVA444P16BE
,
AV_PIX_FMT_NONE
};
static
int
query_formats
(
AVFilterContext
*
ctx
)
{
static
const
enum
AVPixelFormat
pix_fmts
[]
=
{
AV_PIX_FMT_RGB24
,
AV_PIX_FMT_NONE
};
Stereo3DContext
*
s
=
ctx
->
priv
;
const
enum
AVPixelFormat
*
pix_fmts
;
switch
(
s
->
out
.
format
)
{
case
ANAGLYPH_GM_COLOR
:
case
ANAGLYPH_GM_DUBOIS
:
case
ANAGLYPH_GM_GRAY
:
case
ANAGLYPH_GM_HALF
:
case
ANAGLYPH_RB_GRAY
:
case
ANAGLYPH_RC_COLOR
:
case
ANAGLYPH_RC_DUBOIS
:
case
ANAGLYPH_RC_GRAY
:
case
ANAGLYPH_RC_HALF
:
case
ANAGLYPH_RG_GRAY
:
case
ANAGLYPH_YB_COLOR
:
case
ANAGLYPH_YB_DUBOIS
:
case
ANAGLYPH_YB_GRAY
:
case
ANAGLYPH_YB_HALF
:
pix_fmts
=
anaglyph_pix_fmts
;
break
;
default:
pix_fmts
=
other_pix_fmts
;
}
ff_set_common_formats
(
ctx
,
ff_make_format_list
(
pix_fmts
));
...
...
@@ -196,6 +249,8 @@ static int config_output(AVFilterLink *outlink)
AVFilterLink
*
inlink
=
ctx
->
inputs
[
0
];
Stereo3DContext
*
s
=
ctx
->
priv
;
AVRational
aspect
=
inlink
->
sample_aspect_ratio
;
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
outlink
->
format
);
int
ret
;
switch
(
s
->
in
.
format
)
{
case
SIDE_BY_SIDE_2_LR
:
...
...
@@ -242,13 +297,13 @@ static int config_output(AVFilterLink *outlink)
aspect
.
num
*=
2
;
case
SIDE_BY_SIDE_LR
:
s
->
width
=
inlink
->
w
/
2
;
s
->
in
.
off_right
=
s
->
width
*
3
;
s
->
in
.
off_right
=
s
->
width
;
break
;
case
SIDE_BY_SIDE_2_RL
:
aspect
.
num
*=
2
;
case
SIDE_BY_SIDE_RL
:
s
->
width
=
inlink
->
w
/
2
;
s
->
in
.
off_left
=
s
->
width
*
3
;
s
->
in
.
off_left
=
s
->
width
;
break
;
case
ABOVE_BELOW_2_LR
:
aspect
.
den
*=
2
;
...
...
@@ -297,13 +352,13 @@ static int config_output(AVFilterLink *outlink)
aspect
.
num
/=
2
;
case
SIDE_BY_SIDE_LR
:
s
->
out
.
width
=
s
->
width
*
2
;
s
->
out
.
off_right
=
s
->
width
*
3
;
s
->
out
.
off_right
=
s
->
width
;
break
;
case
SIDE_BY_SIDE_2_RL
:
aspect
.
num
/=
2
;
case
SIDE_BY_SIDE_RL
:
s
->
out
.
width
=
s
->
width
*
2
;
s
->
out
.
off_left
=
s
->
width
*
3
;
s
->
out
.
off_left
=
s
->
width
;
break
;
case
ABOVE_BELOW_2_LR
:
aspect
.
den
/=
2
;
...
...
@@ -343,6 +398,11 @@ static int config_output(AVFilterLink *outlink)
outlink
->
h
=
s
->
out
.
height
;
outlink
->
sample_aspect_ratio
=
aspect
;
if
((
ret
=
av_image_fill_linesizes
(
s
->
linesize
,
outlink
->
format
,
s
->
width
))
<
0
)
return
ret
;
s
->
nb_planes
=
av_pix_fmt_count_planes
(
outlink
->
format
);
av_image_fill_max_pixsteps
(
s
->
pixstep
,
NULL
,
desc
);
return
0
;
}
...
...
@@ -363,8 +423,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
Stereo3DContext
*
s
=
ctx
->
priv
;
AVFilterLink
*
outlink
=
ctx
->
outputs
[
0
];
AVFrame
*
out
;
int
out_off_left
,
out_off_right
;
int
in_off_left
,
in_off_right
;
int
out_off_left
[
4
],
out_off_right
[
4
];
int
in_off_left
[
4
],
in_off_right
[
4
];
int
i
;
out
=
ff_get_video_buffer
(
outlink
,
outlink
->
w
,
outlink
->
h
);
if
(
!
out
)
{
...
...
@@ -373,10 +434,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
}
av_frame_copy_props
(
out
,
inpicref
);
in_off_left
=
(
s
->
in
.
row_left
+
s
->
in
.
off_lstep
)
*
inpicref
->
linesize
[
0
]
+
s
->
in
.
off_left
;
in_off_right
=
(
s
->
in
.
row_right
+
s
->
in
.
off_rstep
)
*
inpicref
->
linesize
[
0
]
+
s
->
in
.
off_right
;
out_off_left
=
(
s
->
out
.
row_left
+
s
->
out
.
off_lstep
)
*
out
->
linesize
[
0
]
+
s
->
out
.
off_left
;
out_off_right
=
(
s
->
out
.
row_right
+
s
->
out
.
off_rstep
)
*
out
->
linesize
[
0
]
+
s
->
out
.
off_right
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
in_off_left
[
i
]
=
(
s
->
in
.
row_left
+
s
->
in
.
off_lstep
)
*
inpicref
->
linesize
[
i
]
+
s
->
in
.
off_left
*
s
->
pixstep
[
i
];
in_off_right
[
i
]
=
(
s
->
in
.
row_right
+
s
->
in
.
off_rstep
)
*
inpicref
->
linesize
[
i
]
+
s
->
in
.
off_right
*
s
->
pixstep
[
i
];
out_off_left
[
i
]
=
(
s
->
out
.
row_left
+
s
->
out
.
off_lstep
)
*
out
->
linesize
[
i
]
+
s
->
out
.
off_left
*
s
->
pixstep
[
i
];
out_off_right
[
i
]
=
(
s
->
out
.
row_right
+
s
->
out
.
off_rstep
)
*
out
->
linesize
[
i
]
+
s
->
out
.
off_right
*
s
->
pixstep
[
i
];
}
switch
(
s
->
out
.
format
)
{
case
SIDE_BY_SIDE_LR
:
...
...
@@ -389,23 +452,27 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
case
ABOVE_BELOW_2_RL
:
case
INTERLEAVE_ROWS_LR
:
case
INTERLEAVE_ROWS_RL
:
av_image_copy_plane
(
out
->
data
[
0
]
+
out_off_left
,
out
->
linesize
[
0
]
*
s
->
row_step
,
inpicref
->
data
[
0
]
+
in_off_left
,
inpicref
->
linesize
[
0
]
*
s
->
row_step
,
3
*
s
->
width
,
s
->
height
);
av_image_copy_plane
(
out
->
data
[
0
]
+
out_off_right
,
out
->
linesize
[
0
]
*
s
->
row_step
,
inpicref
->
data
[
0
]
+
in_off_right
,
inpicref
->
linesize
[
0
]
*
s
->
row_step
,
3
*
s
->
width
,
s
->
height
);
for
(
i
=
0
;
i
<
s
->
nb_planes
;
i
++
)
{
av_image_copy_plane
(
out
->
data
[
i
]
+
out_off_left
[
i
],
out
->
linesize
[
i
]
*
s
->
row_step
,
inpicref
->
data
[
i
]
+
in_off_left
[
i
],
inpicref
->
linesize
[
i
]
*
s
->
row_step
,
s
->
linesize
[
i
],
s
->
height
);
av_image_copy_plane
(
out
->
data
[
i
]
+
out_off_right
[
i
],
out
->
linesize
[
i
]
*
s
->
row_step
,
inpicref
->
data
[
i
]
+
in_off_right
[
i
],
inpicref
->
linesize
[
i
]
*
s
->
row_step
,
s
->
linesize
[
i
],
s
->
height
);
}
break
;
case
MONO_L
:
case
MONO_R
:
av_image_copy_plane
(
out
->
data
[
0
],
out
->
linesize
[
0
],
inpicref
->
data
[
0
]
+
in_off_left
,
inpicref
->
linesize
[
0
],
3
*
s
->
width
,
s
->
height
);
for
(
i
=
0
;
i
<
s
->
nb_planes
;
i
++
)
{
av_image_copy_plane
(
out
->
data
[
i
],
out
->
linesize
[
i
],
inpicref
->
data
[
i
]
+
in_off_left
[
i
],
inpicref
->
linesize
[
i
],
s
->
linesize
[
i
],
s
->
height
);
}
break
;
case
ANAGLYPH_RB_GRAY
:
case
ANAGLYPH_RG_GRAY
:
...
...
@@ -432,8 +499,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
for
(
y
=
0
;
y
<
s
->
out
.
height
;
y
++
)
{
o
=
out
->
linesize
[
0
]
*
y
;
il
=
in_off_left
+
y
*
inpicref
->
linesize
[
0
];
ir
=
in_off_right
+
y
*
inpicref
->
linesize
[
0
];
il
=
in_off_left
[
0
]
+
y
*
inpicref
->
linesize
[
0
];
ir
=
in_off_right
[
0
]
+
y
*
inpicref
->
linesize
[
0
];
for
(
x
=
0
;
x
<
out_width
;
x
++
,
il
+=
3
,
ir
+=
3
,
o
+=
3
)
{
dst
[
o
]
=
ana_convert
(
ana_matrix
[
0
],
src
+
il
,
src
+
ir
);
dst
[
o
+
1
]
=
ana_convert
(
ana_matrix
[
1
],
src
+
il
,
src
+
ir
);
...
...
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