1 /*****************************************************************************
2 * streamout.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2004 VideoLAN
7 * Authors: Gildas Bazin <gbazin@netcourrier.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
27 #include <stdlib.h> /* malloc(), free() */
28 #include <errno.h> /* ENOMEM */
29 #include <string.h> /* strerror() */
35 #include "wxwindows.h"
36 #include <wx/combobox.h>
37 #include <wx/statline.h>
39 #include "streamdata.h"
42 # define wxRB_SINGLE 0
45 /*****************************************************************************
47 *****************************************************************************/
49 /* IDs for the controls and the menu commands */
52 Notebook_Event = wxID_HIGHEST,
59 AccessType1_Event, AccessType2_Event, AccessType3_Event,
60 AccessType4_Event, AccessType5_Event, AccessType6_Event,
61 NetPort1_Event, NetPort2_Event, NetPort3_Event, NetPort4_Event,
62 NetAddr1_Event, NetAddr2_Event, NetAddr3_Event, NetAddr4_Event,
64 EncapsulationRadio1_Event, EncapsulationRadio2_Event,
65 EncapsulationRadio3_Event, EncapsulationRadio4_Event,
66 EncapsulationRadio5_Event, EncapsulationRadio6_Event,
67 EncapsulationRadio7_Event, EncapsulationRadio8_Event,
68 EncapsulationRadio9_Event, EncapsulationRadio10_Event,
70 VideoTranscEnable_Event, VideoTranscCodec_Event, VideoTranscBitrate_Event,
71 VideoTranscScale_Event,
72 AudioTranscEnable_Event, AudioTranscCodec_Event, AudioTranscBitrate_Event,
73 AudioTranscChans_Event,
75 SAPMisc_Event, SLPMisc_Event, AnnounceAddr_Event
78 BEGIN_EVENT_TABLE(SoutDialog, wxDialog)
80 EVT_BUTTON(wxID_OK, SoutDialog::OnOk)
81 EVT_BUTTON(wxID_CANCEL, SoutDialog::OnCancel)
83 /* Events generated by the access output panel */
84 EVT_CHECKBOX(AccessType1_Event, SoutDialog::OnAccessTypeChange)
85 EVT_CHECKBOX(AccessType2_Event, SoutDialog::OnAccessTypeChange)
86 EVT_CHECKBOX(AccessType3_Event, SoutDialog::OnAccessTypeChange)
87 EVT_CHECKBOX(AccessType4_Event, SoutDialog::OnAccessTypeChange)
88 EVT_CHECKBOX(AccessType5_Event, SoutDialog::OnAccessTypeChange)
89 EVT_CHECKBOX(AccessType6_Event, SoutDialog::OnAccessTypeChange)
90 EVT_TEXT(FileName_Event, SoutDialog::OnFileChange)
91 EVT_BUTTON(FileBrowse_Event, SoutDialog::OnFileBrowse)
92 EVT_CHECKBOX(FileDump_Event, SoutDialog::OnFileDump)
94 EVT_TEXT(NetPort1_Event, SoutDialog::OnNetChange)
95 EVT_TEXT(NetAddr1_Event, SoutDialog::OnNetChange)
96 EVT_TEXT(NetPort2_Event, SoutDialog::OnNetChange)
97 EVT_TEXT(NetAddr2_Event, SoutDialog::OnNetChange)
98 EVT_TEXT(NetPort3_Event, SoutDialog::OnNetChange)
99 EVT_TEXT(NetAddr3_Event, SoutDialog::OnNetChange)
100 EVT_TEXT(NetPort4_Event, SoutDialog::OnNetChange)
101 EVT_TEXT(NetAddr4_Event, SoutDialog::OnNetChange)
103 /* Events generated by the encapsulation panel */
104 EVT_RADIOBUTTON(EncapsulationRadio1_Event,
105 SoutDialog::OnEncapsulationChange)
106 EVT_RADIOBUTTON(EncapsulationRadio2_Event,
107 SoutDialog::OnEncapsulationChange)
108 EVT_RADIOBUTTON(EncapsulationRadio3_Event,
109 SoutDialog::OnEncapsulationChange)
110 EVT_RADIOBUTTON(EncapsulationRadio4_Event,
111 SoutDialog::OnEncapsulationChange)
112 EVT_RADIOBUTTON(EncapsulationRadio5_Event,
113 SoutDialog::OnEncapsulationChange)
114 EVT_RADIOBUTTON(EncapsulationRadio6_Event,
115 SoutDialog::OnEncapsulationChange)
116 EVT_RADIOBUTTON(EncapsulationRadio7_Event,
117 SoutDialog::OnEncapsulationChange)
118 EVT_RADIOBUTTON(EncapsulationRadio8_Event,
119 SoutDialog::OnEncapsulationChange)
120 EVT_RADIOBUTTON(EncapsulationRadio9_Event,
121 SoutDialog::OnEncapsulationChange)
123 /* Events generated by the transcoding panel */
124 EVT_CHECKBOX(VideoTranscEnable_Event, SoutDialog::OnTranscodingEnable)
125 EVT_CHECKBOX(AudioTranscEnable_Event, SoutDialog::OnTranscodingEnable)
126 EVT_COMBOBOX(VideoTranscCodec_Event, SoutDialog::OnTranscodingChange)
127 EVT_TEXT(VideoTranscCodec_Event, SoutDialog::OnTranscodingChange)
128 EVT_COMBOBOX(AudioTranscCodec_Event, SoutDialog::OnTranscodingChange)
129 EVT_TEXT(AudioTranscCodec_Event, SoutDialog::OnTranscodingChange)
130 EVT_COMBOBOX(VideoTranscBitrate_Event, SoutDialog::OnTranscodingChange)
131 EVT_TEXT(VideoTranscBitrate_Event, SoutDialog::OnTranscodingChange)
132 EVT_COMBOBOX(AudioTranscBitrate_Event, SoutDialog::OnTranscodingChange)
133 EVT_TEXT(AudioTranscBitrate_Event, SoutDialog::OnTranscodingChange)
134 EVT_COMBOBOX(VideoTranscScale_Event, SoutDialog::OnTranscodingChange)
135 EVT_TEXT(VideoTranscScale_Event, SoutDialog::OnTranscodingChange)
136 EVT_COMBOBOX(AudioTranscChans_Event, SoutDialog::OnTranscodingChange)
137 EVT_TEXT(AudioTranscChans_Event, SoutDialog::OnTranscodingChange)
139 /* Events generated by the misc panel */
140 EVT_CHECKBOX(SAPMisc_Event, SoutDialog::OnSAPMiscChange)
141 EVT_CHECKBOX(SLPMisc_Event, SoutDialog::OnSLPMiscChange)
142 EVT_TEXT(AnnounceAddr_Event, SoutDialog::OnAnnounceAddrChange)
146 /*****************************************************************************
148 *****************************************************************************/
149 SoutDialog::SoutDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
150 wxDialog( _p_parent, -1, wxU(_("Stream output")),
151 wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
153 /* Initializations */
155 p_parent = _p_parent;
156 SetIcon( *p_intf->p_sys->p_icon );
158 /* Create a panel to put everything in */
159 wxPanel *panel = new wxPanel( this, -1 );
160 panel->SetAutoLayout( TRUE );
162 /* Create MRL combobox */
163 wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
164 wxStaticBox *mrl_box = new wxStaticBox( panel, -1,
165 wxU(_("Stream output MRL")) );
166 wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box,
168 wxStaticText *mrl_label = new wxStaticText( panel, -1,
169 wxU(_("Destination Target:")));
170 mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
171 wxPoint(20,25), wxSize(120, -1), 0, NULL );
172 mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
173 "the full MRL you want to open.\n""Alternatively, the field will be "
174 "filled automatically when you use the controls below")) );
176 mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
177 mrl_sizer->Add( mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
178 mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
180 /* Create the output encapsulation panel */
181 encapsulation_panel = EncapsulationPanel( panel );
183 /* Create the access output panel */
184 access_panel = AccessPanel( panel );
186 /* Create the transcoding panel */
187 transcoding_panel = TranscodingPanel( panel );
189 /* Create the Misc panel */
190 misc_panel = MiscPanel( panel );
193 wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
195 /* Create the buttons */
196 wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
197 ok_button->SetDefault();
198 wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
201 /* Place everything in sizers */
202 wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
203 button_sizer->Add( ok_button, 0, wxALL, 5 );
204 button_sizer->Add( cancel_button, 0, wxALL, 5 );
205 button_sizer->Layout();
206 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
207 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
208 panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
209 panel_sizer->Add( access_panel, 1, wxEXPAND | wxALL, 5 );
210 panel_sizer->Add( encapsulation_panel, 0, wxEXPAND | wxALL, 5 );
211 panel_sizer->Add( transcoding_panel, 0, wxEXPAND | wxALL, 5 );
212 panel_sizer->Add( misc_panel, 0, wxEXPAND | wxALL, 5 );
213 panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
214 panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
216 panel_sizer->Layout();
217 panel->SetSizerAndFit( panel_sizer );
218 main_sizer->Add( panel, 1, wxGROW, 0 );
219 main_sizer->Layout();
220 SetSizerAndFit( main_sizer );
223 SoutDialog::~SoutDialog()
227 wxArrayString SoutDialog::GetOptions()
229 return SeparateEntries( mrl_combo->GetValue() );
232 /*****************************************************************************
234 *****************************************************************************/
235 void SoutDialog::UpdateMRL()
237 /* Check the demux dump option */
238 if( dump_checkbox->IsChecked() )
242 if( file_combo->GetValue().size() )
243 dumpfile = wxT(" :demuxdump-file=\"") +
244 file_combo->GetValue() + wxT("\"");
245 mrl_combo->SetValue( wxT(":demux=dump") + dumpfile );
250 /* Let's start with the transcode options */
252 if( video_transc_checkbox->IsChecked() ||
253 audio_transc_checkbox->IsChecked() )
255 transcode = wxT("transcode{");
256 if( video_transc_checkbox->IsChecked() )
258 transcode += wxT("vcodec=") + video_codec_combo->GetValue();
259 transcode += wxT(",vb=") + video_bitrate_combo->GetValue();
260 transcode += wxT(",scale=") + video_scale_combo->GetValue();
261 if( audio_transc_checkbox->IsChecked() ) transcode += wxT(",");
263 if( audio_transc_checkbox->IsChecked() )
265 transcode += wxT("acodec=") + audio_codec_combo->GetValue();
266 transcode += wxT(",ab=") + audio_bitrate_combo->GetValue();
267 transcode += wxT(",channels=") + audio_channels_combo->GetValue();
269 transcode += wxT("}");
273 wxString encapsulation;
274 switch( i_encapsulation_type )
276 case PS_ENCAPSULATION:
277 encapsulation = wxT("ps");
279 case MPEG1_ENCAPSULATION:
280 encapsulation = wxT("mpeg1");
282 case AVI_ENCAPSULATION:
283 encapsulation = wxT("avi");
285 case OGG_ENCAPSULATION:
286 encapsulation = wxT("ogg");
288 case RAW_ENCAPSULATION:
289 encapsulation = wxT("raw");
291 case MP4_ENCAPSULATION:
292 encapsulation = wxT("mp4");
294 case MOV_ENCAPSULATION:
295 encapsulation = wxT("mov");
297 case ASF_ENCAPSULATION:
298 encapsulation = wxT("asf");
300 case WAV_ENCAPSULATION:
301 encapsulation = wxT("wav");
303 case TS_ENCAPSULATION:
305 encapsulation = wxT("ts");
309 /* Now continue with the duplicate option */
311 if( access_checkboxes[PLAY_ACCESS_OUT]->IsChecked() )
313 dup_opts += wxT("dst=display");
315 if( access_checkboxes[FILE_ACCESS_OUT]->IsChecked() )
317 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
318 dup_opts += wxT("dst=std{access=file,mux=");
319 dup_opts += encapsulation + wxT(",url=\"");
320 dup_opts += file_combo->GetValue() + wxT("\"}");
322 if( access_checkboxes[HTTP_ACCESS_OUT]->IsChecked() )
324 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
325 dup_opts += wxT("dst=std{access=http,mux=");
326 dup_opts += encapsulation + wxT(",url=");
327 dup_opts += net_addrs[HTTP_ACCESS_OUT]->GetLineText(0);
328 dup_opts += wxString::Format( wxT(":%d"),
329 net_ports[HTTP_ACCESS_OUT]->GetValue() );
330 dup_opts += wxT("}");
332 if( access_checkboxes[MMSH_ACCESS_OUT]->IsChecked() )
334 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
335 dup_opts += wxT("dst=std{access=mmsh,mux=");
336 dup_opts += encapsulation;
337 if( i_encapsulation_type == ASF_ENCAPSULATION ) dup_opts += wxT("h");
338 dup_opts += wxT(",url=");
339 dup_opts += net_addrs[HTTP_ACCESS_OUT]->GetLineText(0);
340 dup_opts += wxString::Format( wxT(":%d"),
341 net_ports[MMSH_ACCESS_OUT]->GetValue() );
342 dup_opts += wxT("}");
344 if( access_checkboxes[UDP_ACCESS_OUT]->IsChecked() )
346 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
347 dup_opts += wxT("dst=std{access=udp,mux=");
348 dup_opts += encapsulation + wxT(",url=");
350 wxString udp_addr = net_addrs[UDP_ACCESS_OUT]->GetLineText(0);
351 if ((udp_addr[0u] != '[') && (udp_addr.Find(':') != -1))
353 dup_opts += wxT ("[") + udp_addr + wxT ("]");
357 dup_opts += udp_addr;
359 dup_opts += wxString::Format( wxT(":%d"),
360 net_ports[UDP_ACCESS_OUT]->GetValue() );
362 /* SAP only if UDP */
363 if( sap_checkbox->IsChecked() )
365 dup_opts += wxT(",sap");
366 if( ! announce_addr->GetLineText(0).IsEmpty() )
368 dup_opts += wxT(",name=\"");
369 dup_opts += announce_addr->GetLineText(0);
370 dup_opts += wxT("\"");
374 /* SLP only if UDP */
375 if( slp_checkbox->IsChecked() )
377 dup_opts += wxT(",slp");
378 if( ! sap_checkbox->IsChecked() &&
379 ! announce_addr->GetLineText(0).IsEmpty() )
381 dup_opts += wxT(",name=\"");
382 dup_opts += announce_addr->GetLineText(0);
383 dup_opts += wxT("\"");
387 dup_opts += wxT("}");
389 if( access_checkboxes[RTP_ACCESS_OUT]->IsChecked() )
391 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
392 dup_opts += wxT("dst=std{access=rtp,mux=");
393 dup_opts += encapsulation + wxT(",url=");
394 dup_opts += net_addrs[RTP_ACCESS_OUT]->GetLineText(0);
395 dup_opts += wxString::Format( wxT(":%d"),
396 net_ports[RTP_ACCESS_OUT]->GetValue() );
397 dup_opts += wxT("}");
401 if( !dup_opts.IsEmpty() )
403 if( !transcode.IsEmpty() ) duplicate = wxT(":");
404 duplicate += wxT("duplicate{") + dup_opts + wxT("}");
407 if( !transcode.IsEmpty() || !duplicate.IsEmpty() )
408 mrl_combo->SetValue( wxT(":sout=#") + transcode + duplicate );
410 mrl_combo->SetValue( wxT("") );
413 wxPanel *SoutDialog::AccessPanel( wxWindow* parent )
416 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
419 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
420 wxU(_("Output methods")) );
421 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
424 wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 4, 20 );
425 static const wxString access_output_array[] =
427 wxU(_("Play locally")),
435 for( i=0; i < ACCESS_OUT_NUM; i++ )
437 access_checkboxes[i] = new wxCheckBox( panel, AccessType1_Event + i,
438 access_output_array[i] );
439 access_subpanels[i] = new wxPanel( panel, -1 );
442 /* Play locally row */
443 wxFlexGridSizer *subpanel_sizer;
445 label = new wxStaticText( access_subpanels[0], -1, wxT("") );
446 subpanel_sizer = new wxFlexGridSizer( 1, 1, 20 );
447 subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
448 access_subpanels[0]->SetSizerAndFit( subpanel_sizer );
449 access_subpanels[0]->Hide();
452 subpanel_sizer = new wxFlexGridSizer( 3, 2, 20 );
453 label = new wxStaticText( access_subpanels[1], -1, wxU(_("Filename")) );
454 file_combo = new wxComboBox( access_subpanels[1], FileName_Event, wxT(""),
455 wxPoint(20,25), wxSize(200, -1), 0, NULL );
456 wxButton *browse_button = new wxButton( access_subpanels[1],
457 FileBrowse_Event, wxU(_("Browse...")) );
458 subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
459 subpanel_sizer->Add( file_combo, 1,
460 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
461 subpanel_sizer->Add( browse_button, 0,
462 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
463 subpanel_sizer->Add( new wxPanel(access_subpanels[1], -1), 0,
464 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
465 dump_checkbox = new wxCheckBox( access_subpanels[1], FileDump_Event,
466 wxU(_("Dump raw input")) );
467 subpanel_sizer->Add( dump_checkbox, 0,
468 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxTOP, 5 );
470 access_subpanels[1]->SetSizerAndFit( subpanel_sizer );
473 for( i = HTTP_ACCESS_OUT; i < ACCESS_OUT_NUM; i++ )
475 subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
476 label = new wxStaticText( access_subpanels[i], -1, wxU(_("Address")) );
477 net_addrs[i] = new wxTextCtrl( access_subpanels[i],
478 NetAddr1_Event + i - HTTP_ACCESS_OUT,
479 wxT(""), wxDefaultPosition,
480 wxSize( 200, -1 ), wxTE_PROCESS_ENTER);
481 subpanel_sizer->Add( label, 0,
482 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
483 subpanel_sizer->Add( net_addrs[i], 1, wxEXPAND |
484 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
486 int val = config_GetInt( p_intf, "server-port" );
487 label = new wxStaticText( access_subpanels[i], -1, wxU(_("Port")) );
488 net_ports[i] = new wxSpinCtrl( access_subpanels[i],
489 NetPort1_Event + i - HTTP_ACCESS_OUT,
490 wxString::Format(wxT("%d"), val),
491 wxDefaultPosition, wxDefaultSize,
495 subpanel_sizer->Add( label, 0,
496 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
497 subpanel_sizer->Add( net_ports[i], 0,
498 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
500 access_subpanels[i]->SetSizerAndFit( subpanel_sizer );
504 /* Stuff everything into the main panel */
505 for( i=1; i < ACCESS_OUT_NUM; i++ )
507 sizer->Add( access_checkboxes[i], 0,
508 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
509 sizer->Add( access_subpanels[i], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL
510 | wxALIGN_LEFT | wxALL, 5 );
513 panel_sizer->Add( access_checkboxes[0], 0,
514 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
515 panel_sizer->Add( sizer, 1, wxEXPAND | wxTOP, 3 );
517 panel->SetSizerAndFit( panel_sizer );
519 /* Update access type panel */
520 for( i=1; i < ACCESS_OUT_NUM; i++ )
522 access_subpanels[i]->Disable();
528 wxPanel *SoutDialog::MiscPanel( wxWindow* parent )
530 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
533 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
534 wxU(_("Miscellaneous options")) );
535 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
539 misc_subpanels[ANN_MISC_SOUT] = new wxPanel( panel, -1 );
540 wxFlexGridSizer *subpanel_sizer = new wxFlexGridSizer( 4, 4, 20 );
542 sap_checkbox = new wxCheckBox( misc_subpanels[ANN_MISC_SOUT],SAPMisc_Event,
543 wxU(_("SAP announce")) );
544 slp_checkbox = new wxCheckBox( misc_subpanels[ANN_MISC_SOUT],SLPMisc_Event,
545 wxU(_("SLP announce")) );
547 wxStaticText *label = new wxStaticText( misc_subpanels[ANN_MISC_SOUT], -1,
548 wxU(_("Channel name")) );
549 announce_addr = new wxTextCtrl( misc_subpanels[ANN_MISC_SOUT],
551 wxT(""), wxDefaultPosition,
552 wxSize( 200, -1 ), wxTE_PROCESS_ENTER);
554 subpanel_sizer->Add( sap_checkbox, 0,
555 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
556 subpanel_sizer->Add( slp_checkbox, 0,
557 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
558 subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
559 subpanel_sizer->Add( announce_addr, 1, wxEXPAND |
560 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
562 misc_subpanels[ANN_MISC_SOUT]->SetSizerAndFit( subpanel_sizer );
564 /* Stuff everything into the main panel */
565 panel_sizer->Add( misc_subpanels[ANN_MISC_SOUT], 1,
566 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
568 panel->SetSizerAndFit( panel_sizer );
570 /* Update misc panel */
571 misc_subpanels[ANN_MISC_SOUT]->Disable();
572 announce_addr->Disable();
577 wxPanel *SoutDialog::EncapsulationPanel( wxWindow* parent )
580 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
583 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
584 wxU(_("Encapsulation Method")) );
585 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
588 static const wxString encapsulation_array[] =
601 /* Stuff everything into the main panel */
602 for( i = 0; i < WXSIZEOF(encapsulation_array); i++ )
604 encapsulation_radios[i] =
605 new wxRadioButton( panel, EncapsulationRadio1_Event + i,
606 encapsulation_array[i] );
607 panel_sizer->Add( encapsulation_radios[i], 0,
608 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
612 for( i = WXSIZEOF(encapsulation_array); i < ENCAPS_NUM; i++ )
614 encapsulation_radios[i] =
615 new wxRadioButton( panel, EncapsulationRadio1_Event + i, wxT("") );
616 encapsulation_radios[i]->Hide();
619 panel->SetSizerAndFit( panel_sizer );
621 /* Update encapsulation panel */
622 encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
623 i_encapsulation_type = TS_ENCAPSULATION;
628 wxPanel *SoutDialog::TranscodingPanel( wxWindow* parent )
630 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
633 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
634 wxU(_("Transcoding options")) );
635 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
638 /* Create video transcoding checkox */
639 static const wxString wxvcodecs_array[] =
656 static const wxString vbitrates_array[] =
673 static const wxString vscales_array[] =
685 wxFlexGridSizer *video_sizer = new wxFlexGridSizer( 6, 1, 20 );
686 video_transc_checkbox =
687 new wxCheckBox( panel, VideoTranscEnable_Event, wxU(_("Video codec")));
689 new wxComboBox( panel, VideoTranscCodec_Event, wxvcodecs_array[2],
690 wxPoint(20,25), wxDefaultSize,
691 WXSIZEOF(wxvcodecs_array),
692 wxvcodecs_array, wxCB_READONLY );
693 video_codec_combo->SetSelection(2);
694 wxStaticText *bitrate_label =
695 new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
696 video_bitrate_combo =
697 new wxComboBox( panel, VideoTranscBitrate_Event, wxT("1024"),
698 wxPoint(20,25), wxDefaultSize,
699 WXSIZEOF(vbitrates_array), vbitrates_array );
700 wxStaticText *scale_label =
701 new wxStaticText( panel, -1, wxU(_("Scale")));
703 new wxComboBox( panel, VideoTranscScale_Event, wxT("1"),
704 wxPoint(20,25), wxDefaultSize,
705 WXSIZEOF(vscales_array), vscales_array );
706 video_sizer->Add( video_transc_checkbox, 0,
707 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
708 video_sizer->Add( video_codec_combo, 1,
709 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
710 video_sizer->Add( bitrate_label, 0,
711 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
712 video_sizer->Add( video_bitrate_combo, 1,
713 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
714 video_sizer->Add( scale_label, 0,
715 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
716 video_sizer->Add( video_scale_combo, 1,
717 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
719 /* Create audio transcoding checkox */
720 static const wxString wxacodecs_array[] =
733 static const wxString achannels_array[] =
741 static const wxString abitrates_array[] =
753 wxFlexGridSizer *audio_sizer = new wxFlexGridSizer( 3, 1, 20 );
754 audio_transc_checkbox =
755 new wxCheckBox( panel, AudioTranscEnable_Event, wxU(_("Audio codec")));
757 new wxComboBox( panel, AudioTranscCodec_Event, wxacodecs_array[0],
758 wxPoint(10,25), wxDefaultSize,
759 WXSIZEOF(wxacodecs_array),
760 wxacodecs_array, wxCB_READONLY );
761 audio_codec_combo->SetSelection(0);
762 #if defined( __WXMSW__ )
763 wxFlexGridSizer *audio_sub_sizer = new wxFlexGridSizer( 4, 5, 20 );
765 wxFlexGridSizer *audio_sub_sizer = new wxFlexGridSizer( 2, 5, 20 );
768 new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
769 audio_bitrate_combo =
770 new wxComboBox( panel, AudioTranscBitrate_Event, wxT("192"),
771 wxPoint(10,25), wxDefaultSize,
772 WXSIZEOF(abitrates_array), abitrates_array );
773 wxStaticText *channels_label =
774 new wxStaticText( panel, -1, wxU(_("Channels")));
775 audio_channels_combo =
776 new wxComboBox( panel, AudioTranscChans_Event, achannels_array[1],
777 wxPoint(10,25), wxDefaultSize,
778 WXSIZEOF(achannels_array), achannels_array );
779 audio_channels_combo->SetSelection(1);
780 audio_sub_sizer->Add( bitrate_label, 0,
781 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
782 audio_sub_sizer->Add( audio_bitrate_combo, 1,
783 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
784 audio_sub_sizer->Add( channels_label, 0,
785 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
786 audio_sub_sizer->Add( audio_channels_combo, 1,
787 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
789 audio_sizer->Add( audio_transc_checkbox, 0,
790 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
791 audio_sizer->Add( audio_codec_combo, 1,
792 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
793 audio_sizer->Add( audio_sub_sizer, 1,
794 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
796 /* Stuff everything into the main panel */
797 panel_sizer->Add( video_sizer, 0,
798 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
799 panel_sizer->Add( audio_sizer, 0,
800 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
802 panel->SetSizerAndFit( panel_sizer );
804 /* Update transcoding panel */
805 wxCommandEvent event( 0, VideoTranscEnable_Event );
807 OnTranscodingEnable( event );
808 event.SetId( AudioTranscEnable_Event );
809 OnTranscodingEnable( event );
814 /*****************************************************************************
816 *****************************************************************************/
817 void SoutDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
819 mrl_combo->Append( mrl_combo->GetValue() );
823 void SoutDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
825 EndModal( wxID_CANCEL );
828 void SoutDialog::OnMRLChange( wxCommandEvent& event )
830 //mrl = event.GetString();
833 /*****************************************************************************
834 * Access output panel event methods.
835 *****************************************************************************/
836 void SoutDialog::OnAccessTypeChange( wxCommandEvent& event )
839 i_access_type = event.GetId() - AccessType1_Event;
841 access_subpanels[i_access_type]->Enable( event.GetInt() );
843 switch( i_access_type )
846 misc_subpanels[ANN_MISC_SOUT]->Enable( event.GetInt() );
849 for( i = 1; i < ENCAPS_NUM; i++ )
851 encapsulation_radios[i]->Enable( !event.GetInt() );
855 encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
856 i_encapsulation_type = TS_ENCAPSULATION;
863 /*****************************************************************************
864 * AnnounceMisc panel event methods.
865 *****************************************************************************/
866 void SoutDialog::OnSAPMiscChange( wxCommandEvent& event )
868 if( !slp_checkbox->IsChecked() )
870 announce_addr->Enable( event.GetInt() );
875 void SoutDialog::OnSLPMiscChange( wxCommandEvent& event )
877 if( !sap_checkbox->IsChecked() )
879 announce_addr->Enable( event.GetInt() );
884 /*****************************************************************************
885 * SAPAddr panel event methods.
886 *****************************************************************************/
887 void SoutDialog::OnAnnounceAddrChange( wxCommandEvent& WXUNUSED(event) )
892 /*****************************************************************************
893 * File access output event methods.
894 *****************************************************************************/
895 void SoutDialog::OnFileChange( wxCommandEvent& WXUNUSED(event) )
900 void SoutDialog::OnFileBrowse( wxCommandEvent& WXUNUSED(event) )
902 wxFileDialog dialog( this, wxU(_("Save file")), wxT(""), wxT(""), wxT("*"),
903 wxSAVE | wxOVERWRITE_PROMPT );
905 if( dialog.ShowModal() == wxID_OK )
907 file_combo->SetValue( dialog.GetPath() );
912 void SoutDialog::OnFileDump( wxCommandEvent& event )
914 misc_panel->Enable( !event.GetInt() );
915 encapsulation_panel->Enable( !event.GetInt() );
916 transcoding_panel->Enable( !event.GetInt() );
918 for( int i = 0; i < ACCESS_OUT_NUM; i++ )
920 if( i != FILE_ACCESS_OUT )
922 access_checkboxes[i]->Enable( !event.GetInt() );
923 access_subpanels[i]->Enable( !event.GetInt() &&
924 access_checkboxes[i]->IsChecked() );
931 /*****************************************************************************
932 * Net access output event methods.
933 *****************************************************************************/
934 void SoutDialog::OnNetChange( wxCommandEvent& WXUNUSED(event) )
939 /*****************************************************************************
940 * Encapsulation panel event methods.
941 *****************************************************************************/
942 void SoutDialog::OnEncapsulationChange( wxCommandEvent& event )
944 i_encapsulation_type = event.GetId() - EncapsulationRadio1_Event;
948 /*****************************************************************************
949 * Transcoding panel event methods.
950 *****************************************************************************/
951 void SoutDialog::OnTranscodingEnable( wxCommandEvent& event )
953 switch( event.GetId() )
955 case VideoTranscEnable_Event:
956 video_codec_combo->Enable( event.GetInt() );
957 video_bitrate_combo->Enable( event.GetInt() );
958 video_scale_combo->Enable( event.GetInt() );
960 case AudioTranscEnable_Event:
961 audio_codec_combo->Enable( event.GetInt() );
962 audio_bitrate_combo->Enable( event.GetInt() );
963 audio_channels_combo->Enable( event.GetInt() );
970 void SoutDialog::OnTranscodingChange( wxCommandEvent& event )