|
|
|
@ -368,28 +368,30 @@ static int read_probe(AVProbeData *p) |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert win32 FILETIME to ISO-8601 string |
|
|
|
|
* @return <0 on error |
|
|
|
|
*/ |
|
|
|
|
static void filetime_to_iso8601(char *buf, int buf_size, int64_t value) |
|
|
|
|
static int filetime_to_iso8601(char *buf, int buf_size, int64_t value) |
|
|
|
|
{ |
|
|
|
|
time_t t = (value / 10000000LL) - 11644473600LL; |
|
|
|
|
struct tm *tm = gmtime(&t); |
|
|
|
|
if (tm) |
|
|
|
|
strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); |
|
|
|
|
else |
|
|
|
|
buf[0] = '\0'; |
|
|
|
|
if (!tm) |
|
|
|
|
return -1; |
|
|
|
|
strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert crazy time (100ns since 1 Jan 0001) to ISO-8601 string |
|
|
|
|
* @return <0 on error |
|
|
|
|
*/ |
|
|
|
|
static void crazytime_to_iso8601(char *buf, int buf_size, int64_t value) |
|
|
|
|
static int crazytime_to_iso8601(char *buf, int buf_size, int64_t value) |
|
|
|
|
{ |
|
|
|
|
time_t t = (value / 10000000LL) - 719162LL*86400LL; |
|
|
|
|
struct tm *tm = gmtime(&t); |
|
|
|
|
if (tm) |
|
|
|
|
strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); |
|
|
|
|
else |
|
|
|
|
buf[0] = '\0'; |
|
|
|
|
if (!tm) |
|
|
|
|
return -1; |
|
|
|
|
strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -460,10 +462,16 @@ static void get_tag(AVFormatContext *s, AVIOContext *pb, const char *key, int ty |
|
|
|
|
int64_t num = avio_rl64(pb); |
|
|
|
|
if (!strcmp(key, "WM/EncodingTime") || |
|
|
|
|
!strcmp(key, "WM/MediaOriginalBroadcastDateTime")) |
|
|
|
|
filetime_to_iso8601(buf, buf_size, num); |
|
|
|
|
if (filetime_to_iso8601(buf, buf_size, num) < 0) { |
|
|
|
|
av_free(buf); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
else if (!strcmp(key, "WM/WMRVEncodeTime") || |
|
|
|
|
!strcmp(key, "WM/WMRVEndTime")) |
|
|
|
|
crazytime_to_iso8601(buf, buf_size, num); |
|
|
|
|
if (crazytime_to_iso8601(buf, buf_size, num) < 0) { |
|
|
|
|
av_free(buf); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
else if (!strcmp(key, "WM/WMRVExpirationDate")) { |
|
|
|
|
if (oledate_to_iso8601(buf, buf_size, num) < 0 ) { |
|
|
|
|
av_free(buf); |
|
|
|
|