aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/wtvdec.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-09-12 14:11:46 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-09-12 23:35:26 +0200
commit654e4b00e2878ad213a0bf01e8b050735f3d50ac (patch)
tree52d1ecaed4d30ceb9feecd1486d1916054c8a7a8 /libavformat/wtvdec.c
parentea0a41bcafd17d4b97e89dd0aabc7ae08a92e780 (diff)
downloadffmpeg-654e4b00e2878ad213a0bf01e8b050735f3d50ac.tar.gz
avformat/wtvdec: Avoid unnecessary allocations
Reviewed-by: Peter Ross <pross@xvid.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavformat/wtvdec.c')
-rw-r--r--libavformat/wtvdec.c47
1 files changed, 19 insertions, 28 deletions
diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c
index 9fe00590c8..e70470f79b 100644
--- a/libavformat/wtvdec.c
+++ b/libavformat/wtvdec.c
@@ -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);
}
/**