summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/filters.texi6
-rw-r--r--libavfilter/f_perms.c14
-rw-r--r--libavfilter/version.h2
3 files changed, 18 insertions, 4 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index 02f0a29c64..4190ccaccc 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -6249,6 +6249,12 @@ Make the frame read-only if writable, and writable if read-only.
@item random
Set each output frame read-only or writable randomly.
@end table
+
+@item seed
+Set the seed for the @var{random} mode, must be an integer included between
+@code{0} and @code{UINT32_MAX}. If not specified, or if explicitly set to
+@code{-1}, the filter will try to use a good random seed on a best effort
+basis.
@end table
Note: in case of auto-inserted filter between the permission filter and the
diff --git a/libavfilter/f_perms.c b/libavfilter/f_perms.c
index e3f974c0c0..2c3d62ccf8 100644
--- a/libavfilter/f_perms.c
+++ b/libavfilter/f_perms.c
@@ -34,6 +34,7 @@ enum mode {
typedef struct {
const AVClass *class;
AVLFG lfg;
+ int64_t random_seed;
enum mode mode;
} PermsContext;
@@ -47,6 +48,7 @@ static const AVOption options[] = {
{ "rw", "set all output frames writable", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_RW}, INT_MIN, INT_MAX, FLAGS, "mode" },
{ "toggle", "switch permissions", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_TOGGLE}, INT_MIN, INT_MAX, FLAGS, "mode" },
{ "random", "set permissions randomly", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_RANDOM}, INT_MIN, INT_MAX, FLAGS, "mode" },
+ { "seed", "set the seed for the random mode", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
{ NULL }
};
@@ -54,9 +56,15 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
{
PermsContext *perms = ctx->priv;
- // TODO: add a seed option
- if (perms->mode == MODE_RANDOM)
- av_lfg_init(&perms->lfg, av_get_random_seed());
+ if (perms->mode == MODE_RANDOM) {
+ uint32_t seed;
+
+ if (perms->random_seed == -1)
+ perms->random_seed = av_get_random_seed();
+ seed = perms->random_seed;
+ av_log(ctx, AV_LOG_INFO, "random seed: 0x%08x\n", seed);
+ av_lfg_init(&perms->lfg, seed);
+ }
return 0;
}
diff --git a/libavfilter/version.h b/libavfilter/version.h
index ce6d874310..e623896e1a 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 48
-#define LIBAVFILTER_VERSION_MICRO 104
+#define LIBAVFILTER_VERSION_MICRO 105
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \