/*****************************************************************************
* streamout.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: streamout.cpp,v 1.9 2003/05/12 17:33:19 gbazin Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
#include <stdio.h>
#include <vlc/vlc.h>
+#include <vlc/intf.h>
-#ifdef WIN32 /* mingw32 hack */
-#undef Yield
-#undef CreateDialog
-#endif
-
-/* Let vlc take care of the i18n stuff */
-#define WXINTL_NO_GETTEXT_MACRO
-
-#include <wx/wxprec.h>
-#include <wx/wx.h>
-#include <wx/notebook.h>
-#include <wx/textctrl.h>
+#include "wxwindows.h"
#include <wx/combobox.h>
-#include <wx/spinctrl.h>
#include <wx/statline.h>
-#include <vlc/intf.h>
-
-#if defined MODULE_NAME_IS_skins
-# include "../skins/src/skin_common.h"
-#endif
-
-#include "wxwindows.h"
+#include "streamdata.h"
#ifndef wxRB_SINGLE
# define wxRB_SINGLE 0
#endif
-enum
-{
- FILE_ACCESS_OUT = 0,
- HTTP_ACCESS_OUT,
- UDP_ACCESS_OUT,
- RTP_ACCESS_OUT
-};
-
-enum
-{
- TS_ENCAPSULATION = 0,
- PS_ENCAPSULATION,
- AVI_ENCAPSULATION,
- OGG_ENCAPSULATION
-};
-
/*****************************************************************************
* Event Table.
*****************************************************************************/
FileBrowse_Event,
FileName_Event,
+ FileDump_Event,
- AccessType_Event,
- AccessRadio1_Event, AccessRadio2_Event,
- AccessRadio3_Event, AccessRadio4_Event,
- NetPort_Event,
- NetAddr_Event,
+ AccessType1_Event, AccessType2_Event, AccessType3_Event,
+ AccessType4_Event, AccessType5_Event, AccessType6_Event,
+ NetPort1_Event, NetPort2_Event, NetPort3_Event, NetPort4_Event,
+ NetAddr1_Event, NetAddr2_Event, NetAddr3_Event, NetAddr4_Event,
EncapsulationRadio1_Event, EncapsulationRadio2_Event,
EncapsulationRadio3_Event, EncapsulationRadio4_Event,
+ EncapsulationRadio5_Event, EncapsulationRadio6_Event,
+ EncapsulationRadio7_Event, EncapsulationRadio8_Event,
+ EncapsulationRadio9_Event,
+
+ VideoTranscEnable_Event, VideoTranscCodec_Event, VideoTranscBitrate_Event,
+ VideoTranscScale_Event,
+ AudioTranscEnable_Event, AudioTranscCodec_Event, AudioTranscBitrate_Event,
+ AudioTranscChans_Event,
+
+ SAPMisc_Event, SLPMisc_Event, AnnounceAddr_Event
};
BEGIN_EVENT_TABLE(SoutDialog, wxDialog)
EVT_BUTTON(wxID_CANCEL, SoutDialog::OnCancel)
/* Events generated by the access output panel */
- EVT_RADIOBUTTON(AccessRadio1_Event, SoutDialog::OnAccessTypeChange)
- EVT_RADIOBUTTON(AccessRadio2_Event, SoutDialog::OnAccessTypeChange)
- EVT_RADIOBUTTON(AccessRadio3_Event, SoutDialog::OnAccessTypeChange)
- EVT_RADIOBUTTON(AccessRadio4_Event, SoutDialog::OnAccessTypeChange)
+ EVT_CHECKBOX(AccessType1_Event, SoutDialog::OnAccessTypeChange)
+ EVT_CHECKBOX(AccessType2_Event, SoutDialog::OnAccessTypeChange)
+ EVT_CHECKBOX(AccessType3_Event, SoutDialog::OnAccessTypeChange)
+ EVT_CHECKBOX(AccessType4_Event, SoutDialog::OnAccessTypeChange)
+ EVT_CHECKBOX(AccessType5_Event, SoutDialog::OnAccessTypeChange)
+ EVT_CHECKBOX(AccessType6_Event, SoutDialog::OnAccessTypeChange)
EVT_TEXT(FileName_Event, SoutDialog::OnFileChange)
EVT_BUTTON(FileBrowse_Event, SoutDialog::OnFileBrowse)
- EVT_TEXT(NetPort_Event, SoutDialog::OnNetChange)
- EVT_SPINCTRL(NetPort_Event, SoutDialog::OnNetChange)
- EVT_TEXT(NetAddr_Event, SoutDialog::OnNetChange)
-
+ EVT_CHECKBOX(FileDump_Event, SoutDialog::OnFileDump)
+
+ EVT_TEXT(NetPort1_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetAddr1_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetPort2_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetAddr2_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetPort3_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetAddr3_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetPort4_Event, SoutDialog::OnNetChange)
+ EVT_TEXT(NetAddr4_Event, SoutDialog::OnNetChange)
+
/* Events generated by the encapsulation panel */
EVT_RADIOBUTTON(EncapsulationRadio1_Event,
SoutDialog::OnEncapsulationChange)
SoutDialog::OnEncapsulationChange)
EVT_RADIOBUTTON(EncapsulationRadio4_Event,
SoutDialog::OnEncapsulationChange)
+ EVT_RADIOBUTTON(EncapsulationRadio5_Event,
+ SoutDialog::OnEncapsulationChange)
+ EVT_RADIOBUTTON(EncapsulationRadio6_Event,
+ SoutDialog::OnEncapsulationChange)
+ EVT_RADIOBUTTON(EncapsulationRadio7_Event,
+ SoutDialog::OnEncapsulationChange)
+ EVT_RADIOBUTTON(EncapsulationRadio8_Event,
+ SoutDialog::OnEncapsulationChange)
+ EVT_RADIOBUTTON(EncapsulationRadio9_Event,
+ SoutDialog::OnEncapsulationChange)
+
+ /* Events generated by the transcoding panel */
+ EVT_CHECKBOX(VideoTranscEnable_Event, SoutDialog::OnTranscodingEnable)
+ EVT_CHECKBOX(AudioTranscEnable_Event, SoutDialog::OnTranscodingEnable)
+ EVT_COMBOBOX(VideoTranscCodec_Event, SoutDialog::OnTranscodingChange)
+ EVT_TEXT(VideoTranscCodec_Event, SoutDialog::OnTranscodingChange)
+ EVT_COMBOBOX(AudioTranscCodec_Event, SoutDialog::OnTranscodingChange)
+ EVT_TEXT(AudioTranscCodec_Event, SoutDialog::OnTranscodingChange)
+ EVT_COMBOBOX(VideoTranscBitrate_Event, SoutDialog::OnTranscodingChange)
+ EVT_TEXT(VideoTranscBitrate_Event, SoutDialog::OnTranscodingChange)
+ EVT_COMBOBOX(AudioTranscBitrate_Event, SoutDialog::OnTranscodingChange)
+ EVT_TEXT(AudioTranscBitrate_Event, SoutDialog::OnTranscodingChange)
+ EVT_COMBOBOX(VideoTranscScale_Event, SoutDialog::OnTranscodingChange)
+ EVT_TEXT(VideoTranscScale_Event, SoutDialog::OnTranscodingChange)
+ EVT_COMBOBOX(AudioTranscChans_Event, SoutDialog::OnTranscodingChange)
+ EVT_TEXT(AudioTranscChans_Event, SoutDialog::OnTranscodingChange)
+
+ /* Events generated by the misc panel */
+ EVT_CHECKBOX(SAPMisc_Event, SoutDialog::OnSAPMiscChange)
+ EVT_CHECKBOX(SLPMisc_Event, SoutDialog::OnSLPMiscChange)
+ EVT_TEXT(AnnounceAddr_Event, SoutDialog::OnAnnounceAddrChange)
END_EVENT_TABLE()
wxHORIZONTAL );
wxStaticText *mrl_label = new wxStaticText( panel, -1,
wxU(_("Destination Target:")));
- mrl_combo = new wxComboBox( panel, MRL_Event, mrl,
+ mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
wxPoint(20,25), wxSize(120, -1), 0, NULL );
mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
"the full MRL you want to open.\n""Alternatively, the field will be "
/* Create the access output panel */
access_panel = AccessPanel( panel );
+ /* Create the transcoding panel */
+ transcoding_panel = TranscodingPanel( panel );
+
+ /* Create the Misc panel */
+ misc_panel = MiscPanel( panel );
+
/* Separation */
wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
panel_sizer->Add( access_panel, 1, wxEXPAND | wxALL, 5 );
panel_sizer->Add( encapsulation_panel, 0, wxEXPAND | wxALL, 5 );
+ panel_sizer->Add( transcoding_panel, 0, wxEXPAND | wxALL, 5 );
+ panel_sizer->Add( misc_panel, 0, wxEXPAND | wxALL, 5 );
panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
wxALL, 5 );
main_sizer->Add( panel, 1, wxGROW, 0 );
main_sizer->Layout();
SetSizerAndFit( main_sizer );
-
- /* Update all the values */
- ParseMRL();
}
SoutDialog::~SoutDialog()
{
}
+wxArrayString SoutDialog::GetOptions()
+{
+ return SeparateEntries( mrl_combo->GetValue() );
+}
+
/*****************************************************************************
* Private methods.
*****************************************************************************/
void SoutDialog::UpdateMRL()
{
- wxString encapsulation;
+ /* Check the demux dump option */
+ if( dump_checkbox->IsChecked() )
+ {
+ wxString dumpfile;
+
+ if( file_combo->GetValue().size() )
+ dumpfile = wxT(" :demuxdump-file=\"") +
+ file_combo->GetValue() + wxT("\"");
+ mrl_combo->SetValue( wxT(":demux=demuxdump") + dumpfile );
+
+ return;
+ }
+ /* Let's start with the transcode options */
+ wxString transcode;
+ if( video_transc_checkbox->IsChecked() ||
+ audio_transc_checkbox->IsChecked() )
+ {
+ transcode = wxT("transcode{");
+ if( video_transc_checkbox->IsChecked() )
+ {
+ transcode += wxT("vcodec=") + video_codec_combo->GetValue();
+ transcode += wxT(",vb=") + video_bitrate_combo->GetValue();
+ transcode += wxT(",scale=") + video_scale_combo->GetValue();
+ if( audio_transc_checkbox->IsChecked() ) transcode += wxT(",");
+ }
+ if( audio_transc_checkbox->IsChecked() )
+ {
+ transcode += wxT("acodec=") + audio_codec_combo->GetValue();
+ transcode += wxT(",ab=") + audio_bitrate_combo->GetValue();
+ transcode += wxT(",channels=") + audio_channels_combo->GetValue();
+ }
+ transcode += wxT("}");
+ }
+
+ /* Encapsulation */
+ wxString encapsulation;
switch( i_encapsulation_type )
{
case PS_ENCAPSULATION:
- encapsulation = wxT("/ps");
+ encapsulation = wxT("ps");
+ break;
+ case MPEG1_ENCAPSULATION:
+ encapsulation = wxT("mpeg1");
break;
case AVI_ENCAPSULATION:
- encapsulation = wxT("/avi");
+ encapsulation = wxT("avi");
break;
case OGG_ENCAPSULATION:
- encapsulation = wxT("/ogg");
+ encapsulation = wxT("ogg");
+ break;
+ case RAW_ENCAPSULATION:
+ encapsulation = wxT("raw");
+ break;
+ case MP4_ENCAPSULATION:
+ encapsulation = wxT("mp4");
+ break;
+ case MOV_ENCAPSULATION:
+ encapsulation = wxT("mov");
+ break;
+ case ASF_ENCAPSULATION:
+ encapsulation = wxT("asf");
break;
case TS_ENCAPSULATION:
default:
- encapsulation = wxT("/ts");
+ encapsulation = wxT("ts");
break;
}
- switch( i_access_type )
+ /* Now continue with the duplicate option */
+ wxString dup_opts;
+ if( access_checkboxes[PLAY_ACCESS_OUT]->IsChecked() )
{
- case FILE_ACCESS_OUT:
- mrl = wxT("file") + encapsulation + wxT(":") + file_combo->GetValue();
- break;
+ dup_opts += wxT("dst=display");
+ }
+ if( access_checkboxes[FILE_ACCESS_OUT]->IsChecked() )
+ {
+ if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+ dup_opts += wxT("dst=std{access=file,mux=");
+ dup_opts += encapsulation + wxT(",url=\"");
+ dup_opts += file_combo->GetValue() + wxT("\"}");
+ }
+ if( access_checkboxes[HTTP_ACCESS_OUT]->IsChecked() )
+ {
+ if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+ dup_opts += wxT("dst=std{access=http,mux=");
+ dup_opts += encapsulation + wxT(",url=");
+ dup_opts += net_addrs[HTTP_ACCESS_OUT]->GetLineText(0);
+ dup_opts += wxString::Format( wxT(":%d"),
+ net_ports[HTTP_ACCESS_OUT]->GetValue() );
+ dup_opts += wxT("}");
+ }
+ if( access_checkboxes[MMSH_ACCESS_OUT]->IsChecked() )
+ {
+ if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+ dup_opts += wxT("dst=std{access=mmsh,mux=");
+ dup_opts += encapsulation;
+ if( i_encapsulation_type == ASF_ENCAPSULATION ) dup_opts += wxT("h");
+ dup_opts += wxT(",url=");
+ dup_opts += net_addrs[HTTP_ACCESS_OUT]->GetLineText(0);
+ dup_opts += wxString::Format( wxT(":%d"),
+ net_ports[MMSH_ACCESS_OUT]->GetValue() );
+ dup_opts += wxT("}");
+ }
+ if( access_checkboxes[UDP_ACCESS_OUT]->IsChecked() )
+ {
+ if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+ dup_opts += wxT("dst=std{access=udp,mux=");
+ dup_opts += encapsulation + wxT(",url=");
- case HTTP_ACCESS_OUT:
- mrl = wxT("http") + encapsulation + wxT(":") + net_addr->GetLineText(0)
- + wxString::Format( wxT(":%d"), net_port->GetValue() );
- break;
+ wxString udp_addr = net_addrs[UDP_ACCESS_OUT]->GetLineText(0);
+ if ((udp_addr[0u] != '[') && (udp_addr.Find(':') != -1))
+ {
+ dup_opts += wxT ("[") + udp_addr + wxT ("]");
+ }
+ else
+ {
+ dup_opts += udp_addr;
+ }
+ dup_opts += wxString::Format( wxT(":%d"),
+ net_ports[UDP_ACCESS_OUT]->GetValue() );
- case UDP_ACCESS_OUT:
- case RTP_ACCESS_OUT:
- mrl = ( i_access_type == UDP_ACCESS_OUT ) ? wxT("udp") : wxT("rtp");
- mrl += encapsulation + wxT(":") + net_addr->GetLineText(0);
- if( net_port->GetValue() != config_GetInt( p_intf, "server-port" ) )
+ /* SAP only if UDP */
+ if( sap_checkbox->IsChecked() )
{
- mrl += wxString::Format( wxT(":%d"), net_port->GetValue() );
+ dup_opts += wxT(",sap");
+ if( ! announce_addr->GetLineText(0).IsEmpty() )
+ {
+ dup_opts += wxT(",name=\"");
+ dup_opts += announce_addr->GetLineText(0);
+ dup_opts += wxT("\"");
+ }
}
- break;
+
+ /* SLP only if UDP */
+ if( slp_checkbox->IsChecked() )
+ {
+ dup_opts += wxT(",slp");
+ if( ! sap_checkbox->IsChecked() &&
+ ! announce_addr->GetLineText(0).IsEmpty() )
+ {
+ dup_opts += wxT(",name=\"");
+ dup_opts += announce_addr->GetLineText(0);
+ dup_opts += wxT("\"");
+ }
+ }
+
+ dup_opts += wxT("}");
+ }
+ if( access_checkboxes[RTP_ACCESS_OUT]->IsChecked() )
+ {
+ if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+ dup_opts += wxT("dst=std{access=rtp,mux=");
+ dup_opts += encapsulation + wxT(",url=");
+ dup_opts += net_addrs[RTP_ACCESS_OUT]->GetLineText(0);
+ dup_opts += wxString::Format( wxT(":%d"),
+ net_ports[RTP_ACCESS_OUT]->GetValue() );
+ dup_opts += wxT("}");
+ }
+
+ wxString duplicate;
+ if( !dup_opts.IsEmpty() )
+ {
+ if( !transcode.IsEmpty() ) duplicate = wxT(":");
+ duplicate += wxT("duplicate{") + dup_opts + wxT("}");
}
- mrl_combo->SetValue( mrl );
+ if( !transcode.IsEmpty() || !duplicate.IsEmpty() )
+ mrl_combo->SetValue( wxT(":sout=#") + transcode + duplicate );
+ else
+ mrl_combo->SetValue( wxT("") );
}
wxPanel *SoutDialog::AccessPanel( wxWindow* parent )
wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
wxSize(200, 200) );
- wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 4, 20 );
wxStaticBox *panel_box = new wxStaticBox( panel, -1,
- wxU(_("Output Method")) );
+ wxU(_("Output methods")) );
wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
- wxHORIZONTAL );
+ wxVERTICAL );
+ wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 4, 20 );
static const wxString access_output_array[] =
{
+ wxU(_("Play locally")),
wxU(_("File")),
wxU(_("HTTP")),
+ wxU(_("MMSH")),
wxU(_("UDP")),
wxU(_("RTP"))
};
- for( i=0; i<4; i++ )
+ for( i=0; i < ACCESS_OUT_NUM; i++ )
{
- access_radios[i] = new wxRadioButton( panel, AccessRadio1_Event + i,
- access_output_array[i],
- wxDefaultPosition, wxDefaultSize,
- wxRB_SINGLE );
-
- access_subpanels[i] = new wxPanel( panel, -1,
- wxDefaultPosition, wxDefaultSize );
+ access_checkboxes[i] = new wxCheckBox( panel, AccessType1_Event + i,
+ access_output_array[i] );
+ access_subpanels[i] = new wxPanel( panel, -1 );
}
- /* File row */
+ /* Play locally row */
wxFlexGridSizer *subpanel_sizer;
wxStaticText *label;
- subpanel_sizer = new wxFlexGridSizer( 3, 1, 20 );
- label = new wxStaticText( access_subpanels[0], -1, wxU(_("Filename")) );
- file_combo = new wxComboBox( access_subpanels[0], FileName_Event, wxT(""),
+ label = new wxStaticText( access_subpanels[0], -1, wxT("") );
+ subpanel_sizer = new wxFlexGridSizer( 1, 1, 20 );
+ subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ access_subpanels[0]->SetSizerAndFit( subpanel_sizer );
+ access_subpanels[0]->Hide();
+
+ /* File row */
+ subpanel_sizer = new wxFlexGridSizer( 3, 2, 20 );
+ label = new wxStaticText( access_subpanels[1], -1, wxU(_("Filename")) );
+ file_combo = new wxComboBox( access_subpanels[1], FileName_Event, wxT(""),
wxPoint(20,25), wxSize(200, -1), 0, NULL );
- wxButton *browse_button = new wxButton( access_subpanels[0],
+ wxButton *browse_button = new wxButton( access_subpanels[1],
FileBrowse_Event, wxU(_("Browse...")) );
subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
subpanel_sizer->Add( file_combo, 1,
wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
subpanel_sizer->Add( browse_button, 0,
wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+ subpanel_sizer->Add( new wxPanel(access_subpanels[1], -1), 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ dump_checkbox = new wxCheckBox( access_subpanels[1], FileDump_Event,
+ wxU(_("Dump raw input")) );
+ subpanel_sizer->Add( dump_checkbox, 0,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxTOP, 5 );
- access_subpanels[0]->SetSizerAndFit( subpanel_sizer );
+ access_subpanels[1]->SetSizerAndFit( subpanel_sizer );
- /* Net row */
- subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
- label = new wxStaticText( access_subpanels[2], -1, wxU(_("Address")) );
- net_addr = new wxTextCtrl( access_subpanels[2], NetAddr_Event, wxT(""),
- wxDefaultPosition, wxSize( 200, -1 ),
- wxTE_PROCESS_ENTER);
- subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
- subpanel_sizer->Add( net_addr, 1,
- wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+ /* Net rows */
+ for( i = HTTP_ACCESS_OUT; i < ACCESS_OUT_NUM; i++ )
+ {
+ subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
+ label = new wxStaticText( access_subpanels[i], -1, wxU(_("Address")) );
+ net_addrs[i] = new wxTextCtrl( access_subpanels[i],
+ NetAddr1_Event + i - HTTP_ACCESS_OUT,
+ wxT(""), wxDefaultPosition,
+ wxSize( 200, -1 ), wxTE_PROCESS_ENTER);
+ subpanel_sizer->Add( label, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ subpanel_sizer->Add( net_addrs[i], 1, wxEXPAND |
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+
+ int val = config_GetInt( p_intf, "server-port" );
+ label = new wxStaticText( access_subpanels[i], -1, wxU(_("Port")) );
+ net_ports[i] = new wxSpinCtrl( access_subpanels[i],
+ NetPort1_Event + i - HTTP_ACCESS_OUT,
+ wxString::Format(wxT("%d"), val),
+ wxDefaultPosition, wxDefaultSize,
+ wxSP_ARROW_KEYS,
+ 0, 16000, val );
+
+ subpanel_sizer->Add( label, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ subpanel_sizer->Add( net_ports[i], 0,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+
+ access_subpanels[i]->SetSizerAndFit( subpanel_sizer );
+ }
- int val = config_GetInt( p_intf, "server-port" );
- label = new wxStaticText( access_subpanels[2], -1, wxU(_("Port")) );
- net_port = new wxSpinCtrl( access_subpanels[2], NetPort_Event,
- wxString::Format(wxT("%d"), val),
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS,
- 0, 16000, val );
- subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
- subpanel_sizer->Add( net_port, 0,
- wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+ /* Stuff everything into the main panel */
+ for( i=1; i < ACCESS_OUT_NUM; i++ )
+ {
+ sizer->Add( access_checkboxes[i], 0,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ sizer->Add( access_subpanels[i], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL
+ | wxALIGN_LEFT | wxALL, 5 );
+ }
- access_subpanels[2]->SetSizerAndFit( subpanel_sizer );
+ panel_sizer->Add( access_checkboxes[0], 0,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ panel_sizer->Add( sizer, 1, wxEXPAND | wxTOP, 3 );
+ panel->SetSizerAndFit( panel_sizer );
- /* Stuff everything into the main panel */
- for( i=0; i<4; i++ )
+ /* Update access type panel */
+ for( i=1; i < ACCESS_OUT_NUM; i++ )
{
- sizer->Add( access_radios[i], 0,
- wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
- sizer->Add( access_subpanels[i], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL
- | wxALIGN_LEFT );
+ access_subpanels[i]->Disable();
}
- panel_sizer->Add( sizer, 1, wxEXPAND, 0 );
+ return panel;
+}
+
+wxPanel *SoutDialog::MiscPanel( wxWindow* parent )
+{
+ wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+ wxSize(200, 200) );
+
+ wxStaticBox *panel_box = new wxStaticBox( panel, -1,
+ wxU(_("Miscellaneous options")) );
+ wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
+ wxVERTICAL );
+
+ /* Announce Row */
+ misc_subpanels[ANN_MISC_SOUT] = new wxPanel( panel, -1 );
+ wxFlexGridSizer *subpanel_sizer = new wxFlexGridSizer( 4, 4, 20 );
+
+ sap_checkbox = new wxCheckBox( misc_subpanels[ANN_MISC_SOUT],SAPMisc_Event,
+ wxU(_("SAP announce")) );
+ slp_checkbox = new wxCheckBox( misc_subpanels[ANN_MISC_SOUT],SLPMisc_Event,
+ wxU(_("SLP announce")) );
+
+ wxStaticText *label = new wxStaticText( misc_subpanels[ANN_MISC_SOUT], -1,
+ wxU(_("Channel name")) );
+ announce_addr = new wxTextCtrl( misc_subpanels[ANN_MISC_SOUT],
+ AnnounceAddr_Event,
+ wxT(""), wxDefaultPosition,
+ wxSize( 200, -1 ), wxTE_PROCESS_ENTER);
+
+ subpanel_sizer->Add( sap_checkbox, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ subpanel_sizer->Add( slp_checkbox, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ subpanel_sizer->Add( announce_addr, 1, wxEXPAND |
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+
+ misc_subpanels[ANN_MISC_SOUT]->SetSizerAndFit( subpanel_sizer );
+
+ /* Stuff everything into the main panel */
+ panel_sizer->Add( misc_subpanels[ANN_MISC_SOUT], 1,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
panel->SetSizerAndFit( panel_sizer );
+ /* Update misc panel */
+ misc_subpanels[ANN_MISC_SOUT]->Disable();
+ announce_addr->Disable();
+
return panel;
}
static const wxString encapsulation_array[] =
{
- wxU(_("MPEG TS")),
- wxU(_("MPEG PS")),
- wxU(_("AVI")),
- wxU(_("Ogg"))
+ wxT("MPEG TS"),
+ wxT("MPEG PS"),
+ wxT("MPEG 1"),
+ wxT("Ogg"),
+ wxT("Raw"),
+ wxT("ASF"),
+ wxT("AVI"),
+ wxT("MP4"),
+ wxT("MOV")
};
/* Stuff everything into the main panel */
- for( i=0; i<4; i++ )
+ for( i=0; i < ENCAPS_NUM; i++ )
{
encapsulation_radios[i] =
new wxRadioButton( panel, EncapsulationRadio1_Event + i,
encapsulation_array[i] );
panel_sizer->Add( encapsulation_radios[i], 0,
- wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
+ wxALL, 4 );
}
panel->SetSizerAndFit( panel_sizer );
/* Update encapsulation panel */
- encapsulation_radios[0]->Enable();
+ encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
i_encapsulation_type = TS_ENCAPSULATION;
return panel;
}
-void SoutDialog::ParseMRL()
+wxPanel *SoutDialog::TranscodingPanel( wxWindow* parent )
{
- /* Initialise MRL value */
- char *psz_sout = config_GetPsz( p_intf, "sout" );
- if( psz_sout )
- {
- mrl = wxU(psz_sout);
- free( psz_sout );
- }
+ wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+ wxSize(200, 200) );
- /* Parse the MRL */
- wxString access = mrl.BeforeFirst( wxT('/') );
- wxString encapsulation = mrl.BeforeFirst( wxT(':') ).AfterFirst(wxT('/'));
+ wxStaticBox *panel_box = new wxStaticBox( panel, -1,
+ wxU(_("Transcoding options")) );
+ wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
+ wxVERTICAL );
- if( !access.Cmp( wxT("http") ) )
+ /* Create video transcoding checkox */
+ static const wxString wxvcodecs_array[] =
{
- i_access_type = HTTP_ACCESS_OUT;
- }
- else if( !access.Cmp( wxT("udp") ) )
- {
- i_access_type = UDP_ACCESS_OUT;
- }
- else if( !access.Cmp( wxT("rtp") ) )
+ wxT("mp1v"),
+ wxT("mp2v"),
+ wxT("mp4v"),
+ wxT("DIV1"),
+ wxT("DIV2"),
+ wxT("DIV3"),
+ wxT("H263"),
+ wxT("I263"),
+ wxT("WMV1"),
+ wxT("WMV2"),
+ wxT("MJPG"),
+ wxT("theo")
+ };
+ /*
+ static const wxString vbitrates_array[] =
{
- i_access_type = RTP_ACCESS_OUT;
- }
- else
+ wxT("3072"),
+ wxT("2048"),
+ wxT("1024"),
+ wxT("768"),
+ wxT("512"),
+ wxT("384"),
+ wxT("256"),
+ wxT("192"),
+ wxT("128"),
+ wxT("96"),
+ wxT("64"),
+ wxT("32"),
+ wxT("16")
+ };
+*/
+ static const wxString vscales_array[] =
{
- i_access_type = FILE_ACCESS_OUT;
- }
+ wxT("0.25"),
+ wxT("0.5"),
+ wxT("0.75"),
+ wxT("1"),
+ wxT("1.25"),
+ wxT("1.5"),
+ wxT("1.75"),
+ wxT("2")
+ };
- if( !encapsulation.Cmp( wxT("ps") ) )
+ wxFlexGridSizer *video_sizer = new wxFlexGridSizer( 6, 1, 20 );
+ video_transc_checkbox =
+ new wxCheckBox( panel, VideoTranscEnable_Event, wxU(_("Video codec")));
+ video_codec_combo =
+ new wxComboBox( panel, VideoTranscCodec_Event, wxT(""),
+ wxPoint(20,25), wxDefaultSize,
+ WXSIZEOF(wxvcodecs_array),
+ wxvcodecs_array, wxCB_READONLY );
+ video_codec_combo->SetSelection(2);
+ wxStaticText *bitrate_label =
+ new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
+ video_bitrate_combo =
+ new wxComboBox( panel, VideoTranscBitrate_Event, wxT("1024"),
+ wxPoint(20,25), wxDefaultSize,
+ WXSIZEOF(vbitrates_array), vbitrates_array );
+ wxStaticText *scale_label =
+ new wxStaticText( panel, -1, wxU(_("Scale")));
+ video_scale_combo =
+ new wxComboBox( panel, VideoTranscScale_Event, wxT("1"),
+ wxPoint(20,25), wxDefaultSize,
+ WXSIZEOF(vscales_array), vscales_array );
+ video_sizer->Add( video_transc_checkbox, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ video_sizer->Add( video_codec_combo, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ video_sizer->Add( bitrate_label, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ video_sizer->Add( video_bitrate_combo, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ video_sizer->Add( scale_label, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ video_sizer->Add( video_scale_combo, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+
+ /* Create audio transcoding checkox */
+ static const wxString wxacodecs_array[] =
{
- i_encapsulation_type = PS_ENCAPSULATION;
- }
- else if( !encapsulation.Cmp( wxT("avi") ) )
- {
- i_encapsulation_type = AVI_ENCAPSULATION;
- }
- else if( !encapsulation.Cmp( wxT("ogg") ) )
+ wxT("mpga"),
+ wxT("mp3"),
+ wxT("mp4a"),
+ wxT("a52"),
+ wxT("vorb"),
+ wxT("flac"),
+ wxT("spx")
+ };
+ static const wxString achannels_array[] =
{
- i_encapsulation_type = OGG_ENCAPSULATION;
- }
- else
+ wxT("1"),
+ wxT("2"),
+ wxT("4"),
+ wxT("6")
+ };
+/*
+ static const wxString abitrates_array[] =
{
- i_encapsulation_type = TS_ENCAPSULATION;
- }
-
- wxString second_part = mrl.AfterFirst( wxT(':') );
+ wxT("512"),
+ wxT("256"),
+ wxT("192"),
+ wxT("128"),
+ wxT("96"),
+ wxT("64"),
+ wxT("32"),
+ wxT("16")
+ };
+*/
+ wxFlexGridSizer *audio_sizer = new wxFlexGridSizer( 3, 1, 20 );
+ audio_transc_checkbox =
+ new wxCheckBox( panel, AudioTranscEnable_Event, wxU(_("Audio codec")));
+ audio_codec_combo =
+ new wxComboBox( panel, AudioTranscCodec_Event, wxT(""),
+ wxPoint(10,25), wxDefaultSize,
+ WXSIZEOF(wxacodecs_array),
+ wxacodecs_array, wxCB_READONLY );
+ audio_codec_combo->SetSelection(0);
+#if defined( __WXMSW__ )
+ wxFlexGridSizer *audio_sub_sizer = new wxFlexGridSizer( 4, 5, 20 );
+#else
+ wxFlexGridSizer *audio_sub_sizer = new wxFlexGridSizer( 2, 5, 20 );
+#endif
+ bitrate_label =
+ new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
+ audio_bitrate_combo =
+ new wxComboBox( panel, AudioTranscBitrate_Event, wxT("192"),
+ wxPoint(10,25), wxDefaultSize,
+ WXSIZEOF(abitrates_array), abitrates_array );
+ wxStaticText *channels_label =
+ new wxStaticText( panel, -1, wxU(_("Channels")));
+ audio_channels_combo =
+ new wxComboBox( panel, AudioTranscChans_Event, wxT(""),
+ wxPoint(10,25), wxDefaultSize,
+ WXSIZEOF(achannels_array), achannels_array );
+ audio_channels_combo->SetSelection(1);
+ audio_sub_sizer->Add( bitrate_label, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ audio_sub_sizer->Add( audio_bitrate_combo, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ audio_sub_sizer->Add( channels_label, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ audio_sub_sizer->Add( audio_channels_combo, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+
+ audio_sizer->Add( audio_transc_checkbox, 0,
+ wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ audio_sizer->Add( audio_codec_combo, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+ audio_sizer->Add( audio_sub_sizer, 1,
+ wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
- if( i_access_type == FILE_ACCESS_OUT )
- {
- /* The whole second part of the MRL is the filename */
- file_combo->SetValue( second_part );
- }
- else
- {
- /* we've got address:port */
- wxString address = second_part.BeforeLast( wxT(':') );
- net_addr->SetValue( address );
+ /* Stuff everything into the main panel */
+ panel_sizer->Add( video_sizer, 0,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ panel_sizer->Add( audio_sizer, 0,
+ wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- long int i_port;
- wxString port = second_part.AfterLast( wxT(':') );
- if( port.ToLong( &i_port ) )
- {
- net_port->SetValue( i_port );
- }
- else
- {
- net_port->SetValue( config_GetInt( p_intf, "server-port" ) );
- }
- }
+ panel->SetSizerAndFit( panel_sizer );
- /* Update access output panel */
- wxCommandEvent dummy_event;
- dummy_event.SetId( AccessRadio1_Event + i_access_type );
- OnAccessTypeChange( dummy_event );
+ /* Update transcoding panel */
+ wxCommandEvent event( 0, VideoTranscEnable_Event );
+ event.SetInt( 0 );
+ OnTranscodingEnable( event );
+ event.SetId( AudioTranscEnable_Event );
+ OnTranscodingEnable( event );
- /* Update encapsulation output panel */
- dummy_event.SetId( EncapsulationRadio1_Event + i_encapsulation_type );
- OnEncapsulationChange( dummy_event );
+ return panel;
}
/*****************************************************************************
*****************************************************************************/
void SoutDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
{
+ mrl_combo->Append( mrl_combo->GetValue() );
EndModal( wxID_OK );
}
void SoutDialog::OnMRLChange( wxCommandEvent& event )
{
- mrl = event.GetString();
+ //mrl = event.GetString();
}
/*****************************************************************************
void SoutDialog::OnAccessTypeChange( wxCommandEvent& event )
{
int i;
- i_access_type = event.GetId() - AccessRadio1_Event;
+ i_access_type = event.GetId() - AccessType1_Event;
+
+ access_subpanels[i_access_type]->Enable( event.GetInt() );
switch( i_access_type )
{
- case FILE_ACCESS_OUT:
- access_subpanels[0]->Enable();
- access_subpanels[2]->Disable();
- access_subpanels[3]->Disable();
- for( i = 1; i < 4; i++ )
- {
- encapsulation_radios[i]->Enable();
- }
- break;
+ case UDP_ACCESS_OUT:
+ misc_subpanels[ANN_MISC_SOUT]->Enable( event.GetInt() );
- case HTTP_ACCESS_OUT:
- access_subpanels[0]->Disable();
- access_subpanels[2]->Enable();
- access_subpanels[3]->Disable();
- for( i = 1; i < 4; i++ )
+ case RTP_ACCESS_OUT:
+ for( i = 1; i < ENCAPS_NUM; i++ )
{
- encapsulation_radios[i]->Enable();
+ encapsulation_radios[i]->Enable( !event.GetInt() );
}
- break;
-
- case UDP_ACCESS_OUT:
- case RTP_ACCESS_OUT:
- access_subpanels[0]->Disable();
- access_subpanels[2]->Enable();
- access_subpanels[3]->Enable();
- for( i = 1; i < 4; i++ )
+ if( event.GetInt() )
{
- encapsulation_radios[i]->Disable();
+ encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
+ i_encapsulation_type = TS_ENCAPSULATION;
}
- encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
- i_encapsulation_type = TS_ENCAPSULATION;
break;
}
+ UpdateMRL();
+}
+
+/*****************************************************************************
+ * AnnounceMisc panel event methods.
+ *****************************************************************************/
+void SoutDialog::OnSAPMiscChange( wxCommandEvent& event )
+{
+ if( !slp_checkbox->IsChecked() )
+ {
+ announce_addr->Enable( event.GetInt() );
+ }
+ UpdateMRL();
+}
- for( i = 0; i < 4; i++ )
+void SoutDialog::OnSLPMiscChange( wxCommandEvent& event )
+{
+ if( !sap_checkbox->IsChecked() )
{
- access_radios[i]->SetValue( event.GetId() == (AccessRadio1_Event+i) );
+ announce_addr->Enable( event.GetInt() );
}
+ UpdateMRL();
+}
+/*****************************************************************************
+ * SAPAddr panel event methods.
+ *****************************************************************************/
+void SoutDialog::OnAnnounceAddrChange( wxCommandEvent& WXUNUSED(event) )
+{
UpdateMRL();
}
void SoutDialog::OnFileBrowse( wxCommandEvent& WXUNUSED(event) )
{
- wxFileDialog dialog( this, wxU(_("Save file")),
- wxT(""), wxT(""), wxT("*.*"), wxSAVE );
+ wxFileDialog dialog( this, wxU(_("Save file")), wxT(""), wxT(""), wxT("*"),
+ wxSAVE | wxOVERWRITE_PROMPT );
if( dialog.ShowModal() == wxID_OK )
{
}
}
+void SoutDialog::OnFileDump( wxCommandEvent& event )
+{
+ misc_panel->Enable( !event.GetInt() );
+ encapsulation_panel->Enable( !event.GetInt() );
+ transcoding_panel->Enable( !event.GetInt() );
+
+ for( int i = 0; i < ACCESS_OUT_NUM; i++ )
+ {
+ if( i != FILE_ACCESS_OUT )
+ {
+ access_checkboxes[i]->Enable( !event.GetInt() );
+ access_subpanels[i]->Enable( !event.GetInt() &&
+ access_checkboxes[i]->IsChecked() );
+ }
+ }
+
+ UpdateMRL();
+}
+
/*****************************************************************************
* Net access output event methods.
*****************************************************************************/
i_encapsulation_type = event.GetId() - EncapsulationRadio1_Event;
UpdateMRL();
}
+
+/*****************************************************************************
+ * Transcoding panel event methods.
+ *****************************************************************************/
+void SoutDialog::OnTranscodingEnable( wxCommandEvent& event )
+{
+ switch( event.GetId() )
+ {
+ case VideoTranscEnable_Event:
+ video_codec_combo->Enable( event.GetInt() );
+ video_bitrate_combo->Enable( event.GetInt() );
+ video_scale_combo->Enable( event.GetInt() );
+ break;
+ case AudioTranscEnable_Event:
+ audio_codec_combo->Enable( event.GetInt() );
+ audio_bitrate_combo->Enable( event.GetInt() );
+ audio_channels_combo->Enable( event.GetInt() );
+ break;
+ }
+
+ UpdateMRL();
+}
+
+void SoutDialog::OnTranscodingChange( wxCommandEvent& event )
+{
+ UpdateMRL();
+}