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
2bdd4349
Commit
2bdd4349
authored
Apr 26, 2013
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi/stereo3d: add support for alternating frames input & output format
Signed-off-by:
Paul B Mahol
<
onemda@gmail.com
>
parent
01a5a3a2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
107 additions
and
24 deletions
+107
-24
filters.texi
doc/filters.texi
+6
-0
vf_stereo3d.c
libavfilter/vf_stereo3d.c
+101
-24
No files found.
doc/filters.texi
View file @
2bdd4349
...
@@ -5785,6 +5785,12 @@ above-below with half height resolution
...
@@ -5785,6 +5785,12 @@ above-below with half height resolution
above-below with half height resolution
above-below with half height resolution
(right eye above, left eye below)
(right eye above, left eye below)
@item al
alternating frames (left eye first, right eye second)
@item ar
alternating frames (right eye first, left eye second)
Default value is @samp{sbsl}.
Default value is @samp{sbsl}.
@end table
@end table
...
...
libavfilter/vf_stereo3d.c
View file @
2bdd4349
...
@@ -56,6 +56,8 @@ enum StereoCode {
...
@@ -56,6 +56,8 @@ enum StereoCode {
ABOVE_BELOW_RL
,
// above-below (right eye above, left eye below)
ABOVE_BELOW_RL
,
// above-below (right eye above, left eye below)
ABOVE_BELOW_2_LR
,
// above-below with half height resolution
ABOVE_BELOW_2_LR
,
// above-below with half height resolution
ABOVE_BELOW_2_RL
,
// above-below with half height resolution
ABOVE_BELOW_2_RL
,
// above-below with half height resolution
ALTERNATING_LR
,
// alternating frames (left eye first, right eye second)
ALTERNATING_RL
,
// alternating frames (right eye first, left eye second)
STEREO_CODE_COUNT
// TODO: needs autodetection
STEREO_CODE_COUNT
// TODO: needs autodetection
};
};
...
@@ -135,17 +137,21 @@ typedef struct Stereo3DContext {
...
@@ -135,17 +137,21 @@ typedef struct Stereo3DContext {
int
nb_planes
;
int
nb_planes
;
int
linesize
[
4
];
int
linesize
[
4
];
int
pixstep
[
4
];
int
pixstep
[
4
];
AVFrame
*
prev
;
double
ts_unit
;
}
Stereo3DContext
;
}
Stereo3DContext
;
#define OFFSET(x) offsetof(Stereo3DContext, x)
#define OFFSET(x) offsetof(Stereo3DContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
static
const
AVOption
stereo3d_options
[]
=
{
static
const
AVOption
stereo3d_options
[]
=
{
{
"in"
,
"set input format"
,
OFFSET
(
in
.
format
),
AV_OPT_TYPE_INT
,
{.
i64
=
SIDE_BY_SIDE_LR
},
SIDE_BY_SIDE_LR
,
ABOVE_BELOW_2_RL
,
FLAGS
,
"in"
},
{
"in"
,
"set input format"
,
OFFSET
(
in
.
format
),
AV_OPT_TYPE_INT
,
{.
i64
=
SIDE_BY_SIDE_LR
},
SIDE_BY_SIDE_LR
,
STEREO_CODE_COUNT
-
1
,
FLAGS
,
"in"
},
{
"ab2l"
,
"above below half height left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_2_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"ab2l"
,
"above below half height left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_2_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"ab2r"
,
"above below half height right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_2_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"ab2r"
,
"above below half height right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_2_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"abl"
,
"above below left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"abl"
,
"above below left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"abr"
,
"above below right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"abr"
,
"above below right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ABOVE_BELOW_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"al"
,
"alternating frames left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ALTERNATING_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"ar"
,
"alternating frames right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ALTERNATING_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"sbs2l"
,
"side by side half width left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
SIDE_BY_SIDE_2_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"sbs2l"
,
"side by side half width left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
SIDE_BY_SIDE_2_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"sbs2r"
,
"side by side half width right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
SIDE_BY_SIDE_2_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"sbs2r"
,
"side by side half width right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
SIDE_BY_SIDE_2_RL
},
0
,
0
,
FLAGS
,
"in"
},
{
"sbsl"
,
"side by side left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
SIDE_BY_SIDE_LR
},
0
,
0
,
FLAGS
,
"in"
},
{
"sbsl"
,
"side by side left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
SIDE_BY_SIDE_LR
},
0
,
0
,
FLAGS
,
"in"
},
...
@@ -159,6 +165,8 @@ static const AVOption stereo3d_options[] = {
...
@@ -159,6 +165,8 @@ static const AVOption stereo3d_options[] = {
{
"agmd"
,
"anaglyph green magenta dubois"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_GM_DUBOIS
},
0
,
0
,
FLAGS
,
"out"
},
{
"agmd"
,
"anaglyph green magenta dubois"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_GM_DUBOIS
},
0
,
0
,
FLAGS
,
"out"
},
{
"agmg"
,
"anaglyph green magenta gray"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_GM_GRAY
},
0
,
0
,
FLAGS
,
"out"
},
{
"agmg"
,
"anaglyph green magenta gray"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_GM_GRAY
},
0
,
0
,
FLAGS
,
"out"
},
{
"agmh"
,
"anaglyph green magenta half color"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_GM_HALF
},
0
,
0
,
FLAGS
,
"out"
},
{
"agmh"
,
"anaglyph green magenta half color"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_GM_HALF
},
0
,
0
,
FLAGS
,
"out"
},
{
"al"
,
"alternating frames left first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ALTERNATING_LR
},
0
,
0
,
FLAGS
,
"out"
},
{
"ar"
,
"alternating frames right first"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ALTERNATING_RL
},
0
,
0
,
FLAGS
,
"out"
},
{
"arbg"
,
"anaglyph red blue gray"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_RB_GRAY
},
0
,
0
,
FLAGS
,
"out"
},
{
"arbg"
,
"anaglyph red blue gray"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_RB_GRAY
},
0
,
0
,
FLAGS
,
"out"
},
{
"arcc"
,
"anaglyph red cyan color"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_RC_COLOR
},
0
,
0
,
FLAGS
,
"out"
},
{
"arcc"
,
"anaglyph red cyan color"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_RC_COLOR
},
0
,
0
,
FLAGS
,
"out"
},
{
"arcd"
,
"anaglyph red cyan dubois"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_RC_DUBOIS
},
0
,
0
,
FLAGS
,
"out"
},
{
"arcd"
,
"anaglyph red cyan dubois"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
ANAGLYPH_RC_DUBOIS
},
0
,
0
,
FLAGS
,
"out"
},
...
@@ -249,6 +257,8 @@ static int config_output(AVFilterLink *outlink)
...
@@ -249,6 +257,8 @@ static int config_output(AVFilterLink *outlink)
AVFilterLink
*
inlink
=
ctx
->
inputs
[
0
];
AVFilterLink
*
inlink
=
ctx
->
inputs
[
0
];
Stereo3DContext
*
s
=
ctx
->
priv
;
Stereo3DContext
*
s
=
ctx
->
priv
;
AVRational
aspect
=
inlink
->
sample_aspect_ratio
;
AVRational
aspect
=
inlink
->
sample_aspect_ratio
;
AVRational
fps
=
inlink
->
frame_rate
;
AVRational
tb
=
inlink
->
time_base
;
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
outlink
->
format
);
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
outlink
->
format
);
int
ret
;
int
ret
;
...
@@ -317,6 +327,12 @@ static int config_output(AVFilterLink *outlink)
...
@@ -317,6 +327,12 @@ static int config_output(AVFilterLink *outlink)
s
->
in
.
row_left
=
s
->
in
.
row_left
=
s
->
height
=
inlink
->
h
/
2
;
s
->
height
=
inlink
->
h
/
2
;
break
;
break
;
case
ALTERNATING_RL
:
case
ALTERNATING_LR
:
outlink
->
flags
|=
FF_LINK_FLAG_REQUEST_LOOP
;
fps
.
den
*=
2
;
tb
.
num
*=
2
;
break
;
default:
default:
av_log
(
ctx
,
AV_LOG_ERROR
,
"input format %d is not supported
\n
"
,
s
->
in
.
format
);
av_log
(
ctx
,
AV_LOG_ERROR
,
"input format %d is not supported
\n
"
,
s
->
in
.
format
);
return
AVERROR
(
EINVAL
);
return
AVERROR
(
EINVAL
);
...
@@ -389,19 +405,27 @@ static int config_output(AVFilterLink *outlink)
...
@@ -389,19 +405,27 @@ static int config_output(AVFilterLink *outlink)
s
->
in
.
row_left
=
s
->
in
.
row_right
;
s
->
in
.
row_left
=
s
->
in
.
row_right
;
case
MONO_L
:
case
MONO_L
:
break
;
break
;
case
ALTERNATING_RL
:
case
ALTERNATING_LR
:
fps
.
num
*=
2
;
tb
.
den
*=
2
;
break
;
default:
default:
av_log
(
ctx
,
AV_LOG_ERROR
,
"output format
is not supported
\n
"
);
av_log
(
ctx
,
AV_LOG_ERROR
,
"output format
%d is not supported
\n
"
,
s
->
out
.
format
);
return
AVERROR
(
EINVAL
);
return
AVERROR
(
EINVAL
);
}
}
outlink
->
w
=
s
->
out
.
width
;
outlink
->
w
=
s
->
out
.
width
;
outlink
->
h
=
s
->
out
.
height
;
outlink
->
h
=
s
->
out
.
height
;
outlink
->
frame_rate
=
fps
;
outlink
->
time_base
=
tb
;
outlink
->
sample_aspect_ratio
=
aspect
;
outlink
->
sample_aspect_ratio
=
aspect
;
if
((
ret
=
av_image_fill_linesizes
(
s
->
linesize
,
outlink
->
format
,
s
->
width
))
<
0
)
if
((
ret
=
av_image_fill_linesizes
(
s
->
linesize
,
outlink
->
format
,
s
->
width
))
<
0
)
return
ret
;
return
ret
;
s
->
nb_planes
=
av_pix_fmt_count_planes
(
outlink
->
format
);
s
->
nb_planes
=
av_pix_fmt_count_planes
(
outlink
->
format
);
av_image_fill_max_pixsteps
(
s
->
pixstep
,
NULL
,
desc
);
av_image_fill_max_pixsteps
(
s
->
pixstep
,
NULL
,
desc
);
s
->
ts_unit
=
av_q2d
(
av_inv_q
(
av_mul_q
(
outlink
->
frame_rate
,
outlink
->
time_base
)));
return
0
;
return
0
;
}
}
...
@@ -422,26 +446,57 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
...
@@ -422,26 +446,57 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
AVFilterContext
*
ctx
=
inlink
->
dst
;
AVFilterContext
*
ctx
=
inlink
->
dst
;
Stereo3DContext
*
s
=
ctx
->
priv
;
Stereo3DContext
*
s
=
ctx
->
priv
;
AVFilterLink
*
outlink
=
ctx
->
outputs
[
0
];
AVFilterLink
*
outlink
=
ctx
->
outputs
[
0
];
AVFrame
*
out
;
AVFrame
*
out
,
*
oleft
,
*
oright
,
*
ileft
,
*
iright
;
int
out_off_left
[
4
],
out_off_right
[
4
];
int
out_off_left
[
4
],
out_off_right
[
4
];
int
in_off_left
[
4
],
in_off_right
[
4
];
int
in_off_left
[
4
],
in_off_right
[
4
];
int
i
;
int
i
;
out
=
ff_get_video_buffer
(
outlink
,
outlink
->
w
,
outlink
->
h
);
switch
(
s
->
in
.
format
)
{
case
ALTERNATING_LR
:
case
ALTERNATING_RL
:
if
(
!
s
->
prev
)
{
s
->
prev
=
inpicref
;
return
0
;
}
ileft
=
s
->
prev
;
iright
=
inpicref
;
if
(
s
->
in
.
format
==
ALTERNATING_RL
)
FFSWAP
(
AVFrame
*
,
ileft
,
iright
);
break
;
default:
ileft
=
iright
=
inpicref
;
};
out
=
oleft
=
oright
=
ff_get_video_buffer
(
outlink
,
outlink
->
w
,
outlink
->
h
);
if
(
!
out
)
{
if
(
!
out
)
{
av_frame_free
(
&
s
->
prev
);
av_frame_free
(
&
inpicref
);
av_frame_free
(
&
inpicref
);
return
AVERROR
(
ENOMEM
);
return
AVERROR
(
ENOMEM
);
}
}
av_frame_copy_props
(
out
,
inpicref
);
av_frame_copy_props
(
out
,
inpicref
);
if
(
s
->
out
.
format
==
ALTERNATING_LR
||
s
->
out
.
format
==
ALTERNATING_RL
)
{
oright
=
ff_get_video_buffer
(
outlink
,
outlink
->
w
,
outlink
->
h
);
if
(
!
oright
)
{
av_frame_free
(
&
oleft
);
av_frame_free
(
&
s
->
prev
);
av_frame_free
(
&
inpicref
);
return
AVERROR
(
ENOMEM
);
}
av_frame_copy_props
(
oright
,
inpicref
);
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
in_off_left
[
i
]
=
(
s
->
in
.
row_left
+
s
->
in
.
off_lstep
)
*
i
npicref
->
linesize
[
i
]
+
s
->
in
.
off_left
*
s
->
pixstep
[
i
];
in_off_left
[
i
]
=
(
s
->
in
.
row_left
+
s
->
in
.
off_lstep
)
*
i
left
->
linesize
[
i
]
+
s
->
in
.
off_left
*
s
->
pixstep
[
i
];
in_off_right
[
i
]
=
(
s
->
in
.
row_right
+
s
->
in
.
off_rstep
)
*
i
npicref
->
linesize
[
i
]
+
s
->
in
.
off_right
*
s
->
pixstep
[
i
];
in_off_right
[
i
]
=
(
s
->
in
.
row_right
+
s
->
in
.
off_rstep
)
*
i
right
->
linesize
[
i
]
+
s
->
in
.
off_right
*
s
->
pixstep
[
i
];
out_off_left
[
i
]
=
(
s
->
out
.
row_left
+
s
->
out
.
off_lstep
)
*
o
ut
->
linesize
[
i
]
+
s
->
out
.
off_left
*
s
->
pixstep
[
i
];
out_off_left
[
i
]
=
(
s
->
out
.
row_left
+
s
->
out
.
off_lstep
)
*
o
left
->
linesize
[
i
]
+
s
->
out
.
off_left
*
s
->
pixstep
[
i
];
out_off_right
[
i
]
=
(
s
->
out
.
row_right
+
s
->
out
.
off_rstep
)
*
o
ut
->
linesize
[
i
]
+
s
->
out
.
off_right
*
s
->
pixstep
[
i
];
out_off_right
[
i
]
=
(
s
->
out
.
row_right
+
s
->
out
.
off_rstep
)
*
o
right
->
linesize
[
i
]
+
s
->
out
.
off_right
*
s
->
pixstep
[
i
];
}
}
switch
(
s
->
out
.
format
)
{
switch
(
s
->
out
.
format
)
{
case
ALTERNATING_LR
:
case
ALTERNATING_RL
:
case
SIDE_BY_SIDE_LR
:
case
SIDE_BY_SIDE_LR
:
case
SIDE_BY_SIDE_RL
:
case
SIDE_BY_SIDE_RL
:
case
SIDE_BY_SIDE_2_LR
:
case
SIDE_BY_SIDE_2_LR
:
...
@@ -453,24 +508,25 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
...
@@ -453,24 +508,25 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
case
INTERLEAVE_ROWS_LR
:
case
INTERLEAVE_ROWS_LR
:
case
INTERLEAVE_ROWS_RL
:
case
INTERLEAVE_ROWS_RL
:
for
(
i
=
0
;
i
<
s
->
nb_planes
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_planes
;
i
++
)
{
av_image_copy_plane
(
o
u
t
->
data
[
i
]
+
out_off_left
[
i
],
av_image_copy_plane
(
o
lef
t
->
data
[
i
]
+
out_off_left
[
i
],
o
u
t
->
linesize
[
i
]
*
s
->
row_step
,
o
lef
t
->
linesize
[
i
]
*
s
->
row_step
,
i
npicref
->
data
[
i
]
+
in_off_left
[
i
],
i
left
->
data
[
i
]
+
in_off_left
[
i
],
i
npicref
->
linesize
[
i
]
*
s
->
row_step
,
i
left
->
linesize
[
i
]
*
s
->
row_step
,
s
->
linesize
[
i
],
s
->
height
);
s
->
linesize
[
i
],
s
->
height
);
av_image_copy_plane
(
o
u
t
->
data
[
i
]
+
out_off_right
[
i
],
av_image_copy_plane
(
o
righ
t
->
data
[
i
]
+
out_off_right
[
i
],
o
u
t
->
linesize
[
i
]
*
s
->
row_step
,
o
righ
t
->
linesize
[
i
]
*
s
->
row_step
,
i
npicref
->
data
[
i
]
+
in_off_right
[
i
],
i
right
->
data
[
i
]
+
in_off_right
[
i
],
i
npicref
->
linesize
[
i
]
*
s
->
row_step
,
i
right
->
linesize
[
i
]
*
s
->
row_step
,
s
->
linesize
[
i
],
s
->
height
);
s
->
linesize
[
i
],
s
->
height
);
}
}
break
;
break
;
case
MONO_L
:
case
MONO_L
:
iright
=
ileft
;
case
MONO_R
:
case
MONO_R
:
for
(
i
=
0
;
i
<
s
->
nb_planes
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_planes
;
i
++
)
{
av_image_copy_plane
(
out
->
data
[
i
],
out
->
linesize
[
i
],
av_image_copy_plane
(
out
->
data
[
i
],
out
->
linesize
[
i
],
i
npicref
->
data
[
i
]
+
in_off_left
[
i
],
i
right
->
data
[
i
]
+
in_off_left
[
i
],
i
npicref
->
linesize
[
i
],
i
right
->
linesize
[
i
],
s
->
linesize
[
i
],
s
->
height
);
s
->
linesize
[
i
],
s
->
height
);
}
}
break
;
break
;
...
@@ -489,7 +545,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
...
@@ -489,7 +545,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
case
ANAGLYPH_YB_COLOR
:
case
ANAGLYPH_YB_COLOR
:
case
ANAGLYPH_YB_DUBOIS
:
{
case
ANAGLYPH_YB_DUBOIS
:
{
int
i
,
x
,
y
,
il
,
ir
,
o
;
int
i
,
x
,
y
,
il
,
ir
,
o
;
uint8_t
*
src
=
inpicref
->
data
[
0
];
uint8_t
*
lsrc
=
ileft
->
data
[
0
];
uint8_t
*
rsrc
=
iright
->
data
[
0
];
uint8_t
*
dst
=
out
->
data
[
0
];
uint8_t
*
dst
=
out
->
data
[
0
];
int
out_width
=
s
->
out
.
width
;
int
out_width
=
s
->
out
.
width
;
int
*
ana_matrix
[
3
];
int
*
ana_matrix
[
3
];
...
@@ -499,12 +556,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
...
@@ -499,12 +556,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
for
(
y
=
0
;
y
<
s
->
out
.
height
;
y
++
)
{
for
(
y
=
0
;
y
<
s
->
out
.
height
;
y
++
)
{
o
=
out
->
linesize
[
0
]
*
y
;
o
=
out
->
linesize
[
0
]
*
y
;
il
=
in_off_left
[
0
]
+
y
*
i
npicref
->
linesize
[
0
];
il
=
in_off_left
[
0
]
+
y
*
i
left
->
linesize
[
0
];
ir
=
in_off_right
[
0
]
+
y
*
i
npicref
->
linesize
[
0
];
ir
=
in_off_right
[
0
]
+
y
*
i
right
->
linesize
[
0
];
for
(
x
=
0
;
x
<
out_width
;
x
++
,
il
+=
3
,
ir
+=
3
,
o
+=
3
)
{
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
]
=
ana_convert
(
ana_matrix
[
0
],
lsrc
+
il
,
r
src
+
ir
);
dst
[
o
+
1
]
=
ana_convert
(
ana_matrix
[
1
],
src
+
il
,
src
+
ir
);
dst
[
o
+
1
]
=
ana_convert
(
ana_matrix
[
1
],
lsrc
+
il
,
r
src
+
ir
);
dst
[
o
+
2
]
=
ana_convert
(
ana_matrix
[
2
],
src
+
il
,
src
+
ir
);
dst
[
o
+
2
]
=
ana_convert
(
ana_matrix
[
2
],
lsrc
+
il
,
r
src
+
ir
);
}
}
}
}
break
;
break
;
...
@@ -514,9 +571,28 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
...
@@ -514,9 +571,28 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
}
}
av_frame_free
(
&
inpicref
);
av_frame_free
(
&
inpicref
);
av_frame_free
(
&
s
->
prev
);
if
(
oright
!=
oleft
)
{
if
(
s
->
out
.
format
==
ALTERNATING_LR
)
FFSWAP
(
AVFrame
*
,
oleft
,
oright
);
oright
->
pts
=
outlink
->
frame_count
*
s
->
ts_unit
;
ff_filter_frame
(
outlink
,
oright
);
out
=
oleft
;
oleft
->
pts
=
outlink
->
frame_count
*
s
->
ts_unit
;
}
else
if
(
s
->
in
.
format
==
ALTERNATING_LR
||
s
->
in
.
format
==
ALTERNATING_RL
)
{
out
->
pts
=
outlink
->
frame_count
*
s
->
ts_unit
;
}
return
ff_filter_frame
(
outlink
,
out
);
return
ff_filter_frame
(
outlink
,
out
);
}
}
static
av_cold
void
uninit
(
AVFilterContext
*
ctx
)
{
Stereo3DContext
*
s
=
ctx
->
priv
;
av_frame_free
(
&
s
->
prev
);
}
static
const
AVFilterPad
stereo3d_inputs
[]
=
{
static
const
AVFilterPad
stereo3d_inputs
[]
=
{
{
{
.
name
=
"default"
,
.
name
=
"default"
,
...
@@ -539,6 +615,7 @@ AVFilter avfilter_vf_stereo3d = {
...
@@ -539,6 +615,7 @@ AVFilter avfilter_vf_stereo3d = {
.
name
=
"stereo3d"
,
.
name
=
"stereo3d"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Convert video stereoscopic 3D view."
),
.
description
=
NULL_IF_CONFIG_SMALL
(
"Convert video stereoscopic 3D view."
),
.
priv_size
=
sizeof
(
Stereo3DContext
),
.
priv_size
=
sizeof
(
Stereo3DContext
),
.
uninit
=
uninit
,
.
query_formats
=
query_formats
,
.
query_formats
=
query_formats
,
.
inputs
=
stereo3d_inputs
,
.
inputs
=
stereo3d_inputs
,
.
outputs
=
stereo3d_outputs
,
.
outputs
=
stereo3d_outputs
,
...
...
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