summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2016-02-22 03:13:20 +0100
committerMarton Balint <cus@passwd.hu>2016-03-03 01:37:12 +0100
commite7dd97b5d8cd6ea150446591f37a5946e8ab7cfb (patch)
treea8ef1c8aafab6b16fcb69997ffac28200621cd3f
parent3af71ac3f9f635856145503f2ace829aad813636 (diff)
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>
-rw-r--r--libavformat/internal.h8
-rw-r--r--libavformat/utils.c22
-rw-r--r--libavformat/version.h2
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, &timestamp, 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, \