Signed-off-by: Marton Balint <cus@passwd.hu>tags/n3.2
| @@ -5217,20 +5217,8 @@ int ff_standardize_creation_time(AVFormatContext *s) | |||||
| { | { | ||||
| int64_t timestamp; | int64_t timestamp; | ||||
| int ret = ff_parse_creation_time_metadata(s, ×tamp, 0); | 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; | return ret; | ||||
| } | } | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include "dict.h" | #include "dict.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "mem.h" | #include "mem.h" | ||||
| #include "time_internal.h" | |||||
| #include "bprint.h" | #include "bprint.h" | ||||
| struct AVDictionary { | struct AVDictionary { | ||||
| @@ -253,3 +254,19 @@ int av_dict_get_string(const AVDictionary *m, char **buffer, | |||||
| } | } | ||||
| return av_bprint_finalize(&bprint, 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; | |||||
| } | |||||
| } | |||||
| @@ -330,6 +330,16 @@ static av_always_inline av_const int avpriv_mirror(int x, int w) | |||||
| void ff_check_pixfmt_descriptors(void); | 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]; | extern const uint8_t ff_reverse[256]; | ||||
| #endif /* AVUTIL_INTERNAL_H */ | #endif /* AVUTIL_INTERNAL_H */ | ||||