diff --git a/Media Blocks SDK/MAUI/RTSPViewer/App.xaml b/Media Blocks SDK/MAUI/RTSPViewer/App.xaml
new file mode 100644
index 0000000000..c9c543c1a3
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/App.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/App.xaml.cs b/Media Blocks SDK/MAUI/RTSPViewer/App.xaml.cs
new file mode 100644
index 0000000000..e4a022870c
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/App.xaml.cs
@@ -0,0 +1,12 @@
+namespace RTSPViewer
+{
+ public partial class App : Application
+ {
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/AppShell.xaml b/Media Blocks SDK/MAUI/RTSPViewer/AppShell.xaml
new file mode 100644
index 0000000000..d16b210519
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/AppShell.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/AppShell.xaml.cs b/Media Blocks SDK/MAUI/RTSPViewer/AppShell.xaml.cs
new file mode 100644
index 0000000000..2552ec3404
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/AppShell.xaml.cs
@@ -0,0 +1,10 @@
+namespace RTSPViewer
+{
+ public partial class AppShell : Shell
+ {
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/MainPage.xaml b/Media Blocks SDK/MAUI/RTSPViewer/MainPage.xaml
new file mode 100644
index 0000000000..52e52303ca
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/MainPage.xaml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/MainPage.xaml.cs b/Media Blocks SDK/MAUI/RTSPViewer/MainPage.xaml.cs
new file mode 100644
index 0000000000..ed2086025c
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/MainPage.xaml.cs
@@ -0,0 +1,114 @@
+using System.Diagnostics;
+using VisioForge.Core;
+using VisioForge.Core.MediaBlocks;
+using VisioForge.Core.MediaBlocks.AudioRendering;
+using VisioForge.Core.MediaBlocks.Sources;
+using VisioForge.Core.MediaBlocks.VideoRendering;
+using VisioForge.Core.Types;
+using VisioForge.Core.Types.Events;
+using VisioForge.Core.Types.X.Sources;
+
+namespace RTSPViewer
+{
+ public partial class MainPage : ContentPage
+ {
+ private MediaBlocksPipeline _pipeline;
+
+ private RTSPSourceBlock _rtspSource;
+
+ private MediaBlock _videoRenderer;
+
+ private AudioRendererBlock _audioRenderer;
+
+ public MainPage()
+ {
+ InitializeComponent();
+
+ // We have to initialize the engine on start
+ VisioForgeX.InitSDK();
+ }
+
+ private void CreateEngine()
+ {
+ _pipeline = new MediaBlocksPipeline(true);
+
+ _pipeline.OnError += VideoCapture1_OnError;
+ }
+
+ private async Task DestroyEngineAsync()
+ {
+ if (_pipeline != null)
+ {
+ _pipeline.OnError -= VideoCapture1_OnError;
+
+ await _pipeline.DisposeAsync();
+ _pipeline = null;
+ }
+ }
+
+ private async Task OpenAsync()
+ {
+ CreateEngine();
+
+ var rtsp = await RTSPSourceSettings.CreateAsync(new Uri(edURL.Text), edUsername.Text, edPassword.Text, true);
+ var info = rtsp.GetInfo();
+
+ if (info == null)
+ {
+ await DisplayAlert("Alert", "Unable to get RTSP source info. Please, use the direct RTSP URL, not HTTP ONVIF", "OK");
+ return;
+ }
+
+ _rtspSource = new RTSPSourceBlock(rtsp);
+
+#if __IOS__ && !__MACCATALYST__ || __ANDROID__
+ var vv = videoView.Handler.PlatformView;
+ _videoRenderer = new VideoRendererBlock(_pipeline, (IVideoView)vv);
+#else
+ _videoRenderer = new VideoRendererBlock(_pipeline, videoView);
+#endif
+
+ _pipeline.Connect(_rtspSource.VideoOutput, _videoRenderer.Input);
+
+ if (info.AudioStreams.Count > 0)
+ {
+ _audioRenderer = new AudioRendererBlock();
+ _pipeline.Connect(_rtspSource.AudioOutput, _audioRenderer.Input);
+ }
+
+ await _pipeline.StartAsync();
+ }
+
+ private async Task StopAsync()
+ {
+ if (_pipeline != null)
+ {
+ await _pipeline.StopAsync();
+ }
+
+ await DestroyEngineAsync();
+ }
+
+ private async void btPlay_Clicked(object sender, EventArgs e)
+ {
+ if (btPlay.Text == "PLAY")
+ {
+ btPlay.Text = "STOP";
+
+ await OpenAsync();
+ }
+ else
+ {
+ btPlay.Text = "PLAY";
+
+ await StopAsync();
+ }
+ }
+
+ private void VideoCapture1_OnError(object sender, ErrorsEventArgs e)
+ {
+ Debug.WriteLine(e.Message);
+ }
+ }
+
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/MauiProgram.cs b/Media Blocks SDK/MAUI/RTSPViewer/MauiProgram.cs
new file mode 100644
index 0000000000..ad9003623c
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/MauiProgram.cs
@@ -0,0 +1,29 @@
+using Microsoft.Extensions.Logging;
+using SkiaSharp.Views.Maui.Controls.Hosting;
+using VisioForge.Core.UI.MAUI;
+
+namespace RTSPViewer
+{
+ public static class MauiProgram
+ {
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .UseSkiaSharp()
+ .ConfigureMauiHandlers(handlers => handlers.AddVisioForgeHandlers())
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+#if DEBUG
+ builder.Logging.AddDebug();
+#endif
+
+ return builder.Build();
+ }
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/AndroidManifest.xml b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000000..e9937ad77d
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/MainActivity.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000000..5df1a802a0
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace RTSPViewer
+{
+ [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+ public class MainActivity : MauiAppCompatActivity
+ {
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/MainApplication.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000000..8e8a27148f
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Runtime;
+
+namespace RTSPViewer
+{
+ [Application]
+ public class MainApplication : MauiApplication
+ {
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/Resources/values/colors.xml b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000000..c04d7492ab
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/AppDelegate.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000000..8206c2b0b9
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace RTSPViewer
+{
+ [Register("AppDelegate")]
+ public class AppDelegate : MauiUIApplicationDelegate
+ {
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/Info.plist b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000000..c96dd0a225
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/Program.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000000..a6b2bec032
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace RTSPViewer
+{
+ public class Program
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Tizen/Main.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Tizen/Main.cs
new file mode 100644
index 0000000000..bb3f903986
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Tizen/Main.cs
@@ -0,0 +1,17 @@
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+using System;
+
+namespace RTSPViewer
+{
+ internal class Program : MauiApplication
+ {
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Tizen/tizen-manifest.xml b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 0000000000..622be07115
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/App.xaml b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/App.xaml
new file mode 100644
index 0000000000..96369434ab
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/App.xaml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/App.xaml.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000000..86d48e6d2b
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,25 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace RTSPViewer.WinUI
+{
+ ///
+ /// Provides application-specific behavior to supplement the default Application class.
+ ///
+ public partial class App : MauiWinUIApplication
+ {
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+ }
+
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/Package.appxmanifest b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000000..a550f89c96
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/app.manifest b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/app.manifest
new file mode 100644
index 0000000000..241017b714
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/Windows/app.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/AppDelegate.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000000..8206c2b0b9
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+
+namespace RTSPViewer
+{
+ [Register("AppDelegate")]
+ public class AppDelegate : MauiUIApplicationDelegate
+ {
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/Info.plist b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/Info.plist
new file mode 100644
index 0000000000..0004a4fdee
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/Program.cs b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/Program.cs
new file mode 100644
index 0000000000..a6b2bec032
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Platforms/iOS/Program.cs
@@ -0,0 +1,16 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace RTSPViewer
+{
+ public class Program
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+ }
+}
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Properties/launchSettings.json b/Media Blocks SDK/MAUI/RTSPViewer/Properties/launchSettings.json
new file mode 100644
index 0000000000..edf8aadcc8
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB.csproj b/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB.csproj
new file mode 100644
index 0000000000..9ff804382c
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB.csproj
@@ -0,0 +1,79 @@
+
+
+
+ net7.0-android;net7.0-ios;net7.0-maccatalyst
+ $(TargetFrameworks);net7.0-windows10.0.19041.0
+
+ Exe
+ RTSPViewer
+ true
+ true
+ enable
+
+
+ RTSPViewer
+
+
+ com.companyname.rtspviewer
+ e7f079f0-5512-45fc-a3ca-49a028b42808
+
+
+ 1.0
+ 1
+
+ 11.0
+ 13.1
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB8.csproj b/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB8.csproj
new file mode 100644
index 0000000000..9df94c4c80
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB8.csproj
@@ -0,0 +1,79 @@
+
+
+
+ net8.0-android;net8.0-ios;net8.0-maccatalyst
+ $(TargetFrameworks);net8.0-windows10.0.19041.0
+
+ Exe
+ RTSPViewer
+ true
+ true
+ enable
+
+
+ RTSPViewer
+
+
+ com.companyname.rtspviewer
+ e7f079f0-5512-45fc-a3ca-49a028b42808
+
+
+ 1.0
+ 1
+
+ 11.0
+ 13.1
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB8.csproj.user b/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB8.csproj.user
new file mode 100644
index 0000000000..54c9166c5c
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/RTSPViewerMB8.csproj.user
@@ -0,0 +1,35 @@
+
+
+
+ False
+ net8.0-android
+ Xiaomi 2201117TY (Android 13.0 - API 33)
+ PhysicalDevice
+ Windows Subsystem for Android
+
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+
+
+ Designer
+
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/AppIcon/appicon.svg b/Media Blocks SDK/MAUI/RTSPViewer/Resources/AppIcon/appicon.svg
new file mode 100644
index 0000000000..9d63b6513a
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/AppIcon/appicon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/AppIcon/appiconfg.svg b/Media Blocks SDK/MAUI/RTSPViewer/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 0000000000..21dfb25f18
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Fonts/OpenSans-Regular.ttf b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000000..39b6aff94d
Binary files /dev/null and b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Fonts/OpenSans-Semibold.ttf b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000000..e0d2fa56e1
Binary files /dev/null and b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Images/dotnet_bot.svg b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000000..abfaff26a8
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,93 @@
+
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Raw/AboutAssets.txt b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Raw/AboutAssets.txt
new file mode 100644
index 0000000000..15d6244845
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,15 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Splash/splash.svg b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Splash/splash.svg
new file mode 100644
index 0000000000..21dfb25f18
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Splash/splash.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Styles/Colors.xaml b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Styles/Colors.xaml
new file mode 100644
index 0000000000..245758ba17
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
\ No newline at end of file
diff --git a/Media Blocks SDK/MAUI/RTSPViewer/Resources/Styles/Styles.xaml b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Styles/Styles.xaml
new file mode 100644
index 0000000000..dc4a03475b
--- /dev/null
+++ b/Media Blocks SDK/MAUI/RTSPViewer/Resources/Styles/Styles.xaml
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net7.sln b/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net7.sln
index b3b6f3f47b..3809db7581 100644
--- a/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net7.sln
+++ b/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net7.sln
@@ -3,11 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.31911.260
MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VisioForge.Core.Android.X7", "..\AndroidDependency\VisioForge.Core.Android.X7.csproj", "{FA322D0F-AB1E-429B-9267-C69A86C14FF1}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleCaptureMB", "MAUI\SimpleCapture\SimpleCaptureMB.csproj", "{F9102788-2140-4A5F-970B-5CC507D21810}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplePlayer", "MAUI\SimplePlayer\SimplePlayer.csproj", "{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplePlayerMB", "MAUI\SimplePlayer\SimplePlayerMB.csproj", "{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VisioForge.Core.Android.X7", "..\AndroidDependency\VisioForge.Core.Android.X7.csproj", "{94B61467-8C8C-4E96-9EC4-5A2F244528C3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RTSPViewerMB", "MAUI\RTSPViewer\RTSPViewerMB.csproj", "{2B90B709-A032-4B0B-9D83-E096BFD83859}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {FA322D0F-AB1E-429B-9267-C69A86C14FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FA322D0F-AB1E-429B-9267-C69A86C14FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA322D0F-AB1E-429B-9267-C69A86C14FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FA322D0F-AB1E-429B-9267-C69A86C14FF1}.Release|Any CPU.Build.0 = Release|Any CPU
{F9102788-2140-4A5F-970B-5CC507D21810}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9102788-2140-4A5F-970B-5CC507D21810}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F9102788-2140-4A5F-970B-5CC507D21810}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
@@ -27,10 +33,12 @@ Global
{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}.Release|Any CPU.Build.0 = Release|Any CPU
{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {94B61467-8C8C-4E96-9EC4-5A2F244528C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {94B61467-8C8C-4E96-9EC4-5A2F244528C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {94B61467-8C8C-4E96-9EC4-5A2F244528C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {94B61467-8C8C-4E96-9EC4-5A2F244528C3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2B90B709-A032-4B0B-9D83-E096BFD83859}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2B90B709-A032-4B0B-9D83-E096BFD83859}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2B90B709-A032-4B0B-9D83-E096BFD83859}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {2B90B709-A032-4B0B-9D83-E096BFD83859}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2B90B709-A032-4B0B-9D83-E096BFD83859}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2B90B709-A032-4B0B-9D83-E096BFD83859}.Release|Any CPU.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net8.sln b/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net8.sln
index 88b74d39d6..88450b02db 100644
--- a/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net8.sln
+++ b/Media Blocks SDK/VisioForge.MediaBlocks.Demos.CS MAUI net8.sln
@@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VisioForge.Core.Android.X8"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleCaptureMB8", "MAUI\SimpleCapture\SimpleCaptureMB8.csproj", "{F9102788-2140-4A5F-970B-5CC507D21810}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplePlayer8", "MAUI\SimplePlayer\SimplePlayer8.csproj", "{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplePlayerMB8", "MAUI\SimplePlayer\SimplePlayerMB8.csproj", "{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RTSPViewerMB8", "MAUI\RTSPViewer\RTSPViewerMB8.csproj", "{2DA8BD79-846C-4794-B932-31BE44386930}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -31,6 +33,12 @@ Global
{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}.Release|Any CPU.Build.0 = Release|Any CPU
{F36827D8-D7C8-470D-9CA0-D0C611F1E1CA}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {2DA8BD79-846C-4794-B932-31BE44386930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2DA8BD79-846C-4794-B932-31BE44386930}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2DA8BD79-846C-4794-B932-31BE44386930}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {2DA8BD79-846C-4794-B932-31BE44386930}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2DA8BD79-846C-4794-B932-31BE44386930}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2DA8BD79-846C-4794-B932-31BE44386930}.Release|Any CPU.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Media Blocks SDK/WPF/CSharp/RTSP Preview Demo/Window1.xaml.cs b/Media Blocks SDK/WPF/CSharp/RTSP Preview Demo/Window1.xaml.cs
index aba0a4aab3..d3d3fef675 100644
--- a/Media Blocks SDK/WPF/CSharp/RTSP Preview Demo/Window1.xaml.cs
+++ b/Media Blocks SDK/WPF/CSharp/RTSP Preview Demo/Window1.xaml.cs
@@ -100,6 +100,13 @@ private async void btStart_Click(object sender, RoutedEventArgs e)
_pipeline.Debug_Dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "VisioForge");
var rtsp = await RTSPSourceSettings.CreateAsync(new Uri(cbIPURL.Text), edIPLogin.Text, edIPPassword.Text, audioEnabled);
+ var info = rtsp.GetInfo();
+
+ if (info == null)
+ {
+ MessageBox.Show(this, "Unable to get RTSP source info. Please, use the direct RTSP URL, not HTTP ONVIF");
+ return;
+ }
_rtspSource = new RTSPSourceBlock(rtsp);
@@ -107,7 +114,7 @@ private async void btStart_Click(object sender, RoutedEventArgs e)
_pipeline.Connect(_rtspSource.VideoOutput, _videoRenderer.Input);
- if (audioEnabled && rtsp.GetInfo().AudioStreams.Count > 0)
+ if (audioEnabled && info.AudioStreams.Count > 0)
{
_audioRenderer = new AudioRendererBlock();
_pipeline.Connect(_rtspSource.AudioOutput, _audioRenderer.Input);