shithub: libvpx

Download patch

ref: 16e101ba547fe7698c16d2ff1f896b7cb2069e96
parent: 34d7c8b3d4b9da3846f0d429e13ac15758f6cf78
author: James Berry <jamesberry@google.com>
date: Mon Nov 28 09:09:35 EST 2011

bugfix: all vpxenc arguments were not parsed under all conditions

dynamicly assign ARG_CTRL_CNT_MAX and
add check to make sure argument instance
doesnt already exist before creating a duplicate

Change-Id: I4f78a9c5346cda8e812cd89c077afe8996493508

--- a/vpxenc.c
+++ b/vpxenc.c
@@ -1442,7 +1442,8 @@
     show_histogram(hist->bucket, buckets, hist->total, scale);
 }
 
-#define ARG_CTRL_CNT_MAX 10
+#define NELEMENTS(x) (sizeof(x)/sizeof(x[0]))
+#define ARG_CTRL_CNT_MAX NELEMENTS(vp8_arg_ctrl_map)
 
 int main(int argc, const char **argv_)
 {
@@ -1721,14 +1722,26 @@
         {
             if (arg_match(&arg, ctrl_args[i], argi))
             {
+                int j;
                 match = 1;
 
-                if (arg_ctrl_cnt < ARG_CTRL_CNT_MAX)
+                /* Point either to the next free element or the first
+                * instance of this control.
+                */
+                for(j=0; j<arg_ctrl_cnt; j++)
+                    if(arg_ctrls[j][0] == ctrl_args_map[i])
+                        break;
+
+                /* Update/insert */
+                assert(j < ARG_CTRL_CNT_MAX);
+                if (j < ARG_CTRL_CNT_MAX)
                 {
-                    arg_ctrls[arg_ctrl_cnt][0] = ctrl_args_map[i];
-                    arg_ctrls[arg_ctrl_cnt][1] = arg_parse_enum_or_int(&arg);
-                    arg_ctrl_cnt++;
+                    arg_ctrls[j][0] = ctrl_args_map[i];
+                    arg_ctrls[j][1] = arg_parse_enum_or_int(&arg);
+                    if(j == arg_ctrl_cnt)
+                        arg_ctrl_cnt++;
                 }
+
             }
         }
 
--