X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fwtvdec.c;h=2999382ee4d9144fbedddf0cecf2d0b4b85fe357;hb=18b0c39f99eee508107c47345494e535b8757434;hp=e25bb5ff547550b68a324cdea0322272736283c4;hpb=d0ad91c258821708ce21b4ae53018922ef1f5614;p=ffmpeg diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index e25bb5ff547..2999382ee4d 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -208,7 +208,7 @@ static AVIOContext * wtvfile_open_sector(int first_sector, uint64_t length, int } wf->length = length; - /* seek to intial sector */ + /* seek to initial sector */ wf->position = 0; if (avio_seek(s->pb, (int64_t)wf->sectors[0] << WTV_SECTOR_BITS, SEEK_SET) < 0) { av_free(wf->sectors); @@ -368,20 +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) + 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) + return -1; strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); + return 0; } /** @@ -420,7 +430,7 @@ static void get_attachment(AVFormatContext *s, AVIOContext *pb, int length) if (!st) goto done; av_dict_set(&st->metadata, "title", description, 0); - st->codec->codec_id = CODEC_ID_MJPEG; + st->codec->codec_id = AV_CODEC_ID_MJPEG; st->codec->codec_type = AVMEDIA_TYPE_ATTACHMENT; st->codec->extradata = av_mallocz(filesize); if (!st->codec->extradata) @@ -451,12 +461,18 @@ static void get_tag(AVFormatContext *s, AVIOContext *pb, const char *key, int ty } else if (type == 4 && length == 8) { int64_t num = avio_rl64(pb); if (!strcmp(key, "WM/EncodingTime") || - !strcmp(key, "WM/MediaOriginalBroadcastDateTime")) - filetime_to_iso8601(buf, buf_size, num); - else if (!strcmp(key, "WM/WMRVEncodeTime") || - !strcmp(key, "WM/WMRVEndTime")) - crazytime_to_iso8601(buf, buf_size, num); - else if (!strcmp(key, "WM/WMRVExpirationDate")) { + !strcmp(key, "WM/MediaOriginalBroadcastDateTime")) { + if (filetime_to_iso8601(buf, buf_size, num) < 0) { + av_free(buf); + return; + } + } else if (!strcmp(key, "WM/WMRVEncodeTime") || + !strcmp(key, "WM/WMRVEndTime")) { + 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); return; @@ -522,7 +538,7 @@ static int parse_videoinfoheader2(AVFormatContext *s, AVStream *st) AVIOContext *pb = wtv->pb; avio_skip(pb, 72); // picture aspect ratio is unreliable - ff_get_bmp_header(pb, st); + ff_get_bmp_header(pb, st, NULL); return 72 + 40; } @@ -534,9 +550,9 @@ static void parse_mpeg1waveformatex(AVStream *st) { /* fwHeadLayer */ switch (AV_RL16(st->codec->extradata)) { - case 0x0001 : st->codec->codec_id = CODEC_ID_MP1; break; - case 0x0002 : st->codec->codec_id = CODEC_ID_MP2; break; - case 0x0004 : st->codec->codec_id = CODEC_ID_MP3; break; + case 0x0001 : st->codec->codec_id = AV_CODEC_ID_MP1; break; + case 0x0002 : st->codec->codec_id = AV_CODEC_ID_MP2; break; + case 0x0004 : st->codec->codec_id = AV_CODEC_ID_MP3; break; } st->codec->bit_rate = AV_RL32(st->codec->extradata + 2); /* dwHeadBitrate */ @@ -633,7 +649,7 @@ static AVStream * parse_media_type(AVFormatContext *s, AVStream *st, int sid, av_log(s, AV_LOG_WARNING, "MPEG1WAVEFORMATEX underflow\n"); } else { st->codec->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subtype); - if (st->codec->codec_id == CODEC_ID_NONE) + if (st->codec->codec_id == AV_CODEC_ID_NONE) av_log(s, AV_LOG_WARNING, "unknown subtype:"FF_PRI_GUID"\n", FF_ARG_GUID(subtype)); } return st; @@ -658,7 +674,7 @@ static AVStream * parse_media_type(AVFormatContext *s, AVStream *st, int sid, } else { st->codec->codec_id = ff_codec_guid_get_id(ff_video_guids, subtype); } - if (st->codec->codec_id == CODEC_ID_NONE) + if (st->codec->codec_id == AV_CODEC_ID_NONE) av_log(s, AV_LOG_WARNING, "unknown subtype:"FF_PRI_GUID"\n", FF_ARG_GUID(subtype)); return st; } else if (!ff_guidcmp(mediatype, mediatype_mpeg2_pes) && @@ -669,7 +685,7 @@ static AVStream * parse_media_type(AVFormatContext *s, AVStream *st, int sid, if (ff_guidcmp(formattype, ff_format_none)) av_log(s, AV_LOG_WARNING, "unknown formattype:"FF_PRI_GUID"\n", FF_ARG_GUID(formattype)); avio_skip(pb, size); - st->codec->codec_id = CODEC_ID_DVB_SUBTITLE; + st->codec->codec_id = AV_CODEC_ID_DVB_SUBTITLE; return st; } else if (!ff_guidcmp(mediatype, mediatype_mstvcaption) && (!ff_guidcmp(subtype, mediasubtype_teletext) || !ff_guidcmp(subtype, mediasubtype_dtvccdata))) { @@ -679,7 +695,7 @@ static AVStream * parse_media_type(AVFormatContext *s, AVStream *st, int sid, if (ff_guidcmp(formattype, ff_format_none)) av_log(s, AV_LOG_WARNING, "unknown formattype:"FF_PRI_GUID"\n", FF_ARG_GUID(formattype)); avio_skip(pb, size); - st->codec->codec_id = CODEC_ID_DVB_TELETEXT; + st->codec->codec_id = AV_CODEC_ID_DVB_TELETEXT; return st; } else if (!ff_guidcmp(mediatype, mediatype_mpeg2_sections) && !ff_guidcmp(subtype, mediasubtype_mpeg2_sections)) {