MAME.Core/MAME.Unity/Assets/Script/UMAME/UniInterface/UniVideoPlayer.cs

78 lines
2.1 KiB
C#
Raw Normal View History

using MAME.Core.run_interface;
using System;
using UnityEngine;
using UnityEngine.UI;
public class UniVideoPlayer : MonoBehaviour, IVideoPlayer
{
[SerializeField]
private int mWidth;
[SerializeField]
private int mHeight;
[SerializeField]
private int mDataLenght;
[SerializeField]
private Texture2D m_rawBufferWarper;
[SerializeField]
private RawImage m_drawCanvas;
[SerializeField]
private RectTransform m_drawCanvasrect;
int[] mFrameData;
IntPtr mFrameDataPtr;
private TimeSpan lastElapsed;
public double videoFPS { get; private set; }
bool bInit = false;
private void Awake()
{
m_drawCanvas = GameObject.Find("GameRawImage").GetComponent<RawImage>();
m_drawCanvasrect = m_drawCanvas.GetComponent<RectTransform>();
}
public void Initialize(int width, int height,IntPtr framePtr)
{
m_drawCanvas.color = Color.white;
if (m_rawBufferWarper == null || mWidth != width || mHeight != height)
{
mWidth = width;
mHeight = height;
mDataLenght = width * height * 4;
mFrameData = new int[mWidth * mHeight];
//MAME<4D><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BGRA32<33><32><EFBFBD>úú<C3BA>
m_rawBufferWarper = new Texture2D(mWidth, mHeight, TextureFormat.BGRA32, false);
m_rawBufferWarper.filterMode = FilterMode.Point;
}
mFrameDataPtr = framePtr;
m_drawCanvas.texture = m_rawBufferWarper;
bInit = true;
float targetWidth = ((float)mWidth / mHeight) * m_drawCanvasrect.rect.height ;
m_drawCanvasrect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, targetWidth);
}
public void StopVideo()
{
bInit = false;
m_drawCanvas.color = new Color(0,0,0,0);
}
void Update()
{
if (!bInit) return;
m_rawBufferWarper.LoadRawTextureData(mFrameDataPtr, mDataLenght);
m_rawBufferWarper.Apply();
}
public void SubmitVideo(int[] data)
{
var current = UMAME.sw.Elapsed;
var delta = current - lastElapsed;
lastElapsed = current;
videoFPS = 1d / delta.TotalSeconds;
mFrameData = data;
}
}