Merge pull request #6403 from frenzibyte/fix-videos

Prefer HDTV / Rec. 709 colorspace for videos with HD resolution and unspecified colorspace
This commit is contained in:
Dean Herbert
2024-12-08 23:40:58 -08:00
committed by GitHub
6 changed files with 76 additions and 13 deletions

View File

@@ -381,6 +381,8 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BNG/@EntryIndexedValue">BNG</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UI/@EntryIndexedValue">UI</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WM/@EntryIndexedValue">WM</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SDTV/@EntryIndexedValue">SDTV</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HDTV/@EntryIndexedValue">HDTV</s:String>
<s:Boolean x:Key="/Default/CodeStyle/Naming/CSharpNaming/ApplyAutoDetectedRules/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=EnumMember/@EntryIndexedValue">HINT</s:String>
<s:String x:Key="/Default/CodeStyle/CSharpFileLayoutPatterns/Pattern/@EntryValue">&lt;?xml version="1.0" encoding="utf-16"?&gt;&#xD;

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

View File

@@ -10,9 +10,12 @@ using osu.Framework.Configuration;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
using osu.Framework.Graphics.Video;
using osu.Framework.IO.Stores;
using osu.Framework.Timing;
using osuTK;
namespace osu.Framework.Tests.Visual.Sprites
{
@@ -32,6 +35,9 @@ namespace osu.Framework.Tests.Visual.Sprites
[Resolved]
private FrameworkConfigManager config { get; set; }
[Resolved]
private TextureStore textures { get; set; }
private static readonly string[] file_formats =
{
"h264.mp4",
@@ -239,6 +245,57 @@ namespace osu.Framework.Tests.Visual.Sprites
AddToggleStep("Toggle rounding", v => video.Rounded = v);
}
[Test]
public void TestUnspecifiedColorspace()
{
AddStep("Reset clock", () =>
{
clock.CurrentTime = 0;
didDecode = false;
});
AddStep("load videos", () =>
{
videoContainer.Child = new FillFlowContainer
{
Scale = new Vector2(0.75f),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
Children = new[]
{
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Vertical,
Children = new[]
{
new SpriteText { Text = "SDTV / Rec. 601" },
new TestVideo(videoStore.GetStream("h264.mp4")),
Empty().With(d => d.Height = 10),
new Sprite { Texture = textures.Get("h264-screenshot.png", WrapMode.ClampToEdge, WrapMode.ClampToEdge), Scale = new Vector2(2f) },
new SpriteText { Text = "Expected" },
}
},
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Vertical,
Children = new[]
{
new SpriteText { Text = "HDTV / Rec. 709" },
new TestVideo(videoStore.GetStream("h264-hd.mp4")) { Scale = new Vector2(270f / 576f) },
Empty().With(d => d.Height = 10),
new Sprite { Texture = textures.Get("h264-hd-screenshot.png", WrapMode.ClampToEdge, WrapMode.ClampToEdge), Scale = new Vector2(270f / 576f * 2f) },
new SpriteText { Text = "Expected" },
}
},
},
};
});
AddStep("Reset clock", () => clock.CurrentTime = 0);
}
private int currentSecond;
private int fps;
private int lastFramesProcessed;

View File

@@ -268,21 +268,25 @@ namespace osu.Framework.Graphics.Video
if (codecContext == null)
return Matrix3.Zero;
switch (codecContext->colorspace)
{
case AVColorSpace.AVCOL_SPC_BT709:
return new Matrix3(1.164f, 1.164f, 1.164f,
0.000f, -0.213f, 2.112f,
1.793f, -0.533f, 0.000f);
// this matches QuickTime Player's choice of colour spaces:
// - any video with width < 704 and height < 576 uses the SDTV colorspace.
// - any video with width >= 704 and height >= 576 uses the HDTV colorspace.
// (704x576 in particular has a special colour space, but we don't worry about it).
bool unspecifiedUsesHDTV = codecContext->width >= 704 || codecContext->height >= 576;
case AVColorSpace.AVCOL_SPC_UNSPECIFIED:
case AVColorSpace.AVCOL_SPC_SMPTE170M:
case AVColorSpace.AVCOL_SPC_SMPTE240M:
default:
return new Matrix3(1.164f, 1.164f, 1.164f,
0.000f, -0.392f, 2.017f,
1.596f, -0.813f, 0.000f);
if (codecContext->colorspace == AVColorSpace.AVCOL_SPC_BT709
|| (codecContext->colorspace == AVColorSpace.AVCOL_SPC_UNSPECIFIED && unspecifiedUsesHDTV))
{
// matrix coefficients for HDTV / Rec. 709 colorspace.
return new Matrix3(1.164f, 1.164f, 1.164f,
0.000f, -0.213f, 2.112f,
1.793f, -0.533f, 0.000f);
}
// matrix coefficients for SDTV / Rec. 601 colorspace.
return new Matrix3(1.164f, 1.164f, 1.164f,
0.000f, -0.392f, 2.017f,
1.596f, -0.813f, 0.000f);
}
[MonoPInvokeCallback(typeof(avio_alloc_context_read_packet))]