2 * copyright (c) 2007 Bobby Bingham
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * @file libavfilter/vf_slicify.c
23 * video slicing filter
29 int h
; ///< output slice height
30 int vshift
; ///< vertical chroma subsampling shift
33 static av_cold
int init(AVFilterContext
*ctx
, const char *args
, void *opaque
)
35 SliceContext
*slice
= ctx
->priv
;
39 sscanf(args
, "%d", &slice
->h
);
44 static int config_props(AVFilterLink
*link
)
46 SliceContext
*slice
= link
->dst
->priv
;
49 avcodec_get_chroma_sub_sample(link
->format
, &tmp
, &slice
->vshift
);
51 /* ensure that slices play nice with chroma subsampling, and enforce
52 * a reasonable minimum size for the slices */
53 slice
->h
= FFMAX(8, slice
->h
& (-1 << slice
->vshift
));
55 av_log(link
->dst
, AV_LOG_INFO
, "h:%d\n", slice
->h
);
60 static AVFilterPicRef
*get_video_buffer(AVFilterLink
*link
, int perms
,
63 return avfilter_get_video_buffer(link
->dst
->outputs
[0], perms
, w
, h
);
66 static void start_frame(AVFilterLink
*link
, AVFilterPicRef
*picref
)
68 avfilter_start_frame(link
->dst
->outputs
[0], picref
);
71 static void end_frame(AVFilterLink
*link
)
73 avfilter_end_frame(link
->dst
->outputs
[0]);
76 static void draw_slice(AVFilterLink
*link
, int y
, int h
)
78 SliceContext
*slice
= link
->dst
->priv
;
81 for (y2
= y
; y2
+ slice
->h
<= y
+ h
; y2
+= slice
->h
)
82 avfilter_draw_slice(link
->dst
->outputs
[0], y2
, slice
->h
);
85 avfilter_draw_slice(link
->dst
->outputs
[0], y2
, y
+ h
- y2
);
88 AVFilter avfilter_vf_slicify
= {
90 .description
= "Pass the images of input video on to next video filter as multiple slices.",
94 .priv_size
= sizeof(SliceContext
),
96 .inputs
= (AVFilterPad
[]) {{ .name
= "default",
97 .type
= CODEC_TYPE_VIDEO
,
98 .get_video_buffer
= get_video_buffer
,
99 .start_frame
= start_frame
,
100 .draw_slice
= draw_slice
,
101 .config_props
= config_props
,
102 .end_frame
= end_frame
, },
104 .outputs
= (AVFilterPad
[]) {{ .name
= "default",
105 .type
= CODEC_TYPE_VIDEO
, },