diff --git a/libavfilter/vf_slicify.c b/libavfilter/vf_slicify.c index d1c9fbc6ac..e2ac594611 100644 --- a/libavfilter/vf_slicify.c +++ b/libavfilter/vf_slicify.c @@ -29,6 +29,8 @@ typedef struct { int h; ///< output slice height int vshift; ///< vertical chroma subsampling shift + uint32_t lcg_state; ///< LCG state used to compute random slice height + int use_random_h; ///< enable the use of random slice height values } SliceContext; static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) @@ -36,9 +38,13 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) SliceContext *slice = ctx->priv; slice->h = 16; - if (args) - sscanf(args, "%d", &slice->h); - + if (args) { + if (!strcmp(args, "random")) { + slice->use_random_h = 1; + } else { + sscanf(args, "%d", &slice->h); + } + } return 0; } @@ -48,12 +54,6 @@ static int config_props(AVFilterLink *link) 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 */ - slice->h = FFMAX(8, slice->h & (-1 << slice->vshift)); - - av_log(link->dst, AV_LOG_INFO, "h:%d\n", slice->h); - return 0; } @@ -65,6 +65,19 @@ static AVFilterPicRef *get_video_buffer(AVFilterLink *link, int perms, static void start_frame(AVFilterLink *link, AVFilterPicRef *picref) { + SliceContext *slice = link->dst->priv; + + if (slice->use_random_h) { + slice->lcg_state = slice->lcg_state * 1664525 + 1013904223; + slice->h = 8 + (uint64_t)slice->lcg_state * 25 / UINT32_MAX; + } + + /* ensure that slices play nice with chroma subsampling, and enforce + * a reasonable minimum size for the slices */ + slice->h = FFMAX(8, slice->h & (-1 << slice->vshift)); + + av_log(link->dst, AV_LOG_DEBUG, "h:%d\n", slice->h); + avfilter_start_frame(link->dst->outputs[0], picref); }