Пример #1
0
        /// <summary>
        /// Updates the local state corresponding to the current video player, given in parameter <paramref name="slimDxPlayer"/>.
        /// This method will check if the given player is suspended (i.e. it is paused). It will also update the thread state so that the system
        /// won't shut down while playing a video.
        /// </summary>
        /// <param name="slimDxPlayer">Player to check.</param>
        private void UpdateVideoPlayerState(ISlimDXVideoPlayer slimDxPlayer)
        {
            IMediaPlaybackControl player = slimDxPlayer as IMediaPlaybackControl;

            _videoPlayerSuspended = player == null || player.IsPaused;
            PlayerSuspendLevel    = slimDxPlayer == null ? SuspendLevel.None : SuspendLevel.DisplayRequired;
        }
Пример #2
0
 private void SynchronizeToVideoPlayerFramerate(ISlimDXVideoPlayer videoPlayer)
 {
     lock (_screenManager.SyncObj)
     {
         if (videoPlayer == _synchronizedVideoPlayer)
         {
             return;
         }
         ISlimDXVideoPlayer oldPlayer = _synchronizedVideoPlayer;
         _synchronizedVideoPlayer = null;
         if (oldPlayer != null)
         {
             oldPlayer.SetRenderDelegate(null);
         }
         if (videoPlayer != null)
         {
             if (videoPlayer.SetRenderDelegate(VideoPlayerRender))
             {
                 _synchronizedVideoPlayer = videoPlayer;
                 ServiceRegistration.Get <ILogger>().Info("SkinEngine MainForm: Synchronized render framerate to video player '{0}'", videoPlayer);
             }
             else
             {
                 ServiceRegistration.Get <ILogger>().Info(
                     "SkinEngine MainForm: Video player '{0}' doesn't provide render thread synchronization, using default framerate", videoPlayer);
             }
         }
     }
 }
Пример #3
0
        public override void DeepCopy(Utilities.DeepCopy.IDeepCopyable source, Utilities.DeepCopy.ICopyManager copyManager)
        {
            base.DeepCopy(source, copyManager);
            BackgroundVideoBrush b = (BackgroundVideoBrush)source;

            VideoPlayer = b.VideoPlayer;
        }
Пример #4
0
        private void OnMessageReceived(AsynchronousMessageQueue queue, SystemMessage message)
        {
            if (message.ChannelName == PlayerManagerMessaging.CHANNEL)
            {
                PlayerManagerMessaging.MessageType messageType = (PlayerManagerMessaging.MessageType)message.MessageType;
                switch (messageType)
                {
                case PlayerManagerMessaging.MessageType.PlayerStarted:
                case PlayerManagerMessaging.MessageType.PlayerStopped:
                case PlayerManagerMessaging.MessageType.PlayerEnded:
                case PlayerManagerMessaging.MessageType.PlayerSlotsChanged:
                {
                    IPlayerManager     playerManager = ServiceRegistration.Get <IPlayerManager>();
                    ISlimDXVideoPlayer player        = playerManager[PlayerManagerConsts.PRIMARY_SLOT] as ISlimDXVideoPlayer;
                    UpdateVideoPlayerState(player);
                    SynchronizeToVideoPlayerFramerate(player);
                    break;
                }

                case PlayerManagerMessaging.MessageType.PlaybackStateChanged:
                {
                    IPlayerManager     playerManager = ServiceRegistration.Get <IPlayerManager>();
                    ISlimDXVideoPlayer player        = playerManager[PlayerManagerConsts.PRIMARY_SLOT] as ISlimDXVideoPlayer;
                    UpdateVideoPlayerState(player);
                    break;
                }
                }
            }
        }
Пример #5
0
        protected virtual bool GetPlayer(out ISlimDXVideoPlayer player)
        {
            player = null;
            IPlayerContextManager playerContextManager = ServiceRegistration.Get <IPlayerContextManager>(false);

            if (playerContextManager == null)
            {
                return(false);
            }

            player = playerContextManager[Stream] as ISlimDXVideoPlayer;
            return(player != null);
        }
Пример #6
0
        public static void ReallocGUIResources(IPlayerSlotController psc)
        {
            ISlimDXVideoPlayer sdvp = psc.CurrentPlayer as ISlimDXVideoPlayer;

            if (sdvp == null)
            {
                return;
            }
            try
            {
                sdvp.ReallocGUIResources();
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Error("Problem reallocating GUI resources in player '{0}'", e, sdvp);
            }
        }
Пример #7
0
        private static string GetPlayerInfos()
        {
            string         playerInfos = string.Empty;
            IPlayerManager pm          = ServiceRegistration.Get <IPlayerManager>();
            int            index       = 0;

            pm.ForEach(psc =>
            {
                ISlimDXVideoPlayer player = psc.CurrentPlayer as ISlimDXVideoPlayer;
                if (player == null || player.Surface == null)
                {
                    return;
                }
                SurfaceDescription desc = player.Surface.Description;
                playerInfos            += String.Format("{0}Player {1}: Resolution {2}x{3}", string.IsNullOrEmpty(playerInfos) ? "" : "\r\n", index++, desc.Width, desc.Height);
            });
            return(playerInfos);
        }
Пример #8
0
        protected override bool BeginRenderBrushOverride(PrimitiveBuffer primitiveContext, RenderContext renderContext)
        {
            IPlayerManager playerManager = ServiceRegistration.Get <IPlayerManager>(false);

            if (playerManager == null)
            {
                return(false);
            }

            ISlimDXVideoPlayer player = playerManager[Stream] as ISlimDXVideoPlayer;

            if (player == null)
            {
                return(false);
            }

            if (!RefreshEffectParameters(player))
            {
                return(false);
            }

            lock (player.SurfaceLock)
            {
                Surface playerSurface = player.Surface;
                if (playerSurface == null)
                {
                    return(false);
                }
                DeviceEx           device      = SkinContext.Device;
                SurfaceDescription desc        = playerSurface.Description;
                SurfaceDescription?textureDesc = _texture == null ? new SurfaceDescription?() : _texture.GetLevelDescription(0);
                if (!textureDesc.HasValue || textureDesc.Value.Width != desc.Width || textureDesc.Value.Height != desc.Height)
                {
                    TryDispose(ref _texture);
                    _texture = new Texture(device, desc.Width, desc.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
                }
                using (Surface target = _texture.GetSurfaceLevel(0))
                    device.StretchRectangle(playerSurface, target, TextureFilter.None);
            }
            return(_imageContext.StartRender(renderContext, _scaledVideoSize, _texture, _videoTextureClip, BorderColor.ToArgb(), _lastFrameData));
        }
Пример #9
0
 protected override bool GetPlayer(out ISlimDXVideoPlayer player)
 {
     player = VideoPlayer;
     return(player != null);
 }
Пример #10
0
 private void SynchronizeToVideoPlayerFramerate(ISlimDXVideoPlayer videoPlayer)
 {
   lock (_screenManager.SyncObj)
   {
     if (videoPlayer == _synchronizedVideoPlayer)
       return;
     ISlimDXVideoPlayer oldPlayer = _synchronizedVideoPlayer;
     _synchronizedVideoPlayer = null;
     if (oldPlayer != null)
       oldPlayer.SetRenderDelegate(null);
     if (videoPlayer != null)
       if (videoPlayer.SetRenderDelegate(VideoPlayerRender))
       {
         _synchronizedVideoPlayer = videoPlayer;
         ServiceRegistration.Get<ILogger>().Info("SkinEngine MainForm: Synchronized render framerate to video player '{0}'", videoPlayer);
       }
       else
         ServiceRegistration.Get<ILogger>().Info(
             "SkinEngine MainForm: Video player '{0}' doesn't provide render thread synchronization, using default framerate", videoPlayer);
   }
 }
Пример #11
0
 /// <summary>
 /// Updates the local state corresponding to the current video player, given in parameter <paramref name="slimDxPlayer"/>.
 /// This method will check if the given player is suspended (i.e. it is paused). It will also update the thread state so that the system
 /// won't shut down while playing a video.
 /// </summary>
 /// <param name="slimDxPlayer">Player to check.</param>
 private void UpdateVideoPlayerState(ISlimDXVideoPlayer slimDxPlayer)
 {
   IMediaPlaybackControl player = slimDxPlayer as IMediaPlaybackControl;
   _videoPlayerSuspended = player == null || player.IsPaused;
   PlayerSuspendLevel = slimDxPlayer == null ? SuspendLevel.None : SuspendLevel.DisplayRequired;
 }
Пример #12
0
 protected override bool GetPlayer(out ISlimDXVideoPlayer player)
 {
   player = VideoPlayer;
   return player != null;
 }
Пример #13
0
 public override void DeepCopy(Utilities.DeepCopy.IDeepCopyable source, Utilities.DeepCopy.ICopyManager copyManager)
 {
   base.DeepCopy(source, copyManager);
   BackgroundVideoBrush b = (BackgroundVideoBrush) source;
   VideoPlayer = b.VideoPlayer;
 }
Пример #14
0
    protected virtual bool GetPlayer(out ISlimDXVideoPlayer player)
    {
      player = null;
      IPlayerContextManager playerContextManager = ServiceRegistration.Get<IPlayerContextManager>(false);
      if (playerContextManager == null)
        return false;

      player = playerContextManager[Stream] as ISlimDXVideoPlayer;
      return player != null;
    }
Пример #15
0
        protected bool RefreshEffectParameters(IVideoPlayer player)
        {
            ISlimDXVideoPlayer sdvPlayer = player as ISlimDXVideoPlayer;

            if (sdvPlayer == null)
            {
                return(false);
            }
            SizeF      aspectRatio   = sdvPlayer.VideoAspectRatio;
            Size       playerSize    = sdvPlayer.VideoSize;
            Rectangle  cropVideoRect = sdvPlayer.CropVideoRect;
            IGeometry  geometry      = ChooseVideoGeometry(player);
            string     effectName    = player.EffectOverride;
            int        deviceWidth   = GraphicsDevice.Width; // To avoid threading issues if the device size changes
            int        deviceHeight  = GraphicsDevice.Height;
            RectangleF vertsBounds   = _vertsBounds;

            // Do we need a refresh?
            if (!_refresh &&
                _lastVideoSize == playerSize &&
                _lastAspectRatio == aspectRatio &&
                _lastCropVideoRect == cropVideoRect &&
                _lastGeometry == geometry &&
                _lastEffect == effectName &&
                _lastDeviceWidth == deviceWidth &&
                _lastDeviceHeight == deviceHeight &&
                _lastVertsBounds == vertsBounds)
            {
                return(true);
            }

            SizeF targetSize = vertsBounds.Size;

            lock (sdvPlayer.SurfaceLock)
            {
                Surface surface = sdvPlayer.Surface;
                if (surface == null)
                {
                    _refresh = true;
                    return(false);
                }
                SurfaceDescription desc = surface.Description;
                _videoTextureClip = new Rectangle(cropVideoRect.X / desc.Width, cropVideoRect.Y / desc.Height,
                                                  cropVideoRect.Width / desc.Width, cropVideoRect.Height / desc.Height);
            }
            _scaledVideoSize = cropVideoRect.Size;

            // Correct aspect ratio for anamorphic video
            if (!aspectRatio.IsEmpty && geometry.RequiresCorrectAspectRatio)
            {
                float pixelRatio = aspectRatio.Width / aspectRatio.Height;
                _scaledVideoSize.Width = _scaledVideoSize.Height * pixelRatio;
            }
            // Adjust target size to match final Skin scaling
            targetSize = ImageContext.AdjustForSkinAR(targetSize);

            // Adjust video size to fit desired geometry
            _scaledVideoSize = geometry.Transform(_scaledVideoSize, targetSize);

            // Cache inverse RelativeTransform
            Transform relativeTransform = RelativeTransform;

            _inverseRelativeTransformCache = (relativeTransform == null) ? Matrix.Identity : Matrix.Invert(relativeTransform.GetTransform());

            // Prepare our ImageContext
            _imageContext.FrameSize       = targetSize;
            _imageContext.ShaderBase      = EFFECT_BASE_VIDEO;
            _imageContext.ShaderTransform = geometry.Shader;
            _imageContext.ShaderEffect    = player.EffectOverride;

            // Store state
            _lastFrameData     = new Vector4(playerSize.Width, playerSize.Height, 0.0f, 0.0f);
            _lastVideoSize     = playerSize;
            _lastAspectRatio   = aspectRatio;
            _lastGeometry      = geometry;
            _lastCropVideoRect = cropVideoRect;
            _lastEffect        = effectName;
            _lastDeviceWidth   = deviceWidth;
            _lastDeviceHeight  = deviceHeight;

            _refresh = false;
            return(true);
        }