diff --git a/libavformat/utils.c b/libavformat/utils.c index c84d69c011..47cb7dd733 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -5217,20 +5217,8 @@ int ff_standardize_creation_time(AVFormatContext *s) { int64_t timestamp; int ret = ff_parse_creation_time_metadata(s, ×tamp, 0); - if (ret == 1) { - time_t seconds = timestamp / 1000000; - struct tm *ptm, tmbuf; - ptm = gmtime_r(&seconds, &tmbuf); - if (ptm) { - char buf[32]; - if (!strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", ptm)) - return AVERROR_EXTERNAL; - av_strlcatf(buf, sizeof(buf), ".%06dZ", (int)(timestamp % 1000000)); - av_dict_set(&s->metadata, "creation_time", buf, 0); - } else { - return AVERROR_EXTERNAL; - } - } + if (ret == 1) + return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp); return ret; } diff --git a/libavutil/dict.c b/libavutil/dict.c index f70c7e0051..0ea71386e5 100644 --- a/libavutil/dict.c +++ b/libavutil/dict.c @@ -24,6 +24,7 @@ #include "dict.h" #include "internal.h" #include "mem.h" +#include "time_internal.h" #include "bprint.h" struct AVDictionary { @@ -253,3 +254,19 @@ int av_dict_get_string(const AVDictionary *m, char **buffer, } return av_bprint_finalize(&bprint, buffer); } + +int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp) +{ + time_t seconds = timestamp / 1000000; + struct tm *ptm, tmbuf; + ptm = gmtime_r(&seconds, &tmbuf); + if (ptm) { + char buf[32]; + if (!strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", ptm)) + return AVERROR_EXTERNAL; + av_strlcatf(buf, sizeof(buf), ".%06dZ", (int)(timestamp % 1000000)); + return av_dict_set(dict, key, buf, 0); + } else { + return AVERROR_EXTERNAL; + } +} diff --git a/libavutil/internal.h b/libavutil/internal.h index 61784b5128..e995af97e4 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -330,6 +330,16 @@ static av_always_inline av_const int avpriv_mirror(int x, int w) void ff_check_pixfmt_descriptors(void); +/** + * Set a dictionary value to an ISO-8601 compliant timestamp string. + * + * @param s AVFormatContext + * @param key metadata key + * @param timestamp unix timestamp in microseconds + * @return <0 on error + */ +int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp); + extern const uint8_t ff_reverse[256]; #endif /* AVUTIL_INTERNAL_H */