Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
7a2b9dd0
Commit
7a2b9dd0
authored
Jun 09, 2016
by
dsmudhar
Committed by
Michael Niedermayer
Jun 15, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vf_codecview: added new options
Signed-off-by:
Michael Niedermayer
<
michael@niedermayer.cc
>
parent
2234566c
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
80 additions
and
13 deletions
+80
-13
filters.texi
doc/filters.texi
+35
-3
vf_codecview.c
libavfilter/vf_codecview.c
+45
-10
No files found.
doc/filters.texi
View file @
7a2b9dd0
...
...
@@ -4790,16 +4790,48 @@ backward predicted MVs of B-frames
@end table
@item qp
Display quantization parameters using the chroma planes
Display quantization parameters using the chroma planes.
@item mv_type, mvt
Set motion vectors type to visualize. Includes MVs from all frames unless specified by @var{frame_type} option.
Available flags for @var{mv_type} are:
@table @samp
@item fp
forward predicted MVs
@item bp
backward predicted MVs
@end table
@item frame_type, ft
Set frame type to visualize motion vectors of.
Available flags for @var{frame_type} are:
@table @samp
@item if
intra-coded frames (I-frames)
@item pf
predicted frames (P-frames)
@item bf
bi-directionally predicted frames (B-frames)
@end table
@end table
@subsection Examples
@itemize
@item
Visualizes multi-directionals MVs from P and B-Frames using @command{ffplay}:
Visualize forward predicted MVs of all frames using @command{ffplay}:
@example
ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv_type=fp
@end example
@item
Visualize multi-directionals MVs of P and B-Frames using @command{ffplay}:
@example
ffplay -flags2 +export_mvs input.mp
g
-vf codecview=mv=pf+bf+bb
ffplay -flags2 +export_mvs input.mp
4
-vf codecview=mv=pf+bf+bb
@end example
@end itemize
...
...
libavfilter/vf_codecview.c
View file @
7a2b9dd0
...
...
@@ -38,22 +38,40 @@
#define MV_P_FOR (1<<0)
#define MV_B_FOR (1<<1)
#define MV_B_BACK (1<<2)
#define MV_TYPE_FOR (1<<0)
#define MV_TYPE_BACK (1<<1)
#define FRAME_TYPE_I (1<<0)
#define FRAME_TYPE_P (1<<1)
#define FRAME_TYPE_B (1<<2)
typedef
struct
{
const
AVClass
*
class
;
unsigned
mv
;
unsigned
frame_type
;
unsigned
mv_type
;
int
hsub
,
vsub
;
int
qp
;
}
CodecViewContext
;
#define OFFSET(x) offsetof(CodecViewContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, 0, 0, FLAGS, unit }
static
const
AVOption
codecview_options
[]
=
{
{
"mv"
,
"set motion vectors to visualize"
,
OFFSET
(
mv
),
AV_OPT_TYPE_FLAGS
,
{.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
,
"mv"
},
{
"pf"
,
"forward predicted MVs of P-frames"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
MV_P_FOR
},
INT_MIN
,
INT_MAX
,
FLAGS
,
"mv"
}
,
{
"bf"
,
"forward predicted MVs of B-frames"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
MV_B_FOR
},
INT_MIN
,
INT_MAX
,
FLAGS
,
"mv"
}
,
{
"bb"
,
"backward predicted MVs of B-frames"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
MV_B_BACK
},
INT_MIN
,
INT_MAX
,
FLAGS
,
"mv"
}
,
CONST
(
"pf"
,
"forward predicted MVs of P-frames"
,
MV_P_FOR
,
"mv"
)
,
CONST
(
"bf"
,
"forward predicted MVs of B-frames"
,
MV_B_FOR
,
"mv"
)
,
CONST
(
"bb"
,
"backward predicted MVs of B-frames"
,
MV_B_BACK
,
"mv"
)
,
{
"qp"
,
NULL
,
OFFSET
(
qp
),
AV_OPT_TYPE_BOOL
,
{.
i64
=
0
},
0
,
1
,
.
flags
=
FLAGS
},
{
"mv_type"
,
"set motion vectors type"
,
OFFSET
(
mv_type
),
AV_OPT_TYPE_FLAGS
,
{.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
,
"mv_type"
},
{
"mvt"
,
"set motion vectors type"
,
OFFSET
(
mv_type
),
AV_OPT_TYPE_FLAGS
,
{.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
,
"mv_type"
},
CONST
(
"fp"
,
"forward predicted MVs"
,
MV_TYPE_FOR
,
"mv_type"
),
CONST
(
"bp"
,
"backward predicted MVs"
,
MV_TYPE_BACK
,
"mv_type"
),
{
"frame_type"
,
"set frame types to visualize motion vectors of"
,
OFFSET
(
frame_type
),
AV_OPT_TYPE_FLAGS
,
{.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
,
"frame_type"
},
{
"ft"
,
"set frame types to visualize motion vectors of"
,
OFFSET
(
frame_type
),
AV_OPT_TYPE_FLAGS
,
{.
i64
=
0
},
0
,
INT_MAX
,
FLAGS
,
"frame_type"
},
CONST
(
"if"
,
"I-frames"
,
FRAME_TYPE_I
,
"frame_type"
),
CONST
(
"pf"
,
"P-frames"
,
FRAME_TYPE_P
,
"frame_type"
),
CONST
(
"bf"
,
"B-frames"
,
FRAME_TYPE_B
,
"frame_type"
),
{
NULL
}
};
...
...
@@ -224,20 +242,37 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
}
}
if
(
s
->
mv
)
{
if
(
s
->
mv
||
s
->
mv_type
)
{
AVFrameSideData
*
sd
=
av_frame_get_side_data
(
frame
,
AV_FRAME_DATA_MOTION_VECTORS
);
if
(
sd
)
{
int
i
;
const
AVMotionVector
*
mvs
=
(
const
AVMotionVector
*
)
sd
->
data
;
const
int
is_iframe
=
(
s
->
frame_type
&
FRAME_TYPE_I
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_I
;
const
int
is_pframe
=
(
s
->
frame_type
&
FRAME_TYPE_P
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_P
;
const
int
is_bframe
=
(
s
->
frame_type
&
FRAME_TYPE_B
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_B
;
for
(
i
=
0
;
i
<
sd
->
size
/
sizeof
(
*
mvs
);
i
++
)
{
const
AVMotionVector
*
mv
=
&
mvs
[
i
];
const
int
direction
=
mv
->
source
>
0
;
if
((
direction
==
0
&&
(
s
->
mv
&
MV_P_FOR
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_P
)
||
(
direction
==
0
&&
(
s
->
mv
&
MV_B_FOR
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_B
)
||
(
direction
==
1
&&
(
s
->
mv
&
MV_B_BACK
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_B
))
draw_arrow
(
frame
->
data
[
0
],
mv
->
dst_x
,
mv
->
dst_y
,
mv
->
src_x
,
mv
->
src_y
,
frame
->
width
,
frame
->
height
,
frame
->
linesize
[
0
],
100
,
0
,
mv
->
source
>
0
);
if
(
s
->
mv_type
)
{
const
int
is_fp
=
direction
==
0
&&
(
s
->
mv_type
&
MV_TYPE_FOR
);
const
int
is_bp
=
direction
==
1
&&
(
s
->
mv_type
&
MV_TYPE_BACK
);
if
((
!
s
->
frame_type
&&
(
is_fp
||
is_bp
))
||
is_iframe
&&
is_fp
||
is_iframe
&&
is_bp
||
is_pframe
&&
is_fp
||
is_bframe
&&
is_fp
||
is_bframe
&&
is_bp
)
draw_arrow
(
frame
->
data
[
0
],
mv
->
dst_x
,
mv
->
dst_y
,
mv
->
src_x
,
mv
->
src_y
,
frame
->
width
,
frame
->
height
,
frame
->
linesize
[
0
],
100
,
0
,
direction
);
}
else
if
(
s
->
mv
)
if
((
direction
==
0
&&
(
s
->
mv
&
MV_P_FOR
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_P
)
||
(
direction
==
0
&&
(
s
->
mv
&
MV_B_FOR
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_B
)
||
(
direction
==
1
&&
(
s
->
mv
&
MV_B_BACK
)
&&
frame
->
pict_type
==
AV_PICTURE_TYPE_B
))
draw_arrow
(
frame
->
data
[
0
],
mv
->
dst_x
,
mv
->
dst_y
,
mv
->
src_x
,
mv
->
src_y
,
frame
->
width
,
frame
->
height
,
frame
->
linesize
[
0
],
100
,
0
,
direction
);
}
}
}
...
...
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