コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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} )");
            }
        }
コード例 #6
0
        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} )");
            }
        }