mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
ea0a41bcaf
commit
654e4b00e2
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue