You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avformat/dump: Avoid unnecessary implicit calculation of strlen
av_strlcpy() returns the length of the src string to enable the caller to check for truncation. It is currently used in the following way in dump_metadata(): Every metadata value is searched for \b, \n, \v, \f, \r and then the data up to the first of these characters found is copied to a small temporary buffer via av_strlcpy() (but of course not more than fits into said buffer) and then printed; all characters up to the character found earlier are then treated as consumed. But this is bad performance-wise if the while string is big and contains many of these characters, because av_strlcpy() will unnecessarily calculate the length of the whole remaining string. (dump_metadata() actually ignored the return value of av_strlcpy().) Fix this by not copying the data to a temporary buffer at all. Instead just use %.*s to bound the number of characters output. Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@@ -145,10 +145,8 @@ static void dump_metadata(void *ctx, const AVDictionary *m, const char *indent)
|
|||||||
av_log(ctx, AV_LOG_INFO,
|
av_log(ctx, AV_LOG_INFO,
|
||||||
"%s %-16s: ", indent, tag->key);
|
"%s %-16s: ", indent, tag->key);
|
||||||
while (*p) {
|
while (*p) {
|
||||||
char tmp[256];
|
|
||||||
size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
|
size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
|
||||||
av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
|
av_log(ctx, AV_LOG_INFO, "%.*s", (int)(FFMIN(255, len)), p);
|
||||||
av_log(ctx, AV_LOG_INFO, "%s", tmp);
|
|
||||||
p += len;
|
p += len;
|
||||||
if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
|
if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
|
||||||
if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
|
if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
|
||||||
|
Reference in New Issue
Block a user