1 /*****************************************************************************
2 * streamout.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2001 VideoLAN
5 * $Id: streamout.cpp,v 1.17 2003/06/22 15:43:54 gbazin Exp $
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() */
34 #ifdef WIN32 /* mingw32 hack */
39 /* Let vlc take care of the i18n stuff */
40 #define WXINTL_NO_GETTEXT_MACRO
42 #include <wx/wxprec.h>
44 #include <wx/notebook.h>
45 #include <wx/textctrl.h>
46 #include <wx/combobox.h>
47 #include <wx/spinctrl.h>
48 #include <wx/statline.h>
52 #if defined MODULE_NAME_IS_skins
53 # include "../skins/src/skin_common.h"
56 #include "wxwindows.h"
59 # define wxRB_SINGLE 0
82 /*****************************************************************************
84 *****************************************************************************/
86 /* IDs for the controls and the menu commands */
89 Notebook_Event = wxID_HIGHEST,
95 AccessType1_Event, AccessType2_Event, AccessType3_Event,
96 AccessType4_Event, AccessType5_Event,
97 NetPort1_Event, NetPort2_Event, NetPort3_Event,
98 NetAddr1_Event, NetAddr2_Event, NetAddr3_Event,
100 EncapsulationRadio1_Event, EncapsulationRadio2_Event,
101 EncapsulationRadio3_Event, EncapsulationRadio4_Event,
102 EncapsulationRadio5_Event,
104 VideoTranscEnable_Event, VideoTranscCodec_Event, VideoTranscBitrate_Event,
105 AudioTranscEnable_Event, AudioTranscCodec_Event, AudioTranscBitrate_Event,
108 BEGIN_EVENT_TABLE(SoutDialog, wxDialog)
110 EVT_BUTTON(wxID_OK, SoutDialog::OnOk)
111 EVT_BUTTON(wxID_CANCEL, SoutDialog::OnCancel)
113 /* Events generated by the access output panel */
114 EVT_CHECKBOX(AccessType1_Event, SoutDialog::OnAccessTypeChange)
115 EVT_CHECKBOX(AccessType2_Event, SoutDialog::OnAccessTypeChange)
116 EVT_CHECKBOX(AccessType3_Event, SoutDialog::OnAccessTypeChange)
117 EVT_CHECKBOX(AccessType4_Event, SoutDialog::OnAccessTypeChange)
118 EVT_CHECKBOX(AccessType5_Event, SoutDialog::OnAccessTypeChange)
119 EVT_TEXT(FileName_Event, SoutDialog::OnFileChange)
120 EVT_BUTTON(FileBrowse_Event, SoutDialog::OnFileBrowse)
122 EVT_TEXT(NetPort1_Event, SoutDialog::OnNetChange)
123 EVT_TEXT(NetAddr1_Event, SoutDialog::OnNetChange)
124 EVT_TEXT(NetPort2_Event, SoutDialog::OnNetChange)
125 EVT_TEXT(NetAddr2_Event, SoutDialog::OnNetChange)
126 EVT_TEXT(NetPort3_Event, SoutDialog::OnNetChange)
127 EVT_TEXT(NetAddr3_Event, SoutDialog::OnNetChange)
129 /* Events generated by the encapsulation panel */
130 EVT_RADIOBUTTON(EncapsulationRadio1_Event,
131 SoutDialog::OnEncapsulationChange)
132 EVT_RADIOBUTTON(EncapsulationRadio2_Event,
133 SoutDialog::OnEncapsulationChange)
134 EVT_RADIOBUTTON(EncapsulationRadio3_Event,
135 SoutDialog::OnEncapsulationChange)
136 EVT_RADIOBUTTON(EncapsulationRadio4_Event,
137 SoutDialog::OnEncapsulationChange)
138 EVT_RADIOBUTTON(EncapsulationRadio5_Event,
139 SoutDialog::OnEncapsulationChange)
141 /* Events generated by the transcoding panel */
142 EVT_CHECKBOX(VideoTranscEnable_Event, SoutDialog::OnTranscodingEnable)
143 EVT_CHECKBOX(AudioTranscEnable_Event, SoutDialog::OnTranscodingEnable)
144 EVT_COMBOBOX(VideoTranscCodec_Event, SoutDialog::OnTranscodingChange)
145 EVT_COMBOBOX(AudioTranscCodec_Event, SoutDialog::OnTranscodingChange)
146 EVT_COMBOBOX(VideoTranscBitrate_Event, SoutDialog::OnTranscodingChange)
147 EVT_COMBOBOX(AudioTranscBitrate_Event, SoutDialog::OnTranscodingChange)
151 /*****************************************************************************
153 *****************************************************************************/
154 SoutDialog::SoutDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
155 wxDialog( _p_parent, -1, wxU(_("Stream output")),
156 wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
158 /* Initializations */
160 p_parent = _p_parent;
161 SetIcon( *p_intf->p_sys->p_icon );
163 /* Create a panel to put everything in */
164 wxPanel *panel = new wxPanel( this, -1 );
165 panel->SetAutoLayout( TRUE );
167 /* Create MRL combobox */
168 wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
169 wxStaticBox *mrl_box = new wxStaticBox( panel, -1,
170 wxU(_("Stream output MRL")) );
171 wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box,
173 wxStaticText *mrl_label = new wxStaticText( panel, -1,
174 wxU(_("Destination Target:")));
175 mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
176 wxPoint(20,25), wxSize(120, -1), 0, NULL );
177 mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
178 "the full MRL you want to open.\n""Alternatively, the field will be "
179 "filled automatically when you use the controls below")) );
181 mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
182 mrl_sizer->Add( mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
183 mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
185 /* Create the output encapsulation panel */
186 wxPanel *encapsulation_panel = EncapsulationPanel( panel );
188 /* Create the access output panel */
189 wxPanel *access_panel = AccessPanel( panel );
191 /* Create the transcoding panel */
192 wxPanel *transcoding_panel = TranscodingPanel( panel );
195 wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
197 /* Create the buttons */
198 wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
199 ok_button->SetDefault();
200 wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
203 /* Place everything in sizers */
204 wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
205 button_sizer->Add( ok_button, 0, wxALL, 5 );
206 button_sizer->Add( cancel_button, 0, wxALL, 5 );
207 button_sizer->Layout();
208 wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
209 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
210 panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
211 panel_sizer->Add( access_panel, 1, wxEXPAND | wxALL, 5 );
212 panel_sizer->Add( encapsulation_panel, 0, wxEXPAND | wxALL, 5 );
213 panel_sizer->Add( transcoding_panel, 0, wxEXPAND | wxALL, 5 );
214 panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
215 panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
217 panel_sizer->Layout();
218 panel->SetSizerAndFit( panel_sizer );
219 main_sizer->Add( panel, 1, wxGROW, 0 );
220 main_sizer->Layout();
221 SetSizerAndFit( main_sizer );
224 SoutDialog::~SoutDialog()
228 /*****************************************************************************
230 *****************************************************************************/
231 void SoutDialog::UpdateMRL()
233 /* Let's start with the transcode options */
235 if( video_transc_checkbox->IsChecked() ||
236 audio_transc_checkbox->IsChecked() )
238 transcode = wxT("transcode{");
239 if( video_transc_checkbox->IsChecked() )
241 transcode += wxT("vcodec=") + video_codec_combo->GetValue();
242 transcode += wxT(",vb=") + video_bitrate_combo->GetValue();
243 if( audio_transc_checkbox->IsChecked() ) transcode += wxT(",");
245 if( audio_transc_checkbox->IsChecked() )
247 transcode += wxT("acodec=") + audio_codec_combo->GetValue();
248 transcode += wxT(",ab=") + audio_bitrate_combo->GetValue();
250 transcode += wxT("}");
254 wxString encapsulation;
255 switch( i_encapsulation_type )
257 case PS_ENCAPSULATION:
258 encapsulation = wxT("ps");
260 case AVI_ENCAPSULATION:
261 encapsulation = wxT("avi");
263 case OGG_ENCAPSULATION:
264 encapsulation = wxT("ogg");
266 case MP4_ENCAPSULATION:
267 encapsulation = wxT("mp4");
269 case TS_ENCAPSULATION:
271 encapsulation = wxT("ts");
275 /* Now continue with the duplicate option */
277 if( access_checkboxes[PLAY_ACCESS_OUT]->IsChecked() )
279 dup_opts += wxT("dst=display");
281 if( access_checkboxes[FILE_ACCESS_OUT]->IsChecked() )
283 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
284 dup_opts += wxT("dst=std{access=file,mux=");
285 dup_opts += encapsulation + wxT(",url=");
286 dup_opts += file_combo->GetValue() + wxT("}");
288 if( access_checkboxes[HTTP_ACCESS_OUT]->IsChecked() )
290 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
291 dup_opts += wxT("dst=std{access=http,mux=");
292 dup_opts += encapsulation + wxT(",url=");
293 dup_opts += net_addrs[HTTP_ACCESS_OUT]->GetLineText(0);
294 dup_opts += wxString::Format( wxT(":%d"),
295 net_ports[HTTP_ACCESS_OUT]->GetValue() );
296 dup_opts += wxT("}");
298 if( access_checkboxes[UDP_ACCESS_OUT]->IsChecked() )
300 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
301 dup_opts += wxT("dst=std{access=udp,mux=");
302 dup_opts += encapsulation + wxT(",url=");
303 dup_opts += net_addrs[UDP_ACCESS_OUT]->GetLineText(0);
304 dup_opts += wxString::Format( wxT(":%d"),
305 net_ports[UDP_ACCESS_OUT]->GetValue() );
306 dup_opts += wxT("}");
308 if( access_checkboxes[RTP_ACCESS_OUT]->IsChecked() )
310 if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
311 dup_opts += wxT("dst=std{access=rtp,mux=");
312 dup_opts += encapsulation + wxT(",url=");
313 dup_opts += net_addrs[RTP_ACCESS_OUT]->GetLineText(0);
314 dup_opts += wxString::Format( wxT(":%d"),
315 net_ports[RTP_ACCESS_OUT]->GetValue() );
316 dup_opts += wxT("}");
320 if( !dup_opts.IsEmpty() )
322 if( !transcode.IsEmpty() ) duplicate = wxT(":");
323 duplicate += wxT("duplicate{") + dup_opts + wxT("}");
326 if( !transcode.IsEmpty() || !duplicate.IsEmpty() )
327 mrl_combo->SetValue( wxT("#") + transcode + duplicate );
329 mrl_combo->SetValue( wxT("") );
332 wxPanel *SoutDialog::AccessPanel( wxWindow* parent )
335 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
338 wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 4, 20 );
339 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
340 wxU(_("Output Methods")) );
341 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
344 static const wxString access_output_array[] =
346 wxU(_("Play locally")),
353 for( i=0; i < ACCESS_OUT_NUM; i++ )
355 access_checkboxes[i] = new wxCheckBox( panel, AccessType1_Event + i,
356 access_output_array[i] );
357 access_subpanels[i] = new wxPanel( panel, -1 );
360 /* Play locally row */
361 wxFlexGridSizer *subpanel_sizer;
363 label = new wxStaticText( access_subpanels[0], -1, wxT("") );
364 subpanel_sizer = new wxFlexGridSizer( 1, 1, 20 );
365 subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
366 access_subpanels[0]->SetSizerAndFit( subpanel_sizer );
369 subpanel_sizer = new wxFlexGridSizer( 3, 1, 20 );
370 label = new wxStaticText( access_subpanels[1], -1, wxU(_("Filename")) );
371 file_combo = new wxComboBox( access_subpanels[1], FileName_Event, wxT(""),
372 wxPoint(20,25), wxSize(200, -1), 0, NULL );
373 wxButton *browse_button = new wxButton( access_subpanels[1],
374 FileBrowse_Event, wxU(_("Browse...")) );
375 subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
376 subpanel_sizer->Add( file_combo, 1,
377 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
378 subpanel_sizer->Add( browse_button, 0,
379 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
381 access_subpanels[1]->SetSizerAndFit( subpanel_sizer );
384 for( i = HTTP_ACCESS_OUT; i < ACCESS_OUT_NUM; i++ )
386 subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
387 label = new wxStaticText( access_subpanels[i], -1, wxU(_("Address")) );
388 net_addrs[i] = new wxTextCtrl( access_subpanels[i],
389 NetAddr1_Event + i - HTTP_ACCESS_OUT,
390 wxT(""), wxDefaultPosition,
391 wxSize( 200, -1 ), wxTE_PROCESS_ENTER);
392 subpanel_sizer->Add( label, 0,
393 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
394 subpanel_sizer->Add( net_addrs[i], 1, wxEXPAND |
395 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
397 int val = config_GetInt( p_intf, "server-port" );
398 label = new wxStaticText( access_subpanels[i], -1, wxU(_("Port")) );
399 net_ports[i] = new wxSpinCtrl( access_subpanels[i],
400 NetPort1_Event + i - HTTP_ACCESS_OUT,
401 wxString::Format(wxT("%d"), val),
402 wxDefaultPosition, wxDefaultSize,
406 subpanel_sizer->Add( label, 0,
407 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
408 subpanel_sizer->Add( net_ports[i], 0,
409 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
411 access_subpanels[i]->SetSizerAndFit( subpanel_sizer );
415 /* Stuff everything into the main panel */
416 for( i=1; i < ACCESS_OUT_NUM; i++ )
418 sizer->Add( access_checkboxes[i], 0,
419 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
420 sizer->Add( access_subpanels[i], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL
421 | wxALIGN_LEFT | wxALL, 5 );
424 panel_sizer->Add( access_checkboxes[0], 0,
425 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
426 panel_sizer->Add( sizer, 1, wxEXPAND | wxTOP, 3 );
428 panel->SetSizerAndFit( panel_sizer );
430 /* Update access type panel */
431 for( i=1; i < ACCESS_OUT_NUM; i++ )
433 access_subpanels[i]->Disable();
439 wxPanel *SoutDialog::EncapsulationPanel( wxWindow* parent )
442 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
445 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
446 wxU(_("Encapsulation Method")) );
447 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
450 static const wxString encapsulation_array[] =
459 /* Stuff everything into the main panel */
460 for( i=0; i < ENCAPS_NUM; i++ )
462 encapsulation_radios[i] =
463 new wxRadioButton( panel, EncapsulationRadio1_Event + i,
464 encapsulation_array[i] );
465 panel_sizer->Add( encapsulation_radios[i], 0,
466 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 8 );
469 panel->SetSizerAndFit( panel_sizer );
471 /* Update encapsulation panel */
472 encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
473 i_encapsulation_type = TS_ENCAPSULATION;
478 wxPanel *SoutDialog::TranscodingPanel( wxWindow* parent )
480 wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
483 wxStaticBox *panel_box = new wxStaticBox( panel, -1,
484 wxU(_("Transcoding options")) );
485 wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
488 /* Create video transcoding checkox */
489 static const wxString vcodecs_array[] =
500 static const wxString vbitrates_array[] =
513 wxFlexGridSizer *video_sizer = new wxFlexGridSizer( 4, 1, 20 );
514 video_transc_checkbox =
515 new wxCheckBox( panel, VideoTranscEnable_Event, wxU(_("Video codec")));
517 new wxComboBox( panel, VideoTranscCodec_Event, wxT("mp4v"),
518 wxPoint(20,25), wxDefaultSize, WXSIZEOF(vcodecs_array),
519 vcodecs_array, wxCB_READONLY );
520 wxStaticText *bitrate_label =
521 new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
522 video_bitrate_combo =
523 new wxComboBox( panel, VideoTranscBitrate_Event, wxT("1000"),
524 wxPoint(20,25), wxDefaultSize,
525 WXSIZEOF(vbitrates_array), vbitrates_array );
526 video_sizer->Add( video_transc_checkbox, 0,
527 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
528 video_sizer->Add( video_codec_combo, 1,
529 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
530 video_sizer->Add( bitrate_label, 0,
531 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
532 video_sizer->Add( video_bitrate_combo, 1,
533 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
535 /* Create audio transcoding checkox */
536 static const wxString acodecs_array[] =
541 static const wxString abitrates_array[] =
550 wxFlexGridSizer *audio_sizer = new wxFlexGridSizer( 4, 1, 20 );
551 audio_transc_checkbox =
552 new wxCheckBox( panel, AudioTranscEnable_Event, wxU(_("Audio codec")));
554 new wxComboBox( panel, AudioTranscCodec_Event, wxT("mpga"),
555 wxPoint(20,25), wxDefaultSize, WXSIZEOF(acodecs_array),
556 acodecs_array, wxCB_READONLY );
558 new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
559 audio_bitrate_combo =
560 new wxComboBox( panel, AudioTranscBitrate_Event, wxT("192"),
561 wxPoint(20,25), wxDefaultSize,
562 WXSIZEOF(abitrates_array), abitrates_array );
563 audio_sizer->Add( audio_transc_checkbox, 0,
564 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
565 audio_sizer->Add( audio_codec_combo, 1,
566 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
567 audio_sizer->Add( bitrate_label, 0,
568 wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
569 audio_sizer->Add( audio_bitrate_combo, 1,
570 wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
572 /* Stuff everything into the main panel */
573 panel_sizer->Add( video_sizer, 0,
574 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
575 panel_sizer->Add( audio_sizer, 0,
576 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
578 panel->SetSizerAndFit( panel_sizer );
580 /* Update transcoding panel */
581 wxCommandEvent event( 0, VideoTranscEnable_Event );
583 OnTranscodingEnable( event );
584 event.SetId( AudioTranscEnable_Event );
585 OnTranscodingEnable( event );
590 /*****************************************************************************
592 *****************************************************************************/
593 void SoutDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
595 mrl_combo->Append( mrl_combo->GetValue() );
596 mrl = mrl_combo->GetValue();
600 void SoutDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
602 EndModal( wxID_CANCEL );
605 void SoutDialog::OnMRLChange( wxCommandEvent& event )
607 //mrl = event.GetString();
610 /*****************************************************************************
611 * Access output panel event methods.
612 *****************************************************************************/
613 void SoutDialog::OnAccessTypeChange( wxCommandEvent& event )
616 i_access_type = event.GetId() - AccessType1_Event;
618 access_subpanels[i_access_type]->Enable( event.GetInt() );
620 switch( i_access_type )
624 for( i = 1; i < ENCAPS_NUM; i++ )
626 encapsulation_radios[i]->Enable( !event.GetInt() );
630 encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
631 i_encapsulation_type = TS_ENCAPSULATION;
639 /*****************************************************************************
640 * File access output event methods.
641 *****************************************************************************/
642 void SoutDialog::OnFileChange( wxCommandEvent& WXUNUSED(event) )
647 void SoutDialog::OnFileBrowse( wxCommandEvent& WXUNUSED(event) )
649 wxFileDialog dialog( this, wxU(_("Save file")),
650 wxT(""), wxT(""), wxT("*"), wxSAVE );
652 if( dialog.ShowModal() == wxID_OK )
654 file_combo->SetValue( dialog.GetPath() );
659 /*****************************************************************************
660 * Net access output event methods.
661 *****************************************************************************/
662 void SoutDialog::OnNetChange( wxCommandEvent& WXUNUSED(event) )
667 /*****************************************************************************
668 * Encapsulation panel event methods.
669 *****************************************************************************/
670 void SoutDialog::OnEncapsulationChange( wxCommandEvent& event )
672 i_encapsulation_type = event.GetId() - EncapsulationRadio1_Event;
676 /*****************************************************************************
677 * Transcoding panel event methods.
678 *****************************************************************************/
679 void SoutDialog::OnTranscodingEnable( wxCommandEvent& event )
681 switch( event.GetId() )
683 case VideoTranscEnable_Event:
684 video_codec_combo->Enable( event.GetInt() );
685 video_bitrate_combo->Enable( event.GetInt() );
687 case AudioTranscEnable_Event:
688 audio_codec_combo->Enable( event.GetInt() );
689 audio_bitrate_combo->Enable( event.GetInt() );
696 void SoutDialog::OnTranscodingChange( wxCommandEvent& event )