1 /*****************************************************************************
2 * wizard.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2004 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., 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() */
36 #include "wxwidgets.h"
38 #include "streamdata.h"
40 #include <wx/statline.h>
45 /*****************************************************************************
47 *****************************************************************************/
50 ActionRadio0_Event, ActionRadio1_Event,
51 MoreInfoStreaming_Event,
52 MoreInfoTranscode_Event,
54 Open_Event , Choose_Event ,
56 InputRadio0_Event, InputRadio1_Event,
59 MethodRadio0_Event, MethodRadio1_Event,
60 MethodRadio2_Event, MethodRadio3_Event,
62 EncapRadio0_Event, EncapRadio1_Event,
63 EncapRadio2_Event, EncapRadio3_Event,
64 EncapRadio4_Event, EncapRadio5_Event,
65 EncapRadio6_Event, EncapRadio7_Event,
66 EncapRadio8_Event, EncapRadio9_Event,
67 EncapRadio10_Event, EncapRadio11_Event,
69 VideoEnable_Event, VideoCodec_Event,VideoBitrate_Event,
70 AudioEnable_Event, AudioCodec_Event,AudioBitrate_Event,
77 #define ACTION_STREAM 0
78 #define ACTION_TRANSCODE 1
80 BEGIN_EVENT_TABLE(WizardDialog, wxWizard)
83 /*****************************************************************************
85 *****************************************************************************/
87 #define ERROR_MSG _("Error")
88 #define ITEM_NAME _("Streaming/Transcoding Wizard")
91 #define HELLO_TITLE _("Streaming/Transcoding Wizard")
92 #define HELLO_TEXT _("This wizard helps you to stream, transcode or" \
94 #define HELLO_STREAMING _("Stream to network")
95 #define HELLO_STREAMING_DESC _("Use this to stream on a network.")
96 #define HELLO_TRANSCODE _("Transcode/Save to file")
97 #define HELLO_TRANSCODE_DESC _("Use this to re-encode a stream and save it to a file.")
98 #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.")
100 #define MOREINFO_STREAM _("Use this to stream on a network")
102 #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 " \
103 "for file to file transcoding. You should use its transcoding " \
104 "features to save network streams, for example." )
107 #define INPUT_TITLE _("Choose input")
108 #define INPUT_TEXT _("Choose here your input stream.")
110 #define INPUT_OPEN _("Select a stream" )
111 #define INPUT_PL _( "Existing playlist item" )
113 #define CHOOSE_STREAM _("You must choose a stream")
114 #define NO_PLAYLIST _("Uh Oh! Unable to find playlist !")
116 #define PARTIAL _("Use this to read only a part of the stream. " \
117 "You must be able to control the incoming stream " \
118 "(for example, a file or a disc, but not a RTP/UDP " \
119 "network stream.)\n" \
120 "Enter the starting and ending times (in seconds).")
122 #define INPUT_BUTTON _("Choose")
125 #define TRANSCODE1_TITLE _("Transcode")
126 #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.)")
128 #define TR_VIDEO_TEXT0 _("If your stream has video and you want to " \
129 "transcode it, enable this.")
130 #define TR_VIDEO_TEXT _("Select your video codec. Click one to get more " \
133 #define TR_AUDIO_TEXT0 _("If your stream has audio and you want to "\
134 "transcode it, enable this.")
135 #define TR_AUDIO_TEXT _("Select your audio codec. Click one to get more " \
139 #define STREAMING1_TITLE _("Streaming")
140 #define STREAMING1_TEXT _("In this page, you will select how your input stream will be sent.")
143 #define INVALID_MCAST_ADDRESS _("This does not appear to be a valid " \
144 "multicast address" )
145 #define NO_ADDRESS_TEXT _("You need to enter an address" )
148 #define ENCAP_TITLE _("Encapsulation format")
149 #define ENCAP_TEXT _("In this page, you will select how the stream will be "\
150 "encapsulated. Depending on the choices you made, all "\
151 "formats won't be available." )
155 #define EXTRATRANSCODE_TITLE _("Additional transcode options")
156 #define EXTRATRANSCODE_TEXT _("In this page, you will define a few " \
157 "additionnal parameters for your transcoding" )
159 #define CHOOSE_OUTFILE _("You must choose a file to save to")
162 #define EXTRASTREAMING_TITLE _("Additional streaming options")
163 #define EXTRASTREAMING_TEXT _("In this page, you will define a few " \
164 "additionnal parameters for your stream" )
166 #define TTL _("Define the TTL (Time-To-Live) of the stream. This parameter " \
167 "is the maximum number of routers your stream can go through. " \
168 "If you don't know what it means, or if you want to stream on " \
169 "your local network only, leave this setting to 1." )
171 #define SAP _("When streaming using RTP, you can announce your streams " \
172 "using the SAP/SDP announcing protocol. This way, the clients " \
173 "won't have to type in the multicast address, it will appear " \
174 "in their playlist if they enable the SAP extra interface.\n" \
175 "If you want to give a name to your stream, enter it here, " \
176 "else, a default name will be used" )
178 /*****************************************************************************
179 * All the pages of the wizard, declaration
180 *****************************************************************************/
182 /* Declare classes */
183 class wizHelloPage : public wxWizardPageSimple
186 wizHelloPage( wxWizard *parent);
187 void OnActionChange( wxCommandEvent& event );
188 void OnWizardPageChanging(wxWizardEvent& event);
189 void OnMoreInfo( wxCommandEvent& event );
192 WizardDialog *p_parent;
193 wxRadioButton *action_radios[2];
194 DECLARE_EVENT_TABLE()
197 BEGIN_EVENT_TABLE(wizHelloPage, wxWizardPageSimple)
198 EVT_RADIOBUTTON( ActionRadio0_Event, wizHelloPage::OnActionChange)
199 EVT_RADIOBUTTON( ActionRadio1_Event, wizHelloPage::OnActionChange)
200 EVT_BUTTON( MoreInfoStreaming_Event, wizHelloPage::OnMoreInfo )
201 EVT_BUTTON( MoreInfoTranscode_Event, wizHelloPage::OnMoreInfo )
203 EVT_WIZARD_PAGE_CHANGING(-1, wizHelloPage::OnWizardPageChanging)
207 class wizInputPage : public wxWizardPage
210 wizInputPage( wxWizard *, wxWizardPage *, intf_thread_t *);
211 wizInputPage::~wizInputPage();
212 void OnWizardPageChanging(wxWizardEvent& event);
213 void OnInputChange( wxCommandEvent& event );
214 void OnEnablePartial(wxCommandEvent& event);
215 virtual wxWizardPage *GetPrev() const;
216 virtual wxWizardPage *GetNext() const;
217 void SetStreamingPage( wxWizardPage *page);
218 void SetTranscodePage( wxWizardPage *page);
219 void SetAction( int i_action );
220 void SetPintf( intf_thread_t *p_intf );
221 void SetUri( char *psz_uri );
222 void SetPartial( int i_from, int i_to );
226 intf_thread_t *p_intf;
230 void OnChoose( wxCommandEvent& event );
232 WizardDialog *p_parent;
233 wxRadioButton *input_radios[2];
234 wxCheckBox *enable_checkbox;
235 wxBoxSizer *mainSizer;
237 wxTextCtrl *mrl_text;
238 wxTextCtrl *from_text;
240 OpenDialog *p_open_dialog;
241 wxListView *listview;
243 wxPanel *radio_panel; /* radio buttons should be in their own panel... */
244 wxWizardPage *p_prev;
245 wxWizardPage *p_streaming_page;
246 wxWizardPage *p_transcode_page;
248 DECLARE_EVENT_TABLE()
251 BEGIN_EVENT_TABLE(wizInputPage, wxWizardPage)
252 EVT_RADIOBUTTON( InputRadio0_Event, wizInputPage::OnInputChange)
253 EVT_RADIOBUTTON( InputRadio1_Event, wizInputPage::OnInputChange)
254 EVT_BUTTON( Choose_Event, wizInputPage::OnChoose)
255 EVT_CHECKBOX( PartialEnable_Event, wizInputPage::OnEnablePartial)
256 EVT_WIZARD_PAGE_CHANGING(-1, wizInputPage::OnWizardPageChanging)
260 class wizTranscodeCodecPage : public wxWizardPage
263 wizTranscodeCodecPage( wxWizard *parent, wxWizardPage *next);
264 ~wizTranscodeCodecPage();
265 void wizTranscodeCodecPage::OnWizardPageChanging(wxWizardEvent& event);
266 virtual wxWizardPage *GetPrev() const;
267 virtual wxWizardPage *GetNext() const;
268 void SetPrev( wxWizardPage *page);
270 wxCheckBox *video_checkbox;
271 wxComboBox *video_combo;
272 wxComboBox *vb_combo;
273 wxStaticText * video_text;
274 wxCheckBox *audio_checkbox;
275 wxComboBox *audio_combo;
276 wxComboBox *ab_combo;
277 wxStaticText * audio_text;
279 WizardDialog *p_parent;
286 wxWizardPage *p_prev;
287 wxWizardPage *p_next;
289 void OnVideoCodecChange(wxCommandEvent& event);
290 void OnAudioCodecChange(wxCommandEvent& event);
291 void OnEnableVideo(wxCommandEvent& event);
292 void OnEnableAudio(wxCommandEvent& event);
294 DECLARE_EVENT_TABLE()
297 BEGIN_EVENT_TABLE(wizTranscodeCodecPage, wxWizardPage)
298 EVT_CHECKBOX( VideoEnable_Event, wizTranscodeCodecPage::OnEnableVideo)
299 EVT_CHECKBOX( AudioEnable_Event, wizTranscodeCodecPage::OnEnableAudio)
300 EVT_COMBOBOX( VideoCodec_Event, wizTranscodeCodecPage::OnVideoCodecChange)
301 EVT_COMBOBOX( AudioCodec_Event, wizTranscodeCodecPage::OnAudioCodecChange)
302 EVT_WIZARD_PAGE_CHANGING(-1, wizTranscodeCodecPage::OnWizardPageChanging)
305 class wizStreamingMethodPage : public wxWizardPage
308 wizStreamingMethodPage( intf_thread_t *p_this, wxWizard *parent,
309 wxWizardPage *next) ;
310 void OnWizardPageChanging(wxWizardEvent& event);
311 virtual wxWizardPage *GetPrev() const;
312 virtual wxWizardPage *GetNext() const;
313 void SetPrev( wxWizardPage *page);
315 DECLARE_EVENT_TABLE()
317 wxBoxSizer *mainSizer;
318 wxStaticBoxSizer *address_sizer;
319 wxStaticText *address_text;
320 wxTextCtrl *address_txtctrl;
321 WizardDialog * p_parent;
322 void OnMethodChange( wxCommandEvent& event );
323 wxRadioButton *method_radios[4];
324 wxWizardPage *p_prev;
325 wxWizardPage *p_next;
326 intf_thread_t *p_intf;
329 BEGIN_EVENT_TABLE(wizStreamingMethodPage, wxWizardPage)
330 EVT_RADIOBUTTON( MethodRadio0_Event, wizStreamingMethodPage::OnMethodChange)
331 EVT_RADIOBUTTON( MethodRadio1_Event, wizStreamingMethodPage::OnMethodChange)
332 EVT_RADIOBUTTON( MethodRadio2_Event, wizStreamingMethodPage::OnMethodChange)
333 EVT_RADIOBUTTON( MethodRadio3_Event, wizStreamingMethodPage::OnMethodChange)
334 EVT_WIZARD_PAGE_CHANGING(-1, wizStreamingMethodPage::OnWizardPageChanging)
338 class wizEncapPage : public wxWizardPage
341 wizEncapPage( wxWizard *parent);
342 wizEncapPage::~wizEncapPage();
343 void OnWizardPageChanging(wxWizardEvent& event);
344 virtual wxWizardPage *GetPrev() const;
345 virtual wxWizardPage *GetNext() const;
346 void SetStreamingPage( wxWizardPage *page);
347 void SetTranscodePage( wxWizardPage *page);
348 void SetPrev( wxWizardPage *page);
349 void SetAction( int );
350 void EnableEncap( int encap );
352 DECLARE_EVENT_TABLE()
356 void OnEncapChange( wxCommandEvent& event );
357 wxRadioButton *encap_radios[MUXERS_NUMBER];
358 WizardDialog *p_parent;
359 wxWizardPage *p_prev;
360 wxWizardPage *p_streaming_page;
361 wxWizardPage *p_transcode_page;
364 BEGIN_EVENT_TABLE(wizEncapPage, wxWizardPage)
365 EVT_WIZARD_PAGE_CHANGING(-1, wizEncapPage::OnWizardPageChanging)
366 EVT_RADIOBUTTON( EncapRadio0_Event, wizEncapPage::OnEncapChange)
367 EVT_RADIOBUTTON( EncapRadio1_Event, wizEncapPage::OnEncapChange)
368 EVT_RADIOBUTTON( EncapRadio2_Event, wizEncapPage::OnEncapChange)
369 EVT_RADIOBUTTON( EncapRadio3_Event, wizEncapPage::OnEncapChange)
370 EVT_RADIOBUTTON( EncapRadio4_Event, wizEncapPage::OnEncapChange)
371 EVT_RADIOBUTTON( EncapRadio5_Event, wizEncapPage::OnEncapChange)
372 EVT_RADIOBUTTON( EncapRadio6_Event, wizEncapPage::OnEncapChange)
373 EVT_RADIOBUTTON( EncapRadio7_Event, wizEncapPage::OnEncapChange)
374 EVT_RADIOBUTTON( EncapRadio8_Event, wizEncapPage::OnEncapChange)
375 EVT_RADIOBUTTON( EncapRadio9_Event, wizEncapPage::OnEncapChange)
376 EVT_RADIOBUTTON( EncapRadio10_Event, wizEncapPage::OnEncapChange)
379 /* Additional settings for transcode */
380 class wizTranscodeExtraPage : public wxWizardPage
383 wizTranscodeExtraPage( wxWizard *parent, wxWizardPage *prev,
385 virtual wxWizardPage *GetPrev() const;
386 virtual wxWizardPage *GetNext() const;
387 void OnWizardPageChanging( wxWizardEvent& event );
389 DECLARE_EVENT_TABLE()
390 void wizTranscodeExtraPage::OnSelectFile(wxCommandEvent&);
391 wxTextCtrl *file_text;
392 WizardDialog *p_parent;
393 wxWizardPage *p_prev;
394 wxWizardPage *p_next;
397 BEGIN_EVENT_TABLE(wizTranscodeExtraPage, wxWizardPage)
398 EVT_BUTTON( Open_Event, wizTranscodeExtraPage::OnSelectFile)
399 EVT_WIZARD_PAGE_CHANGING(-1, wizTranscodeExtraPage::OnWizardPageChanging)
402 /* Additional settings for streaming */
403 class wizStreamingExtraPage : public wxWizardPage
406 wizStreamingExtraPage( wxWizard *parent, wxWizardPage *prev,
408 virtual wxWizardPage *GetPrev() const;
409 virtual wxWizardPage *GetNext() const;
410 void OnWizardPageChanging(wxWizardEvent&);
411 void OnSAP( wxCommandEvent&);
412 wxCheckBox *sap_checkbox;
413 wxTextCtrl *sap_text;
415 friend class wizEncapPage;
416 DECLARE_EVENT_TABLE()
417 WizardDialog *p_parent;
418 wxWizardPage *p_prev;
419 wxWizardPage *p_next;
421 wxSpinCtrl *ttl_spin;
424 BEGIN_EVENT_TABLE(wizStreamingExtraPage, wxWizardPage)
425 EVT_CHECKBOX( SAP_Event, wizStreamingExtraPage::OnSAP )
426 EVT_WIZARD_PAGE_CHANGING(-1, wizStreamingExtraPage::OnWizardPageChanging)
430 /* Local functions */
431 static void pageHeader( wxWindow *window, wxBoxSizer *sizer,
432 char *psz_title, char *psz_text);
434 static void pageHeader( wxWindow *window, wxBoxSizer *sizer,
435 char *psz_title, char *psz_text)
437 wxStaticText *wtitle = new wxStaticText( window, -1, wxU( psz_title ) );
438 wxFont font = wtitle->GetFont();
439 font.SetPointSize(14);
440 wtitle->SetFont(font);
441 sizer->Add( wtitle, 0, wxALL, 5 );
442 sizer->Add( new wxStaticText( window, -1,
443 wxU( vlc_wraptext( psz_text , TEXTWIDTH, false ) ) ),
447 /***************************************************************************
448 * Implementation of the pages
449 ***************************************************************************/
452 /***************************************************
453 * First page: choose between stream and transcode *
454 ***************************************************/
455 wizHelloPage::wizHelloPage( wxWizard *parent) : wxWizardPageSimple(parent)
458 p_parent = (WizardDialog *)parent;
459 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
461 /* Create the texts */
462 pageHeader( this, mainSizer, HELLO_TITLE, HELLO_TEXT );
464 /* Create the radio buttons with their helps */
465 action_radios[0] = new wxRadioButton( this, ActionRadio0_Event,
466 wxU( HELLO_STREAMING ) );
467 action_radios[1] = new wxRadioButton( this, ActionRadio1_Event,
468 wxU( HELLO_TRANSCODE ) );
471 mainSizer->Add( 0, 0, 1 );
473 wxBoxSizer *stream_sizer = new wxBoxSizer( wxHORIZONTAL );
474 stream_sizer->Add( action_radios[0], 0, wxALL, 5 );
475 stream_sizer->Add( 0,0,1 );
476 stream_sizer->Add( new wxButton( this, MoreInfoStreaming_Event,
477 wxU( _("More Info")) ), 0, 0, 0 );
478 mainSizer->Add( stream_sizer, 0, wxALL | wxEXPAND , 5 );
480 wxBoxSizer *transcode_sizer = new wxBoxSizer( wxHORIZONTAL );
481 transcode_sizer->Add( action_radios[1], 0, wxALL, 5 );
482 transcode_sizer->Add( 0,0,1);
483 transcode_sizer->Add( new wxButton( this, MoreInfoTranscode_Event,
484 wxU( _("More Info")) ), 0 , 0 , 0 );
485 mainSizer->Add( transcode_sizer, 0, wxALL | wxEXPAND, 5 );
487 mainSizer->Add( 0, 0, 1 );
489 mainSizer->Add( new wxStaticLine(this, -1 ), 0, wxEXPAND| wxTOP|
492 mainSizer->Add( new wxStaticText(this, -1,
493 wxU( vlc_wraptext(HELLO_NOTICE , TEXTWIDTH , false ))),
497 mainSizer->Fit(this);
500 void wizHelloPage::OnMoreInfo(wxCommandEvent& event)
503 msg.Printf( wxString( wxU( event.GetId() == MoreInfoStreaming_Event ?
505 MOREINFO_TRANSCODE ) ) );
506 wxMessageBox( msg, wxU(_("More information")),
507 wxOK | wxICON_INFORMATION, this->p_parent );
510 void wizHelloPage::OnActionChange( wxCommandEvent& event )
512 i_action = event.GetId() - ActionRadio0_Event;
513 ((wizInputPage *)GetNext())->SetAction( i_action );
514 p_parent->SetAction( i_action );
517 void wizHelloPage::OnWizardPageChanging(wxWizardEvent& event)
519 ((wizInputPage *)GetNext())->SetAction( i_action );
520 p_parent->SetAction( i_action );
523 /************************************
524 * Second page: choose input stream *
525 ************************************/
526 wizInputPage::wizInputPage( wxWizard *parent, wxWizardPage *prev, intf_thread_t *_p_intf) :
531 p_parent = (WizardDialog *)parent;
533 p_open_dialog = NULL;
536 mainSizer = new wxBoxSizer(wxVERTICAL);
538 /* Create the texts */
539 pageHeader( this, mainSizer, INPUT_TITLE, INPUT_TEXT );
541 mainSizer->Add( 0,20,0 );
543 radio_panel = new wxPanel(this, -1);
544 radio_panel->SetAutoLayout( TRUE );
546 wxBoxSizer *radioSizer = new wxBoxSizer(wxVERTICAL);
548 /* Create the radio buttons */
549 input_radios[0] = new wxRadioButton( radio_panel, InputRadio0_Event ,
551 radioSizer->Add( input_radios[0], 0, wxALL, 5 );
552 input_radios[1] = new wxRadioButton( radio_panel, InputRadio1_Event ,
554 radioSizer->Add( input_radios[1], 0, wxALL, 5 );
556 radio_panel->SetSizer( radioSizer );
557 radioSizer->Layout();
558 radioSizer->Fit(radio_panel);
559 mainSizer->Add( radio_panel );
564 open_panel = new wxPanel(this, -1);
565 open_panel->SetAutoLayout( TRUE );
567 wxBoxSizer *openSizer = new wxBoxSizer(wxHORIZONTAL);
569 mrl_text = new wxTextCtrl( open_panel, -1, wxU( "" ), wxDefaultPosition,
572 openSizer->Add( mrl_text, 0 , wxALL, 5 );
573 openSizer->Add( new wxButton( open_panel, Choose_Event, wxU(_("Choose...")) ), 0, wxALL, 5 );
575 open_panel->SetSizer( openSizer );
577 openSizer->Fit(open_panel);
578 mainSizer->Add( open_panel );
580 playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
581 VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
585 if( p_playlist->i_size > 0)
587 listview = new wxListView( this, ListView_Event,
588 wxDefaultPosition, wxDefaultSize,
589 wxLC_REPORT | wxSUNKEN_BORDER );
590 listview->InsertColumn( 0, wxU(_("Name")) );
591 listview->InsertColumn( 1, wxU(_("URI")) );
592 listview->SetColumnWidth( 0, 250 );
593 listview->SetColumnWidth( 1, 100 );
594 for( int i=0 ; i < p_playlist->i_size ; i++ )
596 wxString filename = wxL2U( p_playlist->pp_items[i]->input.
598 listview->InsertItem( i, filename );
599 listview->SetItem( i, 1, wxL2U( p_playlist->pp_items[i]->
602 listview->Select( p_playlist->i_index , TRUE);
603 mainSizer->Add( listview, 1, wxALL|wxEXPAND, 5 );
606 mainSizer->Hide( listview );
611 input_radios[1]->Disable();
613 vlc_object_release( p_playlist );
617 input_radios[1]->Disable();
620 /* Partial Extract Box */
621 mainSizer->Add( 0, 10, 0 );
622 wxStaticBox *partial_box = new wxStaticBox( this, -1,
623 wxU(_("Partial Extract")) );
625 wxStaticBoxSizer *partial_sizer = new wxStaticBoxSizer( partial_box,
628 enable_checkbox = new wxCheckBox( this, PartialEnable_Event,
630 enable_checkbox->SetToolTip(wxU(_(PARTIAL) ) ) ;
631 partial_sizer->Add( enable_checkbox, 0 , wxALIGN_CENTER_VERTICAL|wxALL, 5 ); //wxLEFT
633 wxFlexGridSizer *partial_sizer2 = new wxFlexGridSizer( 4 , 1 , 20 );
634 partial_sizer2->Add( new wxStaticText(this, -1, wxU(_( "From" ) ) ),
636 from_text = new wxTextCtrl( this, -1, wxT(""),
637 wxDefaultPosition, wxSize( 80,25 ) );
638 partial_sizer2->Add( from_text, 0 , wxALIGN_RIGHT);
639 partial_sizer2->Add( new wxStaticText(this, -1, wxU(_( "To" ) ) ),
641 to_text = new wxTextCtrl( this, -1, wxT(""),
642 wxDefaultPosition, wxSize( 80 , 25 ) );
643 partial_sizer2->Add( to_text, 0 , wxALIGN_RIGHT );
645 partial_sizer->Add( partial_sizer2, 0, wxALL, 0 );
647 partial_sizer->Fit( partial_box );
649 mainSizer->Add( partial_sizer, 0, 0, 0 );
651 from_text->Disable();
654 mainSizer->Fit(this);
658 wizInputPage::~wizInputPage()
662 void wizInputPage::OnInputChange( wxCommandEvent& event )
664 i_input = event.GetId() - InputRadio0_Event;
670 mainSizer->Hide( listview );
672 mainSizer->Show( open_panel );
679 mainSizer->Hide( open_panel );
681 mainSizer->Show( listview );
686 void wizInputPage::OnEnablePartial(wxCommandEvent& event)
688 from_text->Enable( event.IsChecked() );
689 to_text->Enable( event.IsChecked() );
693 void wizInputPage::OnChoose(wxCommandEvent& event)
695 p_open_dialog = new OpenDialog( p_intf, this, -1, -1, OPEN_STREAM );
696 if( p_open_dialog->ShowModal() == wxID_OK &&
697 !p_open_dialog->mrl.IsEmpty() )
699 mrl_text->SetValue(p_open_dialog->mrl[0] );
701 delete p_open_dialog;
702 p_open_dialog = NULL;
705 void wizInputPage::OnWizardPageChanging(wxWizardEvent& event)
709 if( mrl_text->GetValue().IsSameAs( wxT(""), TRUE ) &&
710 event.GetDirection() )
712 wxMessageBox( wxU( CHOOSE_STREAM ), wxU( ERROR_MSG ),
713 wxICON_WARNING | wxOK, this->p_parent );
719 p_parent->SetMrl( (const char *)mrl_text->GetValue().mb_str() );
726 i = listview->GetNextItem( i , wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
730 listitem.SetColumn( 1 );
731 listview->GetItem( listitem );
732 p_parent->SetMrl( (const char*) listitem.GetText().mb_str() );
735 if( enable_checkbox->IsChecked() )
737 int i_from = atoi( from_text->GetValue().mb_str() );
738 int i_to = atoi( to_text->GetValue().mb_str() );
739 p_parent->SetPartial( i_from, i_to );
744 wxWizardPage *wizInputPage::GetPrev() const { return p_prev; }
745 wxWizardPage *wizInputPage::GetNext() const
747 if( i_action == ACTION_STREAM )
748 return p_streaming_page;
750 return p_transcode_page;
753 void wizInputPage::SetStreamingPage( wxWizardPage *page)
755 p_streaming_page = page;
758 void wizInputPage::SetTranscodePage( wxWizardPage *page)
760 p_transcode_page = page;
763 void wizInputPage::SetAction( int i_action )
765 this->i_action = i_action;
768 void wizInputPage::SetPintf( intf_thread_t *p_intf )
770 this->p_intf = p_intf;
773 void wizInputPage::SetUri( char *psz_uri )
775 mrl_text->SetValue( wxU( psz_uri ) );
778 void wizInputPage::SetPartial( int i_from, int i_to )
781 msg.Printf( wxString( wxT( "%i") ), i_from );
782 from_text->Enable( TRUE );
783 from_text->SetValue( msg );
784 msg.Printf( wxString( wxT( "%i") ), i_to );
785 to_text->Enable( TRUE );
786 to_text->SetValue( msg );
787 enable_checkbox->SetValue( TRUE );
790 /***************************************************
791 * First transcode page: choose codecs *
792 ***************************************************/
793 wizTranscodeCodecPage::wizTranscodeCodecPage( wxWizard *parent,
794 wxWizardPage *next) : wxWizardPage(parent)
802 p_parent = (WizardDialog *) parent;
804 wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL);
807 pageHeader( this, main_sizer, TRANSCODE1_TITLE, TRANSCODE1_TEXT );
810 wxStaticBox *video_box = new wxStaticBox( this, -1, wxU(_("Video")) );
811 wxStaticBoxSizer *video_sizer = new wxStaticBoxSizer( video_box,
813 /* Line 1 : only the checkbox */
814 wxFlexGridSizer *video_sizer1 = new wxFlexGridSizer( 2,3,20 );
815 video_sizer1->Add( new wxCheckBox( this, VideoEnable_Event,
816 wxU(_("Transcode video") ) ), 0 , wxALIGN_CENTER_VERTICAL|wxALL , 5 );
817 video_sizer1->Add( 0,0,1);
819 video_sizer1->Add( new wxStaticText(this, -1, wxU(_("Codec"))),0,wxLEFT ,5);
820 video_combo = new wxComboBox( this, VideoCodec_Event, wxT(""),
821 wxDefaultPosition, wxSize(200,25), 0, NULL,
822 wxCB_DROPDOWN| wxCB_READONLY );
823 for( i= 0; vcodecs_array[i].psz_display != NULL; i++ )
825 video_combo->Append( wxU( vcodecs_array[i].psz_display ) ,
826 (void *)&vcodecs_array[i] );
829 video_combo->SetSelection(0);
831 video_sizer1->Add( video_combo, 0 , wxALIGN_LEFT , 0 );
833 video_sizer1->Add( new wxStaticText(this, -1, wxU(_("Bitrate (kb/s)"))),0,
835 vb_combo = new wxComboBox( this, VideoBitrate_Event, wxT("1024"),
836 wxDefaultPosition, wxDefaultSize,
837 WXSIZEOF(vbitrates_array), vbitrates_array, wxCB_READONLY );
838 video_sizer1->Add( vb_combo, 0, wxALIGN_LEFT , 0 );
841 video_text = new wxStaticText( this, -1,
842 wxU( vlc_wraptext( TR_VIDEO_TEXT, TEXTWIDTH, false) ) );
843 /* Fill the main video sizer */
844 video_sizer->Add( video_sizer1 , 0, wxEXPAND , 5 );
845 video_sizer->Add( video_text, 0, wxLEFT|wxTOP , 5 );
849 wxStaticBox *audio_box = new wxStaticBox( this, -1, wxU(_("Audio")) );
850 wxStaticBoxSizer *audio_sizer = new wxStaticBoxSizer( audio_box,
853 wxFlexGridSizer *audio_sizer1 = new wxFlexGridSizer( 2,3,20);
854 audio_sizer1->Add( new wxCheckBox( this, AudioEnable_Event,
855 wxU(_("Transcode audio") ) ), 0 , wxALIGN_CENTER_VERTICAL|wxALL, 5 );
856 audio_sizer1->Add( 0, 0, 1 );
859 audio_sizer1->Add( new wxStaticText(this, -1, wxU(_("Codec"))),0,wxLEFT,5);
860 audio_combo = new wxComboBox( this, AudioCodec_Event, wxT(""),
861 wxDefaultPosition, wxSize(200,25), 0, NULL,
862 wxCB_DROPDOWN| wxCB_READONLY );
863 for( i= 0; acodecs_array[i].psz_display != NULL; i++ )
865 audio_combo->Append( wxU( acodecs_array[i].psz_display ) ,
866 (void *)&acodecs_array[i] );
869 audio_combo->SetSelection(0);
870 audio_sizer1->Add( audio_combo, 0 , wxALIGN_LEFT, 0 );
872 audio_sizer1->Add( new wxStaticText(this, -1, wxU(_("Bitrate (kb/s)"))),0,
874 ab_combo = new wxComboBox( this, AudioBitrate_Event, wxT("192"),
875 wxDefaultPosition, wxDefaultSize,
876 WXSIZEOF(abitrates_array), abitrates_array, wxCB_READONLY );
877 audio_sizer1->Add( ab_combo, 0, wxALIGN_LEFT, 0 );
880 audio_text = new wxStaticText( this, -1,
881 wxU( vlc_wraptext( TR_AUDIO_TEXT, TEXTWIDTH, false) ) );
883 audio_sizer->Add(audio_sizer1, 0, wxEXPAND, 5);
884 audio_sizer->Add( audio_text, 0, wxLEFT | wxTOP, 5 );
886 main_sizer->Add( video_sizer, 1, wxGROW, 0 );
887 main_sizer->Add( audio_sizer, 1, wxGROW, 0 );
888 main_sizer->Layout();
889 SetSizerAndFit( main_sizer );
891 /* Default disabled */
892 video_combo->Disable(); video_text->Disable();vb_combo->Disable();
893 audio_combo->Disable(); audio_text->Disable();ab_combo->Disable();
897 wizTranscodeCodecPage::~wizTranscodeCodecPage()
899 if( acodec ) free( acodec );
900 if( vcodec ) free( vcodec );
903 void wizTranscodeCodecPage::OnEnableVideo(wxCommandEvent& event)
905 video_combo->Enable( event.IsChecked() );
906 vb_combo->Enable( event.IsChecked() );
907 video_text->Enable( event.IsChecked() );
910 void wizTranscodeCodecPage::OnEnableAudio(wxCommandEvent& event)
912 audio_combo->Enable( event.IsChecked() );
913 ab_combo->Enable( event.IsChecked() );
914 audio_text->Enable( event.IsChecked() );
917 void wizTranscodeCodecPage::OnVideoCodecChange(wxCommandEvent& event)
919 struct codec *c = (struct codec*)
920 (video_combo->GetClientData(video_combo->GetSelection()));
921 video_text->SetLabel( wxU( vlc_wraptext(c->psz_descr, TEXTWIDTH, false) ) );
922 i_video_codec = video_combo->GetSelection();
923 vcodec = strdup(c->psz_codec);
926 void wizTranscodeCodecPage::OnAudioCodecChange(wxCommandEvent& event)
928 struct codec *c = (struct codec*)
929 (audio_combo->GetClientData(audio_combo->GetSelection()));
930 audio_text->SetLabel( wxU( vlc_wraptext(c->psz_descr, TEXTWIDTH, false) ) );
931 i_audio_codec = audio_combo->GetSelection();
932 acodec = strdup(c->psz_codec);
936 void wizTranscodeCodecPage::OnWizardPageChanging(wxWizardEvent& event)
940 if( !event.GetDirection() )
946 /* Set the dummy codec ( accept all muxers ) if needed */
947 if( !video_combo->IsEnabled() )
949 i_video_codec = VCODECS_NUMBER;
951 if( !audio_combo->IsEnabled() )
953 i_audio_codec = ACODECS_NUMBER;
956 ((wizEncapPage *)GetNext())->SetPrev(this);
958 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
960 if( vcodecs_array[i_video_codec].muxers[i] != -1 )
962 for( j = 0 ; j< MUXERS_NUMBER ; j++ )
964 if( acodecs_array[i_audio_codec].muxers[j] ==
965 vcodecs_array[i_video_codec].muxers[i] )
967 ((wizEncapPage*)GetNext())->EnableEncap(
968 vcodecs_array[i_video_codec].muxers[i] );
973 struct codec *c = (struct codec*)
974 (video_combo->GetClientData( video_combo->IsEnabled() ?
975 video_combo->GetSelection(): i_video_codec ));
976 vcodec = strdup(c->psz_codec);
978 (audio_combo->GetClientData( audio_combo->IsEnabled() ?
979 audio_combo->GetSelection() : i_audio_codec ));
980 acodec = strdup(c->psz_codec);
982 int vb = atoi(vb_combo->GetValue().mb_str() );
987 int ab = atoi(ab_combo->GetValue().mb_str() );
993 p_parent->SetTranscode( vcodec, vb , acodec, ab );
994 ((wizEncapPage*)GetNext())->SetAction( p_parent->GetAction() );
995 p_parent->SetAction( p_parent->GetAction() );
1000 wxWizardPage *wizTranscodeCodecPage::GetPrev() const { return p_prev; }
1001 wxWizardPage *wizTranscodeCodecPage::GetNext() const { return p_next; }
1002 void wizTranscodeCodecPage::SetPrev( wxWizardPage *page) {p_prev = page; }
1005 /***************************************************
1006 * First streaming page: choose method *
1007 ***************************************************/
1008 wizStreamingMethodPage::wizStreamingMethodPage( intf_thread_t *p_this, wxWizard *parent,
1009 wxWizardPage *next) : wxWizardPage(parent), p_intf( p_this )
1013 p_parent = (WizardDialog *)parent;
1015 mainSizer = new wxBoxSizer(wxVERTICAL);
1017 /* Create the texts */
1018 pageHeader( this, mainSizer, STREAMING1_TITLE, STREAMING1_TEXT );
1020 mainSizer->Add( 0,50,0 );
1024 wxStaticBox *method_box = new wxStaticBox( this, -1,
1025 wxU(_("Streaming method")) );
1026 wxStaticBoxSizer *method_sizer = new wxStaticBoxSizer(method_box,
1028 for( i = 0 ; i< 3 ; i++ )
1030 method_radios[i] = new wxRadioButton( this, MethodRadio0_Event + i,
1031 wxU( methods_array[i].psz_method ) );
1032 method_radios[i]->SetToolTip( wxU(_( methods_array[i].psz_descr ) ) );
1033 method_sizer->Add( method_radios[i], 0, wxALL, 5 );
1036 method_sizer->Layout();
1038 wxStaticBox *address_box = new wxStaticBox( this, -1,
1039 wxU(_("Destination")) );
1041 address_sizer = new wxStaticBoxSizer(address_box,
1044 /* Big kludge, we take the longest text to get the size */
1045 address_text = new wxStaticText(this, -1,
1046 wxU( vlc_wraptext(methods_array[2].psz_address,
1047 TEXTWIDTH, false ) ),
1048 wxDefaultPosition, wxDefaultSize );
1050 address_txtctrl = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
1052 address_sizer->Add( address_text, 0, wxALL, 5 );
1053 address_sizer->Add( address_txtctrl, 0, wxALL, 5 );
1054 address_sizer->Layout();
1056 /* Set the minimum size */
1057 address_sizer->SetMinSize( address_sizer->GetSize() );
1058 address_text->SetLabel( wxU(
1059 vlc_wraptext( _(methods_array[0].psz_address), TEXTWIDTH, false)));
1061 mainSizer->Add( method_sizer, 0, wxALL | wxEXPAND, 5 );
1062 mainSizer->Add( address_sizer, 0, wxALL | wxEXPAND, 5 );
1064 mainSizer->Add( 0,0,1 );
1066 mainSizer->Layout();
1068 SetSizer(mainSizer);
1069 mainSizer->Fit(this);
1074 void wizStreamingMethodPage::OnWizardPageChanging(wxWizardEvent& event)
1077 if( !event.GetDirection() ) return;
1079 /* Check valid address */
1081 && !net_AddressIsMulticast( (vlc_object_t *)p_intf,
1082 address_txtctrl->GetValue().mb_str()) )
1084 wxMessageBox( wxU( INVALID_MCAST_ADDRESS ) , wxU( ERROR_MSG ),
1085 wxICON_WARNING | wxOK, this->p_parent );
1089 else if( i_method == 0 && address_txtctrl->GetValue().IsEmpty() )
1091 wxMessageBox( wxU( NO_ADDRESS_TEXT ) , wxU( ERROR_MSG ),
1092 wxICON_WARNING | wxOK, this->p_parent );
1097 ((wizEncapPage *)GetNext())->SetPrev(this);
1098 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
1100 if( methods_array[i_method].muxers[i] != -1 )
1102 ((wizEncapPage*)GetNext())->EnableEncap(
1103 methods_array[i_method].muxers[i] );
1106 p_parent->SetStream( methods_array[i_method].psz_access ,
1107 address_txtctrl->GetValue().mb_str() );
1109 /* Set the action for the muxer page */
1110 ((wizEncapPage*)GetNext())->SetAction( p_parent->GetAction() );
1114 wxWizardPage *wizStreamingMethodPage::GetPrev() const { return p_prev; }
1115 wxWizardPage *wizStreamingMethodPage::GetNext() const { return p_next; }
1117 void wizStreamingMethodPage::SetPrev( wxWizardPage *page) {p_prev = page; }
1120 void wizStreamingMethodPage::OnMethodChange( wxCommandEvent& event )
1122 i_method = event.GetId() - MethodRadio0_Event;
1123 address_text->SetLabel( wxU(
1124 vlc_wraptext( _(methods_array[i_method].psz_address), TEXTWIDTH, false)));
1125 address_sizer->Layout();
1126 mainSizer->Layout();
1129 /***************************************************
1130 * Choose encapsulation format *
1131 ***************************************************/
1132 wizEncapPage::wizEncapPage( wxWizard *parent ) : wxWizardPage(parent)
1136 p_parent = (WizardDialog *)parent;
1137 p_streaming_page = NULL;
1138 p_transcode_page = NULL;
1140 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
1142 /* Create the texts */
1143 pageHeader( this, mainSizer, ENCAP_TITLE, ENCAP_TEXT );
1145 mainSizer->Add( 0,0,1 );
1147 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
1149 encap_radios[i] = new wxRadioButton( this, EncapRadio0_Event + i,
1150 wxU( encaps_array[i].psz_encap ) );
1151 encap_radios[i]->SetToolTip( wxU(_( encaps_array[i].psz_descr ) ) );
1152 mainSizer->Add( encap_radios[i], 0, wxLEFT, 5 );
1153 encap_radios[i]->Disable();
1156 mainSizer->Add( 0,0,1 );
1158 SetSizer(mainSizer);
1159 mainSizer->Fit(this);
1162 wizEncapPage::~wizEncapPage()
1166 void wizEncapPage::OnWizardPageChanging(wxWizardEvent& event)
1169 if( !event.GetDirection() )
1171 for( i = 0 ; i< MUXERS_NUMBER ; i++ )
1173 encap_radios[i]->Disable();
1176 p_parent->SetMux( encaps_array[i_mux].psz_mux );
1178 if( p_parent->GetAction() == ACTION_STREAM )
1180 if( strstr( p_parent->method, "rtp" ))
1182 ((wizStreamingExtraPage *)GetNext())->sap_checkbox->Enable();
1183 ((wizStreamingExtraPage *)GetNext())->sap_text->Enable(false);
1187 ((wizStreamingExtraPage *)GetNext())->sap_checkbox->Enable( false );
1188 ((wizStreamingExtraPage *)GetNext())->sap_text->Enable( false );
1196 void wizEncapPage::OnEncapChange( wxCommandEvent& event )
1198 i_mux = event.GetId() - EncapRadio0_Event;
1201 void wizEncapPage::EnableEncap( int encap )
1204 for( i = 0 ; i< MUXERS_NUMBER ; i++)
1206 if( encaps_array[i].id == encap )
1208 encap_radios[i]->Enable();
1209 encap_radios[i]->SetValue(true);
1215 void wizEncapPage::SetStreamingPage( wxWizardPage *page)
1217 p_streaming_page = page;
1220 void wizEncapPage::SetTranscodePage( wxWizardPage *page)
1222 p_transcode_page = page;
1225 wxWizardPage *wizEncapPage::GetPrev() const { return p_prev; }
1227 wxWizardPage *wizEncapPage::GetNext() const
1229 if( i_action== ACTION_STREAM )
1230 return p_streaming_page;
1232 return p_transcode_page;
1235 void wizEncapPage::SetAction( int i_act ) { i_action = i_act; }
1237 void wizEncapPage::SetPrev( wxWizardPage *page) { p_prev = page; }
1239 /***************************************************
1240 * Extra transcoding page : Select file *
1241 ***************************************************/
1242 wizTranscodeExtraPage::wizTranscodeExtraPage( wxWizard *parent,
1244 wxWizardPage *next) : wxWizardPage(parent)
1248 p_parent = (WizardDialog *) parent;
1249 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
1251 /* Create the texts */
1252 pageHeader( this, mainSizer, EXTRATRANSCODE_TITLE, EXTRATRANSCODE_TEXT );
1254 mainSizer->Add( 0, 0, 1 );
1256 wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 2, 1 );
1257 sizer->Add( new wxStaticText( this, -1,
1258 wxU(_("Select the file to save to") ) ),
1260 sizer->Add( 0, 0, 1 );
1262 file_text = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
1263 wxSize( 150, -1 ) );
1265 sizer->Add( file_text, 0, wxALL, 5 );
1266 sizer->Add( new wxButton( this, Open_Event, wxU("Choose") ) );
1268 mainSizer->Add( sizer, 0, 0, 0) ;
1270 mainSizer->Add( 0, 0, 1 );
1271 SetSizer(mainSizer);
1272 mainSizer->Fit(this);
1275 void wizTranscodeExtraPage::OnSelectFile( wxCommandEvent &event)
1277 wxFileDialog *file_dialog = new wxFileDialog( this, wxU(_("Save to file")),
1278 wxT(""), wxT(""), wxT("*"), wxSAVE );
1280 if( file_dialog && file_dialog->ShowModal() == wxID_OK )
1282 if( file_dialog->GetFilename().mb_str() )
1284 file_text->SetValue( file_dialog->GetPath() );
1289 void wizTranscodeExtraPage::OnWizardPageChanging( wxWizardEvent& event )
1291 if( event.GetDirection() && file_text->GetValue().IsEmpty() )
1293 wxMessageBox( wxU( CHOOSE_OUTFILE ), wxU( ERROR_MSG ),
1294 wxICON_WARNING | wxOK, this->p_parent );
1297 if( event.GetDirection() )
1299 p_parent->SetTranscodeOut( file_text->GetValue().mb_str());
1303 wxWizardPage *wizTranscodeExtraPage::GetPrev() const { return p_prev; }
1304 wxWizardPage *wizTranscodeExtraPage::GetNext() const {return p_next; }
1306 /***********************************************************
1307 * Extra streaming page
1308 ***********************************************************/
1309 wizStreamingExtraPage::wizStreamingExtraPage( wxWizard *parent,
1311 wxWizardPage *next) : wxWizardPage(parent)
1315 p_parent = (WizardDialog *) parent;
1316 wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
1318 /* Create the texts */
1319 pageHeader( this, mainSizer, EXTRASTREAMING_TITLE, EXTRASTREAMING_TEXT );
1321 mainSizer->Add( 0, 0, 1 );
1323 wxFlexGridSizer *sizer = new wxFlexGridSizer( 2,2,1) ;
1326 sizer->Add( new wxStaticText( this, -1, wxU(_("Time-To-Live (TTL)"))),
1328 ttl_spin = new wxSpinCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize,
1330 ttl_spin->SetToolTip(wxU(_(TTL) ) ) ;
1331 sizer->Add( ttl_spin, 0, wxALL , 5 );
1334 sap_checkbox = new wxCheckBox( this, SAP_Event, wxU(_("SAP Announce")) );
1335 sap_checkbox->SetToolTip( wxU(_( SAP ) ) );
1336 sizer->Add( sap_checkbox, 0, 0 , 0 );
1337 sap_text = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
1339 sap_text->SetToolTip( wxU(_( SAP ) ) );
1340 sizer->Add( sap_text, 0, wxALL , 5 );
1342 mainSizer->Add(sizer, 0, wxALL, 5 );
1344 mainSizer->Add( 0, 0, 1 );
1346 SetSizer(mainSizer);
1347 mainSizer->Fit(this);
1350 void wizStreamingExtraPage::OnSAP( wxCommandEvent &event )
1352 sap_text->Enable( event.IsChecked() );
1355 void wizStreamingExtraPage::OnWizardPageChanging(wxWizardEvent& event)
1357 if( sap_checkbox->IsChecked() )
1359 if( sap_text->GetValue().IsEmpty() )
1361 p_parent->SetSAP( true, NULL );
1365 p_parent->SetSAP( true,
1366 (const char *)sap_text->GetValue().mb_str() );
1371 p_parent->SetSAP( false, NULL );
1374 p_parent->SetTTL( ttl_spin->GetValue() );
1377 wxWizardPage *wizStreamingExtraPage::GetPrev() const { return p_prev; }
1378 wxWizardPage *wizStreamingExtraPage::GetNext() const {return p_next; }
1381 /***************************************************************************
1382 * Implementation of the wizard itself
1383 ***************************************************************************/
1384 wizHelloPage *page1;
1385 wizInputPage *page2 ;
1386 wizTranscodeCodecPage *tr_page1 ;
1387 wizStreamingMethodPage *st_page1;
1388 wizTranscodeExtraPage *tr_page2 ;
1389 wizStreamingExtraPage *st_page2;
1390 wizEncapPage *encap_page;
1392 WizardDialog::WizardDialog(intf_thread_t *_p_intf, wxWindow *_p_parent,
1393 char *psz_uri, int _i_from, int _i_to ) :
1394 wxWizard( _p_parent, -1, wxU(_("Streaming/Transcoding Wizard")), wxNullBitmap, wxDefaultPosition)
1396 /* Initializations */
1398 SetPageSize(wxSize(400,420));
1400 /* Initialize structure */
1410 page1 = new wizHelloPage(this);
1411 page2 = new wizInputPage(this, page1, p_intf);
1415 page2->SetUri( psz_uri );
1417 if( i_from != 0 || i_to != 0 )
1419 page2->SetPartial( i_from, i_to );
1422 encap_page = new wizEncapPage(this );
1423 tr_page1 = new wizTranscodeCodecPage(this, encap_page );
1424 st_page1 = new wizStreamingMethodPage( p_intf, this, encap_page);
1426 tr_page2 = new wizTranscodeExtraPage(this, encap_page, NULL );
1427 st_page2 = new wizStreamingExtraPage(this, encap_page, NULL );
1430 page1->SetNext( page2 );
1431 /* 2->1 in constructor of 2 */
1434 page2->SetTranscodePage(tr_page1);
1435 page2->SetStreamingPage(st_page1);
1436 page2->SetPintf( p_intf );
1437 tr_page1->SetPrev(page2);
1438 st_page1->SetPrev(page2);
1441 encap_page->SetTranscodePage( tr_page2 );
1442 encap_page->SetStreamingPage( st_page2 );
1443 /* 3->4 in constructor of 3 */
1444 // encap_page->SetPrev(tr_page1);
1447 WizardDialog::~WizardDialog()
1459 void WizardDialog::SetMrl( const char *mrl )
1461 this->mrl = strdup( mrl );
1464 void WizardDialog::SetTTL( int i_ttl )
1466 this->i_ttl = i_ttl;
1469 void WizardDialog::SetSAP( bool b_enabled, const char *psz_text )
1471 this->b_sap = b_enabled;
1474 if( psz_text != NULL )
1476 this->psz_sap_name = strdup( psz_text );
1480 this->psz_sap_name = NULL;
1485 void WizardDialog::SetPartial( int i_from, int i_to )
1487 this->i_from = i_from;
1491 void WizardDialog::SetTranscode( char const *vcodec, int vb,
1492 char const *acodec, int ab)
1494 if( strcmp( vcodec, "dummy") )
1496 this->vcodec= strdup(vcodec);
1498 if( strcmp( acodec, "dummy" ) )
1500 this->acodec = strdup(acodec);
1506 void WizardDialog::SetStream( char const *method, char const *address )
1508 this->method = strdup( method );
1509 this->address = strdup( address );
1512 void WizardDialog::SetTranscodeOut( char const *address )
1514 char *psz_utf8 = FromLocale( address );
1515 this->address = strdup( psz_utf8 );
1516 LocaleFree( psz_utf8 );
1519 void WizardDialog::SetMux( char const *mux )
1521 this->mux = strdup( mux );
1524 void WizardDialog::SetAction( int i_action )
1526 this->i_action = i_action;
1529 int WizardDialog::GetAction()
1534 void WizardDialog::Run()
1536 if( RunWizard(page1) )
1541 if( i_action == ACTION_TRANSCODE )
1543 msg_Dbg( p_intf,"Starting transcode of %s to file %s",
1545 msg_Dbg( p_intf,"Using %s (%i kbps) / %s (%i kbps),encap %s",
1546 vcodec,vb,acodec,ab,mux);
1547 char *psz_transcode;
1549 if( vcodec != NULL || acodec != NULL )
1552 if( vcodec != NULL )
1553 i_tr_size += strlen( vcodec ) + 17;
1554 if( acodec != NULL )
1555 i_tr_size += strlen( acodec ) + 17;
1567 psz_transcode = (char *)malloc( i_tr_size * sizeof(char) );
1569 strcpy( psz_transcode, "transcode{" );
1570 if( vcodec != NULL )
1572 sprintf( psz_transcode + strlen( psz_transcode ),
1573 "vcodec=%s,vb=%i%s", vcodec, vb,
1574 ( acodec != NULL ) ? "," : "}:" );
1576 if( acodec != NULL )
1578 sprintf( psz_transcode + strlen( psz_transcode ),
1579 "acodec=%s,ab=%i}:", acodec, ab );
1585 i_size = 73 + strlen(mux) + strlen(address) + strlen(psz_transcode);
1586 psz_opt = (char *)malloc( i_size * sizeof(char) );
1587 snprintf( psz_opt, i_size, ":sout=#%sstandard{mux=%s,url=%s,"
1588 "access=file}", psz_transcode, mux, address );
1590 if( *psz_transcode )
1591 free( psz_transcode );
1595 msg_Dbg( p_intf, "Starting stream of %s to %s using %s, encap %s",
1596 mrl, address, method, mux);
1599 char *psz_sap_option = NULL;
1602 psz_sap_option = (char *) malloc( strlen( psz_sap_name )
1604 snprintf( psz_sap_option,strlen( psz_sap_name ) + 15,
1605 "sap,name=\"%s\"",psz_sap_name );
1608 psz_sap_option = strdup( "sap" );
1610 i_size = 40 + strlen(mux) + strlen(address) +
1611 strlen( psz_sap_option);
1612 psz_opt = (char *)malloc( i_size * sizeof(char) );
1613 snprintf( psz_opt, i_size,
1614 ":sout=#standard{mux=%s,url=%s,access=%s,%s}",
1615 mux, address,method, psz_sap_option);
1616 if( psz_sap_option ) free( psz_sap_option );
1620 i_size = 40 + strlen(mux) + strlen(address);
1621 psz_opt = (char *)malloc( i_size * sizeof(char) );
1622 snprintf( psz_opt, i_size,
1623 ":sout=#standard{mux=%s,url=%s,access=%s}",
1624 mux, address,method);
1628 playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
1629 VLC_OBJECT_PLAYLIST, FIND_ANYWHERE);
1632 playlist_item_t *p_item = playlist_ItemNew( p_playlist, mrl,
1634 playlist_ItemAddOption( p_item, psz_opt);
1638 snprintf( psz_from, 20, "start-time=%i", i_from);
1639 playlist_ItemAddOption( p_item, psz_from);
1644 snprintf( psz_to, 20, "stop-time=%i", i_to);
1645 playlist_ItemAddOption( p_item, psz_to);
1649 snprintf( psz_ttl, 20, "ttl=%i",i_ttl );
1650 playlist_ItemAddOption( p_item, psz_ttl );
1652 playlist_AddItem( p_playlist, p_item, PLAYLIST_GO, PLAYLIST_END );
1653 vlc_object_release(p_playlist);
1657 wxMessageBox( wxU( NO_PLAYLIST ), wxU( ERROR_MSG ),
1658 wxICON_WARNING | wxOK, this );