From 4dc583ab8b733c48e935bc41133529082704dbf5 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Tue, 23 Jan 2018 15:41:24 +0100 Subject: [PATCH] Work on SMPTE beta feature --- src/Controls/VideoPlayerContainer.cs | 44 +++++++++++-- src/Forms/Main.Designer.cs | 97 ++++++++++++++++------------ src/Forms/Main.cs | 8 +++ src/Forms/Main.resx | 31 +++++---- 4 files changed, 118 insertions(+), 62 deletions(-) diff --git a/src/Controls/VideoPlayerContainer.cs b/src/Controls/VideoPlayerContainer.cs index f0c08ebf8..b3e14f682 100644 --- a/src/Controls/VideoPlayerContainer.cs +++ b/src/Controls/VideoPlayerContainer.cs @@ -167,6 +167,7 @@ namespace Nikse.SubtitleEdit.Controls public VideoPlayerContainer() { + SmpteMode = false; FontSizeFactor = 1.0F; BorderStyle = BorderStyle.None; _resources = new System.ComponentModel.ComponentResourceManager(typeof(VideoPlayerContainer)); @@ -1336,6 +1337,13 @@ namespace Nikse.SubtitleEdit.Controls OnButtonClicked?.Invoke(sender, e); } + /// + /// Use SMPTE time (drop frame mode) + /// See https://blog.frame.io/2017/07/17/timecode-and-frame-rates/ and + /// https://backlothelp.netflix.com/hc/en-us/articles/215131928-How-do-I-know-whether-to-select-SMPTE-or-MEDIA-for-a-timing-reference- + /// + public bool SmpteMode { get; set; } + public void RefreshProgressBar() { if (VideoPlayer == null) @@ -1354,10 +1362,18 @@ namespace Nikse.SubtitleEdit.Controls var pos = CurrentPosition; if (pos > 1000000) pos = 0; - var span = TimeCode.FromSeconds(pos + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); - var dur = TimeCode.FromSeconds(Duration + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); - _labelTimeCode.Text = string.Format("{0} / {1}", span.ToDisplayString(), dur.ToDisplayString()); + var dur = TimeCode.FromSeconds(Duration + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + if (SmpteMode) + { + var span = TimeCode.FromSeconds(pos + 0.017 + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + _labelTimeCode.Text = string.Format("{0} / {1} SMPTE", span.ToDisplayString(), dur.ToDisplayString()); + } + else + { + var span = TimeCode.FromSeconds(pos + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + _labelTimeCode.Text = string.Format("{0} / {1}", span.ToDisplayString(), dur.ToDisplayString()); + } RefreshPlayPauseButtons(); } @@ -1490,14 +1506,30 @@ namespace Nikse.SubtitleEdit.Controls get { if (VideoPlayer != null) - return VideoPlayer.CurrentPosition; + { + if (SmpteMode) + { + return VideoPlayer.CurrentPosition / 1.001; + } + else + { + return VideoPlayer.CurrentPosition; + } + } return 0; } set { if (VideoPlayer != null) { - VideoPlayer.CurrentPosition = value; + if (SmpteMode) + { + VideoPlayer.CurrentPosition = value * 1.001; + } + else + { + VideoPlayer.CurrentPosition = value; + } } else { @@ -1554,6 +1586,7 @@ namespace Nikse.SubtitleEdit.Controls DeleteTempMpvFileName(); base.Dispose(disposing); _retryCount = 3; + SmpteMode = false; } public void PauseAndDisposePlayer() @@ -1564,6 +1597,7 @@ namespace Nikse.SubtitleEdit.Controls VideoPlayer = null; DeleteTempMpvFileName(); _retryCount = 3; + SmpteMode = false; } } diff --git a/src/Forms/Main.Designer.cs b/src/Forms/Main.Designer.cs index 59e7081a5..51c5e9354 100644 --- a/src/Forms/Main.Designer.cs +++ b/src/Forms/Main.Designer.cs @@ -38,9 +38,9 @@ { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); - Nikse.SubtitleEdit.Core.TimeCode timeCode1 = new Nikse.SubtitleEdit.Core.TimeCode(); - Nikse.SubtitleEdit.Core.TimeCode timeCode2 = new Nikse.SubtitleEdit.Core.TimeCode(); - Nikse.SubtitleEdit.Core.TimeCode timeCode3 = new Nikse.SubtitleEdit.Core.TimeCode(); + Nikse.SubtitleEdit.Core.TimeCode timeCode4 = new Nikse.SubtitleEdit.Core.TimeCode(); + Nikse.SubtitleEdit.Core.TimeCode timeCode5 = new Nikse.SubtitleEdit.Core.TimeCode(); + Nikse.SubtitleEdit.Core.TimeCode timeCode6 = new Nikse.SubtitleEdit.Core.TimeCode(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.labelStatus = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripSelected = new System.Windows.Forms.ToolStripStatusLabel(); @@ -481,6 +481,7 @@ this.imageListPlayRate = new System.Windows.Forms.ImageList(this.components); this.timerTextUndo = new System.Windows.Forms.Timer(this.components); this.timerAlternateTextUndo = new System.Windows.Forms.Timer(this.components); + this.smpteTimeModedropFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.statusStrip1.SuspendLayout(); this.toolStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout(); @@ -2010,6 +2011,7 @@ this.toolStripMenuItemSetAudioTrack, this.closeVideoToolStripMenuItem, this.setVideoOffsetToolStripMenuItem, + this.smpteTimeModedropFrameToolStripMenuItem, this.toolStripMenuItemImportSceneChanges, this.toolStripMenuItemRemoveSceneChanges, this.toolStripMenuItemAddWaveformBatch, @@ -2028,100 +2030,100 @@ // openVideoToolStripMenuItem // this.openVideoToolStripMenuItem.Name = "openVideoToolStripMenuItem"; - this.openVideoToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.openVideoToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.openVideoToolStripMenuItem.Text = "Open video..."; this.openVideoToolStripMenuItem.Click += new System.EventHandler(this.buttonOpenVideo_Click); // // toolStripMenuItemOpenVideoFromUrl // this.toolStripMenuItemOpenVideoFromUrl.Name = "toolStripMenuItemOpenVideoFromUrl"; - this.toolStripMenuItemOpenVideoFromUrl.Size = new System.Drawing.Size(206, 22); + this.toolStripMenuItemOpenVideoFromUrl.Size = new System.Drawing.Size(224, 22); this.toolStripMenuItemOpenVideoFromUrl.Text = "Open video from url..."; this.toolStripMenuItemOpenVideoFromUrl.Click += new System.EventHandler(this.toolStripMenuItemOpenVideoFromUrl_Click); // // toolStripMenuItemOpenDvd // this.toolStripMenuItemOpenDvd.Name = "toolStripMenuItemOpenDvd"; - this.toolStripMenuItemOpenDvd.Size = new System.Drawing.Size(206, 22); + this.toolStripMenuItemOpenDvd.Size = new System.Drawing.Size(224, 22); this.toolStripMenuItemOpenDvd.Text = "Open DVD..."; this.toolStripMenuItemOpenDvd.Click += new System.EventHandler(this.toolStripMenuItemOpenDvd_Click); // // toolStripMenuItemSetAudioTrack // this.toolStripMenuItemSetAudioTrack.Name = "toolStripMenuItemSetAudioTrack"; - this.toolStripMenuItemSetAudioTrack.Size = new System.Drawing.Size(206, 22); + this.toolStripMenuItemSetAudioTrack.Size = new System.Drawing.Size(224, 22); this.toolStripMenuItemSetAudioTrack.Text = "Choose audio track"; // // closeVideoToolStripMenuItem // this.closeVideoToolStripMenuItem.Name = "closeVideoToolStripMenuItem"; - this.closeVideoToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.closeVideoToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.closeVideoToolStripMenuItem.Text = "Close video"; this.closeVideoToolStripMenuItem.Click += new System.EventHandler(this.CloseVideoToolStripMenuItemClick); // // setVideoOffsetToolStripMenuItem // this.setVideoOffsetToolStripMenuItem.Name = "setVideoOffsetToolStripMenuItem"; - this.setVideoOffsetToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.setVideoOffsetToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.setVideoOffsetToolStripMenuItem.Text = "Set video offset..."; this.setVideoOffsetToolStripMenuItem.Click += new System.EventHandler(this.setVideoOffsetToolStripMenuItem_Click); // // toolStripMenuItemImportSceneChanges // this.toolStripMenuItemImportSceneChanges.Name = "toolStripMenuItemImportSceneChanges"; - this.toolStripMenuItemImportSceneChanges.Size = new System.Drawing.Size(206, 22); + this.toolStripMenuItemImportSceneChanges.Size = new System.Drawing.Size(224, 22); this.toolStripMenuItemImportSceneChanges.Text = "Import scene changes..."; this.toolStripMenuItemImportSceneChanges.Click += new System.EventHandler(this.toolStripMenuItemImportSceneChanges_Click); // // toolStripMenuItemRemoveSceneChanges // this.toolStripMenuItemRemoveSceneChanges.Name = "toolStripMenuItemRemoveSceneChanges"; - this.toolStripMenuItemRemoveSceneChanges.Size = new System.Drawing.Size(206, 22); + this.toolStripMenuItemRemoveSceneChanges.Size = new System.Drawing.Size(224, 22); this.toolStripMenuItemRemoveSceneChanges.Text = "Remove scene changes"; this.toolStripMenuItemRemoveSceneChanges.Click += new System.EventHandler(this.toolStripMenuItemRemoveSceneChanges_Click); // // toolStripMenuItemAddWaveformBatch // this.toolStripMenuItemAddWaveformBatch.Name = "toolStripMenuItemAddWaveformBatch"; - this.toolStripMenuItemAddWaveformBatch.Size = new System.Drawing.Size(206, 22); + this.toolStripMenuItemAddWaveformBatch.Size = new System.Drawing.Size(224, 22); this.toolStripMenuItemAddWaveformBatch.Text = "Add waveform batch..."; this.toolStripMenuItemAddWaveformBatch.Click += new System.EventHandler(this.ToolStripMenuItemAddWaveformBatchClick); // // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(203, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(221, 6); // // showhideWaveformToolStripMenuItem // this.showhideWaveformToolStripMenuItem.Name = "showhideWaveformToolStripMenuItem"; - this.showhideWaveformToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.showhideWaveformToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.showhideWaveformToolStripMenuItem.Text = "Show/hide waveform"; this.showhideWaveformToolStripMenuItem.Click += new System.EventHandler(this.ShowhideWaveformToolStripMenuItemClick); // // showhideVideoToolStripMenuItem // this.showhideVideoToolStripMenuItem.Name = "showhideVideoToolStripMenuItem"; - this.showhideVideoToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.showhideVideoToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.showhideVideoToolStripMenuItem.Text = "Show/hide video"; this.showhideVideoToolStripMenuItem.Click += new System.EventHandler(this.toolStripButtonToggleVideo_Click); // // toolStripSeparator19 // this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(203, 6); + this.toolStripSeparator19.Size = new System.Drawing.Size(221, 6); // // undockVideoControlsToolStripMenuItem // this.undockVideoControlsToolStripMenuItem.Name = "undockVideoControlsToolStripMenuItem"; - this.undockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.undockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.undockVideoControlsToolStripMenuItem.Text = "Un-dock video controls"; this.undockVideoControlsToolStripMenuItem.Click += new System.EventHandler(this.UndockVideoControlsToolStripMenuItemClick); // // redockVideoControlsToolStripMenuItem // this.redockVideoControlsToolStripMenuItem.Name = "redockVideoControlsToolStripMenuItem"; - this.redockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(206, 22); + this.redockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(224, 22); this.redockVideoControlsToolStripMenuItem.Text = "Re-dock video controls"; this.redockVideoControlsToolStripMenuItem.Visible = false; this.redockVideoControlsToolStripMenuItem.Click += new System.EventHandler(this.RedockVideoControlsToolStripMenuItemClick); @@ -3272,14 +3274,14 @@ this.timeUpDownVideoPosition.Name = "timeUpDownVideoPosition"; this.timeUpDownVideoPosition.Size = new System.Drawing.Size(96, 27); this.timeUpDownVideoPosition.TabIndex = 12; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownVideoPosition.TimeCode = timeCode1; + timeCode4.Hours = 0; + timeCode4.Milliseconds = 0; + timeCode4.Minutes = 0; + timeCode4.Seconds = 0; + timeCode4.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode4.TotalMilliseconds = 0D; + timeCode4.TotalSeconds = 0D; + this.timeUpDownVideoPosition.TimeCode = timeCode4; this.timeUpDownVideoPosition.UseVideoOffset = false; // // buttonGotoSub @@ -3726,14 +3728,14 @@ this.timeUpDownVideoPositionAdjust.Name = "timeUpDownVideoPositionAdjust"; this.timeUpDownVideoPositionAdjust.Size = new System.Drawing.Size(96, 27); this.timeUpDownVideoPositionAdjust.TabIndex = 13; - timeCode2.Hours = 0; - timeCode2.Milliseconds = 0; - timeCode2.Minutes = 0; - timeCode2.Seconds = 0; - timeCode2.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode2.TotalMilliseconds = 0D; - timeCode2.TotalSeconds = 0D; - this.timeUpDownVideoPositionAdjust.TimeCode = timeCode2; + timeCode5.Hours = 0; + timeCode5.Milliseconds = 0; + timeCode5.Minutes = 0; + timeCode5.Seconds = 0; + timeCode5.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode5.TotalMilliseconds = 0D; + timeCode5.TotalSeconds = 0D; + this.timeUpDownVideoPositionAdjust.TimeCode = timeCode5; this.timeUpDownVideoPositionAdjust.UseVideoOffset = false; // // ShowSubtitleTimer @@ -4212,7 +4214,7 @@ this.superscriptToolStripMenuItem, this.subscriptToolStripMenuItem}); this.contextMenuStripTextBoxListView.Name = "contextMenuStripTextBoxListView"; - this.contextMenuStripTextBoxListView.Size = new System.Drawing.Size(243, 424); + this.contextMenuStripTextBoxListView.Size = new System.Drawing.Size(243, 402); this.contextMenuStripTextBoxListView.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.MenuClosed); this.contextMenuStripTextBoxListView.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripTextBoxListViewOpening); this.contextMenuStripTextBoxListView.Opened += new System.EventHandler(this.MenuOpened); @@ -4469,14 +4471,14 @@ this.timeUpDownStartTime.Name = "timeUpDownStartTime"; this.timeUpDownStartTime.Size = new System.Drawing.Size(96, 27); this.timeUpDownStartTime.TabIndex = 0; - timeCode3.Hours = 0; - timeCode3.Milliseconds = 0; - timeCode3.Minutes = 0; - timeCode3.Seconds = 0; - timeCode3.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode3.TotalMilliseconds = 0D; - timeCode3.TotalSeconds = 0D; - this.timeUpDownStartTime.TimeCode = timeCode3; + timeCode6.Hours = 0; + timeCode6.Milliseconds = 0; + timeCode6.Minutes = 0; + timeCode6.Seconds = 0; + timeCode6.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode6.TotalMilliseconds = 0D; + timeCode6.TotalSeconds = 0D; + this.timeUpDownStartTime.TimeCode = timeCode6; this.timeUpDownStartTime.UseVideoOffset = false; // // numericUpDownDuration @@ -4632,6 +4634,7 @@ this.mediaPlayer.ShowMuteButton = true; this.mediaPlayer.ShowStopButton = true; this.mediaPlayer.Size = new System.Drawing.Size(219, 246); + this.mediaPlayer.SmpteMode = false; this.mediaPlayer.SubtitleText = ""; this.mediaPlayer.TabIndex = 5; this.mediaPlayer.TextRightToLeft = System.Windows.Forms.RightToLeft.No; @@ -4673,6 +4676,13 @@ this.timerAlternateTextUndo.Interval = 700; this.timerAlternateTextUndo.Tick += new System.EventHandler(this.TimerAlternateTextUndoTick); // + // sMPTETimeModedropFrameToolStripMenuItem + // + this.smpteTimeModedropFrameToolStripMenuItem.Name = "sMPTETimeModedropFrameToolStripMenuItem"; + this.smpteTimeModedropFrameToolStripMenuItem.Size = new System.Drawing.Size(224, 22); + this.smpteTimeModedropFrameToolStripMenuItem.Text = "SMPTE timing (drop frame)"; + this.smpteTimeModedropFrameToolStripMenuItem.Click += new System.EventHandler(this.SmpteTimeModedropFrameToolStripMenuItem_Click); + // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -5195,5 +5205,6 @@ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFcpXmlAdvanced; private System.Windows.Forms.Label labelNextWord; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenVideoFromUrl; + private System.Windows.Forms.ToolStripMenuItem smpteTimeModedropFrameToolStripMenuItem; } } \ No newline at end of file diff --git a/src/Forms/Main.cs b/src/Forms/Main.cs index e8f21462a..178694e8f 100644 --- a/src/Forms/Main.cs +++ b/src/Forms/Main.cs @@ -18549,6 +18549,7 @@ namespace Nikse.SubtitleEdit.Forms closeVideoToolStripMenuItem.Visible = !string.IsNullOrEmpty(_videoFileName); setVideoOffsetToolStripMenuItem.Visible = !string.IsNullOrEmpty(_videoFileName); // && Configuration.Settings.General.ShowBetaStuff; + smpteTimeModedropFrameToolStripMenuItem.Visible = !string.IsNullOrEmpty(_videoFileName) && Configuration.Settings.General.ShowBetaStuff; if (!string.IsNullOrEmpty(_videoFileName)) { if (Configuration.Settings.General.CurrentVideoOffsetInMs > 0) @@ -18559,6 +18560,7 @@ namespace Nikse.SubtitleEdit.Forms { setVideoOffsetToolStripMenuItem.Text = _language.Menu.Video.SetVideoOffset; } + smpteTimeModedropFrameToolStripMenuItem.Checked = mediaPlayer.SmpteMode; } toolStripMenuItemOpenVideoFromUrl.Visible = Configuration.Settings.General.VideoPlayer.Trim().Equals("MPV", StringComparison.OrdinalIgnoreCase) && @@ -21892,6 +21894,12 @@ namespace Nikse.SubtitleEdit.Forms } } } + + private void SmpteTimeModedropFrameToolStripMenuItem_Click(object sender, EventArgs e) + { + smpteTimeModedropFrameToolStripMenuItem.Checked = !smpteTimeModedropFrameToolStripMenuItem.Checked; + mediaPlayer.SmpteMode = smpteTimeModedropFrameToolStripMenuItem.Checked; + } } } diff --git a/src/Forms/Main.resx b/src/Forms/Main.resx index 50a840acb..e3fc32483 100644 --- a/src/Forms/Main.resx +++ b/src/Forms/Main.resx @@ -462,19 +462,19 @@ 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 AABJRU5ErkJggg== @@ -665,6 +665,9 @@ 650, 56 + + 650, 56 + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -771,7 +774,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2 - CAAAAk1TRnQBSQFMAgEBAgEAAUgBJAFIASQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAAVABJAFQASQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA