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; }
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; } }