2025-03-10 10:18:11 +08:00

836 lines
19 KiB
C#

//-----------------------------------------------------------------------------
// Copyright 2015-2020 RenderHeads Ltd. All rights reserved.
//-----------------------------------------------------------------------------
#if PLAYMAKER
using UnityEngine;
using HutongGames.PlayMaker;
using HutongGames.PlayMaker.Actions;
using Tooltip = HutongGames.PlayMaker.TooltipAttribute;
using RenderHeads.Media.AVProVideo;
namespace RenderHeads.Media.AVProVideo.PlayMaker.Actions
{
[ActionCategory("AVProVideo")]
[Tooltip("Gets Whether this MediaPlayer instance supports linear color space from media info a MediaPlayer. If it doesn't then a correction may have to be made in the shader")]
public class AVProVideoInfoDoesSupportsLinearColorSpace : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[UIHint(UIHint.Variable)]
[Tooltip("True if player supports linear color space")]
public FsmBool doesSupportsLCS;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if player supports linear color space")]
public FsmEvent doesSupportsLCSEvent;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if player does not supports linear color space")]
public FsmEvent doesNotSupportsLCSEvent;
[Tooltip("Event Sent if MediaPlayer media media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
doesSupportsLCS = null;
doesSupportsLCSEvent = null;
doesNotSupportsLCSEvent = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache (Fsm.GetOwnerDefaultTarget (gameObject)))
{
ExecuteAction ();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event (missingMediaInfoEvent);
return;
}
if (this.mediaPlayer.Info.PlayerSupportsLinearColorSpace())
{
doesSupportsLCS.Value = true;
Fsm.Event (doesSupportsLCSEvent);
} else
{
doesSupportsLCS.Value = false;
Fsm.Event (doesNotSupportsLCSEvent);
}
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the number of audio tracks from media info a MediaPlayer.")]
public class AVProVideoInfoGetAudioTrackCount : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The number of audio tracks")]
public FsmInt trackCount;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
trackCount = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
trackCount.Value = this.mediaPlayer.Info.GetAudioTrackCount();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the current audio bitrate from media info a MediaPlayer.")]
public class AVProVideoInfoGetCurrentAudioTrackBitrate : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The current audio bitrate")]
public FsmInt trackBitrate;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
trackBitrate = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
trackBitrate.Value = this.mediaPlayer.Info.GetCurrentAudioTrackBitrate();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the current audio track identification from media info a MediaPlayer.")]
public class AVProVideoInfoGetCurrentAudioTrackId : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The current audio track identification")]
public FsmString trackId;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
trackId = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
trackId.Value = this.mediaPlayer.Info.GetCurrentAudioTrackId();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the current video bitrate from media info a MediaPlayer.")]
public class AVProVideoInfoGetCurrentVideoTrackBitrate : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The current video bitrate")]
public FsmInt trackBitrate;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
trackBitrate = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
trackBitrate.Value = this.mediaPlayer.Info.GetCurrentVideoTrackBitrate();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the current video track identification from media info a MediaPlayer.")]
public class AVProVideoInfoGetCurrentVideoTrackId : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The current video track identification")]
public FsmString trackId;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
trackId = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
trackId.Value = this.mediaPlayer.Info.GetCurrentVideoTrackId();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets video duration from media info a MediaPlayer.")]
public class AVProVideoInfoGetDurationMs : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The value of the video duration in ms.")]
public FsmFloat duration;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
duration = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
duration.Value = this.mediaPlayer.Info.GetDurationMs();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the description of which playback path is used internally from media info a MediaPlayer.")]
public class AVProVideoInfoAVProInfoGetPlayerDescription : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The description of the playback")]
public FsmString description;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
description = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
description.Value = this.mediaPlayer.Info.GetPlayerDescription();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the current achieved display rate in frames per second from media info a MediaPlayer.")]
public class AVProVideoInfoGetVideoDisplayRate : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[UIHint(UIHint.Variable)]
[RequiredField]
[Tooltip("The achieved framerate of the video")]
public FsmFloat framerate;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
framerate = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
framerate.Value = this.mediaPlayer.Info.GetVideoDisplayRate();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets video frame rate from media info a MediaPlayer.")]
public class AVProVideoInfoGetVideoFrameRate : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The framerate of the video")]
public FsmFloat framerate;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
framerate = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
framerate.Value = this.mediaPlayer.Info.GetVideoFrameRate();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets video size ( width and height ) from media info a MediaPlayer.")]
public class AVProVideoInfoGetVideoSize : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[UIHint(UIHint.Variable)]
[Tooltip("The width of the video")]
public FsmFloat width;
[UIHint(UIHint.Variable)]
[Tooltip("The height of the video")]
public FsmFloat height;
[UIHint(UIHint.Variable)]
[Tooltip("The width and height of the video")]
public FsmVector2 size;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
width = null;
height = null;
size = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
if (!width.IsNone) width.Value = this.mediaPlayer.Info.GetVideoWidth();
if (!height.IsNone) height.Value = this.mediaPlayer.Info.GetVideoHeight();
if (!size.IsNone) size.Value = new Vector2(this.mediaPlayer.Info.GetVideoWidth(), this.mediaPlayer.Info.GetVideoHeight());
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets the number of video tracks from media info a MediaPlayer.")]
public class AVProVideoInfoGetVideoTrackCount : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The number of video tracks")]
public FsmInt trackCount;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
trackCount = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
trackCount.Value = this.mediaPlayer.Info.GetVideoTrackCount();
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets hasAudio from media info a MediaPlayer.")]
public class AVProVideoInfoHasAudio : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[UIHint(UIHint.Variable)]
[Tooltip("The value of the hasAudio.")]
public FsmBool hasAudio;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if media has audio")]
public FsmEvent hasAudioEvent;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if media doesn't have audio")]
public FsmEvent hasNoAudioEvent;
[Tooltip("Event Sent if MediaPlayer media media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
hasAudio = null;
hasAudioEvent = null;
hasNoAudioEvent = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
if (this.mediaPlayer.Info.HasAudio())
{
hasAudio.Value = true;
Fsm.Event(hasNoAudioEvent);
}
else
{
hasAudio.Value = false;
Fsm.Event(hasNoAudioEvent);
}
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Gets hasVideo from media info a MediaPlayer.")]
public class AVProVideoInfoHasVideo : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[UIHint(UIHint.Variable)]
[Tooltip("The value of the hasVideo.")]
public FsmBool hasVideo;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if media has video")]
public FsmEvent hasVideoEvent;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if media doesn't have video")]
public FsmEvent hasNoVideoEvent;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
hasVideo = null;
hasVideoEvent = null;
hasNoVideoEvent = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
if (this.mediaPlayer.Info.HasVideo())
{
hasVideo.Value = true;
Fsm.Event(hasNoVideoEvent);
}
else
{
hasVideo.Value = false;
Fsm.Event(hasNoVideoEvent);
}
}
}
[ActionCategory("AVProVideo")]
[Tooltip("Checks if the playback is in a stalled state from media info a MediaPlayer.")]
public class AVProVideoInfoIsPlaybackStalled : AVProVideoActionBase
{
public AVProVideoActionHeader headerImage;
[RequiredField]
[CheckForComponent(typeof(MediaPlayer))]
[Tooltip("The GameObject with a MediaPlayer component.")]
public FsmOwnerDefault gameObject;
[ActionSection("Result")]
[UIHint(UIHint.Variable)]
[Tooltip("True if the playback is in a stalled state")]
public FsmBool isStalled;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if the playback is in a stalled state")]
public FsmEvent isStalledEvent;
[UIHint(UIHint.Variable)]
[Tooltip("Event Sent if the playback is not in a stalled state")]
public FsmEvent isNotStalledEvent;
[Tooltip("Event Sent if MediaPlayer media info is missing (null)")]
public FsmEvent missingMediaInfoEvent;
public override void Reset()
{
gameObject = null;
isStalled = null;
isStalledEvent = null;
isNotStalledEvent = null;
missingMediaInfoEvent = null;
}
public override void OnEnter()
{
if (this.UpdateCache(Fsm.GetOwnerDefaultTarget(gameObject)))
{
ExecuteAction();
}
Finish();
}
void ExecuteAction()
{
if (this.mediaPlayer.Info == null)
{
Fsm.Event(missingMediaInfoEvent);
return;
}
if (this.mediaPlayer.Info.IsPlaybackStalled())
{
isStalled.Value = true;
Fsm.Event(isStalledEvent);
}
else
{
isStalled.Value = false;
Fsm.Event(isNotStalledEvent);
}
}
}
}
#endif