diff options
author | Marton Balint <cus@passwd.hu> | 2016-02-22 03:13:20 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2016-03-03 01:37:12 +0100 |
commit | e7dd97b5d8cd6ea150446591f37a5946e8ab7cfb (patch) | |
tree | a8ef1c8aafab6b16fcb69997ffac28200621cd3f /libavformat | |
parent | 3af71ac3f9f635856145503f2ace829aad813636 (diff) | |
download | ffmpeg-e7dd97b5d8cd6ea150446591f37a5946e8ab7cfb.tar.gz |
avformat/utils: add a function to standardize creation time
This can be used for formats which write all format metadata as string to
files, therefore non-standard creation times such as 'now' will be parsed.
The standardized creation time is UTC ISO 8601 with microsecond precision.
Reviewed-by: wm4 <nfxjfg@googlemail.com>
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/internal.h | 8 | ||||
-rw-r--r-- | libavformat/utils.c | 22 | ||||
-rw-r--r-- | libavformat/version.h | 2 |
3 files changed, 31 insertions, 1 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h index 8e066552d2..63e0632a5d 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -560,6 +560,14 @@ void ff_format_io_close(AVFormatContext *s, AVIOContext **pb); */ int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds); +/** + * Standardize creation_time metadata in AVFormatContext to an ISO-8601 + * timestamp string. + * + * @param s AVFormatContext + * @return <0 on error + */ +int ff_standardize_creation_time(AVFormatContext *s); #define CONTAINS_PAL 2 /** diff --git a/libavformat/utils.c b/libavformat/utils.c index 771e878b75..85702dd92a 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -33,6 +33,7 @@ #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" #include "libavutil/time.h" +#include "libavutil/time_internal.h" #include "libavutil/timestamp.h" #include "libavcodec/bytestream.h" @@ -4760,6 +4761,27 @@ int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return 0; } +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; + } + } + return ret; +} + int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, const uint8_t **palette) { int size; diff --git a/libavformat/version.h b/libavformat/version.h index 4849171c76..22f2797cb2 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -31,7 +31,7 @@ #define LIBAVFORMAT_VERSION_MAJOR 57 #define LIBAVFORMAT_VERSION_MINOR 27 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MICRO 102 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ |