1 /*****************************************************************************
2 * wizard.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2005 the VideoLAN team
7 * Authors: Clément Stenac <zorglub@videolan.org>
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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
27 #include "dialogs/wizard.hpp"
28 #include "streamdata.h"
29 #include "dialogs/open.hpp"
31 #include <wx/listctrl.h>
32 #include <wx/statline.h>
38 /*****************************************************************************
40 *****************************************************************************/
43 ActionRadio0_Event, ActionRadio1_Event,
44 MoreInfoStreaming_Event,
45 MoreInfoTranscode_Event,
47 Open_Event , Choose_Event ,
49 InputRadio0_Event, InputRadio1_Event,
52 MethodRadio0_Event, MethodRadio1_Event,
53 MethodRadio2_Event, MethodRadio3_Event,
55 EncapRadio0_Event, EncapRadio1_Event,
56 EncapRadio2_Event, EncapRadio3_Event,
57 EncapRadio4_Event, EncapRadio5_Event,
58 EncapRadio6_Event, EncapRadio7_Event,
59 EncapRadio8_Event, EncapRadio9_Event,
60 EncapRadio10_Event, EncapRadio11_Event,
62 VideoEnable_Event, VideoCodec_Event,VideoBitrate_Event,
63 AudioEnable_Event, AudioCodec_Event,AudioBitrate_Event,
70 #define ACTION_STREAM 0
71 #define ACTION_TRANSCODE 1
73 BEGIN_EVENT_TABLE(WizardDialog, wxWizard)
76 /*****************************************************************************
78 *****************************************************************************/
80 #define ERROR_MSG _("Error")
81 #define ITEM_NAME _("Streaming/Transcoding Wizard")
84 #define HELLO_TITLE _("Streaming/Transcoding Wizard")
85 #define HELLO_TEXT _("This wizard helps you to stream, transcode or" \
87 #define HELLO_STREAMING _("Stream to network")
88 #define HELLO_STREAMING_DESC _("Use this to stream on a network.")
89 #define HELLO_TRANSCODE _("Transcode/Save to file")
90 #define HELLO_TRANSCODE_DESC _("Use this to re-encode a stream and save it to a file.")
91 #define HELLO_NOTICE _("This wizard only gives access to a small subset of VLC's streaming and transcoding capabilities. Use the Open and Stream Output dialogs to get all of them.")
93 #define MOREINFO_STREAM _("Use this to stream on a network")
95 #define MOREINFO_TRANSCODE _("Use this to save a stream to a file. You have the possibility to reencode the stream. You can save whatever VLC can read.\nPlease notice that VLC is not very suited " \
96 "for file to file transcoding. You should use its transcoding " \
97 "features to save network streams, for example." )
100 #define INPUT_TITLE _("Choose input")
101 #define INPUT_TEXT _("Choose here your input stream.")
103 #define INPUT_OPEN _("Select a stream" )
104 #define INPUT_PL _( "Existing playlist item" )
106 #define CHOOSE_STREAM _("You must choose a stream")
107 #define NO_PLAYLIST _("Uh Oh! Unable to find playlist !")
109 #define PARTIAL _("Use this to read only a part of the stream. " \
110 "You must be able to control the incoming stream " \
111 "(for example, a file or a disc, but not a RTP/UDP " \
112 "network stream.)\n" \
113 "Enter the starting and ending times (in seconds).")
115 #define INPUT_BUTTON _("Choose")
118 #define TRANSCODE1_TITLE _("Transcode")
119 #define TRANSCODE1_TEXT _("If you want to change the compression format of the audio or video tracks, fill in this page. (If you only want to change the container format, proceed to next page.)")
121 #define TR_VIDEO_TEXT0 _("If your stream has video and you want to " \
122 "transcode it, enable this.")
123 #define TR_VIDEO_TEXT _("Select your video codec. Click one to get more " \
126 #define TR_AUDIO_TEXT0 _("If your stream has audio and you want to "\
127 "transcode it, enable this.")
128 #define TR_AUDIO_TEXT _("Select your audio codec. Click one to get more " \
132 #define STREAMING1_TITLE _("Streaming")
133 #define STREAMING1_TEXT _("In this page, you will select how your input stream will be sent.")
136 #define INVALID_MCAST_ADDRESS _("This does not appear to be a valid " \
137 "multicast address" )
138 #define NO_ADDRESS_TEXT _("You need to enter an address" )
141 #define ENCAP_TITLE _("Encapsulation format")
142 #define ENCAP_TEXT _("In this page, you will select how the stream will be "\
143 "encapsulated. Depending on the choices you made, all "\
144 "formats won't be available." )
148 #define EXTRATRANSCODE_TITLE _("Additional transcode options")
149 #define EXTRATRANSCODE_TEXT _("In this page, you will define a few " \
150 "additionnal parameters for your transcoding" )
152 #define CHOOSE_OUTFILE _("You must choose a file to save to")
155 #define EXTRASTREAMING_TITLE _("Additional streaming options")
156 #define EXTRASTREAMING_TEXT _("In this page, you will define a few " \
157 "additionnal parameters for your stream" )
159 #define TTL _("Define the TTL (Time-To-Live) of the stream. This parameter " \
160 "is the maximum number of routers your stream can go through. " \
161 "If you don't know what it means, or if you want to stream on " \
162 "your local network only, leave this setting to 1." )
164 #define SAP _("When streaming using RTP, you can announce your streams " \
165 "using the SAP/SDP announcing protocol. This way, the clients " \
166 "won't have to type in the multicast address, it will appear " \
167 "in their playlist if they enable the SAP extra interface.\n" \
168 "If you want to give a name to your stream, enter it here, " \
169 "else, a default name will be used" )
171 /*****************************************************************************
172 * All the pages of the wizard, declaration
173 *****************************************************************************/
175 /* Declare classes */
176 class wizHelloPage : public wxWizardPageSimple
179 wizHelloPage( wxWizard *parent);
180 void OnActionChange( wxCommandEvent& event );
181 void OnWizardPageChanging(wxWizardEvent& event);
182 void OnMoreInfo( wxCommandEvent& event );
185 WizardDialog *p_parent;
186 wxRadioButton *action_radios[2];
187 DECLARE_EVENT_TABLE()
190 BEGIN_EVENT_TABLE(wizHelloPage, wxWizardPageSimple)
191 EVT_RADIOBUTTON( ActionRadio0_Event, wizHelloPage::OnActionChange)
192 EVT_RADIOBUTTON( ActionRadio1_Event, wizHelloPage::OnActionChange)
193 EVT_BUTTON( MoreInfoStreaming_Event, wizHelloPage::OnMoreInfo )
194 EVT_BUTTON( MoreInfoTranscode_Event, wizHelloPage::OnMoreInfo )
196 EVT_WIZARD_PAGE_CHANGING(-1, wizHelloPage::OnWizardPageChanging)
200 class wizInputPage : public wxWizardPage
203 wizInputPage( wxWizard *, wxWizardPage *, intf_thread_t *);
204 wizInputPage::~wizInputPage();
205 void OnWizardPageChanging(wxWizardEvent& event);
206 void OnInputChange( wxCommandEvent& event );
207 void OnEnablePartial(wxCommandEvent& event);
208 virtual wxWizardPage *GetPrev() const;
209 virtual wxWizardPage *GetNext() const;
210 void SetStreamingPage( wxWizardPage *page);
211 void SetTranscodePage( wxWizardPage *page);
212 void SetAction( int i_action );
213 void SetPintf( intf_thread_t *p_intf );
214 void SetUri( char *psz_uri );
215 void SetPartial( int i_from, int i_to );
219 intf_thread_t *p_intf;
223 void OnChoose( wxCommandEvent& event );
225 WizardDialog *p_parent;
226 wxRadioButton *input_radios[2];
227 wxCheckBox *enable_checkbox;
228 wxBoxSizer *mainSizer;
230 wxTextCtrl *mrl_text;
231 wxTextCtrl *from_text;
233 OpenDialog *p_open_dialog;
234 wxListView *listview;
236 wxPanel *radio_panel; /* radio buttons should be in their own panel... */
237 wxWizardPage *p_prev;
238 wxWizardPage *p_streaming_page;
239 wxWizardPage *p_transcode_page;
241 DECLARE_EVENT_TABLE()
244 BEGIN_EVENT_TABLE(wizInputPage, wxWizardPage)
245 EVT_RADIOBUTTON( InputRadio0_Event, wizInputPage::OnInputChange)
246 EVT_RADIOBUTTON( InputRadio1_Event, wizInputPage::OnInputChange)
247 EVT_BUTTON( Choose_Event, wizInputPage::OnChoose)
248 EVT_CHECKBOX( PartialEnable_Event, wizInputPage::OnEnablePartial)
249 EVT_WIZARD_PAGE_CHANGING(-1, wizInputPage::OnWizardPageChanging)
253 class wizTranscodeCodecPage : public wxWizardPage
256 wizTranscodeCodecPage( wxWizard *parent, wxWizardPage *next);
257 ~wizTranscodeCodecPage();
258 void wizTranscodeCodecPage::OnWizardPageChanging(wxWizardEvent& event);
259 virtual wxWizardPage *GetPrev() const;
260 virtual wxWizardPage *GetNext() const;
261 void SetPrev( wxWizardPage *page);
263 wxCheckBox *video_checkbox;
264 wxComboBox *video_combo;
265 wxComboBox *vb_combo;
266 wxStaticText * video_text;
267 wxCheckBox *audio_checkbox;
268 wxComboBox *audio_combo;
269 wxComboBox *ab_combo;
270 wxStaticText * audio_text;
272 WizardDialog *p_parent;
279 wxWizardPage *p_prev;
280 wxWizardPage *p_next;
282 void OnVideoCodecChange(wxCommandEvent& event);
283 void OnAudioCodecChange(wxCommandEvent& event);
284 void OnEnableVideo(wxCommandEvent& event);
285 void OnEnableAudio(wxCommandEvent& event);
287 DECLARE_EVENT_TABLE()
290 BEGIN_EVENT_TABLE(wizTranscodeCodecPage, wxWizardPage)
291 EVT_CHECKBOX( VideoEnable_Event, wizTranscodeCodecPage::OnEnableVideo)
292 EVT_CHECKBOX( AudioEnable_Event, wizTranscodeCodecPage::OnEnableAudio)
293 EVT_COMBOBOX( VideoCodec_Event, wizTranscodeCodecPage::OnVideoCodecChange)
294 EVT_COMBOBOX( AudioCodec_Event, wizTranscodeCodecPage::OnAudioCodecChange)
295 EVT_WIZARD_PAGE_CHANGING(-1, wizTranscodeCodecPage::OnWizardPageChanging)
298 class wizStreamingMethodPage : public wxWizardPage
301 wizStreamingMethodPage( intf_thread_t *p_this, wxWizard *parent,
302 wxWizardPage *next) ;
303 void OnWizardPageChanging(wxWizardEvent& event);
304 virtual wxWizardPage *GetPrev() const;
305 virtual wxWizardPage *GetNext() const;
306 void SetPrev( wxWizardPage *page);
308 DECLARE_EVENT_TABLE()
310 wxBoxSizer *mainSizer;
311 wxStaticBoxSizer *address_sizer;
312 wxStaticText *address_text;
313 wxTextCtrl *address_txtctrl;
314 WizardDialog * p_parent;
315 void OnMethodChange( wxCommandEvent& event );
316 wxRadioButton *method_radios[4];
317 wxWizardPage *p_prev;
318 wxWizardPage *p_next;
319 intf_thread_t *p_intf;
322 BEGIN_EVENT_TABLE(wizStreamingMethodPage, wxWizardPage)
323 EVT_RADIOBUTTON( MethodRadio0_Event, wizStreamingMethodPage::OnMethodChange)
324 EVT_RADIOBUTTON( MethodRadio1_Event, wizStreamingMethodPage::OnMethodChange)
325 EVT_RADIOBUTTON( MethodRadio2_Event, wizStreamingMethodPage::OnMethodChange)
326 EVT_RADIOBUTTON( MethodRadio3_Event, wizStreamingMethodPage::OnMethodChange)
327 EVT_WIZARD_PAGE_CHANGING(-1, wizStreamingMethodPage::OnWizardPageChanging)
331 class wizEncapPage : public wxWizardPage
334 wizEncapPage( wxWizard *parent);
335 wizEncapPage::~wizEncapPage();
336 void OnWizardPageChanging(wxWizardEvent& event);
337 virtual wxWizardPage *GetPrev() const;
338 virtual wxWizardPage *GetNext() const;
339 void SetStreamingPage( wxWizardPage *page);
340 void SetTranscodePage( wxWizardPage *page);
341 void SetPrev( wxWizardPage *page);
342 void SetAction( int );
343 void EnableEncap( int encap );
345 DECLARE_EVENT_TABLE()
349 void OnEncapChange( wxCommandEvent& event );
350 wxRadioButton *encap_radios[MUXERS_NUMBER];
351 WizardDialog *p_parent;
352 wxWizardPage *p_prev;
353 wxWizardPage *p_streaming_page;
354 wxWizardPage *p_transcode_page;
357 BEGIN_EVENT_TABLE(wizEncapPage, wxWizardPage)
358 EVT_WIZARD_PAGE_CHANGING(-1, wizEncapPage::OnWizardPageChanging)
359 EVT_RADIOBUTTON( EncapRadio0_Event, wizEncapPage::OnEncapChange)
360 EVT_RADIOBUTTON( EncapRadio1_Event, wizEncapPage::OnEncapChange)
361 EVT_RADIOBUTTON( EncapRadio2_Event, wizEncapPage::OnEncapChange)
362 EVT_RADIOBUTTON( EncapRadio3_Event, wizEncapPage::OnEncapChange)
363 EVT_RADIOBUTTON( EncapRadio4_Event, wizEncapPage::OnEncapChange)
364 EVT_RADIOBUTTON( EncapRadio5_Event, wizEncapPage::OnEncapChange)
365 EVT_RADIOBUTTON( EncapRadio6_Event, wizEncapPage::OnEncapChange)
366 EVT_RADIOBUTTON( EncapRadio7_Event, wizEncapPage::OnEncapChange)
367 EVT_RADIOBUTTON( EncapRadio8_Event, wizEncapPage::OnEncapChange)
368 EVT_RADIOBUTTON( EncapRadio9_Event, wizEncapPage::OnEncapChange)
369 EVT_RADIOBUTTON( EncapRadio10_Event, wizEncapPage::OnEncapChange)
372 /* Additional settings for transcode */
373 class wizTranscodeExtraPage : public wxWizardPage
376 wizTranscodeExtraPage( wxWizard *parent, wxWizardPage *prev,
378 virtual wxWizardPage *GetPrev() const;
379 virtual wxWizardPage *GetNext() const;
380 void OnWizardPageChanging( wxWizardEvent& event );
382 DECLARE_EVENT_TABLE()
383 void wizTranscodeExtraPage::OnSelectFile(wxCommandEvent&);
384 wxTextCtrl *file_text;
385 WizardDialog *p_parent;
386 wxWizardPage *p_prev;
387 wxWizardPage *p_next;
390 BEGIN_EVENT_TABLE(wizTranscodeExtraPage, wxWizardPage)
391 EVT_BUTTON( Open_Event, wizTranscodeExtraPage::OnSelectFile)
392 EVT_WIZARD_PAGE_CHANGING(-1, wizTranscodeExtraPage::OnWizardPageChanging)
395 /* Additional settings for streaming */
396 class wizStreamingExtraPage : public wxWizardPage
399 wizStreamingExtraPage( wxWizard *parent, wxWizardPage *prev,
401 virtual wxWizardPage *GetPrev() const;
402 virtual wxWizardPage *GetNext() const;
403 void OnWizardPageChanging(wxWizardEvent&);
404 void OnSAP( wxCommandEvent&);
405 wxCheckBox *sap_checkbox;
406 wxTextCtrl *sap_text;
408 friend class wizEncapPage;
409 DECLARE_EVENT_TABLE()
410 WizardDialog *p_parent;
411 wxWizardPage *p_prev;
412 wxWizardPage *p_next;
414 wxSpinCtrl *ttl_spin;
417 BEGIN_EVENT_TABLE(wizStreamingExtraPage, wxWizardPage)
418 EVT_CHECKBOX( SAP_Event, wizStreamingExtraPage::OnSAP )
419 EVT_WIZARD_PAGE_CHANGING(-1, wizStreamingExtraPage::OnWizardPageChanging)
423 /* Local functions */
424 static void pageHeader( wxWindow *window, wxBoxSizer *sizer,
425 char *psz_title, char *psz_text);
427 static void pageHeader( wxWindow *window, wxBoxSizer *sizer,
428 char *psz_title, char *psz_text)
430 wxStaticText *wtitle = new wxStaticText( window, -1, wxU( psz_title ) );
431 wxFont font = wtitle->GetFont();
432 font.SetPointSize(14);
433 wtitle->SetFont(font);
434 sizer->Add( wtitle, 0, wxALL, 5 );
435 sizer->Add( new wxStaticText( window, -1,
436 wxU( vlc_wraptext( psz_text , TEXTWIDTH, false ) ) ),
440 /***************************************************************************
441 * Implementation of the pages
442 ***************************************************************************/
445 /***************************************************
446 * First page: choose between stream and transcode *
447 ***************************************************/
448 wizHelloPage::wizHelloPage( wxWizard *parent) : wxWizardPageSimple(parent)
451 p_parent = (WizardDialog *)parent;
452 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
454 /* Create the texts */
455 pageHeader( this, mainSizer, HELLO_TITLE, HELLO_TEXT );
457 /* Create the radio buttons with their helps */
458 action_radios[0] = new wxRadioButton( this, ActionRadio0_Event,
459 wxU( HELLO_STREAMING ) );
460 action_radios[1] = new wxRadioButton( this, ActionRadio1_Event,
461 wxU( HELLO_TRANSCODE ) );
464 mainSizer->Add( 0, 0, 1 );
466 wxBoxSizer *stream_sizer = new wxBoxSizer( wxHORIZONTAL );
467 stream_sizer->Add( action_radios[0], 0, wxALL, 5 );
468 stream_sizer->Add( 0,0,1 );
469 stream_sizer->Add( new wxButton( this, MoreInfoStreaming_Event,
470 wxU( _("More Info")) ), 0, 0, 0 );
471 mainSizer->Add( stream_sizer, 0, wxALL | wxEXPAND , 5 );
473 wxBoxSizer *transcode_sizer = new wxBoxSizer( wxHORIZONTAL );
474 transcode_sizer->Add( action_radios[1], 0, wxALL, 5 );
475 transcode_sizer->Add( 0,0,1);
476 transcode_sizer->Add( new wxButton( this, MoreInfoTranscode_Event,
477 wxU( _("More Info")) ), 0 , 0 , 0 );
478 mainSizer->Add( transcode_sizer, 0, wxALL | wxEXPAND, 5 );
480 mainSizer->Add( 0, 0, 1 );
482 mainSizer->Add( new wxStaticLine(this, -1 ), 0, wxEXPAND| wxTOP|
485 mainSizer->Add( new wxStaticText(this, -1,
486 wxU( vlc_wraptext(HELLO_NOTICE , TEXTWIDTH , false ))),
490 mainSizer->Fit(this);
493 void wizHelloPage::OnMoreInfo(wxCommandEvent& event)
496 msg.Printf( wxString( wxU( event.GetId() == MoreInfoStreaming_Event ?
498 MOREINFO_TRANSCODE ) ) );
499 wxMessageBox( msg, wxU(_("More information")),
500 wxOK | wxICON_INFORMATION, this->p_parent );
503 void wizHelloPage::OnActionChange( wxCommandEvent& event )
505 i_action = event.GetId() - ActionRadio0_Event;
506 ((wizInputPage *)GetNext())->SetAction( i_action );
507 p_parent->SetAction( i_action );
510 void wizHelloPage::OnWizardPageChanging(wxWizardEvent& event)
512 ((wizInputPage *)GetNext())->SetAction( i_action );
513 p_parent->SetAction( i_action );
516 /************************************
517 * Second page: choose input stream *
518 ************************************/
519 wizInputPage::wizInputPage( wxWizard *parent, wxWizardPage *prev, intf_thread_t *_p_intf) :
524 p_parent = (WizardDialog *)parent;
526 p_open_dialog = NULL;
529 mainSizer = new wxBoxSizer(wxVERTICAL);
531 /* Create the texts */
532 pageHeader( this, mainSizer, INPUT_TITLE, INPUT_TEXT );
534 mainSizer->Add( 0,20,0 );
536 radio_panel = new wxPanel(this, -1);
537 radio_panel->SetAutoLayout( TRUE );
539 wxBoxSizer *radioSizer = new wxBoxSizer(wxVERTICAL);
541 /* Create the radio buttons */
542 input_radios[0] = new wxRadioButton( radio_panel, InputRadio0_Event ,
544 radioSizer->Add( input_radios[0], 0, wxALL, 5 );
545 input_radios[1] = new wxRadioButton( radio_panel, InputRadio1_Event ,
547 radioSizer->Add( input_radios[1], 0, wxALL, 5 );
549 radio_panel->SetSizer( radioSizer );
550 radioSizer->Layout();
551 radioSizer->Fit(radio_panel);
552 mainSizer->Add( radio_panel );
557 open_panel = new wxPanel(this, -1);
558 open_panel->SetAutoLayout( TRUE );
560 wxBoxSizer *openSizer = new wxBoxSizer(wxHORIZONTAL);
562 mrl_text = new wxTextCtrl( open_panel, -1, wxU( "" ), wxDefaultPosition,
565 openSizer->Add( mrl_text, 0 , wxALL, 5 );
566 openSizer->Add( new wxButton( open_panel, Choose_Event, wxU(_("Choose...")) ), 0, wxALL, 5 );
568 open_panel->SetSizer( openSizer );
570 openSizer->Fit(open_panel);
571 mainSizer->Add( open_panel );
573 playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
574 VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
578 if( p_playlist->i_size > 0)
580 listview = new wxListView( this, ListView_Event,
581 wxDefaultPosition, wxDefaultSize,
582 wxLC_REPORT | wxSUNKEN_BORDER );
583 listview->InsertColumn( 0, wxU(_("Name")) );
584 listview->InsertColumn( 1, wxU(_("URI")) );
585 listview->SetColumnWidth( 0, 250 );
586 listview->SetColumnWidth( 1, 100 );
587 for( int i=0 ; i < p_playlist->i_size ; i++ )
589 wxString filename = wxL2U( p_playlist->pp_items[i]->input.
591 listview->InsertItem( i, filename );
592 listview->SetItem( i, 1, wxL2U( p_playlist->pp_items[i]->
594 listview->SetItemData( i,
595 (long)p_playlist->pp_items[i]->input.i_id );
597 listview->Select( p_playlist->i_index , TRUE);
598 mainSizer->Add( listview, 1, wxALL|wxEXPAND, 5 );
601 mainSizer->Hide( listview );
606 input_radios[1]->Disable();
608 vlc_object_release( p_playlist );
612 input_radios[1]->Disable();
615 /* Partial Extract Box */
616 mainSizer->Add( 0, 10, 0 );
617 wxStaticBox *partial_box = new wxStaticBox( this, -1,
618 wxU(_("Partial Extract")) );
620 wxStaticBoxSizer *partial_sizer = new wxStaticBoxSizer( partial_box,
623 enable_checkbox = new wxCheckBox( this, PartialEnable_Event,
625 enable_checkbox->SetToolTip(wxU(_(PARTIAL) ) ) ;
626 partial_sizer->Add( enable_checkbox, 0 , wxALIGN_CENTER_VERTICAL|wxALL, 5 ); //wxLEFT
628 wxFlexGridSizer *partial_sizer2 = new wxFlexGridSizer( 4 , 1 , 20 );
629 partial_sizer2->Add( new wxStaticText(this, -1, wxU(_( "From" ) ) ),
631 from_text = new wxTextCtrl( this, -1, wxT(""),
632 wxDefaultPosition, wxSize( 80,25 ) );
633 partial_sizer2->Add( from_text, 0 , wxALIGN_RIGHT);
634 partial_sizer2->Add( new wxStaticText(this, -1, wxU(_( "To" ) ) ),
636 to_text = new wxTextCtrl( this, -1, wxT(""),
637 wxDefaultPosition, wxSize( 80 , 25 ) );
638 partial_sizer2->Add( to_text, 0 , wxALIGN_RIGHT );
640 partial_sizer->Add( partial_sizer2, 0, wxALL, 0 );
642 partial_sizer->Fit( partial_box );
644 mainSizer->Add( partial_sizer, 0, 0, 0 );
646 from_text->Disable();
649 mainSizer->Fit(this);
653 wizInputPage::~wizInputPage()
657 void wizInputPage::OnInputChange( wxCommandEvent& event )
659 i_input = event.GetId() - InputRadio0_Event;
665 mainSizer->Hide( listview );
667 mainSizer->Show( open_panel );
674 mainSizer->Hide( open_panel );
676 mainSizer->Show( listview );
681 void wizInputPage::OnEnablePartial(wxCommandEvent& event)
683 from_text->Enable( event.IsChecked() );
684 to_text->Enable( event.IsChecked() );
688 void wizInputPage::OnChoose(wxCommandEvent& event)
690 p_open_dialog = new OpenDialog( p_intf, this, -1, -1, OPEN_STREAM );
691 if( p_open_dialog->ShowModal() == wxID_OK &&
692 !p_open_dialog->mrl.IsEmpty() )
694 mrl_text->SetValue(p_open_dialog->mrl[0] );
696 delete p_open_dialog;
697 p_open_dialog = NULL;
700 void wizInputPage::OnWizardPageChanging(wxWizardEvent& event)
704 if( mrl_text->GetValue().IsSameAs( wxT(""), TRUE ) &&
705 event.GetDirection() )
707 wxMessageBox( wxU( CHOOSE_STREAM ), wxU( ERROR_MSG ),
708 wxICON_WARNING | wxOK, this->p_parent );
714 p_parent->SetMrl( (const char *)mrl_text->GetValue().mb_str() );
720 i = listview->GetNextItem( i , wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
723 long data = listview->GetItemData( i );
724 playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
725 VLC_OBJECT_PLAYLIST, FIND_ANYWHERE);
728 playlist_item_t * p_item = playlist_LockItemGetById(
729 p_playlist, (int)data );
732 p_parent->SetMrl( (const char*)p_item->input.psz_uri );
741 if( enable_checkbox->IsChecked() )
743 int i_from = atoi( from_text->GetValue().mb_str() );
744 int i_to = atoi( to_text->GetValue().mb_str() );
745 p_parent->SetPartial( i_from, i_to );
750 wxWizardPage *wizInputPage::GetPrev() const { return p_prev; }
751 wxWizardPage *wizInputPage::GetNext() const
753 if( i_action == ACTION_STREAM )
754 return p_streaming_page;
756 return p_transcode_page;
759 void wizInputPage::SetStreamingPage( wxWizardPage *page)
761 p_streaming_page = page;
764 void wizInputPage::SetTranscodePage( wxWizardPage *page)
766 p_transcode_page = page;
769 void wizInputPage::SetAction( int i_action )
771 this->i_action = i_action;
774 void wizInputPage::SetPintf( intf_thread_t *p_intf )
776 this->p_intf = p_intf;
779 void wizInputPage::SetUri( char *psz_uri )
781 mrl_text->SetValue( wxU( psz_uri ) );
784 void wizInputPage::SetPartial( int i_from, int i_to )
787 msg.Printf( wxString( wxT( "%i") ), i_from );
788 from_text->Enable( TRUE );
789 from_text->SetValue( msg );
790 msg.Printf( wxString( wxT( "%i") ), i_to );
791 to_text->Enable( TRUE );
792 to_text->SetValue( msg );
793 enable_checkbox->SetValue( TRUE );
796 /***************************************************
797 * First transcode page: choose codecs *
798 ***************************************************/
799 wizTranscodeCodecPage::wizTranscodeCodecPage( wxWizard *parent,
800 wxWizardPage *next) : wxWizardPage(parent)
808 p_parent = (WizardDialog *) parent;
810 wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL);
813 pageHeader( this, main_sizer, TRANSCODE1_TITLE, TRANSCODE1_TEXT );
816 wxStaticBox *video_box = new wxStaticBox( this, -1, wxU(_("Video")) );
817 wxStaticBoxSizer *video_sizer = new wxStaticBoxSizer( video_box,
819 /* Line 1 : only the checkbox */
820 wxFlexGridSizer *video_sizer1 = new wxFlexGridSizer( 2,3,20 );
821 video_sizer1->Add( new wxCheckBox( this, VideoEnable_Event,
822 wxU(_("Transcode video") ) ), 0 , wxALIGN_CENTER_VERTICAL|wxALL , 5 );
823 video_sizer1->Add( 0,0,1);
825 video_sizer1->Add( new wxStaticText(this, -1, wxU(_("Codec"))),0,wxLEFT ,5);
826 video_combo = new wxComboBox( this, VideoCodec_Event, wxT(""),
827 wxDefaultPosition, wxSize(200,25), 0, NULL,
828 wxCB_DROPDOWN| wxCB_READONLY );
829 for( i= 0; vcodecs_array[i].psz_display != NULL; i++ )
831 video_combo->Append( wxU( vcodecs_array[i].psz_display ) ,
832 (void *)&vcodecs_array[i] );
835 video_combo->SetSelection(0);
837 video_sizer1->Add( video_combo, 0 , wxALIGN_LEFT , 0 );
839 video_sizer1->Add( new wxStaticText(this, -1, wxU(_("Bitrate (kb/s)"))),0,
841 vb_combo = new wxComboBox( this, VideoBitrate_Event, wxT("1024"),
842 wxDefaultPosition, wxDefaultSize,
843 WXSIZEOF(vbitrates_array), vbitrates_array, wxCB_READONLY );
844 video_sizer1->Add( vb_combo, 0, wxALIGN_LEFT , 0 );
847 video_text = new wxStaticText( this, -1,
848 wxU( vlc_wraptext( TR_VIDEO_TEXT, TEXTWIDTH, false) ) );
849 /* Fill the main video sizer */
850 video_sizer->Add( video_sizer1 , 0, wxEXPAND , 5 );
851 video_sizer->Add( video_text, 0, wxLEFT|wxTOP , 5 );
855 wxStaticBox *audio_box = new wxStaticBox( this, -1, wxU(_("Audio")) );
856 wxStaticBoxSizer *audio_sizer = new wxStaticBoxSizer( audio_box,
859 wxFlexGridSizer *audio_sizer1 = new wxFlexGridSizer( 2,3,20);
860 audio_sizer1->Add( new wxCheckBox( this, AudioEnable_Event,
861 wxU(_("Transcode audio") ) ), 0 , wxALIGN_CENTER_VERTICAL|wxALL, 5 );
862 audio_sizer1->Add( 0, 0, 1 );
865 audio_sizer1->Add( new wxStaticText(this, -1, wxU(_("Codec"))),0,wxLEFT,5);
866 audio_combo = new wxComboBox( this, AudioCodec_Event, wxT(""),
867 wxDefaultPosition, wxSize(200,25), 0, NULL,
868 wxCB_DROPDOWN| wxCB_READONLY );
869 for( i= 0; acodecs_array[i].psz_display != NULL; i++ )
871 audio_combo->Append( wxU( acodecs_array[i].psz_display ) ,
872 (void *)&acodecs_array[i] );
875 audio_combo->SetSelection(0);
876 audio_sizer1->Add( audio_combo, 0 , wxALIGN_LEFT, 0 );
878 audio_sizer1->Add( new wxStaticText(this, -1, wxU(_("Bitrate (kb/s)"))),0,
880 ab_combo = new wxComboBox( this, AudioBitrate_Event, wxT("192"),
881 wxDefaultPosition, wxDefaultSize,
882 WXSIZEOF(abitrates_array), abitrates_array, wxCB_READONLY );
883 audio_sizer1->Add( ab_combo, 0, wxALIGN_LEFT, 0 );
886 audio_text = new wxStaticText( this, -1,
887 wxU( vlc_wraptext( TR_AUDIO_TEXT, TEXTWIDTH, false) ) );
889 audio_sizer->Add(audio_sizer1, 0, wxEXPAND, 5);
890 audio_sizer->Add( audio_text, 0, wxLEFT | wxTOP, 5 );
892 main_sizer->Add( video_sizer, 1, wxGROW, 0 );
893 main_sizer->Add( audio_sizer, 1, wxGROW, 0 );
894 main_sizer->Layout();
895 SetSizerAndFit( main_sizer );
897 /* Default disabled */
898 video_combo->Disable(); video_text->Disable();vb_combo->Disable();
899 audio_combo->Disable(); audio_text->Disable();ab_combo->Disable();
903 wizTranscodeCodecPage::~wizTranscodeCodecPage()
905 if( acodec ) free( acodec );
906 if( vcodec ) free( vcodec );
909 void wizTranscodeCodecPage::OnEnableVideo(wxCommandEvent& event)
911 video_combo->Enable( event.IsChecked() );
912 vb_combo->Enable( event.IsChecked() );
913 video_text->Enable( event.IsChecked() );
916 void wizTranscodeCodecPage::OnEnableAudio(wxCommandEvent& event)
918 audio_combo->Enable( event.IsChecked() );
919 ab_combo->Enable( event.IsChecked() );
920 audio_text->Enable( event.IsChecked() );
923 void wizTranscodeCodecPage::OnVideoCodecChange(wxCommandEvent& event)
925 struct codec *c = (struct codec*)
926 (video_combo->GetClientData(video_combo->GetSelection()));
927 video_text->SetLabel( wxU( vlc_wraptext(c->psz_descr, TEXTWIDTH, false) ) );
928 i_video_codec = video_combo->GetSelection();
929 vcodec = strdup(c->psz_codec);
932 void wizTranscodeCodecPage::OnAudioCodecChange(wxCommandEvent& event)
934 struct codec *c = (struct codec*)
935 (audio_combo->GetClientData(audio_combo->GetSelection()));
936 audio_text->SetLabel( wxU( vlc_wraptext(c->psz_descr, TEXTWIDTH, false) ) );
937 i_audio_codec = audio_combo->GetSelection();
938 acodec = strdup(c->psz_codec);
942 void wizTranscodeCodecPage::OnWizardPageChanging(wxWizardEvent& event)
946 if( !event.GetDirection() )
952 /* Set the dummy codec ( accept all muxers ) if needed */
953 if( !video_combo->IsEnabled() )
955 i_video_codec = VCODECS_NUMBER;
957 if( !audio_combo->IsEnabled() )
959 i_audio_codec = ACODECS_NUMBER;
962 ((wizEncapPage *)GetNext())->SetPrev(this);
964 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
966 if( vcodecs_array[i_video_codec].muxers[i] != -1 )
968 for( j = 0 ; j< MUXERS_NUMBER ; j++ )
970 if( acodecs_array[i_audio_codec].muxers[j] ==
971 vcodecs_array[i_video_codec].muxers[i] )
973 ((wizEncapPage*)GetNext())->EnableEncap(
974 vcodecs_array[i_video_codec].muxers[i] );
979 struct codec *c = (struct codec*)
980 (video_combo->GetClientData( video_combo->IsEnabled() ?
981 video_combo->GetSelection(): i_video_codec ));
982 vcodec = strdup(c->psz_codec);
984 (audio_combo->GetClientData( audio_combo->IsEnabled() ?
985 audio_combo->GetSelection() : i_audio_codec ));
986 acodec = strdup(c->psz_codec);
988 int vb = atoi(vb_combo->GetValue().mb_str() );
993 int ab = atoi(ab_combo->GetValue().mb_str() );
999 p_parent->SetTranscode( vcodec, vb , acodec, ab );
1000 ((wizEncapPage*)GetNext())->SetAction( p_parent->GetAction() );
1001 p_parent->SetAction( p_parent->GetAction() );
1006 wxWizardPage *wizTranscodeCodecPage::GetPrev() const { return p_prev; }
1007 wxWizardPage *wizTranscodeCodecPage::GetNext() const { return p_next; }
1008 void wizTranscodeCodecPage::SetPrev( wxWizardPage *page) {p_prev = page; }
1011 /***************************************************
1012 * First streaming page: choose method *
1013 ***************************************************/
1014 wizStreamingMethodPage::wizStreamingMethodPage( intf_thread_t *p_this, wxWizard *parent,
1015 wxWizardPage *next) : wxWizardPage(parent), p_intf( p_this )
1019 p_parent = (WizardDialog *)parent;
1021 mainSizer = new wxBoxSizer(wxVERTICAL);
1023 /* Create the texts */
1024 pageHeader( this, mainSizer, STREAMING1_TITLE, STREAMING1_TEXT );
1026 mainSizer->Add( 0,50,0 );
1030 wxStaticBox *method_box = new wxStaticBox( this, -1,
1031 wxU(_("Streaming method")) );
1032 wxStaticBoxSizer *method_sizer = new wxStaticBoxSizer(method_box,
1034 for( i = 0 ; i< 3 ; i++ )
1036 method_radios[i] = new wxRadioButton( this, MethodRadio0_Event + i,
1037 wxU( methods_array[i].psz_method ) );
1038 method_radios[i]->SetToolTip( wxU(_( methods_array[i].psz_descr ) ) );
1039 method_sizer->Add( method_radios[i], 0, wxALL, 5 );
1042 method_sizer->Layout();
1044 wxStaticBox *address_box = new wxStaticBox( this, -1,
1045 wxU(_("Destination")) );
1047 address_sizer = new wxStaticBoxSizer(address_box,
1050 /* Big kludge, we take the longest text to get the size */
1051 address_text = new wxStaticText(this, -1,
1052 wxU( vlc_wraptext(methods_array[2].psz_address,
1053 TEXTWIDTH, false ) ),
1054 wxDefaultPosition, wxDefaultSize );
1056 address_txtctrl = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
1058 address_sizer->Add( address_text, 0, wxALL, 5 );
1059 address_sizer->Add( address_txtctrl, 0, wxALL, 5 );
1060 address_sizer->Layout();
1062 /* Set the minimum size */
1063 address_sizer->SetMinSize( address_sizer->GetSize() );
1064 address_text->SetLabel( wxU(
1065 vlc_wraptext( _(methods_array[0].psz_address), TEXTWIDTH, false)));
1067 mainSizer->Add( method_sizer, 0, wxALL | wxEXPAND, 5 );
1068 mainSizer->Add( address_sizer, 0, wxALL | wxEXPAND, 5 );
1070 mainSizer->Add( 0,0,1 );
1072 mainSizer->Layout();
1074 SetSizer(mainSizer);
1075 mainSizer->Fit(this);
1080 void wizStreamingMethodPage::OnWizardPageChanging(wxWizardEvent& event)
1083 if( !event.GetDirection() ) return;
1085 /* Check valid address */
1087 && !net_AddressIsMulticast( (vlc_object_t *)p_intf,
1088 address_txtctrl->GetValue().mb_str()) )
1090 wxMessageBox( wxU( INVALID_MCAST_ADDRESS ) , wxU( ERROR_MSG ),
1091 wxICON_WARNING | wxOK, this->p_parent );
1095 else if( i_method == 0 && address_txtctrl->GetValue().IsEmpty() )
1097 wxMessageBox( wxU( NO_ADDRESS_TEXT ) , wxU( ERROR_MSG ),
1098 wxICON_WARNING | wxOK, this->p_parent );
1103 ((wizEncapPage *)GetNext())->SetPrev(this);
1104 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
1106 if( methods_array[i_method].muxers[i] != -1 )
1108 ((wizEncapPage*)GetNext())->EnableEncap(
1109 methods_array[i_method].muxers[i] );
1112 p_parent->SetStream( methods_array[i_method].psz_access ,
1113 address_txtctrl->GetValue().mb_str() );
1115 /* Set the action for the muxer page */
1116 ((wizEncapPage*)GetNext())->SetAction( p_parent->GetAction() );
1120 wxWizardPage *wizStreamingMethodPage::GetPrev() const { return p_prev; }
1121 wxWizardPage *wizStreamingMethodPage::GetNext() const { return p_next; }
1123 void wizStreamingMethodPage::SetPrev( wxWizardPage *page) {p_prev = page; }
1126 void wizStreamingMethodPage::OnMethodChange( wxCommandEvent& event )
1128 i_method = event.GetId() - MethodRadio0_Event;
1129 address_text->SetLabel( wxU(
1130 vlc_wraptext( _(methods_array[i_method].psz_address), TEXTWIDTH, false)));
1131 address_sizer->Layout();
1132 mainSizer->Layout();
1135 /***************************************************
1136 * Choose encapsulation format *
1137 ***************************************************/
1138 wizEncapPage::wizEncapPage( wxWizard *parent ) : wxWizardPage(parent)
1142 p_parent = (WizardDialog *)parent;
1143 p_streaming_page = NULL;
1144 p_transcode_page = NULL;
1146 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
1148 /* Create the texts */
1149 pageHeader( this, mainSizer, ENCAP_TITLE, ENCAP_TEXT );
1151 mainSizer->Add( 0,0,1 );
1153 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
1155 encap_radios[i] = new wxRadioButton( this, EncapRadio0_Event + i,
1156 wxU( encaps_array[i].psz_encap ) );
1157 encap_radios[i]->SetToolTip( wxU(_( encaps_array[i].psz_descr ) ) );
1158 mainSizer->Add( encap_radios[i], 0, wxLEFT, 5 );
1159 encap_radios[i]->Disable();
1162 mainSizer->Add( 0,0,1 );
1164 SetSizer(mainSizer);
1165 mainSizer->Fit(this);
1168 wizEncapPage::~wizEncapPage()
1172 void wizEncapPage::OnWizardPageChanging(wxWizardEvent& event)
1175 if( !event.GetDirection() )
1177 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
1179 encap_radios[i]->Disable();
1182 p_parent->SetMux( encaps_array[i_mux].psz_mux );
1184 if( p_parent->GetAction() == ACTION_STREAM )
1186 if( strstr( p_parent->method, "rtp" ))
1188 ((wizStreamingExtraPage *)GetNext())->sap_checkbox->Enable();
1189 ((wizStreamingExtraPage *)GetNext())->sap_text->Enable(false);
1193 ((wizStreamingExtraPage *)GetNext())->sap_checkbox->Enable( false );
1194 ((wizStreamingExtraPage *)GetNext())->sap_text->Enable( false );
1202 void wizEncapPage::OnEncapChange( wxCommandEvent& event )
1204 i_mux = event.GetId() - EncapRadio0_Event;
1207 void wizEncapPage::EnableEncap( int encap )
1210 for( i = 0 ; i< MUXERS_NUMBER ; i++)
1212 if( encaps_array[i].id == encap )
1214 encap_radios[i]->Enable();
1215 encap_radios[i]->SetValue(true);
1221 void wizEncapPage::SetStreamingPage( wxWizardPage *page)
1223 p_streaming_page = page;
1226 void wizEncapPage::SetTranscodePage( wxWizardPage *page)
1228 p_transcode_page = page;
1231 wxWizardPage *wizEncapPage::GetPrev() const { return p_prev; }
1233 wxWizardPage *wizEncapPage::GetNext() const
1235 if( i_action== ACTION_STREAM )
1236 return p_streaming_page;
1238 return p_transcode_page;
1241 void wizEncapPage::SetAction( int i_act ) { i_action = i_act; }
1243 void wizEncapPage::SetPrev( wxWizardPage *page) { p_prev = page; }
1245 /***************************************************
1246 * Extra transcoding page : Select file *
1247 ***************************************************/
1248 wizTranscodeExtraPage::wizTranscodeExtraPage( wxWizard *parent,
1250 wxWizardPage *next) : wxWizardPage(parent)
1254 p_parent = (WizardDialog *) parent;
1255 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
1257 /* Create the texts */
1258 pageHeader( this, mainSizer, EXTRATRANSCODE_TITLE, EXTRATRANSCODE_TEXT );
1260 mainSizer->Add( 0, 0, 1 );
1262 wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 2, 1 );
1263 sizer->Add( new wxStaticText( this, -1,
1264 wxU(_("Select the file to save to") ) ),
1266 sizer->Add( 0, 0, 1 );
1268 file_text = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
1269 wxSize( 150, -1 ) );
1271 sizer->Add( file_text, 0, wxALL, 5 );
1272 sizer->Add( new wxButton( this, Open_Event, wxU("Choose") ) );
1274 mainSizer->Add( sizer, 0, 0, 0) ;
1276 mainSizer->Add( 0, 0, 1 );
1277 SetSizer(mainSizer);
1278 mainSizer->Fit(this);
1281 void wizTranscodeExtraPage::OnSelectFile( wxCommandEvent &event)
1283 wxFileDialog *file_dialog = new wxFileDialog( this, wxU(_("Save to file")),
1284 wxT(""), wxT(""), wxT("*"), wxSAVE );
1286 if( file_dialog && file_dialog->ShowModal() == wxID_OK )
1288 if( file_dialog->GetFilename().mb_str() )
1290 file_text->SetValue( file_dialog->GetPath() );
1295 void wizTranscodeExtraPage::OnWizardPageChanging( wxWizardEvent& event )
1297 if( event.GetDirection() && file_text->GetValue().IsEmpty() )
1299 wxMessageBox( wxU( CHOOSE_OUTFILE ), wxU( ERROR_MSG ),
1300 wxICON_WARNING | wxOK, this->p_parent );
1303 if( event.GetDirection() )
1305 p_parent->SetTranscodeOut( file_text->GetValue().mb_str());
1309 wxWizardPage *wizTranscodeExtraPage::GetPrev() const { return p_prev; }
1310 wxWizardPage *wizTranscodeExtraPage::GetNext() const {return p_next; }
1312 /***********************************************************
1313 * Extra streaming page
1314 ***********************************************************/
1315 wizStreamingExtraPage::wizStreamingExtraPage( wxWizard *parent,
1317 wxWizardPage *next) : wxWizardPage(parent)
1321 p_parent = (WizardDialog *) parent;
1322 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
1324 /* Create the texts */
1325 pageHeader( this, mainSizer, EXTRASTREAMING_TITLE, EXTRASTREAMING_TEXT );
1327 mainSizer->Add( 0, 0, 1 );
1329 wxFlexGridSizer *sizer = new wxFlexGridSizer( 2,2,1) ;
1332 sizer->Add( new wxStaticText( this, -1, wxU(_("Time-To-Live (TTL)"))),
1334 ttl_spin = new wxSpinCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize,
1336 ttl_spin->SetToolTip(wxU(_(TTL) ) ) ;
1337 sizer->Add( ttl_spin, 0, wxALL , 5 );
1340 sap_checkbox = new wxCheckBox( this, SAP_Event, wxU(_("SAP Announce")) );
1341 sap_checkbox->SetToolTip( wxU(_( SAP ) ) );
1342 sizer->Add( sap_checkbox, 0, 0 , 0 );
1343 sap_text = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
1345 sap_text->SetToolTip( wxU(_( SAP ) ) );
1346 sizer->Add( sap_text, 0, wxALL , 5 );
1348 mainSizer->Add(sizer, 0, wxALL, 5 );
1350 mainSizer->Add( 0, 0, 1 );
1352 SetSizer(mainSizer);
1353 mainSizer->Fit(this);
1356 void wizStreamingExtraPage::OnSAP( wxCommandEvent &event )
1358 sap_text->Enable( event.IsChecked() );
1361 void wizStreamingExtraPage::OnWizardPageChanging(wxWizardEvent& event)
1363 if( sap_checkbox->IsChecked() )
1365 if( sap_text->GetValue().IsEmpty() )
1367 p_parent->SetSAP( true, NULL );
1371 p_parent->SetSAP( true,
1372 (const char *)sap_text->GetValue().mb_str() );
1377 p_parent->SetSAP( false, NULL );
1380 p_parent->SetTTL( ttl_spin->GetValue() );
1383 wxWizardPage *wizStreamingExtraPage::GetPrev() const { return p_prev; }
1384 wxWizardPage *wizStreamingExtraPage::GetNext() const {return p_next; }
1387 /***************************************************************************
1388 * Implementation of the wizard itself
1389 ***************************************************************************/
1390 wizHelloPage *page1;
1391 wizInputPage *page2 ;
1392 wizTranscodeCodecPage *tr_page1 ;
1393 wizStreamingMethodPage *st_page1;
1394 wizTranscodeExtraPage *tr_page2 ;
1395 wizStreamingExtraPage *st_page2;
1396 wizEncapPage *encap_page;
1398 WizardDialog::WizardDialog(intf_thread_t *_p_intf, wxWindow *_p_parent,
1399 char *psz_uri, int _i_from, int _i_to ) :
1400 wxWizard( _p_parent, -1, wxU(_("Streaming/Transcoding Wizard")), wxNullBitmap, wxDefaultPosition)
1402 /* Initializations */
1404 SetPageSize(wxSize(400,420));
1406 /* Initialize structure */
1416 page1 = new wizHelloPage(this);
1417 page2 = new wizInputPage(this, page1, p_intf);
1421 page2->SetUri( psz_uri );
1423 if( i_from != 0 || i_to != 0 )
1425 page2->SetPartial( i_from, i_to );
1428 encap_page = new wizEncapPage(this );
1429 tr_page1 = new wizTranscodeCodecPage(this, encap_page );
1430 st_page1 = new wizStreamingMethodPage( p_intf, this, encap_page);
1432 tr_page2 = new wizTranscodeExtraPage(this, encap_page, NULL );
1433 st_page2 = new wizStreamingExtraPage(this, encap_page, NULL );
1436 page1->SetNext( page2 );
1437 /* 2->1 in constructor of 2 */
1440 page2->SetTranscodePage(tr_page1);
1441 page2->SetStreamingPage(st_page1);
1442 page2->SetPintf( p_intf );
1443 tr_page1->SetPrev(page2);
1444 st_page1->SetPrev(page2);
1447 encap_page->SetTranscodePage( tr_page2 );
1448 encap_page->SetStreamingPage( st_page2 );
1449 /* 3->4 in constructor of 3 */
1450 // encap_page->SetPrev(tr_page1);
1453 WizardDialog::~WizardDialog()
1465 void WizardDialog::SetMrl( const char *mrl )
1467 this->mrl = strdup( mrl );
1470 void WizardDialog::SetTTL( int i_ttl )
1472 this->i_ttl = i_ttl;
1475 void WizardDialog::SetSAP( bool b_enabled, const char *psz_text )
1477 this->b_sap = b_enabled;
1480 if( psz_text != NULL )
1482 this->psz_sap_name = strdup( psz_text );
1486 this->psz_sap_name = NULL;
1491 void WizardDialog::SetPartial( int i_from, int i_to )
1493 this->i_from = i_from;
1497 void WizardDialog::SetTranscode( char const *vcodec, int vb,
1498 char const *acodec, int ab)
1500 if( strcmp( vcodec, "dummy") )
1502 this->vcodec= strdup(vcodec);
1504 if( strcmp( acodec, "dummy" ) )
1506 this->acodec = strdup(acodec);
1512 void WizardDialog::SetStream( char const *method, char const *address )
1514 this->method = strdup( method );
1515 this->address = strdup( address );
1518 void WizardDialog::SetTranscodeOut( char const *address )
1520 char *psz_utf8 = FromLocale( address );
1521 this->address = strdup( psz_utf8 );
1522 LocaleFree( psz_utf8 );
1525 void WizardDialog::SetMux( char const *mux )
1527 this->mux = strdup( mux );
1530 void WizardDialog::SetAction( int i_action )
1532 this->i_action = i_action;
1535 int WizardDialog::GetAction()
1540 void WizardDialog::Run()
1542 if( RunWizard(page1) )
1546 if( i_action == ACTION_TRANSCODE )
1548 msg_Dbg( p_intf,"Starting transcode of %s to file %s",
1550 msg_Dbg( p_intf,"Using %s (%i kbps) / %s (%i kbps),encap %s",
1551 vcodec,vb,acodec,ab,mux);
1552 char *psz_transcode;
1554 if( vcodec != NULL || acodec != NULL )
1557 if( vcodec != NULL )
1558 i_tr_size += strlen( vcodec ) + 17;
1559 if( acodec != NULL )
1560 i_tr_size += strlen( acodec ) + 17;
1572 psz_transcode = (char *)malloc( i_tr_size * sizeof(char) );
1574 strcpy( psz_transcode, "transcode{" );
1575 if( vcodec != NULL )
1577 sprintf( psz_transcode + strlen( psz_transcode ),
1578 "vcodec=%s,vb=%i%s", vcodec, vb,
1579 ( acodec != NULL ) ? "," : "}:" );
1581 if( acodec != NULL )
1583 sprintf( psz_transcode + strlen( psz_transcode ),
1584 "acodec=%s,ab=%i}:", acodec, ab );
1590 asprintf( &psz_opt, ":sout=#%sstandard{mux=%s,url=%s,"
1591 "access=file}", psz_transcode, mux, address );
1593 if( *psz_transcode )
1594 free( psz_transcode );
1598 char *psz_sap_option = NULL;
1601 msg_Dbg( p_intf, "Starting stream of %s to %s using %s, encap %s",
1602 mrl, address, method, mux );
1607 asprintf( &psz_sap_option,
1608 ",sap,name=\"%s\"", psz_sap_name );
1611 psz_sap_option = strdup( ",sap" );
1615 /* Add brackets automatically for IPv6 if they are missing */
1616 v6 = ( address[0] != '[' ) && ( strchr( address, ':' ) != NULL );
1618 ":sout=#standard{mux=%s,url=%s%s%s,access=%s%s}",
1619 mux, v6 ? "[" : "", address, v6 ? "]" : "", method,
1620 psz_sap_option ?: "" );
1621 if( psz_sap_option ) free( psz_sap_option );
1624 playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
1625 VLC_OBJECT_PLAYLIST, FIND_ANYWHERE);
1628 playlist_item_t *p_item = playlist_ItemNew( p_playlist, mrl,
1630 playlist_ItemAddOption( p_item, psz_opt);
1634 snprintf( psz_from, 20, "start-time=%i", i_from);
1635 playlist_ItemAddOption( p_item, psz_from);
1640 snprintf( psz_to, 20, "stop-time=%i", i_to);
1641 playlist_ItemAddOption( p_item, psz_to);
1645 snprintf( psz_ttl, 20, "ttl=%i",i_ttl );
1646 playlist_ItemAddOption( p_item, psz_ttl );
1648 playlist_AddItem( p_playlist, p_item, PLAYLIST_GO, PLAYLIST_END );
1649 vlc_object_release(p_playlist);
1653 wxMessageBox( wxU( NO_PLAYLIST ), wxU( ERROR_MSG ),
1654 wxICON_WARNING | wxOK, this );