mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-19 05:40:56 +00:00
lavf/flvdec: add AMF date type support
Support AMF date type when parse the FLV metadata. Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
This commit is contained in:
parent
7adce3e64c
commit
24dac56e1d
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user