diff mbox series

[FFmpeg-devel] avutil/opt: only skip evaluation for rational options

Message ID 20200418200045.18778-1-cus@passwd.hu
State Accepted
Commit 6847affcb775e89d9256b33c7dc8a7502d2bb428
Headers show
Series [FFmpeg-devel] avutil/opt: only skip evaluation for rational options | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Marton Balint April 18, 2020, 8 p.m. UTC
Fixes problems when non-rational options were set using rational expressions,
causing rounding errors and the option range limits not to be enforced
properly.

ffmpeg -f lavfi -i "sine=r=96000/2"

This caused an assertion failure with assert level 2.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 libavutil/opt.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

Comments

Marton Balint April 29, 2020, 4:28 p.m. UTC | #1
On Sat, 18 Apr 2020, Marton Balint wrote:

> Fixes problems when non-rational options were set using rational expressions,
> causing rounding errors and the option range limits not to be enforced
> properly.
>
> ffmpeg -f lavfi -i "sine=r=96000/2"
>
> This caused an assertion failure with assert level 2.
>
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
> libavutil/opt.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/libavutil/opt.c b/libavutil/opt.c
> index bf2562737b..b792dec01c 100644
> --- a/libavutil/opt.c
> +++ b/libavutil/opt.c
> @@ -229,13 +229,15 @@ static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **d
> static int set_string_number(void *obj, void *target_obj, const AVOption *o, const char *val, void *dst)
> {
>     int ret = 0;
> -    int num, den;
> -    char c;
> 
> -    if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
> -        if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
> -            return ret;
> -        ret = 0;
> +    if (o->type == AV_OPT_TYPE_RATIONAL || o->type == AV_OPT_TYPE_VIDEO_RATE) {
> +        int num, den;
> +        char c;
> +        if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
> +            if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
> +                return ret;
> +            ret = 0;
> +        }
>     }

Ping, will apply soon.

Regards,
Marton
Marton Balint May 1, 2020, 3:26 p.m. UTC | #2
On Wed, 29 Apr 2020, Marton Balint wrote:

>
>
> On Sat, 18 Apr 2020, Marton Balint wrote:
>
>> Fixes problems when non-rational options were set using rational 
> expressions,
>> causing rounding errors and the option range limits not to be enforced
>> properly.
>>
>> ffmpeg -f lavfi -i "sine=r=96000/2"
>>
>> This caused an assertion failure with assert level 2.
>>
>> Signed-off-by: Marton Balint <cus@passwd.hu>
>> ---
>> libavutil/opt.c | 14 ++++++++------
>> 1 file changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/libavutil/opt.c b/libavutil/opt.c
>> index bf2562737b..b792dec01c 100644
>> --- a/libavutil/opt.c
>> +++ b/libavutil/opt.c
>> @@ -229,13 +229,15 @@ static int set_string(void *obj, const AVOption *o, 
> const char *val, uint8_t **d
>> static int set_string_number(void *obj, void *target_obj, const AVOption 
> *o, const char *val, void *dst)
>> {
>>     int ret = 0;
>> -    int num, den;
>> -    char c;
>> 
>> -    if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
>> -        if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
>> -            return ret;
>> -        ret = 0;
>> +    if (o->type == AV_OPT_TYPE_RATIONAL || o->type == 
> AV_OPT_TYPE_VIDEO_RATE) {
>> +        int num, den;
>> +        char c;
>> +        if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
>> +            if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
>> +                return ret;
>> +            ret = 0;
>> +        }
>>     }
>
> Ping, will apply soon.

Applied.

Regards,
Marton
diff mbox series

Patch

diff --git a/libavutil/opt.c b/libavutil/opt.c
index bf2562737b..b792dec01c 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -229,13 +229,15 @@  static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **d
 static int set_string_number(void *obj, void *target_obj, const AVOption *o, const char *val, void *dst)
 {
     int ret = 0;
-    int num, den;
-    char c;
 
-    if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
-        if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
-            return ret;
-        ret = 0;
+    if (o->type == AV_OPT_TYPE_RATIONAL || o->type == AV_OPT_TYPE_VIDEO_RATE) {
+        int num, den;
+        char c;
+        if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
+            if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
+                return ret;
+            ret = 0;
+        }
     }
 
     for (;;) {