[FFmpeg-devel] [PATCH v1 6/6] avfilter/vf_random: seeds is uint32, it's enough to use int32_t

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Fri Oct 11 10:34:00 EEST 2019


Limin Wang:
> On Fri, Oct 11, 2019 at 06:59:00AM +0000, Andreas Rheinhardt wrote:
>> Limin Wang:
>>> On Fri, Oct 11, 2019 at 06:20:00AM +0000, Andreas Rheinhardt wrote:
>>>> lance.lmwang at gmail.com:
>>>>> From: Limin Wang <lance.lmwang at gmail.com>
>>>>>
>>>>> Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
>>>>> ---
>>>>>  libavfilter/vf_random.c | 2 +-
>>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/libavfilter/vf_random.c b/libavfilter/vf_random.c
>>>>> index 1937eae771..9f2153be61 100644
>>>>> --- a/libavfilter/vf_random.c
>>>>> +++ b/libavfilter/vf_random.c
>>>>> @@ -33,7 +33,7 @@ typedef struct RandomContext {
>>>>>  
>>>>>      AVLFG lfg;
>>>>>      int nb_frames;
>>>>> -    int64_t random_seed;
>>>>> +    int32_t random_seed;
>>>>>      int nb_frames_filled;
>>>>>      AVFrame *frames[MAX_FRAMES];
>>>>>      int64_t pts[MAX_FRAMES];
>>>>>
>>>>     { "seed",   "set the seed",                  OFFSET(random_seed),
>>>> AV_OPT_TYPE_INT64, {.i64=-1}, -1, UINT32_MAX, FLAGS },
>>>>
>>>> So in addition to the complete range of an uint32_t one also needs
>>>> another value that instructs init to get a random seed of its own.
>>>
>>> yes, the max range is UINT32_MAX, so no need to use int64_t
>>>
>> First of all, simply changing the value to 32 bit is not right -- you
>> would also have to change the type in the corresponding AVOption (it
> 
> I haven't see .i32 type for AVOption
> 
>> might seem to work on little-endian systems, but it certainly doesn't
>> on big-endian systems; actually using -1 as random_seed would probably
>> already not work on little-endian systems either). Second, there are
>> more legal values for random_seed than values representable in 32 bit,
>> hence one has to use a type with more than 32 bit.
> 
> random_seed = -1, it'll get the seed by av_get_random_seed(), it'll
> return 32bit.
> 
> else 
> 
> uint32_t seed
>      seed = s->random_seed;
>      av_lfg_init(&s->lfg, seed);
> 
> the seed is uint32_t still, so user can't use with more than 32bit
> for the current code.
> 
There are more than 2^32 legal values the user can input for
random_seed: The 2^32 values which should be directly used as random
seed and the special value -1. You need a type with more than 32 bits
to distinguish -1 from UINT32_MAX.

- Andreas


More information about the ffmpeg-devel mailing list