diff --git a/osu.Game.Tests/WaveformTestBeatmap.cs b/osu.Game.Tests/WaveformTestBeatmap.cs
index 53ce5def32..90c91eb007 100644
--- a/osu.Game.Tests/WaveformTestBeatmap.cs
+++ b/osu.Game.Tests/WaveformTestBeatmap.cs
@@ -6,7 +6,6 @@ using System.Linq;
using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Formats;
using osu.Game.IO;
@@ -51,8 +50,6 @@ namespace osu.Game.Tests
protected override Texture GetBackground() => null;
- protected override VideoSprite GetVideo() => null;
-
protected override Waveform GetWaveform() => new Waveform(trackStore.GetStream(firstAudioFile));
protected override Track GetTrack() => trackStore.Get(firstAudioFile);
diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs
index 31869f9310..abb3f8ac42 100644
--- a/osu.Game/Beatmaps/BeatmapManager.cs
+++ b/osu.Game/Beatmaps/BeatmapManager.cs
@@ -14,7 +14,6 @@ using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Extensions;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Framework.Lists;
using osu.Framework.Logging;
using osu.Framework.Platform;
@@ -403,7 +402,6 @@ namespace osu.Game.Beatmaps
protected override IBeatmap GetBeatmap() => beatmap;
protected override Texture GetBackground() => null;
- protected override VideoSprite GetVideo() => null;
protected override Track GetTrack() => null;
}
diff --git a/osu.Game/Beatmaps/BeatmapManager_WorkingBeatmap.cs b/osu.Game/Beatmaps/BeatmapManager_WorkingBeatmap.cs
index 1991770518..e62a9bb39d 100644
--- a/osu.Game/Beatmaps/BeatmapManager_WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/BeatmapManager_WorkingBeatmap.cs
@@ -6,7 +6,6 @@ using System.Linq;
using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Framework.IO.Stores;
using osu.Framework.Logging;
using osu.Game.Beatmaps.Formats;
@@ -67,24 +66,6 @@ namespace osu.Game.Beatmaps
}
}
- protected override VideoSprite GetVideo()
- {
- if (Metadata?.VideoFile == null)
- return null;
-
- try
- {
- var stream = textureStore.GetStream(getPathForFile(Metadata.VideoFile));
-
- return stream == null ? null : new VideoSprite(stream);
- }
- catch (Exception e)
- {
- Logger.Error(e, "Video failed to load");
- return null;
- }
- }
-
protected override Track GetTrack()
{
try
diff --git a/osu.Game/Beatmaps/BeatmapMetadata.cs b/osu.Game/Beatmaps/BeatmapMetadata.cs
index a353b1a0b6..9267527d79 100644
--- a/osu.Game/Beatmaps/BeatmapMetadata.cs
+++ b/osu.Game/Beatmaps/BeatmapMetadata.cs
@@ -52,7 +52,6 @@ namespace osu.Game.Beatmaps
public int PreviewTime { get; set; }
public string AudioFile { get; set; }
public string BackgroundFile { get; set; }
- public int VideoOffset { get; set; }
public string VideoFile { get; set; }
public override string ToString() => $"{Artist} - {Title} ({Author})";
@@ -84,7 +83,6 @@ namespace osu.Game.Beatmaps
&& PreviewTime == other.PreviewTime
&& AudioFile == other.AudioFile
&& BackgroundFile == other.BackgroundFile
- && VideoOffset == other.VideoOffset
&& VideoFile == other.VideoFile;
}
}
diff --git a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs
index bfcc38e4a9..8080e94075 100644
--- a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs
@@ -7,7 +7,6 @@ using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Difficulty;
using osu.Game.Rulesets.Mods;
@@ -45,8 +44,6 @@ namespace osu.Game.Beatmaps
protected override Texture GetBackground() => textures?.Get(@"Backgrounds/bg4");
- protected override VideoSprite GetVideo() => null;
-
protected override Track GetTrack() => GetVirtualTrack();
private class DummyRulesetInfo : RulesetInfo
diff --git a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
index 8fe08a61b7..f5b27eddd2 100644
--- a/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyBeatmapDecoder.cs
@@ -303,11 +303,6 @@ namespace osu.Game.Beatmaps.Formats
beatmap.BeatmapInfo.Metadata.BackgroundFile = CleanFilename(split[2]);
break;
- case LegacyEventType.Video:
- beatmap.BeatmapInfo.Metadata.VideoOffset = Parsing.ParseInt(split[1]);
- beatmap.BeatmapInfo.Metadata.VideoFile = CleanFilename(split[2]);
- break;
-
case LegacyEventType.Break:
double start = getOffsetTime(Parsing.ParseDouble(split[1]));
diff --git a/osu.Game/Beatmaps/Formats/LegacyBeatmapEncoder.cs b/osu.Game/Beatmaps/Formats/LegacyBeatmapEncoder.cs
index 7e3e3aacd8..ec2ca30535 100644
--- a/osu.Game/Beatmaps/Formats/LegacyBeatmapEncoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyBeatmapEncoder.cs
@@ -133,9 +133,6 @@ namespace osu.Game.Beatmaps.Formats
if (!string.IsNullOrEmpty(beatmap.BeatmapInfo.Metadata.BackgroundFile))
writer.WriteLine(FormattableString.Invariant($"{(int)LegacyEventType.Background},0,\"{beatmap.BeatmapInfo.Metadata.BackgroundFile}\",0,0"));
- if (!string.IsNullOrEmpty(beatmap.BeatmapInfo.Metadata.VideoFile))
- writer.WriteLine(FormattableString.Invariant($"{(int)LegacyEventType.Video},{beatmap.BeatmapInfo.Metadata.VideoOffset},\"{beatmap.BeatmapInfo.Metadata.VideoFile}\",0,0"));
-
foreach (var b in beatmap.Breaks)
writer.WriteLine(FormattableString.Invariant($"{(int)LegacyEventType.Break},{b.StartTime},{b.EndTime}"));
}
diff --git a/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs b/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
index 6569f76b2d..b44d4947d4 100644
--- a/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
@@ -5,13 +5,13 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
-using osuTK;
-using osuTK.Graphics;
using osu.Framework.Graphics;
+using osu.Framework.Utils;
+using osu.Game.Beatmaps.Legacy;
using osu.Game.IO;
using osu.Game.Storyboards;
-using osu.Game.Beatmaps.Legacy;
-using osu.Framework.Utils;
+using osuTK;
+using osuTK.Graphics;
namespace osu.Game.Beatmaps.Formats
{
@@ -88,6 +88,15 @@ namespace osu.Game.Beatmaps.Formats
switch (type)
{
+ case LegacyEventType.Video:
+ {
+ var offset = Parsing.ParseInt(split[1]);
+ var filename = CleanFilename(split[2]);
+
+ storyboard.GetLayer("Video").Add(new StoryboardVideo(filename, offset));
+ break;
+ }
+
case LegacyEventType.Sprite:
{
var layer = parseLayer(split[1]);
diff --git a/osu.Game/Beatmaps/IWorkingBeatmap.cs b/osu.Game/Beatmaps/IWorkingBeatmap.cs
index 5f1f0d1e40..155e603d30 100644
--- a/osu.Game/Beatmaps/IWorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/IWorkingBeatmap.cs
@@ -4,7 +4,6 @@
using System.Collections.Generic;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Objects;
@@ -26,11 +25,6 @@ namespace osu.Game.Beatmaps
///
Texture Background { get; }
- ///
- /// Retrieves the video background file for this .
- ///
- VideoSprite Video { get; }
-
///
/// Retrieves the audio track for this .
///
diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs
index 1e1ffad81e..ad94ae8050 100644
--- a/osu.Game/Beatmaps/WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmap.cs
@@ -1,23 +1,22 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using osu.Framework.Audio.Track;
-using osu.Framework.Graphics.Textures;
-using osu.Game.Rulesets.Mods;
using System;
using System.Collections.Generic;
-using osu.Game.Storyboards;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using osu.Framework.Audio;
+using osu.Framework.Audio.Track;
+using osu.Framework.Graphics.Textures;
+using osu.Framework.Logging;
using osu.Framework.Statistics;
using osu.Game.Rulesets;
+using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Objects.Types;
using osu.Game.Rulesets.UI;
using osu.Game.Skinning;
-using osu.Framework.Graphics.Video;
-using osu.Framework.Logging;
+using osu.Game.Storyboards;
namespace osu.Game.Beatmaps
{
@@ -208,10 +207,6 @@ namespace osu.Game.Beatmaps
protected abstract Texture GetBackground();
private readonly RecyclableLazy background;
- public VideoSprite Video => GetVideo();
-
- protected abstract VideoSprite GetVideo();
-
public bool TrackLoaded => track.IsResultAvailable;
public Track Track => track.Value;
protected abstract Track GetTrack();
diff --git a/osu.Game/Migrations/20200307015200_AddVideoOffset.Designer.cs b/osu.Game/Migrations/20200307015200_AddVideoOffset.Designer.cs
deleted file mode 100644
index 10fea5a8bc..0000000000
--- a/osu.Game/Migrations/20200307015200_AddVideoOffset.Designer.cs
+++ /dev/null
@@ -1,508 +0,0 @@
-//
-using System;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Migrations;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-using osu.Game.Database;
-
-namespace osu.Game.Migrations
-{
- [DbContext(typeof(OsuDbContext))]
- [Migration("20200307015200_AddVideoOffset")]
- partial class AddVideoOffset
- {
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder
- .HasAnnotation("ProductVersion", "2.2.6-servicing-10079");
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapDifficulty", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("ApproachRate");
-
- b.Property("CircleSize");
-
- b.Property("DrainRate");
-
- b.Property("OverallDifficulty");
-
- b.Property("SliderMultiplier");
-
- b.Property("SliderTickRate");
-
- b.HasKey("ID");
-
- b.ToTable("BeatmapDifficulty");
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("AudioLeadIn");
-
- b.Property("BPM");
-
- b.Property("BaseDifficultyID");
-
- b.Property("BeatDivisor");
-
- b.Property("BeatmapSetInfoID");
-
- b.Property("Countdown");
-
- b.Property("DistanceSpacing");
-
- b.Property("GridSize");
-
- b.Property("Hash");
-
- b.Property("Hidden");
-
- b.Property("Length");
-
- b.Property("LetterboxInBreaks");
-
- b.Property("MD5Hash");
-
- b.Property("MetadataID");
-
- b.Property("OnlineBeatmapID");
-
- b.Property("Path");
-
- b.Property("RulesetID");
-
- b.Property("SpecialStyle");
-
- b.Property("StackLeniency");
-
- b.Property("StarDifficulty");
-
- b.Property("Status");
-
- b.Property("StoredBookmarks");
-
- b.Property("TimelineZoom");
-
- b.Property("Version");
-
- b.Property("WidescreenStoryboard");
-
- b.HasKey("ID");
-
- b.HasIndex("BaseDifficultyID");
-
- b.HasIndex("BeatmapSetInfoID");
-
- b.HasIndex("Hash");
-
- b.HasIndex("MD5Hash");
-
- b.HasIndex("MetadataID");
-
- b.HasIndex("OnlineBeatmapID")
- .IsUnique();
-
- b.HasIndex("RulesetID");
-
- b.ToTable("BeatmapInfo");
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapMetadata", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("Artist");
-
- b.Property("ArtistUnicode");
-
- b.Property("AudioFile");
-
- b.Property("AuthorString")
- .HasColumnName("Author");
-
- b.Property("BackgroundFile");
-
- b.Property("PreviewTime");
-
- b.Property("Source");
-
- b.Property("Tags");
-
- b.Property("Title");
-
- b.Property("TitleUnicode");
-
- b.Property("VideoFile");
-
- b.Property("VideoOffset");
-
- b.HasKey("ID");
-
- b.ToTable("BeatmapMetadata");
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetFileInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("BeatmapSetInfoID");
-
- b.Property("FileInfoID");
-
- b.Property("Filename")
- .IsRequired();
-
- b.HasKey("ID");
-
- b.HasIndex("BeatmapSetInfoID");
-
- b.HasIndex("FileInfoID");
-
- b.ToTable("BeatmapSetFileInfo");
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("DateAdded");
-
- b.Property("DeletePending");
-
- b.Property("Hash");
-
- b.Property("MetadataID");
-
- b.Property("OnlineBeatmapSetID");
-
- b.Property("Protected");
-
- b.Property("Status");
-
- b.HasKey("ID");
-
- b.HasIndex("DeletePending");
-
- b.HasIndex("Hash")
- .IsUnique();
-
- b.HasIndex("MetadataID");
-
- b.HasIndex("OnlineBeatmapSetID")
- .IsUnique();
-
- b.ToTable("BeatmapSetInfo");
- });
-
- modelBuilder.Entity("osu.Game.Configuration.DatabasedSetting", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("Key")
- .HasColumnName("Key");
-
- b.Property("RulesetID");
-
- b.Property("SkinInfoID");
-
- b.Property("StringValue")
- .HasColumnName("Value");
-
- b.Property("Variant");
-
- b.HasKey("ID");
-
- b.HasIndex("SkinInfoID");
-
- b.HasIndex("RulesetID", "Variant");
-
- b.ToTable("Settings");
- });
-
- modelBuilder.Entity("osu.Game.IO.FileInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("Hash");
-
- b.Property("ReferenceCount");
-
- b.HasKey("ID");
-
- b.HasIndex("Hash")
- .IsUnique();
-
- b.HasIndex("ReferenceCount");
-
- b.ToTable("FileInfo");
- });
-
- modelBuilder.Entity("osu.Game.Input.Bindings.DatabasedKeyBinding", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("IntAction")
- .HasColumnName("Action");
-
- b.Property("KeysString")
- .HasColumnName("Keys");
-
- b.Property("RulesetID");
-
- b.Property("Variant");
-
- b.HasKey("ID");
-
- b.HasIndex("IntAction");
-
- b.HasIndex("RulesetID", "Variant");
-
- b.ToTable("KeyBinding");
- });
-
- modelBuilder.Entity("osu.Game.Rulesets.RulesetInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("Available");
-
- b.Property("InstantiationInfo");
-
- b.Property("Name");
-
- b.Property("ShortName");
-
- b.HasKey("ID");
-
- b.HasIndex("Available");
-
- b.HasIndex("ShortName")
- .IsUnique();
-
- b.ToTable("RulesetInfo");
- });
-
- modelBuilder.Entity("osu.Game.Scoring.ScoreFileInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("FileInfoID");
-
- b.Property("Filename")
- .IsRequired();
-
- b.Property("ScoreInfoID");
-
- b.HasKey("ID");
-
- b.HasIndex("FileInfoID");
-
- b.HasIndex("ScoreInfoID");
-
- b.ToTable("ScoreFileInfo");
- });
-
- modelBuilder.Entity("osu.Game.Scoring.ScoreInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("Accuracy")
- .HasColumnType("DECIMAL(1,4)");
-
- b.Property("BeatmapInfoID");
-
- b.Property("Combo");
-
- b.Property("Date");
-
- b.Property("DeletePending");
-
- b.Property("Hash");
-
- b.Property("MaxCombo");
-
- b.Property("ModsJson")
- .HasColumnName("Mods");
-
- b.Property("OnlineScoreID");
-
- b.Property("PP");
-
- b.Property("Rank");
-
- b.Property("RulesetID");
-
- b.Property("StatisticsJson")
- .HasColumnName("Statistics");
-
- b.Property("TotalScore");
-
- b.Property("UserID")
- .HasColumnName("UserID");
-
- b.Property("UserString")
- .HasColumnName("User");
-
- b.HasKey("ID");
-
- b.HasIndex("BeatmapInfoID");
-
- b.HasIndex("OnlineScoreID")
- .IsUnique();
-
- b.HasIndex("RulesetID");
-
- b.ToTable("ScoreInfo");
- });
-
- modelBuilder.Entity("osu.Game.Skinning.SkinFileInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("FileInfoID");
-
- b.Property("Filename")
- .IsRequired();
-
- b.Property("SkinInfoID");
-
- b.HasKey("ID");
-
- b.HasIndex("FileInfoID");
-
- b.HasIndex("SkinInfoID");
-
- b.ToTable("SkinFileInfo");
- });
-
- modelBuilder.Entity("osu.Game.Skinning.SkinInfo", b =>
- {
- b.Property("ID")
- .ValueGeneratedOnAdd();
-
- b.Property("Creator");
-
- b.Property("DeletePending");
-
- b.Property("Hash");
-
- b.Property("Name");
-
- b.HasKey("ID");
-
- b.HasIndex("DeletePending");
-
- b.HasIndex("Hash")
- .IsUnique();
-
- b.ToTable("SkinInfo");
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapInfo", b =>
- {
- b.HasOne("osu.Game.Beatmaps.BeatmapDifficulty", "BaseDifficulty")
- .WithMany()
- .HasForeignKey("BaseDifficultyID")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo", "BeatmapSet")
- .WithMany("Beatmaps")
- .HasForeignKey("BeatmapSetInfoID")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("osu.Game.Beatmaps.BeatmapMetadata", "Metadata")
- .WithMany("Beatmaps")
- .HasForeignKey("MetadataID");
-
- b.HasOne("osu.Game.Rulesets.RulesetInfo", "Ruleset")
- .WithMany()
- .HasForeignKey("RulesetID")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetFileInfo", b =>
- {
- b.HasOne("osu.Game.Beatmaps.BeatmapSetInfo")
- .WithMany("Files")
- .HasForeignKey("BeatmapSetInfoID")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("osu.Game.IO.FileInfo", "FileInfo")
- .WithMany()
- .HasForeignKey("FileInfoID")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("osu.Game.Beatmaps.BeatmapSetInfo", b =>
- {
- b.HasOne("osu.Game.Beatmaps.BeatmapMetadata", "Metadata")
- .WithMany("BeatmapSets")
- .HasForeignKey("MetadataID");
- });
-
- modelBuilder.Entity("osu.Game.Configuration.DatabasedSetting", b =>
- {
- b.HasOne("osu.Game.Skinning.SkinInfo")
- .WithMany("Settings")
- .HasForeignKey("SkinInfoID");
- });
-
- modelBuilder.Entity("osu.Game.Scoring.ScoreFileInfo", b =>
- {
- b.HasOne("osu.Game.IO.FileInfo", "FileInfo")
- .WithMany()
- .HasForeignKey("FileInfoID")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("osu.Game.Scoring.ScoreInfo")
- .WithMany("Files")
- .HasForeignKey("ScoreInfoID");
- });
-
- modelBuilder.Entity("osu.Game.Scoring.ScoreInfo", b =>
- {
- b.HasOne("osu.Game.Beatmaps.BeatmapInfo", "Beatmap")
- .WithMany("Scores")
- .HasForeignKey("BeatmapInfoID")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("osu.Game.Rulesets.RulesetInfo", "Ruleset")
- .WithMany()
- .HasForeignKey("RulesetID")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("osu.Game.Skinning.SkinFileInfo", b =>
- {
- b.HasOne("osu.Game.IO.FileInfo", "FileInfo")
- .WithMany()
- .HasForeignKey("FileInfoID")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("osu.Game.Skinning.SkinInfo")
- .WithMany("Files")
- .HasForeignKey("SkinInfoID")
- .OnDelete(DeleteBehavior.Cascade);
- });
-#pragma warning restore 612, 618
- }
- }
-}
diff --git a/osu.Game/Migrations/20200307015200_AddVideoOffset.cs b/osu.Game/Migrations/20200307015200_AddVideoOffset.cs
deleted file mode 100644
index 06c456c551..0000000000
--- a/osu.Game/Migrations/20200307015200_AddVideoOffset.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Microsoft.EntityFrameworkCore.Migrations;
-
-namespace osu.Game.Migrations
-{
- public partial class AddVideoOffset : Migration
- {
- protected override void Up(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.AddColumn(
- name: "VideoOffset",
- table: "BeatmapMetadata",
- nullable: false,
- defaultValue: 0);
- }
-
- protected override void Down(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.DropColumn(
- name: "VideoOffset",
- table: "BeatmapMetadata");
- }
- }
-}
diff --git a/osu.Game/Rulesets/Mods/ModCinema.cs b/osu.Game/Rulesets/Mods/ModCinema.cs
index cd08aee453..cf8128301c 100644
--- a/osu.Game/Rulesets/Mods/ModCinema.cs
+++ b/osu.Game/Rulesets/Mods/ModCinema.cs
@@ -39,7 +39,6 @@ namespace osu.Game.Rulesets.Mods
{
player.Background.EnableUserDim.Value = false;
- player.DimmableVideo.IgnoreUserSettings.Value = true;
player.DimmableStoryboard.IgnoreUserSettings.Value = true;
player.BreakOverlay.Hide();
diff --git a/osu.Game/Screens/Play/DimmableVideo.cs b/osu.Game/Screens/Play/DimmableVideo.cs
deleted file mode 100644
index 2e080d9c2b..0000000000
--- a/osu.Game/Screens/Play/DimmableVideo.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Framework.Allocation;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Shapes;
-using osu.Framework.Graphics.Video;
-using osu.Framework.Timing;
-using osu.Game.Graphics.Containers;
-using osuTK.Graphics;
-
-namespace osu.Game.Screens.Play
-{
- public class DimmableVideo : UserDimContainer
- {
- private readonly VideoSprite video;
- private readonly int offset;
- private DrawableVideo drawableVideo;
-
- public DimmableVideo(VideoSprite video, int offset)
- {
- this.video = video;
- this.offset = offset;
- }
-
- [BackgroundDependencyLoader]
- private void load()
- {
- initializeVideo(false);
- }
-
- protected override void LoadComplete()
- {
- ShowVideo.BindValueChanged(_ => initializeVideo(true), true);
- base.LoadComplete();
- }
-
- protected override bool ShowDimContent => IgnoreUserSettings.Value || (ShowVideo.Value && DimLevel < 1);
-
- private void initializeVideo(bool async)
- {
- if (video == null)
- return;
-
- if (drawableVideo != null)
- return;
-
- if (!ShowVideo.Value && !IgnoreUserSettings.Value)
- return;
-
- drawableVideo = new DrawableVideo(video, offset);
-
- if (async)
- LoadComponentAsync(drawableVideo, Add);
- else
- Add(drawableVideo);
- }
-
- private class DrawableVideo : Container
- {
- private readonly Drawable cover;
- private readonly int offset;
- private readonly ManualClock videoClock;
- private bool videoStarted;
-
- public DrawableVideo(VideoSprite video, int offset)
- {
- this.offset = offset;
-
- RelativeSizeAxes = Axes.Both;
- Masking = true;
-
- video.RelativeSizeAxes = Axes.Both;
- video.FillMode = FillMode.Fit;
- video.Anchor = Anchor.Centre;
- video.Origin = Anchor.Centre;
-
- videoClock = new ManualClock();
- video.Clock = new FramedClock(videoClock);
-
- AddRangeInternal(new[]
- {
- video,
- cover = new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = Color4.Black,
- },
- });
- }
-
- [BackgroundDependencyLoader]
- private void load(GameplayClock clock)
- {
- if (clock != null)
- Clock = clock;
- }
-
- protected override void Update()
- {
- if (videoClock != null && Clock.CurrentTime > offset)
- {
- if (!videoStarted)
- {
- cover.FadeOut(500);
- videoStarted = true;
- }
-
- // handle seeking before the video starts (break skipping, replay seek)
- videoClock.CurrentTime = Clock.CurrentTime - offset;
- }
-
- base.Update();
- }
- }
- }
-}
diff --git a/osu.Game/Screens/Play/GameplayClockContainer.cs b/osu.Game/Screens/Play/GameplayClockContainer.cs
index da4829d484..ac0a4bcadc 100644
--- a/osu.Game/Screens/Play/GameplayClockContainer.cs
+++ b/osu.Game/Screens/Play/GameplayClockContainer.cs
@@ -117,8 +117,15 @@ namespace osu.Game.Screens.Play
startTime = Math.Min(startTime, firstHitObjectTime - beatmap.BeatmapInfo.AudioLeadIn);
// some beatmaps have no AudioLeadIn but the video starts before the first object
- if (beatmap.Video != null && beatmap.Metadata.VideoOffset != 0)
- startTime = Math.Min(startTime, beatmap.Metadata.VideoOffset);
+ var videoLayer = beatmap.Storyboard.GetLayer("Video");
+
+ if (videoLayer.Elements.Any())
+ {
+ var videoOffset = videoLayer.Elements.First().StartTime;
+
+ if (videoOffset != 0)
+ startTime = Math.Min(startTime, videoOffset);
+ }
Seek(startTime);
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 22d90d4ac1..b90d9d982a 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -85,7 +85,6 @@ namespace osu.Game.Screens.Play
protected GameplayClockContainer GameplayClockContainer { get; private set; }
public DimmableStoryboard DimmableStoryboard { get; private set; }
- public DimmableVideo DimmableVideo { get; private set; }
[Cached]
[Cached(Type = typeof(IBindable>))]
@@ -189,7 +188,6 @@ namespace osu.Game.Screens.Play
private void addUnderlayComponents(Container target)
{
- target.Add(DimmableVideo = new DimmableVideo(Beatmap.Value.Video, Beatmap.Value.Metadata.VideoOffset) { RelativeSizeAxes = Axes.Both });
target.Add(DimmableStoryboard = new DimmableStoryboard(Beatmap.Value.Storyboard) { RelativeSizeAxes = Axes.Both });
}
@@ -549,7 +547,6 @@ namespace osu.Game.Screens.Play
// bind component bindables.
Background.IsBreakTime.BindTo(BreakOverlay.IsBreakTime);
DimmableStoryboard.IsBreakTime.BindTo(BreakOverlay.IsBreakTime);
- DimmableVideo.IsBreakTime.BindTo(BreakOverlay.IsBreakTime);
Background.StoryboardReplacesBackground.BindTo(storyboardReplacesBackground);
DimmableStoryboard.StoryboardReplacesBackground.BindTo(storyboardReplacesBackground);
diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardVideo.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardVideo.cs
new file mode 100644
index 0000000000..2c887a1553
--- /dev/null
+++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardVideo.cs
@@ -0,0 +1,82 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Textures;
+using osu.Framework.Graphics.Video;
+using osu.Framework.Timing;
+using osu.Game.Beatmaps;
+using osu.Game.Screens.Play;
+
+namespace osu.Game.Storyboards.Drawables
+{
+ public class DrawableStoryboardVideo : Container
+ {
+ public readonly StoryboardVideo Video;
+ private VideoSprite videoSprite;
+ private ManualClock videoClock;
+ private GameplayClock clock;
+
+ private bool videoStarted;
+
+ public override bool RemoveWhenNotAlive => false;
+
+ public DrawableStoryboardVideo(StoryboardVideo video)
+ {
+ Video = video;
+
+ RelativeSizeAxes = Axes.Both;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(GameplayClock clock, IBindable beatmap, TextureStore textureStore)
+ {
+ if (clock != null)
+ this.clock = clock;
+
+ var path = beatmap.Value.BeatmapSetInfo?.Files?.Find(f => f.Filename.Equals(Video.Path, StringComparison.OrdinalIgnoreCase))?.FileInfo.StoragePath;
+
+ if (path == null)
+ return;
+
+ var stream = textureStore.GetStream(path);
+
+ if (stream == null)
+ return;
+
+ AddInternal(videoSprite = new VideoSprite(stream)
+ {
+ RelativeSizeAxes = Axes.Both,
+ FillMode = FillMode.Fill,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ AlwaysPresent = true,
+ Alpha = 0
+ });
+
+ videoClock = new ManualClock();
+ videoSprite.Clock = new FramedClock(videoClock);
+ }
+
+ protected override void Update()
+ {
+ if (clock.CurrentTime > Video.StartTime)
+ {
+ if (!videoStarted)
+ {
+ videoSprite.FadeIn(500);
+ videoStarted = true;
+ }
+
+ // handle seeking before the video starts (break skipping, replay seek)
+ videoClock.CurrentTime = clock.CurrentTime - Video.StartTime;
+ }
+
+ base.Update();
+ }
+ }
+}
diff --git a/osu.Game/Storyboards/Storyboard.cs b/osu.Game/Storyboards/Storyboard.cs
index 35bfe8c229..e58c422c6d 100644
--- a/osu.Game/Storyboards/Storyboard.cs
+++ b/osu.Game/Storyboards/Storyboard.cs
@@ -21,6 +21,7 @@ namespace osu.Game.Storyboards
public Storyboard()
{
+ layers.Add("Video", new StoryboardLayer("Video", 4));
layers.Add("Background", new StoryboardLayer("Background", 3));
layers.Add("Fail", new StoryboardLayer("Fail", 2) { EnabledWhenPassing = false, });
layers.Add("Pass", new StoryboardLayer("Pass", 1) { EnabledWhenFailing = false, });
@@ -53,7 +54,7 @@ namespace osu.Game.Storyboards
public DrawableStoryboard CreateDrawable(WorkingBeatmap working = null)
{
var drawable = new DrawableStoryboard(this);
- drawable.Width = drawable.Height * (BeatmapInfo.WidescreenStoryboard ? 16 / 9f : 4 / 3f);
+ drawable.Width = drawable.Height * (BeatmapInfo.WidescreenStoryboard || GetLayer("Video").Elements.Any() ? 16 / 9f : 4 / 3f);
return drawable;
}
}
diff --git a/osu.Game/Storyboards/StoryboardVideo.cs b/osu.Game/Storyboards/StoryboardVideo.cs
new file mode 100644
index 0000000000..4652e45852
--- /dev/null
+++ b/osu.Game/Storyboards/StoryboardVideo.cs
@@ -0,0 +1,25 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Game.Storyboards.Drawables;
+
+namespace osu.Game.Storyboards
+{
+ public class StoryboardVideo : IStoryboardElement
+ {
+ public string Path { get; }
+
+ public bool IsDrawable => true;
+
+ public double StartTime { get; }
+
+ public StoryboardVideo(string path, int offset)
+ {
+ Path = path;
+ StartTime = offset;
+ }
+
+ public Drawable CreateDrawable() => new DrawableStoryboardVideo(this);
+ }
+}
diff --git a/osu.Game/Tests/Beatmaps/BeatmapConversionTest.cs b/osu.Game/Tests/Beatmaps/BeatmapConversionTest.cs
index ef86186e41..b60add6e3b 100644
--- a/osu.Game/Tests/Beatmaps/BeatmapConversionTest.cs
+++ b/osu.Game/Tests/Beatmaps/BeatmapConversionTest.cs
@@ -10,7 +10,6 @@ using Newtonsoft.Json;
using NUnit.Framework;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Formats;
using osu.Game.IO;
@@ -207,8 +206,6 @@ namespace osu.Game.Tests.Beatmaps
protected override Texture GetBackground() => throw new NotImplementedException();
- protected override VideoSprite GetVideo() => throw new NotImplementedException();
-
protected override Track GetTrack() => throw new NotImplementedException();
protected override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap, Ruleset ruleset)
diff --git a/osu.Game/Tests/Beatmaps/TestWorkingBeatmap.cs b/osu.Game/Tests/Beatmaps/TestWorkingBeatmap.cs
index 871d8ee3f1..6db34af20c 100644
--- a/osu.Game/Tests/Beatmaps/TestWorkingBeatmap.cs
+++ b/osu.Game/Tests/Beatmaps/TestWorkingBeatmap.cs
@@ -3,7 +3,6 @@
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
-using osu.Framework.Graphics.Video;
using osu.Game.Beatmaps;
using osu.Game.Storyboards;
@@ -32,8 +31,6 @@ namespace osu.Game.Tests.Beatmaps
protected override Texture GetBackground() => null;
- protected override VideoSprite GetVideo() => null;
-
protected override Track GetTrack() => null;
}
}