/* StreamViewer.xaml.cs/Open GoPro, Version 2.0 (C) Copyright 2021 GoPro, Inc. (http://gopro.com/OpenGoPro). */
/* This copyright was auto-generated on Wed Oct 20 21:41:18 UTC 2021 */
using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
namespace GoProWebcamViewer
{
enum Status
{
SUCCESS,
FAILURE
}
///
/// Interaction logic for StreamViewer.xaml
///
public partial class StreamViewer : Window, INotifyPropertyChanged
{
bool bQuit = false;
bool zoomMan = false;
private string playerEnabledText, webcamEnabledText, previewEnabledText;
private bool playerEnabled
{
get { return playerEnabledText == "enabled" ? true : false; }
set
{
playerEnabledText = value == true ? "enabled" : "disabled";
UpdateStatusBar();
}
}
private bool webcamEnabled
{
get { return webcamEnabledText == "enabled" ? true : false; }
set
{
webcamEnabledText = value == true ? "enabled" : "disabled";
UpdateStatusBar();
}
}
private bool previewEnabled
{
get { return previewEnabledText == "enabled" ? true : false; }
set
{
previewEnabledText = value == true ? "enabled" : "disabled";
UpdateStatusBar();
}
}
private string ipaddr = "unknown";
public event PropertyChangedEventHandler PropertyChanged;
public string IPAddr
{
get { return ipaddr; }
set
{
ipaddr = value;
OnPropertyChanged("IPAddr");
}
}
public StreamViewer()
{
InitializeComponent();
this.Top = Properties.Settings.Default.FTop;
this.Left = Properties.Settings.Default.FLeft;
this.Height = Properties.Settings.Default.FHeight;
this.Width = Properties.Settings.Default.FWidth;
if (this.Height == 0)
{
this.Height = 600;
this.Width = 800;
}
ipaddr = Properties.Settings.Default.IPAddress;
this.txtIPAddr.Text = ipaddr;
DataContext = this;
var vlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine("./", "libvlc", IntPtr.Size == 4 ? "win-x86" : "win-x64"));
var options = new string[]
{
// VLC options can be given here. Please refer to the VLC command line documentation.
};
mPlayer.SourceProvider.CreatePlayer(vlcLibDirectory, options);
new Timer(IPAddrCheck, this, 50, 10000);
playerEnabled = false;
webcamEnabled = false;
previewEnabled = false;
}
private void Log(string text)
{
Dispatcher.Invoke((Action)delegate ()
{ /* update UI */
this.txtGeneral.Text += text;
});
}
private void UpdateStatusBar()
{
Dispatcher.Invoke((Action)delegate ()
{ /* update UI */
this.txtStatusBar.Text = $"Player: {playerEnabledText,-20}Webcam: {webcamEnabledText,-20}Preview: {previewEnabledText,-20}";
});
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
bQuit = true;
ThreadPool.QueueUserWorkItem(_ => mPlayer.SourceProvider.MediaPlayer.Stop());
if (WindowState == WindowState.Maximized)
{
// Use the RestoreBounds as the current values will be 0, 0 and the size of the screen
Properties.Settings.Default.FTop = RestoreBounds.Top;
Properties.Settings.Default.FLeft = RestoreBounds.Left;
Properties.Settings.Default.FHeight = RestoreBounds.Height;
Properties.Settings.Default.FWidth = RestoreBounds.Width;
}
else
{
Properties.Settings.Default.FTop = this.Top;
Properties.Settings.Default.FLeft = this.Left;
Properties.Settings.Default.FHeight = this.Height;
Properties.Settings.Default.FWidth = this.Width;
}
Properties.Settings.Default.IPAddress = ipaddr;
Properties.Settings.Default.Save();
}
private Status SendHTTPRequest(string endpoint)
{
Status status = Status.FAILURE;
if (ipaddr == "not found")
return status;
string responseString;
string requestString = "http://" + ipaddr + ":8080/gopro/" + endpoint;
HttpWebResponse resp;
HttpWebRequest req = HttpWebRequest.CreateHttp(requestString);
req.Method = "GET";
req.KeepAlive = false;
try
{
Log(requestString + " ==> \n");
resp = (HttpWebResponse)req.GetResponse();
responseString = new StreamReader(resp.GetResponseStream()).ReadToEnd();
resp.Close();
status = Status.SUCCESS;
}
catch (WebException ep)
{
responseString = "Failed url " + endpoint + ": " + ep.Message;
HttpWebResponse respy = (HttpWebResponse)ep.Response;
if (respy != null)
{
responseString = new StreamReader(respy.GetResponseStream()).ReadToEnd();
}
}
if (!bQuit)
{
Log(responseString);
}
return status;
}
private Status SetSetting(int id, int value)
{
return SendHTTPRequest("camera/setting?setting=" + id.ToString() + "&option=" + value.ToString());
}
private void btnStatusStream_Click(object sender, RoutedEventArgs e)
{
SendHTTPRequest("webcam/status");
}
private void btnClearText_Click(object sender, RoutedEventArgs e)
{
txtGeneral.Clear();
txtStatusBar.Text = "";
}
private void HideStream()
{
ThreadPool.QueueUserWorkItem(_ => mPlayer.SourceProvider.MediaPlayer.Stop());
playerEnabled = false;
}
private void sldZoom_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
if (!zoomMan)
{
SendHTTPRequest("camera/digital_zoom?percent=" + Convert.ToInt32(sldZoom.Value));
}
}
private void Thumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
{
zoomMan = true;
}
private void Thumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
zoomMan = false;
SendHTTPRequest("camera/digital_zoom?percent=" + Convert.ToInt32(sldZoom.Value));
}
private void btnFOV_Click(object sender, RoutedEventArgs e)
{
int value = Convert.ToInt32(((ComboBoxItem)cmbFOV.SelectedItem).Content.ToString());
SetSetting(43, value);
}
private void txtIPAddr_TextChanged(object sender, TextChangedEventArgs e)
{
ipaddr = txtIPAddr.Text;
}
private void IPAddrCheck(object state)
{
String strHostName = Dns.GetHostName();
bool found = false;
// Find host by name
IPHostEntry iphostentry = Dns.GetHostEntry(strHostName);
// Enumerate IP addresses
foreach (IPAddress ipaddress in iphostentry.AddressList)
{
if (ipaddress.AddressFamily == AddressFamily.InterNetwork)
{
byte[] abytes = ipaddress.GetAddressBytes();
if (abytes[0] == 172 && abytes[1] >= 20 && abytes[1] <= 29 && abytes[3] >= 50 && abytes[3] <= 70)
{
ipaddr = ipaddress.ToString();
StringBuilder sb = new StringBuilder(ipaddress.ToString());
sb[ipaddress.ToString().Length - 1] = '1';
IPAddr = sb.ToString();
found = true;
break;
}
}
}
if (!found)
IPAddr = "not found";
}
protected void OnPropertyChanged(string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private void btnPreview_Click(object sender, RoutedEventArgs e)
{
if (SendHTTPRequest("webcam/preview") == Status.SUCCESS)
{
btnFOV.IsEnabled = true;
sldZoom.IsEnabled = true;
previewEnabled = true;
webcamEnabled = false;
}
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
if (SendHTTPRequest("webcam/start") == Status.SUCCESS)
{
btnFOV.IsEnabled = false;
sldZoom.IsEnabled = false;
webcamEnabled = true;
previewEnabled = false;
}
}
private void btnStop_Click(object sender, RoutedEventArgs e)
{
if (SendHTTPRequest("webcam/stop") == Status.SUCCESS)
{
HideStream();
btnFOV.IsEnabled = false;
sldZoom.IsEnabled = false;
webcamEnabled = false;
}
}
private void btnExit_Click(object sender, RoutedEventArgs e)
{
if (SendHTTPRequest("webcam/exit") == Status.SUCCESS)
{
HideStream();
btnFOV.IsEnabled = false;
sldZoom.IsEnabled = false;
webcamEnabled = false;
previewEnabled = false;
}
}
private void btnStartPlayer_Click(object sender, RoutedEventArgs e)
{
Log("Starting video player...\n");
ThreadPool.QueueUserWorkItem(_ =>
{
mPlayer.SourceProvider.MediaPlayer.Play(new Uri("udp://@0.0.0.0:8554", UriKind.Absolute), new string[] { "--network-caching=10", "--no-audio" });
});
playerEnabled = true;
}
private void btnStopPlayer_Click(object sender, RoutedEventArgs e)
{
Log("Stopping video player...\n");
HideStream();
}
private void btnMute_Click(object sender, RoutedEventArgs e)
{
Log("Toggling mute...\n");
ThreadPool.QueueUserWorkItem(_ => mPlayer.SourceProvider.MediaPlayer.Audio.ToggleMute());
}
}
}