Skip to content

Commit

Permalink
fix: Corrected sizing of videoView
Browse files Browse the repository at this point in the history
  • Loading branch information
nickrandolph authored and jeromelaban committed May 25, 2023
1 parent 38d1519 commit 1eee18d
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 83 deletions.
76 changes: 49 additions & 27 deletions src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/GTKMediaPlayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@
using Uno.Extensions;
using Windows.Foundation;
using Windows.UI.Xaml.Media;
using Point = Windows.Foundation.Point;

namespace Uno.UI.Media;

public partial class GTKMediaPlayer : Button
public partial class GTKMediaPlayer : Border
{
private LibVLC? _libvlc;
private LibVLCSharp.Shared.MediaPlayer? _mediaPlayer;
private ContentControl _videoContainer;
private ContentControl? _videoContainer;
private VideoView? _videoView;
private double _ratio;
//public int VideoHeight;
Expand Down Expand Up @@ -68,13 +69,13 @@ public GTKMediaPlayer()
//RaiseLoaded();
Initialized();

SizeChanged += GTKMediaPlayer_SizeChanged;
//SizeChanged += GTKMediaPlayer_SizeChanged;
}

private void GTKMediaPlayer_SizeChanged(object sender, SizeChangedEventArgs args)
{
UpdateVideoStretch();
}
//private void GTKMediaPlayer_SizeChanged(object sender, SizeChangedEventArgs args)
//{
// UpdateVideoStretch();
//}

public void Play()
{
Expand Down Expand Up @@ -130,19 +131,37 @@ public string Source
"Source", typeof(string), typeof(GTKMediaPlayer), new PropertyMetadata(default(string),
OnSourceChanged));

internal void UpdateVideoStretch()
private int _isUpdating;
private bool _updatedRequested;
private void UpdateVideoStretch()
{
if (Interlocked.CompareExchange(ref _isUpdating, 1, 0) == 1)
{
_updatedRequested = true;
return;
}

_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if (_videoView != null && _mediaPlayer != null && _mediaPlayer.Media != null)
try
{
try
if (_videoView != null &&
_mediaPlayer != null &&
_mediaPlayer.Media != null &&
_videoContainer is not null)
{
if (this.ActualHeight <= 0 || this.ActualWidth <= 0)
{
return;
}
var width = _videoView.AllocatedWidth;
var height = _videoView.AllocatedHeight;
var parentRatio = (double)width / global::System.Math.Max(1, height);
var playerRatio = (double)this.ActualHeight / (double)this.ActualWidth;
_mediaPlayer.Media.Parse(MediaParseOptions.ParseNetwork);
while (!_mediaPlayer.Media.Tracks.Any(track => track.TrackType == TrackType.Video))
Expand All @@ -163,40 +182,43 @@ internal void UpdateVideoStretch()
{
return;
}
UIElement? container = VisualTreeHelper.GetParent(_videoContainer) as UIElement;
UIElement? containerGrid = VisualTreeHelper.GetParent(container) as UIElement;
if (container != null)
{
var videoRatio = (double)videoHeight / (double)videoWidth;
//Point relativeLocation = _videoContainer.TransformToVisual(new Point(0, 0), container!);
Point pagePosition = _videoContainer.TransformToVisual(container).TransformPoint(new Point(0, 0));
var newHeight = (videoRatio > playerRatio) ? this.ActualHeight : this.ActualWidth * videoRatio;
var newWidth = (videoRatio > playerRatio) ? this.ActualHeight / videoRatio : this.ActualWidth;
//relative to the page
pagePosition = container.TransformToVisual(null).TransformPoint(new Point(0, 0));
//containerGrid.Background = new SolidColorBrush(Colors.Yellow);
_videoView?.SizeAllocate(new((int)pagePosition.X, (int)pagePosition.Y, (int)videoWidth, (int)videoHeight));
}
var root = (_videoContainer.XamlRoot?.Content as UIElement)!;
//_videoView?.SetNaturalSize((int)videoHeight, (int)videoWidth);
_videoContainer.Height = (int)videoHeight;
_videoContainer.Width = (int)videoWidth;
//_videoView?.SizeAllocate(new(0, 0, (int)_videoContainer.Width, (int)_videoContainer.Height));
var topInset = (this.ActualHeight - newHeight) / 2;
var leftInset = (this.ActualWidth - newWidth) / 2;
Point pagePosition = this.TransformToVisual(root).TransformPoint(new Point(leftInset, topInset));
_videoView?.SizeAllocate(new((int)pagePosition.X, (int)pagePosition.Y, (int)newWidth, (int)newHeight));
_videoView?.SetNaturalSize((int)newHeight, (int)newWidth);
Console.WriteLine($"Largura: {width}, Altura: {height}");
}
}
finally
}
finally
{
Interlocked.Exchange(ref _isUpdating, 0);
if (_updatedRequested)
{
_updatedRequested = false;
UpdateVideoStretch();
}
}
});
}

protected override Size ArrangeOverride(Size finalSize)
{
var result = base.ArrangeOverride(finalSize);
UpdateVideoStretch();
return base.ArrangeOverride(finalSize);

return result;
}

//internal void UpdateVideoStretch()
Expand Down
110 changes: 56 additions & 54 deletions src/AddIns/Uno.UI.MediaPlayer.Skia.Gtk/GTKMediaPlayer.events.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

namespace Uno.UI.Media;

public partial class GTKMediaPlayer : Button
public partial class GTKMediaPlayer
{

public event EventHandler<object>? OnSourceFailed;
Expand Down Expand Up @@ -75,58 +75,58 @@ public event EventHandler? TimeUpdated
{
}
}
private void OnLoaded(object sender, object args)
{
//if (this.Log().IsEnabled(LogLevel.Debug))
//{
// this.Log().Debug($"GTKMediaPlayer Loaded");
//}
if (_mediaPlayer != null && _libvlc != null)
{
return;
}
Console.WriteLine("GTKMediaPlayer OnLoaded");
SourceLoaded += OnSourceVideoLoaded;
Console.WriteLine("Creating libvlc");
_libvlc = new LibVLC(enableDebugLogs: false);

Console.WriteLine("Creating player");
_mediaPlayer = new LibVLCSharp.Shared.MediaPlayer(_libvlc);

Console.WriteLine("Creating VideoView");
_videoView = new LibVLCSharp.GTK.VideoView();


_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Console.WriteLine("Set MediaPlayer");
_videoView.MediaPlayer = _mediaPlayer;
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
_videoView.Visible = true;
//_videoView.MediaPlayer = _mediaPlayer;
_mediaPlayer.Stopped += (sender, e) =>
{
_videoView.Visible = false;
};
Console.WriteLine("Content _videoView on Dispatcher");
Content = _videoView;
UpdateVideoStretch();
Console.WriteLine("Created player");
});
});




SourceLoaded += OnHtmlSourceLoaded;
SourceFailed += OnHtmlSourceFailed;
SourceEnded += OnHtmlSourceEnded;
MetadataLoaded += OnHtmlMetadataLoaded;
TimeUpdated += OnHtmlTimeUpdated;
}
//private void OnLoaded(object sender, object args)
//{
// //if (this.Log().IsEnabled(LogLevel.Debug))
// //{
// // this.Log().Debug($"GTKMediaPlayer Loaded");
// //}
// if (_mediaPlayer != null && _libvlc != null)
// {
// return;
// }
// Console.WriteLine("GTKMediaPlayer OnLoaded");
// SourceLoaded += OnSourceVideoLoaded;
// Console.WriteLine("Creating libvlc");
// _libvlc = new LibVLC(enableDebugLogs: false);

// Console.WriteLine("Creating player");
// _mediaPlayer = new LibVLCSharp.Shared.MediaPlayer(_libvlc);

// Console.WriteLine("Creating VideoView");
// _videoView = new LibVLCSharp.GTK.VideoView();


// _ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
// {
// Console.WriteLine("Set MediaPlayer");
// _videoView.MediaPlayer = _mediaPlayer;

// _ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
// {

// _videoView.Visible = true;
// //_videoView.MediaPlayer = _mediaPlayer;
// _mediaPlayer.Stopped += (sender, e) =>
// {
// _videoView.Visible = false;
// };
// Console.WriteLine("Content _videoView on Dispatcher");
// Content = _videoView;
// UpdateVideoStretch();
// Console.WriteLine("Created player");
// });
// });




// SourceLoaded += OnHtmlSourceLoaded;
// SourceFailed += OnHtmlSourceFailed;
// SourceEnded += OnHtmlSourceEnded;
// MetadataLoaded += OnHtmlMetadataLoaded;
// TimeUpdated += OnHtmlTimeUpdated;
//}
private void Initialized()
{
//if (this.Log().IsEnabled(LogLevel.Debug))
Expand Down Expand Up @@ -177,10 +177,12 @@ private void Initialized()
_videoView.MediaPlayer.Media = media;
Console.WriteLine("Content _videoView on Dispatcher");
//_videoContainer.Content = new Border() { Background = new SolidColorBrush(Colors.Red) };
_videoContainer.Content = _videoView;
//_videoContainer.Height = 300;
//_videoContainer.Width = 450;
Content = _videoContainer;
//Child = new Border() { Background = new SolidColorBrush(Colors.Red) };
Child = _videoContainer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public void OnPrepared(object? sender, object what)
//{
// this.Log().Debug($"OnPrepared: {mp.VideoWidth}x{mp.VideoHeight}");
//}
mp.UpdateVideoStretch();
//mp.UpdateVideoStretch();
Events?.RaiseVideoRatioChanged(global::System.Math.Max(1, (double)mp.Ratio));
}
catch { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public MediaPlayerPresenterExtension(object owner)



_player.UpdateVideoStretch();
//_player.UpdateVideoStretch();
}


Expand Down

0 comments on commit 1eee18d

Please sign in to comment.