summaryrefslogtreecommitdiff
path: root/libavformat/flvdec.c
diff options
context:
space:
mode:
authorJun Zhao <barryjzhao@tencent.com>2019-03-26 16:54:33 +0800
committerJun Zhao <barryjzhao@tencent.com>2019-03-31 18:02:46 +0800
commit24dac56e1d8c3d9778fdcd530355135c4a9d61c3 (patch)
tree301ec60fef1e9dc2762d80cd330f14a81b225a7c /libavformat/flvdec.c
parent7adce3e64c6e218b94af819c522d2b4b39ec75c9 (diff)
lavf/flvdec: add AMF date type support
Support AMF date type when parse the FLV metadata. Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
Diffstat (limited to 'libavformat/flvdec.c')
-rw-r--r--libavformat/flvdec.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index c4d5278a9b..b1e13daf81 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -30,6 +30,7 @@
#include "libavutil/opt.h"
#include "libavutil/intfloat.h"
#include "libavutil/mathematics.h"
+#include "libavutil/time_internal.h"
#include "libavcodec/bytestream.h"
#include "libavcodec/mpeg4audio.h"
#include "avformat.h"
@@ -77,6 +78,12 @@ typedef struct FLVContext {
int64_t time_pos;
} FLVContext;
+/* AMF date type */
+typedef struct amf_date {
+ double milliseconds;
+ int16_t timezone;
+} amf_date;
+
static int probe(const AVProbeData *p, int live)
{
const uint8_t *d = p->buf;
@@ -471,6 +478,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
AMFDataType amf_type;
char str_val[1024];
double num_val;
+ amf_date date;
num_val = 0;
ioc = s->pb;
@@ -542,7 +550,9 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
}
break;
case AMF_DATA_TYPE_DATE:
- avio_skip(ioc, 8 + 2); // timestamp (double) and UTC offset (int16)
+ // timestamp (double) and UTC offset (int16)
+ date.milliseconds = av_int2double(avio_rb64(ioc));
+ date.timezone = avio_rb16(ioc);
break;
default: // unsupported type, we couldn't skip
av_log(s, AV_LOG_ERROR, "unsupported amf type %d\n", amf_type);
@@ -641,8 +651,18 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
} else if (amf_type == AMF_DATA_TYPE_NUMBER) {
snprintf(str_val, sizeof(str_val), "%.f", num_val);
av_dict_set(&s->metadata, key, str_val, 0);
- } else if (amf_type == AMF_DATA_TYPE_STRING)
+ } else if (amf_type == AMF_DATA_TYPE_STRING) {
av_dict_set(&s->metadata, key, str_val, 0);
+ } else if (amf_type == AMF_DATA_TYPE_DATE) {
+ time_t time;
+ struct tm t;
+ char datestr[128];
+ time = date.milliseconds / 1000; // to seconds
+ localtime_r(&time, &t);
+ strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S %z", &t);
+
+ av_dict_set(&s->metadata, key, datestr, 0);
+ }
}
return 0;