Show More
Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
References:
File last commit:
Show/Diff file:
Action:
FNA/src/Media/Xiph/Video.cs
178 lines | 3.3 KiB | text/x-csharp | CSharpLexer
178 lines | 3.3 KiB | text/x-csharp | CSharpLexer
r0 | #region License | |||
/* FNA - XNA4 Reimplementation for Desktop Platforms | ||||
* Copyright 2009-2020 Ethan Lee and the MonoGame Team | ||||
* | ||||
* Released under the Microsoft Public License. | ||||
* See LICENSE for details. | ||||
*/ | ||||
#endregion | ||||
#region Using Statements | ||||
using System; | ||||
using Microsoft.Xna.Framework.Graphics; | ||||
#endregion | ||||
namespace Microsoft.Xna.Framework.Media | ||||
{ | ||||
public sealed class Video | ||||
{ | ||||
#region Public Properties | ||||
public int Width | ||||
{ | ||||
get | ||||
{ | ||||
return yWidth; | ||||
} | ||||
} | ||||
public int Height | ||||
{ | ||||
get | ||||
{ | ||||
return yHeight; | ||||
} | ||||
} | ||||
public float FramesPerSecond | ||||
{ | ||||
get | ||||
{ | ||||
return (float) fps; | ||||
} | ||||
} | ||||
public VideoSoundtrackType VideoSoundtrackType | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
// FIXME: This is hacked, look up "This is a part of the Duration hack!" | ||||
public TimeSpan Duration | ||||
{ | ||||
get; | ||||
internal set; | ||||
} | ||||
#endregion | ||||
#region Internal Properties | ||||
internal GraphicsDevice GraphicsDevice | ||||
{ | ||||
get; | ||||
private set; | ||||
} | ||||
#endregion | ||||
#region Internal Variables: Theorafile | ||||
internal IntPtr theora; | ||||
internal int yWidth; | ||||
internal int yHeight; | ||||
internal int uvWidth; | ||||
internal int uvHeight; | ||||
internal double fps; | ||||
internal bool needsDurationHack; | ||||
#endregion | ||||
#region Internal Constructors | ||||
internal Video(string fileName, GraphicsDevice device) | ||||
{ | ||||
GraphicsDevice = device; | ||||
Theorafile.th_pixel_fmt fmt; | ||||
Theorafile.tf_fopen(fileName, out theora); | ||||
Theorafile.tf_videoinfo( | ||||
theora, | ||||
out yWidth, | ||||
out yHeight, | ||||
out fps, | ||||
out fmt | ||||
); | ||||
if (fmt == Theorafile.th_pixel_fmt.TH_PF_420) | ||||
{ | ||||
uvWidth = yWidth / 2; | ||||
uvHeight = yHeight / 2; | ||||
} | ||||
else if (fmt == Theorafile.th_pixel_fmt.TH_PF_422) | ||||
{ | ||||
uvWidth = yWidth / 2; | ||||
uvHeight = yHeight; | ||||
} | ||||
else if (fmt == Theorafile.th_pixel_fmt.TH_PF_444) | ||||
{ | ||||
uvWidth = yWidth; | ||||
uvHeight = yHeight; | ||||
} | ||||
else | ||||
{ | ||||
throw new NotSupportedException( | ||||
"Unrecognized YUV format!" | ||||
); | ||||
} | ||||
// FIXME: This is a part of the Duration hack! | ||||
Duration = TimeSpan.MaxValue; | ||||
needsDurationHack = true; | ||||
} | ||||
internal Video( | ||||
string fileName, | ||||
GraphicsDevice device, | ||||
int durationMS, | ||||
int width, | ||||
int height, | ||||
float framesPerSecond, | ||||
VideoSoundtrackType soundtrackType | ||||
) : this(fileName, device) { | ||||
/* If you got here, you've still got the XNB file! Well done! | ||||
* Except if you're running FNA, you're not using the WMV anymore. | ||||
* But surely it's the same video, right...? | ||||
* Well, consider this a check more than anything. If this bothers | ||||
* you, just remove the XNB file and we'll read the OGV straight up. | ||||
* -flibit | ||||
*/ | ||||
if (width != Width || height != Height) | ||||
{ | ||||
throw new InvalidOperationException( | ||||
"XNB/OGV width/height mismatch!" + | ||||
" Width: " + Width.ToString() + | ||||
" Height: " + Height.ToString() | ||||
); | ||||
} | ||||
if (Math.Abs(FramesPerSecond - framesPerSecond) >= 1.0f) | ||||
{ | ||||
throw new InvalidOperationException( | ||||
"XNB/OGV framesPerSecond mismatch!" + | ||||
" FPS: " + FramesPerSecond.ToString() | ||||
); | ||||
} | ||||
// FIXME: Oh, hey! I wish we had this info in Theora! | ||||
Duration = TimeSpan.FromMilliseconds(durationMS); | ||||
needsDurationHack = false; | ||||
VideoSoundtrackType = soundtrackType; | ||||
} | ||||
#endregion | ||||
#region Destructor | ||||
~Video() | ||||
{ | ||||
if (theora != IntPtr.Zero) | ||||
{ | ||||
Theorafile.tf_close(ref theora); | ||||
} | ||||
} | ||||
#endregion | ||||
} | ||||
} | ||||