[FFmpeg-devel] [PATCH 4/4] avcodec/xpm: Minor speed increase for mod_strcspn() use string pointer
Jose Da Silva
digital at joescat.com
Fri Feb 26 07:35:05 EET 2021
Incrementing pointer *ps once is faster than computing string[i] for each
time we need it.
Bug fix: For the remote possibility of a crazy-long comment section that
overflows int, this fix can also return a value larger than sizeof(int).
Signed-off-by: Jose Da Silva <digital at joescat.com>
---
libavcodec/xpmdec.c | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/libavcodec/xpmdec.c b/libavcodec/xpmdec.c
index 7b3d3a7ff5..c7fbd38fe5 100644
--- a/libavcodec/xpmdec.c
+++ b/libavcodec/xpmdec.c
@@ -211,28 +211,27 @@ static unsigned int hex_char_to_number(uint8_t x)
*/
static size_t mod_strcspn(const char *string, const char *reject)
{
- const char *pr;
- int i;
+ const char *ps, *pr;
if (!string)
return 0;
- for (i = 0; string[i]; i++) {
- if (string[i] == '/' && string[i+1] == '*') {
- i += 2;
- while (string[i] && (string[i] != '*' || string[i+1] != '/'))
- i++;
- i++;
- } else if (string[i] == '/' && string[i+1] == '/') {
- i += 2;
- while (string[i] && string[i] != '\n')
- i++;
+ for (ps = string; *ps; ps++) {
+ if (*ps == '/' && *(ps+1) == '*') {
+ ps += 2;
+ while (*ps && (*ps != '*' || *(ps+1) != '/'))
+ ps++;
+ ps++;
+ } else if (*ps == '/' && *(ps+1) == '/') {
+ ps += 2;
+ while (*ps && *ps != '\n')
+ ps++;
} else if (reject) {
- for (pr = reject; *pr && *pr != string[i]; pr++);
+ for (pr = reject; *pr && *pr != *ps; pr++);
if (*pr)
break;
}
}
- return i;
+ return (ps - string);
}
static uint32_t color_string_to_rgba(const char *p, int len)
--
2.30.1
More information about the ffmpeg-devel
mailing list