示例#1
0
        public void ChangeSurfaceZoom(VLCSurfaceZoom desiredZoom)
        {
            var screenWidth  = App.RootPage.SwapChainPanel.ActualWidth;
            var screenHeight = App.RootPage.SwapChainPanel.ActualHeight;

            var videoTrack = Locator.VLCService.MediaPlayer?.media()?.tracks()?.FirstOrDefault(x => x.type() == TrackType.Video);

            if (videoTrack == null)
            {
                return;
            }
            var videoHeight = videoTrack.height();
            var videoWidth  = videoTrack.width();

            var sarDen = videoTrack.sarDen();
            var sarNum = videoTrack.sarNum();

            double var = 0, displayedVideoWidth;

            if (sarDen == sarNum)
            {
                // Assuming it's 1:1 pixel
                var = (float)videoWidth / videoHeight;
            }
            else
            {
                var = (videoWidth * (double)sarNum / sarDen) / videoHeight;
            }

            var    screenar             = (float)screenWidth / screenHeight;
            double displayedVideoHeight = 0;

            if (var > screenar)
            {
                displayedVideoHeight = screenWidth * ((float)videoHeight / videoWidth);
                displayedVideoWidth  = screenWidth;
            }
            else
            {
                displayedVideoHeight = screenHeight;
                displayedVideoWidth  = displayedVideoHeight * var;
            }

            double bandesNoiresVertical   = screenHeight - displayedVideoHeight;
            double bandesNoiresHorizontal = screenWidth - displayedVideoWidth;

            var scaleTransform  = new ScaleTransform();
            var verticalScale   = Math.Abs(displayedVideoHeight / (displayedVideoHeight - bandesNoiresVertical));
            var horizontalScale = Math.Abs(displayedVideoWidth / (displayedVideoWidth - bandesNoiresHorizontal));

            scaleTransform.CenterX = screenWidth / 2;
            scaleTransform.CenterY = screenHeight / 2;
            switch (desiredZoom)
            {
            case VLCSurfaceZoom.SURFACE_BEST_FIT:
                scaleTransform.ScaleX = scaleTransform.ScaleY = 1;
                break;

            case VLCSurfaceZoom.SURFACE_FIT_HORIZONTAL:
                scaleTransform.ScaleX  = horizontalScale;
                scaleTransform.ScaleY  = horizontalScale;
                scaleTransform.CenterX = screenWidth / 2;
                scaleTransform.CenterY = screenHeight / 2;
                break;

            case VLCSurfaceZoom.SURFACE_FIT_VERTICAL:
                scaleTransform.ScaleX = verticalScale;
                scaleTransform.ScaleY = verticalScale;
                break;

            case VLCSurfaceZoom.SURFACE_STRETCH:
                if (bandesNoiresVertical > 0)
                {
                    scaleTransform.ScaleX = 1;
                    scaleTransform.ScaleY = verticalScale;
                }
                else if (bandesNoiresHorizontal > 0)
                {
                    scaleTransform.ScaleX = horizontalScale;
                    scaleTransform.ScaleY = 1;
                }
                break;

            //case VLCSurfaceZoom.SURFACE_FILL:
            //    break;
            //case VLCSurfaceZoom.SURFACE_16_9:
            //    break;
            //case VLCSurfaceZoom.SURFACE_4_3:
            //    break;
            //case VLCSurfaceZoom.SURFACE_ORIGINAL:
            //    break;
            //case VLCSurfaceZoom.SURFACE_CUSTOM_ZOOM:
            //    break;
            default:
                break;
            }
            App.RootPage.SwapChainPanel.RenderTransform = scaleTransform;
        }
示例#2
0
        public void ChangeSurfaceZoom(VLCSurfaceZoom desiredZoom)
        {
            var playbackService = Locator.PlaybackService;
            var screenWidth     = App.RootPage.SwapChainPanel.ActualWidth;
            var screenHeight    = App.RootPage.SwapChainPanel.ActualHeight;

            var videoTrack = playbackService.CurrentMedia?.tracks()?.FirstOrDefault(x => x.type() == TrackType.Video);

            if (videoTrack == null)
            {
                return;
            }

            switch (desiredZoom)
            {
            case VLCSurfaceZoom.SURFACE_BEST_FIT:
                playbackService.VideoAspectRatio = string.Empty;
                playbackService.VideoScale       = 0;
                break;

            case VLCSurfaceZoom.SURFACE_FIT_SCREEN:
                var videoW = videoTrack.width();
                var videoH = videoTrack.height();

                if (videoTrack.sarNum() != videoTrack.sarDen())
                {
                    videoW = videoW * videoTrack.sarNum() / videoTrack.sarDen();
                }

                var ar  = videoW / (float)videoH;
                var dar = screenWidth / screenHeight;

                float scale;
                if (dar >= ar)
                {
                    scale = (float)screenWidth / videoW;     /* horizontal */
                }
                else
                {
                    scale = (float)screenHeight / videoH;     /* vertical */
                }
                playbackService.VideoScale       = scale;
                playbackService.VideoAspectRatio = string.Empty;
                break;

            case VLCSurfaceZoom.SURFACE_FILL:
                playbackService.VideoScale       = 0;
                playbackService.VideoAspectRatio = $"{screenWidth}:{screenHeight}";
                break;

            case VLCSurfaceZoom.SURFACE_16_9:
                playbackService.VideoAspectRatio = "16:9";
                playbackService.VideoScale       = 0;
                break;

            case VLCSurfaceZoom.SURFACE_4_3:
                playbackService.VideoAspectRatio = "4:3";
                playbackService.VideoScale       = 0;
                break;

            case VLCSurfaceZoom.SURFACE_ORIGINAL:
                playbackService.VideoAspectRatio = string.Empty;
                playbackService.VideoScale       = 1;
                break;

            case VLCSurfaceZoom.SURFACE_2_35_1:
                playbackService.VideoScale       = 0;
                playbackService.VideoAspectRatio = "21:9";     /* equals 2.35:1 */
                break;
            }
        }