Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
File last commit:
Show/Diff file:
Action:
FNA/src/Media/Xiph/Video.cs
178 lines | 3.3 KiB | text/x-csharp | CSharpLexer
#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
}
}