[FFmpeg-cvslog] r25744 - in trunk/libavfilter: parseutils.c parseutils.h vf_drawbox.c vf_pad.c

aurel subversion
Sat Nov 13 14:55:02 CET 2010


Author: aurel
Date: Sat Nov 13 14:55:01 2010
New Revision: 25744

Log:
improve av_parse_color() to allow for non-null terminated color string

Modified:
   trunk/libavfilter/parseutils.c
   trunk/libavfilter/parseutils.h
   trunk/libavfilter/vf_drawbox.c
   trunk/libavfilter/vf_pad.c

Modified: trunk/libavfilter/parseutils.c
==============================================================================
--- trunk/libavfilter/parseutils.c	Sat Nov 13 14:49:58 2010	(r25743)
+++ trunk/libavfilter/parseutils.c	Sat Nov 13 14:55:01 2010	(r25744)
@@ -183,7 +183,8 @@ static int color_table_compare(const voi
 
 #define ALPHA_SEP '@'
 
-int av_parse_color(uint8_t *rgba_color, const char *color_string, void *log_ctx)
+int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
+                   void *log_ctx)
 {
     char *tail, color_string2[128];
     const ColorEntry *entry;
@@ -194,7 +195,10 @@ int av_parse_color(uint8_t *rgba_color, 
     } else if (!strncmp(color_string, "0x", 2))
         hex_offset = 2;
 
-    av_strlcpy(color_string2, color_string + hex_offset, sizeof(color_string2));
+    if (slen < 0)
+        slen = strlen(color_string);
+    av_strlcpy(color_string2, color_string + hex_offset,
+               FFMIN(slen-hex_offset+1, sizeof(color_string2)));
     if ((tail = strchr(color_string2, ALPHA_SEP)))
         *tail++ = 0;
     len = strlen(color_string2);
@@ -308,7 +312,7 @@ int main(void)
         av_log_set_level(AV_LOG_DEBUG);
 
         for (i = 0;  i < FF_ARRAY_ELEMS(color_names); i++) {
-            if (av_parse_color(rgba, color_names[i], NULL) >= 0)
+            if (av_parse_color(rgba, color_names[i], -1, NULL) >= 0)
                 printf("%s -> R(%d) G(%d) B(%d) A(%d)\n", color_names[i], rgba[0], rgba[1], rgba[2], rgba[3]);
         }
     }

Modified: trunk/libavfilter/parseutils.h
==============================================================================
--- trunk/libavfilter/parseutils.h	Sat Nov 13 14:49:58 2010	(r25743)
+++ trunk/libavfilter/parseutils.h	Sat Nov 13 14:55:01 2010	(r25744)
@@ -40,9 +40,13 @@
  * 0xff/1.0 completely opaque).
  * If the alpha component is not specified then 0xff is assumed.
  * The string "random" will result in a random color.
+ * @param slen length of the initial part of color_string containing the
+ * color. It can be set to -1 if color_string is a null terminated string
+ * containing nothing else than the color.
  * @return >= 0 in case of success, a negative value in case of
  * failure (for example if color_string cannot be parsed).
  */
-int av_parse_color(uint8_t *rgba_color, const char *color_string, void *log_ctx);
+int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
+                   void *log_ctx);
 
 #endif  /* AVFILTER_PARSEUTILS_H */

Modified: trunk/libavfilter/vf_drawbox.c
==============================================================================
--- trunk/libavfilter/vf_drawbox.c	Sat Nov 13 14:49:58 2010	(r25743)
+++ trunk/libavfilter/vf_drawbox.c	Sat Nov 13 14:55:01 2010	(r25744)
@@ -49,7 +49,7 @@ static av_cold int init(AVFilterContext 
         sscanf(args, "%d:%d:%d:%d:%s",
                &drawbox->x, &drawbox->y, &drawbox->w, &drawbox->h, color_str);
 
-    if (av_parse_color(rgba_color, color_str, ctx) < 0)
+    if (av_parse_color(rgba_color, color_str, -1, ctx) < 0)
         return AVERROR(EINVAL);
 
     drawbox->yuv_color[Y] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);

Modified: trunk/libavfilter/vf_pad.c
==============================================================================
--- trunk/libavfilter/vf_pad.c	Sat Nov 13 14:49:58 2010	(r25743)
+++ trunk/libavfilter/vf_pad.c	Sat Nov 13 14:55:01 2010	(r25744)
@@ -143,7 +143,7 @@ static av_cold int init(AVFilterContext 
     if (args)
         sscanf(args, "%d:%d:%d:%d:%s", &pad->w, &pad->h, &pad->x, &pad->y, color_string);
 
-    if (av_parse_color(pad->color, color_string, ctx) < 0)
+    if (av_parse_color(pad->color, color_string, -1, ctx) < 0)
         return AVERROR(EINVAL);
 
     /* sanity check params */
@@ -377,7 +377,7 @@ static av_cold int color_init(AVFilterCo
     color->time_base.num = frame_rate_q.den;
     color->time_base.den = frame_rate_q.num;
 
-    if ((ret = av_parse_color(color->color, color_string, ctx)) < 0)
+    if ((ret = av_parse_color(color->color, color_string, -1, ctx)) < 0)
         return ret;
 
     return 0;



More information about the ffmpeg-cvslog mailing list