summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Sabatini <stefano.sabatini-lala@poste.it>2010-03-13 10:41:25 +0000
committerStefano Sabatini <stefano.sabatini-lala@poste.it>2010-03-13 10:41:25 +0000
commitec7ab610d51508344273dbc38fec4ab6034bf1e2 (patch)
tree2b801854ed8236e269c616bc1531b70e1658577e
parent14268254c8b3ab1c82b839af3644a43f0d7260f7 (diff)
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 for other purposes and this interface may change in the future, thus it is not documented. The randomization algorithm adopted is the standard Numerical Recipes LCG. Originally committed as revision 22505 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavfilter/vf_slicify.c31
1 files changed, 22 insertions, 9 deletions
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);
}