[FFmpeg-cvslog] r22505 - trunk/libavfilter/vf_slicify.c

stefano subversion
Sat Mar 13 11:41:26 CET 2010


Author: stefano
Date: Sat Mar 13 11:41:25 2010
New Revision: 22505

Log:
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.

Modified:
   trunk/libavfilter/vf_slicify.c

Modified: trunk/libavfilter/vf_slicify.c
==============================================================================
--- trunk/libavfilter/vf_slicify.c	Sat Mar 13 11:25:41 2010	(r22504)
+++ trunk/libavfilter/vf_slicify.c	Sat Mar 13 11:41:25 2010	(r22505)
@@ -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 
     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 *li
 
     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(
 
 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);
 }
 



More information about the ffmpeg-cvslog mailing list