diff --git a/libavcodec/opt.c b/libavcodec/opt.c
index 94ac62218034dcf62927f9d01c032dc51c0e6934..70f2f3d91f9d88ff08513a24d901efc70a4b4a55 100644
--- a/libavcodec/opt.c
+++ b/libavcodec/opt.c
@@ -179,8 +179,10 @@ const AVOption *av_set_string(void *obj, const char *name, const char *val){
             if(o->type == FF_OPT_TYPE_FLAGS){
                 if     (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
                 else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
-            }else if(cmd=='-')
-                d= -d;
+            }else{
+                if     (cmd=='+') d= av_get_double(obj, name, NULL) + d;
+                else if(cmd=='-') d= av_get_double(obj, name, NULL) - d;
+            }
 
             if (!av_set_number(obj, name, d, 1, 1))
                 return NULL;