*/
#include "avfilter.h"
+#include "libavutil/pixdesc.h"
typedef struct {
int h; ///< output slice height
static int config_props(AVFilterLink *link)
{
SliceContext *slice = link->dst->priv;
- int tmp;
- avcodec_get_chroma_sub_sample(link->format, &tmp, &slice->vshift);
+ slice->vshift = av_pix_fmt_descriptors[link->format].log2_chroma_h;
/* ensure that slices play nice with chroma subsampling, and enforce
* a reasonable minimum size for the slices */
avfilter_end_frame(link->dst->outputs[0]);
}
-static void draw_slice(AVFilterLink *link, int y, int h)
+static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
{
SliceContext *slice = link->dst->priv;
int y2;
- for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h)
- avfilter_draw_slice(link->dst->outputs[0], y2, slice->h);
+ if (slice_dir == 1) {
+ for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h)
+ avfilter_draw_slice(link->dst->outputs[0], y2, slice->h, slice_dir);
- if (y2 < y + h)
- avfilter_draw_slice(link->dst->outputs[0], y2, y + h - y2);
+ if (y2 < y + h)
+ avfilter_draw_slice(link->dst->outputs[0], y2, y + h - y2, slice_dir);
+ } else if (slice_dir == -1) {
+ for (y2 = y + h; y2 - slice->h >= y; y2 -= slice->h)
+ avfilter_draw_slice(link->dst->outputs[0], y2 - slice->h, slice->h, slice_dir);
+
+ if (y2 > y)
+ avfilter_draw_slice(link->dst->outputs[0], y, y2 - y, slice_dir);
+ }
}
AVFilter avfilter_vf_slicify = {