Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: "Martin Storsjö" <code@ffmpeg.org>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH] fate: Fix the sub-mcc tests on Windows in eastern time zones (PR #20214)
Date: Mon, 11 Aug 2025 14:43:07 +0300 (EEST)
Message-ID: <20250811114307.8145E68C4D1@ffbox0-bg.ffmpeg.org> (raw)

PR #20214 opened by Martin Storsjö (mstorsjo)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20214
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20214.patch

Previously, these tests failed when running on Windows, if the
system is configured with a time zone east of Greenwich, i.e.
with a positive GMT offset.

The muxer converts the creation_date given by the user using
av_parse_time to unix time, as a time_t. The creation_date is
interpreted as a local time, i.e. according to the current time
zone. (This time_t value is then converted back to a broken out
local time form with localtime_r.)

The given reference date/time, "1970-01-01T00:00:00", is the
origin point for unix time, corresponding to time_t zero. However
when interpreted as local time, this doesn't map to exactly zero.
Time zones east of Greenwich reached this time a number of hours
before the point of zero time_t - so the corresponding time_t
value essentially is minus the GMT offset, in seconds.

Windows mktime returns an error, returning (time_t)-1, when given
such a "struct tm", while e.g. glibc mktime happily returns a
negative time_t. av_parse_time doesn't check the return value of
mktime for potential errors.

This is observable with the following test snippet:

    struct tm tm = { 0 };
    tm.tm_year = 70;
    tm.tm_isdst = -1;
    tm.tm_mday = 1;
    tm.tm_hour = 0;
    time_t t = mktime(&tm);
    printf("%d-%02d-%02d %02d:%02d:%02d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
    printf("t %d\n", (int)t);

By varying the value of tm_hour and the system time zone, one
can observe that Windows mktime returns -1 for all time_t values
that would have been negative.

To avoid the issue, pick a different, arbitrary reference time,
which should have a nonnegative time_t for all time zones.


From 02ec6b6f947a47143933d2cd817d123bcfa1aed8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
Date: Mon, 11 Aug 2025 14:26:44 +0300
Subject: [PATCH] fate: Fix the sub-mcc tests on Windows in eastern time zones

Previously, these tests failed when running on Windows, if the
system is configured with a time zone east of Greenwich, i.e.
with a positive GMT offset.

The muxer converts the creation_date given by the user using
av_parse_time to unix time, as a time_t. The creation_date is
interpreted as a local time, i.e. according to the current time
zone. (This time_t value is then converted back to a broken out
local time form with localtime_r.)

The given reference date/time, "1970-01-01T00:00:00", is the
origin point for unix time, corresponding to time_t zero. However
when interpreted as local time, this doesn't map to exactly zero.
Time zones east of Greenwich reached this time a number of hours
before the point of zero time_t - so the corresponding time_t
value essentially is minus the GMT offset, in seconds.

Windows mktime returns an error, returning (time_t)-1, when given
such a "struct tm", while e.g. glibc mktime happily returns a
negative time_t. av_parse_time doesn't check the return value of
mktime for potential errors.

This is observable with the following test snippet:

    struct tm tm = { 0 };
    tm.tm_year = 70;
    tm.tm_isdst = -1;
    tm.tm_mday = 1;
    tm.tm_hour = 0;
    time_t t = mktime(&tm);
    printf("%d-%02d-%02d %02d:%02d:%02d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
    printf("t %d\n", (int)t);

By varying the value of tm_hour and the system time zone, one
can observe that Windows mktime returns -1 for all time_t values
that would have been negative.

To avoid the issue, pick a different, arbitrary reference time,
which should have a nonnegative time_t for all time zones.
---
 tests/fate/subtitles.mak                   | 12 ++++++------
 tests/ref/fate/sub-mcc-remux               |  2 +-
 tests/ref/fate/sub-mcc-remux-eia608        |  2 +-
 tests/ref/fate/sub-mcc-remux-eia608-bsf    |  2 +-
 tests/ref/fate/sub-mcc-remux-eia608-recode |  2 +-
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/tests/fate/subtitles.mak b/tests/fate/subtitles.mak
index 56eefa3b88..8423e8311a 100644
--- a/tests/fate/subtitles.mak
+++ b/tests/fate/subtitles.mak
@@ -131,24 +131,24 @@ fate-sub-rcwt: CMP = oneline
 fate-sub-rcwt: REF = d86f179094a5752d68aa97d82cf887b0
 
 FATE_SUBTITLES-$(call ALLYES, AVDEVICE LAVFI_INDEV MOVIE_FILTER MPEGTS_DEMUXER MCC_MUXER EIA608_TO_SMPTE436M_BSF) += fate-sub-mcc
-fate-sub-mcc: CMD = md5 -f lavfi -i "movie=$(TARGET_SAMPLES)/sub/scte20.ts[out0+subcc]" -map 0:s -c copy -override_time_code_rate ntsc -creation_time "1970-01-01T00:00:00" -bitexact -f mcc
+fate-sub-mcc: CMD = md5 -f lavfi -i "movie=$(TARGET_SAMPLES)/sub/scte20.ts[out0+subcc]" -map 0:s -c copy -override_time_code_rate ntsc -creation_time "1970-01-02T00:00:00" -bitexact -f mcc
 fate-sub-mcc: CMP = oneline
-fate-sub-mcc: REF = 752c60c3a74445a2a76e1a6465064763
+fate-sub-mcc: REF = 779ca7759324441febd6aa6039f29308
 
 FATE_SUBTITLES-$(call DEMMUX, MCC, MCC, SMPTE436M_TO_EIA608_BSF EIA608_TO_SMPTE436M_BSF) += fate-sub-mcc-remux-eia608-bsf
-fate-sub-mcc-remux-eia608-bsf: CMD = fmtstdout mcc -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:s -c copy -bsf "eia608_to_smpte436m=cdp_frame_rate=60000/1001:initial_cdp_sequence_cntr=65535:line_number=11" -override_time_code_rate ntsc -creation_time "1970-01-01T00:00:00"
+fate-sub-mcc-remux-eia608-bsf: CMD = fmtstdout mcc -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:s -c copy -bsf "eia608_to_smpte436m=cdp_frame_rate=60000/1001:initial_cdp_sequence_cntr=65535:line_number=11" -override_time_code_rate ntsc -creation_time "1970-01-02T00:00:00"
 fate-sub-mcc-remux-eia608-bsf: CMP = rawdiff
 
 FATE_SUBTITLES-$(call DEMMUX, MCC, MCC, SMPTE436M_TO_EIA608_BSF EIA608_TO_SMPTE436M_BSF) += fate-sub-mcc-remux-eia608
-fate-sub-mcc-remux-eia608: CMD = fmtstdout mcc -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:s -c copy -override_time_code_rate ntsc -creation_time "1970-01-01T00:00:00"
+fate-sub-mcc-remux-eia608: CMD = fmtstdout mcc -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:s -c copy -override_time_code_rate ntsc -creation_time "1970-01-02T00:00:00"
 fate-sub-mcc-remux-eia608: CMP = rawdiff
 
 FATE_SUBTITLES-$(call DEMMUX, MCC, MCC, SMPTE436M_TO_EIA608_BSF EIA608_TO_SMPTE436M_BSF) += fate-sub-mcc-remux-eia608-recode
-fate-sub-mcc-remux-eia608-recode: CMD = fmtstdout mcc -eia608_extract 0 -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:d -c copy -bsf smpte436m_to_eia608 -override_time_code_rate ntsc -creation_time "1970-01-01T00:00:00"
+fate-sub-mcc-remux-eia608-recode: CMD = fmtstdout mcc -eia608_extract 0 -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:d -c copy -bsf smpte436m_to_eia608 -override_time_code_rate ntsc -creation_time "1970-01-02T00:00:00"
 fate-sub-mcc-remux-eia608-recode: CMP = rawdiff
 
 FATE_SUBTITLES-$(call DEMMUX, MCC, MCC) += fate-sub-mcc-remux
-fate-sub-mcc-remux: CMD = fmtstdout mcc -eia608_extract 0 -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:d -c copy -override_time_code_rate ntsc -creation_time "1970-01-01T00:00:00"
+fate-sub-mcc-remux: CMD = fmtstdout mcc -eia608_extract 0 -f mcc -i $(SRC_PATH)/tests/ref/fate/sub-mcc-remux -map 0:d -c copy -override_time_code_rate ntsc -creation_time "1970-01-02T00:00:00"
 fate-sub-mcc-remux: CMP = rawdiff
 
 FATE_SUBTITLES-$(call FRAMECRC, MPEGTS, DVBSUB, DVBSUB_ENCODER) += fate-sub-dvb
diff --git a/tests/ref/fate/sub-mcc-remux b/tests/ref/fate/sub-mcc-remux
index d9d2f32dc0..a58c040711 100644
--- a/tests/ref/fate/sub-mcc-remux
+++ b/tests/ref/fate/sub-mcc-remux
@@ -38,7 +38,7 @@ File Format=MacCaption_MCC V2.0
 
 UUID=0087C4F6-A6B4-5469-8C8E-BBF44950401D
 Creation Program=FFmpeg
-Creation Date=Thursday, January 1, 1970
+Creation Date=Friday, January 2, 1970
 Creation Time=00:00:00
 Time Code Rate=30DF
 
diff --git a/tests/ref/fate/sub-mcc-remux-eia608 b/tests/ref/fate/sub-mcc-remux-eia608
index 01e8c37b2c..f31562d524 100644
--- a/tests/ref/fate/sub-mcc-remux-eia608
+++ b/tests/ref/fate/sub-mcc-remux-eia608
@@ -38,7 +38,7 @@ File Format=MacCaption_MCC V2.0
 
 UUID=0087C4F6-A6B4-5469-8C8E-BBF44950401D
 Creation Program=FFmpeg
-Creation Date=Thursday, January 1, 1970
+Creation Date=Friday, January 2, 1970
 Creation Time=00:00:00
 Time Code Rate=30DF
 
diff --git a/tests/ref/fate/sub-mcc-remux-eia608-bsf b/tests/ref/fate/sub-mcc-remux-eia608-bsf
index 64e428f6f1..c0e125db5e 100644
--- a/tests/ref/fate/sub-mcc-remux-eia608-bsf
+++ b/tests/ref/fate/sub-mcc-remux-eia608-bsf
@@ -38,7 +38,7 @@ File Format=MacCaption_MCC V2.0
 
 UUID=0087C4F6-A6B4-5469-8C8E-BBF44950401D
 Creation Program=FFmpeg
-Creation Date=Thursday, January 1, 1970
+Creation Date=Friday, January 2, 1970
 Creation Time=00:00:00
 Time Code Rate=30DF
 
diff --git a/tests/ref/fate/sub-mcc-remux-eia608-recode b/tests/ref/fate/sub-mcc-remux-eia608-recode
index 01e8c37b2c..f31562d524 100644
--- a/tests/ref/fate/sub-mcc-remux-eia608-recode
+++ b/tests/ref/fate/sub-mcc-remux-eia608-recode
@@ -38,7 +38,7 @@ File Format=MacCaption_MCC V2.0
 
 UUID=0087C4F6-A6B4-5469-8C8E-BBF44950401D
 Creation Program=FFmpeg
-Creation Date=Thursday, January 1, 1970
+Creation Date=Friday, January 2, 1970
 Creation Time=00:00:00
 Time Code Rate=30DF
 
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

                 reply	other threads:[~2025-08-11 11:43 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250811114307.8145E68C4D1@ffbox0-bg.ffmpeg.org \
    --to=code@ffmpeg.org \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git