mirror of https://git.ffmpeg.org/ffmpeg.git
improve av_parse_color() to allow for non-null terminated color string
Originally committed as revision 25744 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
521b860748
commit
2722dd6ebf
|
@ -183,7 +183,8 @@ static int color_table_compare(const void *lhs, const void *rhs)
|
||||||
|
|
||||||
#define ALPHA_SEP '@'
|
#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];
|
char *tail, color_string2[128];
|
||||||
const ColorEntry *entry;
|
const ColorEntry *entry;
|
||||||
|
@ -194,7 +195,10 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, void *log_ctx)
|
||||||
} else if (!strncmp(color_string, "0x", 2))
|
} else if (!strncmp(color_string, "0x", 2))
|
||||||
hex_offset = 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)))
|
if ((tail = strchr(color_string2, ALPHA_SEP)))
|
||||||
*tail++ = 0;
|
*tail++ = 0;
|
||||||
len = strlen(color_string2);
|
len = strlen(color_string2);
|
||||||
|
@ -308,7 +312,7 @@ int main(void)
|
||||||
av_log_set_level(AV_LOG_DEBUG);
|
av_log_set_level(AV_LOG_DEBUG);
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(color_names); i++) {
|
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]);
|
printf("%s -> R(%d) G(%d) B(%d) A(%d)\n", color_names[i], rgba[0], rgba[1], rgba[2], rgba[3]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,13 @@
|
||||||
* 0xff/1.0 completely opaque).
|
* 0xff/1.0 completely opaque).
|
||||||
* If the alpha component is not specified then 0xff is assumed.
|
* If the alpha component is not specified then 0xff is assumed.
|
||||||
* The string "random" will result in a random color.
|
* 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
|
* @return >= 0 in case of success, a negative value in case of
|
||||||
* failure (for example if color_string cannot be parsed).
|
* 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 */
|
#endif /* AVFILTER_PARSEUTILS_H */
|
||||||
|
|
|
@ -49,7 +49,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
|
||||||
sscanf(args, "%d:%d:%d:%d:%s",
|
sscanf(args, "%d:%d:%d:%d:%s",
|
||||||
&drawbox->x, &drawbox->y, &drawbox->w, &drawbox->h, color_str);
|
&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);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
drawbox->yuv_color[Y] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);
|
drawbox->yuv_color[Y] = RGB_TO_Y_CCIR(rgba_color[0], rgba_color[1], rgba_color[2]);
|
||||||
|
|
|
@ -143,7 +143,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
|
||||||
if (args)
|
if (args)
|
||||||
sscanf(args, "%d:%d:%d:%d:%s", &pad->w, &pad->h, &pad->x, &pad->y, color_string);
|
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);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
/* sanity check params */
|
/* sanity check params */
|
||||||
|
@ -377,7 +377,7 @@ static av_cold int color_init(AVFilterContext *ctx, const char *args, void *opaq
|
||||||
color->time_base.num = frame_rate_q.den;
|
color->time_base.num = frame_rate_q.den;
|
||||||
color->time_base.den = frame_rate_q.num;
|
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 ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue