Commit 5e3fd8c5 authored by stefano's avatar stefano

Extend the slice filter to make it issue slice height values randomly

choosen between 8 and 32 when the supplied parameter is the string
"random".

This is useful for testing the slice support, but it is not supposed
to be used by the user for other purposes and this interface may
change in the future, and thus it is not documented.

The randomization algorithm adopted is the standard Numerical Recipes
LCG.

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@22505 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent d1327095
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
typedef struct { typedef struct {
int h; ///< output slice height int h; ///< output slice height
int vshift; ///< vertical chroma subsampling shift 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; } SliceContext;
static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) 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) ...@@ -36,9 +38,13 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
SliceContext *slice = ctx->priv; SliceContext *slice = ctx->priv;
slice->h = 16; slice->h = 16;
if (args) if (args) {
sscanf(args, "%d", &slice->h); if (!strcmp(args, "random")) {
slice->use_random_h = 1;
} else {
sscanf(args, "%d", &slice->h);
}
}
return 0; return 0;
} }
...@@ -48,12 +54,6 @@ static int config_props(AVFilterLink *link) ...@@ -48,12 +54,6 @@ static int config_props(AVFilterLink *link)
slice->vshift = av_pix_fmt_descriptors[link->format].log2_chroma_h; 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; return 0;
} }
...@@ -65,6 +65,19 @@ static AVFilterPicRef *get_video_buffer(AVFilterLink *link, int perms, ...@@ -65,6 +65,19 @@ static AVFilterPicRef *get_video_buffer(AVFilterLink *link, int perms,
static void start_frame(AVFilterLink *link, AVFilterPicRef *picref) 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); avfilter_start_frame(link->dst->outputs[0], picref);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment