// %BANNER_BEGIN%
// ---------------------------------------------------------------------
// %COPYRIGHT_BEGIN%
// Copyright (c) (2024) Magic Leap, Inc. All Rights Reserved.
// Use of this file is governed by the Software License Agreement, located here: https://www.magicleap.com/software-license-agreement-ml2
// Terms and conditions applicable to third-party materials accompanying this distribution may also be found in the top-level NOTICE file appearing herein.
// %COPYRIGHT_END%
// ---------------------------------------------------------------------
// %BANNER_END%
// Disabling deprecated warning for the internal project
#pragma warning disable 618
using System;
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using UnityEngine.XR.MagicLeap;
using Media = UnityEngine.XR.MagicLeap.MLMedia;
namespace UnitySDKPlayTests
{
public partial class MLMedia
{
public partial class PlayerTests
{
private const string WebSource = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
public Media.Player MediaPlayer
{
get
{
if (_mediaPlayer == null)
{
var mediaPlayer = new Media.Player(out MLResult result);
if (!result.IsOk)
Assert.Fail($"Media Player initialization result with error {result}.");
_mediaPlayer = mediaPlayer;
_mediaPlayer.OnPrepared += HandleOnPrepare;
_mediaPlayer.OnVideoSizeChanged += HandleOnVideoSizeChanged;
_mediaPlayer.OnPlay += HandleOnPlay;
_mediaPlayer.OnPause += HandleOnPause;
_mediaPlayer.OnStop += HandleOnStop;
_mediaPlayer.OnCompletion += HandleOnCompletion;
_mediaPlayer.OnBufferingUpdate += HandleOnBufferingUpdate;
_mediaPlayer.OnInfo += HandleOnInfo;
_mediaPlayer.OnSeekComplete += HandleOnSeekComplete;
_mediaPlayer.OnCEA608 += HandleOnCaptionsText;
_mediaPlayer.OnCEA708 += HandleOnCaptionsText;
_mediaPlayer.OnTimedText += HandleOnCaptionsText;
_mediaPlayer.OnTrackSelected += HandleOnTrackSelected;
_mediaPlayer.OnResetComplete += HandleOnResetComplete;
}
return _mediaPlayer;
}
}
private MLPermissions.Callbacks permissionCallbacks = new MLPermissions.Callbacks();
private Media.Player _mediaPlayer;
#pragma warning disable CS0414 // Remove unused private members
private readonly long currentPositionInMiliseconds = 0;
private readonly int videoWidth, videoHeight;
private bool renderVideo = false;
#pragma warning restore CS0414 // Remove unused private members
public bool IsBuffering { get; private set; } = false;
public bool IsSeeking { get; private set; } = false;
public long DurationInMiliseconds { get; private set; } = 0;
public bool IsPlaying => _mediaPlayer is { IsPlaying: true };
public bool IsPrepared => _mediaPlayer is { IsPrepared: true };
[Test]
public void MediaPlayer_Create()
{
SetUp();
TearDown();
}
[Test]
public void MediaPlayer_Prepare()
{
SetUp();
if (!MLResult.DidNativeCallSucceed(MLPermissions.CheckPermission(MLPermission.Internet).Result))
{
Assert.Fail($"Using PathSourceType.Web requires {MLPermission.Internet} permission included in AndroidManifest.xml");
}
var result = MediaPlayer.SetSourceURI(WebSource);
if (!result.IsOk)
{
Assert.Fail($"Couldn't set source, reason: {result}");
}
TearDown();
}
///
/// Callback handler on Prepare.
///
///
private void HandleOnPrepare(Media.Player mediaplayer)
{
DurationInMiliseconds = MediaPlayer.GetDurationMilliseconds();
}
///
/// Callback handler on video size changed.
///
///
///
///
private void HandleOnVideoSizeChanged(Media.Player player, int width, int height)
{
}
///
/// Callback handler on play.
///
private void HandleOnPlay(Media.Player mediaPlayer)
{
}
///
/// Callback handler on pause.
///
private void HandleOnPause(Media.Player mediaPlayer)
{
}
///
/// Callback handler on stop.
///
///
private void HandleOnStop(Media.Player mediaplayer)
{
}
///
/// Callback handler on video completion.
///
private void HandleOnCompletion(Media.Player mediaPlayer)
{
}
private void HandleOnResetComplete(Media.Player mediaPlayer)
{
}
///
/// Callback handler on buffering update.
///
private void HandleOnBufferingUpdate(Media.Player mediaPlayer, float percent)
{
}
///
/// Callback handler on media player info.
///
private void HandleOnInfo(Media.Player mediaPlayer, Media.Player.Info info)
{
switch (info)
{
case Media.Player.Info.NetworkBandwidth:
// source media is not local
// the parameter extra would contain bandwidth in kbps
break;
case Media.Player.Info.BufferingStart:
IsBuffering = true;
break;
case Media.Player.Info.BufferingEnd:
IsBuffering = false;
break;
case Media.Player.Info.RenderingStart:
renderVideo = true;
break;
case Media.Player.Info.Stopped:
renderVideo = false;
break;
}
}
///
/// Callback handler on seek complete.
///
private void HandleOnSeekComplete(Media.Player mediaPlayer)
{
IsSeeking = false;
}
///
/// Callback handler on track selected.
///
///
///
private void HandleOnTrackSelected(Media.Player mediaPlayer, Media.Player.Track track)
{
}
///
/// Callback handler on captions text.
///
///
///
private void HandleOnCaptionsText(Media.Player mediaPlayer, string text)
{
}
private void SetUp()
{
MLResult result = MLPermissions.RequestPermission(UnityEngine.Android.Permission.ExternalStorageRead, permissionCallbacks);
var _ = MediaPlayer;
}
private void TearDown()
{
if (_mediaPlayer != null)
{
_mediaPlayer.OnPrepared -= HandleOnPrepare;
_mediaPlayer.OnVideoSizeChanged -= HandleOnVideoSizeChanged;
_mediaPlayer.OnPlay -= HandleOnPlay;
_mediaPlayer.OnPause -= HandleOnPause;
_mediaPlayer.OnStop -= HandleOnStop;
_mediaPlayer.OnCompletion -= HandleOnCompletion;
_mediaPlayer.OnBufferingUpdate -= HandleOnBufferingUpdate;
_mediaPlayer.OnInfo -= HandleOnInfo;
_mediaPlayer.OnSeekComplete -= HandleOnSeekComplete;
_mediaPlayer.OnCEA608 -= HandleOnCaptionsText;
_mediaPlayer.OnCEA708 -= HandleOnCaptionsText;
_mediaPlayer.OnTimedText -= HandleOnCaptionsText;
_mediaPlayer.OnTrackSelected -= HandleOnTrackSelected;
_mediaPlayer.OnResetComplete -= HandleOnResetComplete;
StopMLMediaPlayer();
_mediaPlayer.Reset();
_mediaPlayer.Destroy();
}
}
///
/// Stops Media Player and destroys it's instance.
///
public void StopMLMediaPlayer()
{
if (_mediaPlayer == null)
return;
if (_mediaPlayer.IsPrepared)
{
var result = _mediaPlayer.Stop();
if (!result.IsOk)
{
Assert.Fail($"Couldn't stop Media Player. Reason: {result}");
}
}
}
}
}
}