Example #1
0
        /// <summary>
        /// Pushes elementary stream to decode audio or video.
        /// </summary>
        /// <remarks>This source must be set as a source to a player and the player must be in the <see cref="PlayerState.Ready"/>,
        /// <see cref="PlayerState.Playing"/>, or <see cref="PlayerState.Paused"/> state.</remarks>
        /// <param name="packet">The <see cref="MediaPacket"/> to decode.</param>
        /// <exception cref="InvalidOperationException">
        ///     This source is not set as a source to a player.<br/>
        ///     -or-<br/>
        ///     The player is not in the valid state.
        /// </exception>
        /// <exception cref="ArgumentNullException"><paramref name="packet"/> is null.</exception>
        /// <exception cref="ObjectDisposedException"><paramref name="packet"/> has been disposed of.</exception>
        /// <exception cref="ArgumentException">
        ///     <paramref name="packet"/> is neither video nor audio type.<br/>
        ///     -or-<br/>
        ///     The format of packet is not matched with the specified format in the constructor.
        /// </exception>
        /// <exception cref="NoBufferSpaceException">The internal buffer has reached its limits.</exception>
        /// <seealso cref="Player.SetSource(MediaSource)"/>
        /// <seealso cref="MediaStreamConfiguration.BufferMaxSize"/>
        /// <seealso cref="MediaPacket"/>
        /// <since_tizen> 3 </since_tizen>
        public void Push(MediaPacket packet)
        {
            if (_player == null)
            {
                Log.Error(PlayerLog.Tag, "The source is not set as a source to a player yet.");
                throw new InvalidOperationException("The source is not set as a source to a player yet.");
            }

            if (packet == null)
            {
                Log.Error(PlayerLog.Tag, "packet is null");
                throw new ArgumentNullException(nameof(packet));
            }

            if (packet.IsDisposed)
            {
                Log.Error(PlayerLog.Tag, "packet is disposed");
                throw new ObjectDisposedException(nameof(packet));
            }

            if (packet.Format.Type == MediaFormatType.Text || packet.Format.Type == MediaFormatType.Container)
            {
                Log.Error(PlayerLog.Tag, "The format of the packet is invalid : " + packet.Format.Type);
                throw new ArgumentException($"The format of the packet is invalid : { packet.Format.Type }.");
            }

            if (!packet.Format.Equals(_audioMediaFormat) && !packet.Format.Equals(_videoMediaFormat))
            {
                Log.Error(PlayerLog.Tag, "The format of the packet is invalid : Unmatched format.");
                throw new ArgumentException($"The format of the packet is invalid : Unmatched format.");
            }

            if (packet.Format.Type == MediaFormatType.Video && _videoMediaFormat == null)
            {
                Log.Error(PlayerLog.Tag, "Video is not configured with the current source.");
                throw new ArgumentException("Video is not configured with the current source.");
            }

            if (packet.Format.Type == MediaFormatType.Audio && _audioMediaFormat == null)
            {
                Log.Error(PlayerLog.Tag, "Audio is not configured with the current source.");
                throw new ArgumentException("Audio is not configured with the current source.");
            }

            _player.ValidatePlayerState(PlayerState.Paused, PlayerState.Playing, PlayerState.Ready);

            NativePlayer.PushMediaStream(_player.Handle, packet.GetHandle()).
            ThrowIfFailed(_player, "Failed to push the packet to the player");
        }