avformat/wtvdec: Avoid unnecessary allocations

Reviewed-by: Peter Ross <pross@xvid.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2023-09-12 14:11:46 +02:00
parent ea0a41bcaf
commit 654e4b00e2
1 changed files with 19 additions and 28 deletions

View File

@ -460,71 +460,62 @@ done:
static void get_tag(AVFormatContext *s, AVIOContext *pb, const char *key, int type, int length)
{
int buf_size;
char *buf;
char buf[LEN_PRETTY_GUID + 1], *bufp = buf;
unsigned dict_flags = 0;
if (!strcmp(key, "WM/MediaThumbType")) {
avio_skip(pb, length);
return;
}
buf_size = FFMIN(FFMAX(length + length / 2U, LEN_PRETTY_GUID) + 1, INT_MAX);
buf = av_malloc(buf_size);
if (!buf)
return;
if (type == 0 && length == 4) {
snprintf(buf, buf_size, "%u", avio_rl32(pb));
snprintf(buf, sizeof(buf), "%u", avio_rl32(pb));
} else if (type == 1) {
avio_get_str16le(pb, length, buf, buf_size);
if (!strlen(buf)) {
av_free(buf);
int buflen = FFMIN(length + length / 2U + 1, INT_MAX);
bufp = av_malloc(buflen);
if (!bufp)
return;
avio_get_str16le(pb, length, bufp, buflen);
if (!*bufp) {
av_free(bufp);
return;
}
dict_flags = AV_DICT_DONT_STRDUP_VAL;
} else if (type == 3 && length == 4) {
strcpy(buf, avio_rl32(pb) ? "true" : "false");
} else if (type == 4 && length == 8) {
int64_t num = avio_rl64(pb);
if (!strcmp(key, "WM/EncodingTime") ||
!strcmp(key, "WM/MediaOriginalBroadcastDateTime")) {
if (filetime_to_iso8601(buf, buf_size, num) < 0) {
av_free(buf);
if (filetime_to_iso8601(buf, sizeof(buf), num) < 0)
return;
}
} else if (!strcmp(key, "WM/WMRVEncodeTime") ||
!strcmp(key, "WM/WMRVEndTime")) {
if (crazytime_to_iso8601(buf, buf_size, num) < 0) {
av_free(buf);
if (crazytime_to_iso8601(buf, sizeof(buf), num) < 0)
return;
}
} else if (!strcmp(key, "WM/WMRVExpirationDate")) {
if (oledate_to_iso8601(buf, buf_size, num) < 0 ) {
av_free(buf);
if (oledate_to_iso8601(buf, sizeof(buf), num) < 0)
return;
}
} else if (!strcmp(key, "WM/WMRVBitrate"))
snprintf(buf, buf_size, "%f", av_int2double(num));
snprintf(buf, sizeof(buf), "%f", av_int2double(num));
else
snprintf(buf, buf_size, "%"PRIi64, num);
snprintf(buf, sizeof(buf), "%"PRIi64, num);
} else if (type == 5 && length == 2) {
snprintf(buf, buf_size, "%u", avio_rl16(pb));
snprintf(buf, sizeof(buf), "%u", avio_rl16(pb));
} else if (type == 6 && length == 16) {
ff_asf_guid guid;
avio_read(pb, guid, 16);
snprintf(buf, buf_size, PRI_PRETTY_GUID, ARG_PRETTY_GUID(guid));
snprintf(buf, sizeof(buf), PRI_PRETTY_GUID, ARG_PRETTY_GUID(guid));
} else if (type == 2 && !strcmp(key, "WM/Picture")) {
get_attachment(s, pb, length);
av_freep(&buf);
return;
} else {
av_freep(&buf);
av_log(s, AV_LOG_WARNING, "unsupported metadata entry; key:%s, type:%d, length:0x%x\n", key, type, length);
avio_skip(pb, length);
return;
}
av_dict_set(&s->metadata, key, buf, 0);
av_freep(&buf);
av_dict_set(&s->metadata, key, bufp, dict_flags);
}
/**