diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2023-09-12 14:11:46 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2023-09-12 23:35:26 +0200 |
commit | 654e4b00e2878ad213a0bf01e8b050735f3d50ac (patch) | |
tree | 52d1ecaed4d30ceb9feecd1486d1916054c8a7a8 /libavformat/wtvdec.c | |
parent | ea0a41bcafd17d4b97e89dd0aabc7ae08a92e780 (diff) | |
download | ffmpeg-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.c | 47 |
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); } /** |