Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
599b81ca
Commit
599b81ca
authored
Feb 23, 2014
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi: add shuffleplanes filter
parent
bba2a7cc
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
206 additions
and
1 deletion
+206
-1
Changelog
Changelog
+1
-0
filters.texi
doc/filters.texi
+30
-0
Makefile
libavfilter/Makefile
+1
-0
allfilters.c
libavfilter/allfilters.c
+1
-0
version.h
libavfilter/version.h
+1
-1
vf_shuffleplanes.c
libavfilter/vf_shuffleplanes.c
+172
-0
No files found.
Changelog
View file @
599b81ca
...
@@ -3,6 +3,7 @@ releases are sorted from youngest to oldest.
...
@@ -3,6 +3,7 @@ releases are sorted from youngest to oldest.
version <next>:
version <next>:
- compand audio filter
- compand audio filter
- shuffleplanes filter
version 10:
version 10:
...
...
doc/filters.texi
View file @
599b81ca
...
@@ -2453,6 +2453,36 @@ Adler-32 checksum of each plane of the input frame, expressed in the form
...
@@ -2453,6 +2453,36 @@ Adler-32 checksum of each plane of the input frame, expressed in the form
"[@var{c0} @var{c1} @var{c2} @var{c3}]"
"[@var{c0} @var{c1} @var{c2} @var{c3}]"
@end table
@end table
@section shuffleplanes
Reorder and/or duplicate video planes.
This filter accepts the following options:
@table @option
@item map0
The index of the input plane to be used as the first output plane.
@item map1
The index of the input plane to be used as the second output plane.
@item map2
The index of the input plane to be used as the third output plane.
@item map3
The index of the input plane to be used as the fourth output plane.
@end table
The first plane has the index 0. The default is to keep the input unchanged.
E.g.
@example
avconv -i INPUT -vf shuffleplanes=0:2:1:3 OUTPUT
@end example
swaps the second and third planes of the input.
@section split
@section split
Split input video into several identical outputs.
Split input video into several identical outputs.
...
...
libavfilter/Makefile
View file @
599b81ca
...
@@ -78,6 +78,7 @@ OBJS-$(CONFIG_SETPTS_FILTER) += setpts.o
...
@@ -78,6 +78,7 @@ OBJS-$(CONFIG_SETPTS_FILTER) += setpts.o
OBJS-$(CONFIG_SETSAR_FILTER)
+=
vf_aspect.o
OBJS-$(CONFIG_SETSAR_FILTER)
+=
vf_aspect.o
OBJS-$(CONFIG_SETTB_FILTER)
+=
vf_settb.o
OBJS-$(CONFIG_SETTB_FILTER)
+=
vf_settb.o
OBJS-$(CONFIG_SHOWINFO_FILTER)
+=
vf_showinfo.o
OBJS-$(CONFIG_SHOWINFO_FILTER)
+=
vf_showinfo.o
OBJS-$(CONFIG_SHUFFLEPLANES_FILTER)
+=
vf_shuffleplanes.o
OBJS-$(CONFIG_SPLIT_FILTER)
+=
split.o
OBJS-$(CONFIG_SPLIT_FILTER)
+=
split.o
OBJS-$(CONFIG_TRANSPOSE_FILTER)
+=
vf_transpose.o
OBJS-$(CONFIG_TRANSPOSE_FILTER)
+=
vf_transpose.o
OBJS-$(CONFIG_TRIM_FILTER)
+=
trim.o
OBJS-$(CONFIG_TRIM_FILTER)
+=
trim.o
...
...
libavfilter/allfilters.c
View file @
599b81ca
...
@@ -98,6 +98,7 @@ void avfilter_register_all(void)
...
@@ -98,6 +98,7 @@ void avfilter_register_all(void)
REGISTER_FILTER
(
SETSAR
,
setsar
,
vf
);
REGISTER_FILTER
(
SETSAR
,
setsar
,
vf
);
REGISTER_FILTER
(
SETTB
,
settb
,
vf
);
REGISTER_FILTER
(
SETTB
,
settb
,
vf
);
REGISTER_FILTER
(
SHOWINFO
,
showinfo
,
vf
);
REGISTER_FILTER
(
SHOWINFO
,
showinfo
,
vf
);
REGISTER_FILTER
(
SHUFFLEPLANES
,
shuffleplanes
,
vf
);
REGISTER_FILTER
(
SPLIT
,
split
,
vf
);
REGISTER_FILTER
(
SPLIT
,
split
,
vf
);
REGISTER_FILTER
(
TRANSPOSE
,
transpose
,
vf
);
REGISTER_FILTER
(
TRANSPOSE
,
transpose
,
vf
);
REGISTER_FILTER
(
TRIM
,
trim
,
vf
);
REGISTER_FILTER
(
TRIM
,
trim
,
vf
);
...
...
libavfilter/version.h
View file @
599b81ca
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
#include "libavutil/version.h"
#include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 4
#define LIBAVFILTER_VERSION_MAJOR 4
#define LIBAVFILTER_VERSION_MINOR
2
#define LIBAVFILTER_VERSION_MINOR
3
#define LIBAVFILTER_VERSION_MICRO 0
#define LIBAVFILTER_VERSION_MICRO 0
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
...
...
libavfilter/vf_shuffleplanes.c
0 → 100644
View file @
599b81ca
/*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/avstring.h"
#include "libavutil/common.h"
#include "libavutil/internal.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h"
#include "avfilter.h"
#include "internal.h"
#include "video.h"
typedef
struct
ShufflePlanesContext
{
const
AVClass
*
class
;
/* number of planes in the selected pixel format */
int
planes
;
/* mapping indices */
uint8_t
map
[
4
];
/* set to 1 if some plane is used more than once, so we need to make a copy */
int
copy
;
}
ShufflePlanesContext
;
static
av_cold
int
shuffleplanes_config_input
(
AVFilterLink
*
inlink
)
{
AVFilterContext
*
ctx
=
inlink
->
dst
;
ShufflePlanesContext
*
s
=
ctx
->
priv
;
const
AVPixFmtDescriptor
*
desc
;
int
used
[
4
]
=
{
0
};
int
i
;
s
->
copy
=
0
;
s
->
planes
=
av_pix_fmt_count_planes
(
inlink
->
format
);
desc
=
av_pix_fmt_desc_get
(
inlink
->
format
);
for
(
i
=
0
;
i
<
s
->
planes
;
i
++
)
{
if
(
s
->
map
[
i
]
>=
s
->
planes
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Non-existing input plane #%d mapped to output plane #%d.
\n
"
,
s
->
map
[
i
],
i
);
return
AVERROR
(
EINVAL
);
}
if
((
desc
->
log2_chroma_h
||
desc
->
log2_chroma_w
)
&&
(
i
==
1
||
i
==
2
)
!=
(
s
->
map
[
i
]
==
1
||
s
->
map
[
i
]
==
2
))
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Cannot map between a subsampled chroma plane and a luma "
"or alpha plane.
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
((
desc
->
flags
&
AV_PIX_FMT_FLAG_PAL
||
desc
->
flags
&
AV_PIX_FMT_FLAG_PSEUDOPAL
)
&&
(
i
==
1
)
!=
(
s
->
map
[
i
]
==
1
))
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Cannot map between a palette plane and a data plane.
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
used
[
s
->
map
[
i
]])
s
->
copy
=
1
;
used
[
s
->
map
[
i
]]
++
;
}
return
0
;
}
static
int
shuffleplanes_filter_frame
(
AVFilterLink
*
inlink
,
AVFrame
*
frame
)
{
AVFilterContext
*
ctx
=
inlink
->
dst
;
ShufflePlanesContext
*
s
=
ctx
->
priv
;
uint8_t
*
shuffled_data
[
4
]
=
{
NULL
};
int
shuffled_linesize
[
4
]
=
{
0
};
int
i
,
ret
;
for
(
i
=
0
;
i
<
s
->
planes
;
i
++
)
{
shuffled_data
[
i
]
=
frame
->
data
[
s
->
map
[
i
]];
shuffled_linesize
[
i
]
=
frame
->
linesize
[
s
->
map
[
i
]];
}
memcpy
(
frame
->
data
,
shuffled_data
,
sizeof
(
shuffled_data
));
memcpy
(
frame
->
linesize
,
shuffled_linesize
,
sizeof
(
shuffled_linesize
));
if
(
s
->
copy
)
{
AVFrame
*
copy
=
ff_get_video_buffer
(
ctx
->
outputs
[
0
],
frame
->
width
,
frame
->
height
);
if
(
!
copy
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
}
av_frame_copy
(
copy
,
frame
);
ret
=
av_frame_copy_props
(
copy
,
frame
);
if
(
ret
<
0
)
{
av_frame_free
(
&
copy
);
goto
fail
;
}
av_frame_free
(
&
frame
);
frame
=
copy
;
}
return
ff_filter_frame
(
ctx
->
outputs
[
0
],
frame
);
fail:
av_frame_free
(
&
frame
);
return
ret
;
}
#define OFFSET(x) offsetof(ShufflePlanesContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
static
const
AVOption
shuffleplanes_options
[]
=
{
{
"map0"
,
"Index of the input plane to be used as the first output plane "
,
OFFSET
(
map
[
0
]),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
4
,
FLAGS
},
{
"map1"
,
"Index of the input plane to be used as the second output plane "
,
OFFSET
(
map
[
1
]),
AV_OPT_TYPE_INT
,
{
.
i64
=
1
},
0
,
4
,
FLAGS
},
{
"map2"
,
"Index of the input plane to be used as the third output plane "
,
OFFSET
(
map
[
2
]),
AV_OPT_TYPE_INT
,
{
.
i64
=
2
},
0
,
4
,
FLAGS
},
{
"map3"
,
"Index of the input plane to be used as the fourth output plane "
,
OFFSET
(
map
[
3
]),
AV_OPT_TYPE_INT
,
{
.
i64
=
3
},
0
,
4
,
FLAGS
},
{
NULL
},
};
static
const
AVClass
shuffleplanes_class
=
{
.
class_name
=
"shuffleplanes"
,
.
item_name
=
av_default_item_name
,
.
option
=
shuffleplanes_options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
static
const
AVFilterPad
shuffleplanes_inputs
[]
=
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
config_props
=
shuffleplanes_config_input
,
.
filter_frame
=
shuffleplanes_filter_frame
,
.
get_video_buffer
=
ff_null_get_video_buffer
,
},
{
NULL
},
};
static
const
AVFilterPad
shuffleplanes_outputs
[]
=
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
},
{
NULL
},
};
AVFilter
ff_vf_shuffleplanes
=
{
.
name
=
"shuffleplanes"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Shuffle video planes"
),
.
priv_size
=
sizeof
(
ShufflePlanesContext
),
.
priv_class
=
&
shuffleplanes_class
,
.
inputs
=
shuffleplanes_inputs
,
.
outputs
=
shuffleplanes_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