public static SubmitStatus SubmitPacketExt(this ESPlayer player, ESPacket packet) { Dictionary <string, IntPtr> unmanagedMemories = null; try { unmanagedMemories = GetNativePacket(packet); var nativePlayerHandle = _nativePlayerFieldGetter.Invoke(player); var result = _submitPacketMethodCaller.Invoke(nativePlayerHandle, unmanagedMemories["unmanagedNativePacket"]); return(result); } catch (Exception) { throw new InvalidOperationException("Submitting espacket to native pipeline has failed."); } finally { if (unmanagedMemories != null) { foreach (var kv in unmanagedMemories) { Marshal.FreeHGlobal(kv.Value); } } } }
public override async Task Open(Window presenterWindow) { Log.Enter(); var openTask = _dataProvider.Open(); Log.Info("Opening data provider"); _esPlayer = CreateESplayer(presenterWindow); Log.Info("ESPlayer created"); var clipConfig = await openTask; // Configure platform player and initiate playback. var(readyToTransferTask, prepareAsyncTask) = PrepareESplayer(_esPlayer, clipConfig.StreamConfigs); await readyToTransferTask; // Start data transfer. _dataReaderSession = _createDataReader() .AddHandler(ErrorHandler) .With(_dataProvider, PresentPacket); // Wait for PreapareAsync completion. await prepareAsyncTask; Log.Info("PrepareAsync() completed"); // Start playback. _esPlayer.Start(); Log.Info("Plyback started"); Log.Exit(); }
private ESPlayer CreateESplayer(Window playerWindow) { Log.Enter(); var player = new ESPlayer(); player.Open(); player.SetDisplay(playerWindow); player.EOSEmitted += OnEos; player.ErrorOccurred += OnError; player.BufferStatusChanged += OnBufferStatusChanged; Log.Exit(); return(player); }
public override void Dispose() { Log.Enter(); Log.Info($"Terminating DataReader session: {_dataReaderSession != null}"); _dataReaderSession?.Dispose(); _dataReaderSession = null; _createDataReader = null; Log.Info($"Disposing data provider: {_dataProvider != null}"); _dataProvider?.Dispose(); _dataProvider = null; Log.Info($"Disposing ESPlayer: {_esPlayer != null}"); _esPlayer?.Dispose(); _esPlayer = null; ErrorHandler = null; EosHandler = null; Log.Exit(); }
private static (Task readyToTransferTask, Task seekAsyncTask) SeekESplayer(ESPlayer player, TimeSpan seekTo, int streamCount) { Log.Enter(); // Completes when all streams report onReadyToSeek. var readyToTransferTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); Log.Info($"SeekingAsync( {streamCount} streams )"); var seekAsyncTask = player.SeekAsync(seekTo, OnReadyToSeek); Log.Exit(); return(readyToTransferTcs.Task, seekAsyncTask); void OnReadyToSeek(Tizen.TV.Multimedia.StreamType stream, TimeSpan position) { if (--streamCount == 0) { readyToTransferTcs.SetResult(null); } Log.Info($"onReadyToSeek( {stream} {position} )"); } }
private static (Task readyToTransferTask, Task prepareAsyncTask) PrepareESplayer(ESPlayer player, ICollection <StreamConfig> streamConfigs) { Log.Enter(); foreach (var config in streamConfigs) { switch (config) { case AudioStreamConfig audioConfig: player.SetStream(audioConfig.ESAudioStreamInfo()); break; case VideoStreamConfig videoConfig: player.SetStream(videoConfig.ESVideoStreamInfo()); break; } } // Completes when all streams report onReadyToPreapre. var readyToTransferTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); int streamCount = streamConfigs.Count; Log.Info($"PreparingAsync( {streamCount} streams )"); var prepareAsyncTask = player.PrepareAsync(OnReadyToPreapare); Log.Exit(); return(readyToTransferTcs.Task, prepareAsyncTask); void OnReadyToPreapare(Tizen.TV.Multimedia.StreamType stream) { if (--streamCount == 0) { readyToTransferTcs.SetResult(null); } Log.Info($"onReadyToPreapre( {stream} )"); } }