mirror of https://github.com/mpv-player/mpv
misc/random: seed using libavutil/random_seed
When starting multiple processes of `mpv --shuffle` in parallel, sometimes the random seed happens to be identical, so files are played in the same random order. mp_rand_seed(0) now uses a random seed provided by libavutil, and only falls back to time in case of failure.
This commit is contained in:
parent
53f2619dbd
commit
c365e2f7b1
|
@ -20,7 +20,10 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <libavutil/random_seed.h>
|
||||||
|
|
||||||
#include "osdep/threads.h"
|
#include "osdep/threads.h"
|
||||||
|
#include "osdep/timer.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
|
|
||||||
static uint64_t state[4];
|
static uint64_t state[4];
|
||||||
|
@ -44,6 +47,16 @@ void mp_rand_seed(uint64_t seed)
|
||||||
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||||
seed = 42;
|
seed = 42;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (seed == 0) {
|
||||||
|
uint8_t buf[sizeof(seed)];
|
||||||
|
if (av_random_bytes(buf, sizeof(buf)) < 0) {
|
||||||
|
seed = mp_raw_time_ns();
|
||||||
|
} else {
|
||||||
|
memcpy(&seed, buf, sizeof(seed));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mp_mutex_lock(&state_mutex);
|
mp_mutex_lock(&state_mutex);
|
||||||
state[0] = seed;
|
state[0] = seed;
|
||||||
for (int i = 1; i < 4; i++)
|
for (int i = 1; i < 4; i++)
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the pseudo-random number generator's state with
|
* Initialize the pseudo-random number generator's state with
|
||||||
* the given 64-bit seed.
|
* the given 64-bit seed. If the seed is 0, it is randomized.
|
||||||
*/
|
*/
|
||||||
void mp_rand_seed(uint64_t seed);
|
void mp_rand_seed(uint64_t seed);
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
#include "common/common.h"
|
#include "common/common.h"
|
||||||
#include "common/msg.h"
|
#include "common/msg.h"
|
||||||
#include "misc/random.h"
|
|
||||||
#include "threads.h"
|
#include "threads.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
|
@ -32,7 +31,6 @@ static mp_once timer_init_once = MP_STATIC_ONCE_INITIALIZER;
|
||||||
static void do_timer_init(void)
|
static void do_timer_init(void)
|
||||||
{
|
{
|
||||||
mp_raw_time_init();
|
mp_raw_time_init();
|
||||||
mp_rand_seed(mp_raw_time_ns());
|
|
||||||
raw_time_offset = mp_raw_time_ns();
|
raw_time_offset = mp_raw_time_ns();
|
||||||
assert(raw_time_offset > 0);
|
assert(raw_time_offset > 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "mpv_talloc.h"
|
#include "mpv_talloc.h"
|
||||||
|
|
||||||
#include "misc/dispatch.h"
|
#include "misc/dispatch.h"
|
||||||
|
#include "misc/random.h"
|
||||||
#include "misc/thread_pool.h"
|
#include "misc/thread_pool.h"
|
||||||
#include "osdep/io.h"
|
#include "osdep/io.h"
|
||||||
#include "osdep/terminal.h"
|
#include "osdep/terminal.h"
|
||||||
|
@ -263,6 +264,7 @@ struct MPContext *mp_create(void)
|
||||||
talloc_enable_leak_report();
|
talloc_enable_leak_report();
|
||||||
|
|
||||||
mp_time_init();
|
mp_time_init();
|
||||||
|
mp_rand_seed(0);
|
||||||
|
|
||||||
struct MPContext *mpctx = talloc(NULL, MPContext);
|
struct MPContext *mpctx = talloc(NULL, MPContext);
|
||||||
*mpctx = (struct MPContext){
|
*mpctx = (struct MPContext){
|
||||||
|
|
Loading…
Reference in New Issue