wizard.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:54k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * wizard.cpp : wxWindows plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2004 VideoLAN
  5.  * $Id: wizard.cpp 9136 2004-11-04 16:41:56Z hartman $
  6.  *
  7.  * Authors: Cl閙ent Stenac <zorglub@videolan.org>
  8.  *
  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.
  13.  *
  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.
  18.  *
  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.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <stdlib.h>                                      /* malloc(), free() */
  27. #include <errno.h>                                                 /* ENOMEM */
  28. #include <string.h>                                            /* strerror() */
  29. #include <stdio.h>
  30. #include <vlc/vlc.h>
  31. #include <vlc/intf.h>
  32. #include "wxwindows.h"
  33. #include "streamdata.h"
  34. #include <wx/statline.h>
  35. class wizHelloPage;
  36. class wizInputPage;
  37. /*****************************************************************************
  38.  * Define events
  39.  *****************************************************************************/
  40. enum
  41. {
  42.     ActionRadio0_Event, ActionRadio1_Event,
  43.     MoreInfoStreaming_Event,
  44.     MoreInfoTranscode_Event,
  45.     Open_Event , Choose_Event ,
  46.     ListView_Event,
  47.     InputRadio0_Event, InputRadio1_Event,
  48.     PartialEnable_Event,
  49.     MethodRadio0_Event, MethodRadio1_Event,
  50.     MethodRadio2_Event, MethodRadio3_Event,
  51.     EncapRadio0_Event, EncapRadio1_Event,
  52.     EncapRadio2_Event, EncapRadio3_Event,
  53.     EncapRadio4_Event, EncapRadio5_Event,
  54.     EncapRadio6_Event, EncapRadio7_Event,
  55.     EncapRadio8_Event, EncapRadio9_Event,
  56.     EncapRadio10_Event, EncapRadio11_Event,
  57.     VideoEnable_Event, VideoCodec_Event,VideoBitrate_Event,
  58.     AudioEnable_Event, AudioCodec_Event,AudioBitrate_Event,
  59.     SAP_Event,
  60. };
  61. #define TEXTWIDTH 55
  62. #define ACTION_STREAM 0
  63. #define ACTION_TRANSCODE 1
  64. BEGIN_EVENT_TABLE(WizardDialog, wxWizard)
  65. END_EVENT_TABLE()
  66. /*****************************************************************************
  67.  * Wizard strings
  68.  *****************************************************************************/
  69. #define ERROR_MSG _("Error")
  70. #define ITEM_NAME _("Streaming/Transcoding Wizard")
  71. /* Hello page */
  72. #define HELLO_TITLE _("Streaming/Transcoding Wizard")
  73. #define HELLO_TEXT _("This wizard helps you to stream, transcode or" 
  74.                      " save a stream")
  75. #define HELLO_STREAMING _("Stream to network")
  76. #define HELLO_STREAMING_DESC _("Use this to stream on a network")
  77. #define HELLO_TRANSCODE _("Transcode/Save to file")
  78. #define HELLO_TRANSCODE_DESC _("Use this to re-encode a stream and save it to a file")
  79. #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")
  80. #define MOREINFO_STREAM _("Use this to stream on a network")
  81. #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 " 
  82.              "for file to file transcoding. You should use its transcoding " 
  83.              "features to save network streams, for example" )
  84. /* Input page */
  85. #define INPUT_TITLE _("Choose input")
  86. #define INPUT_TEXT _("Choose here your input stream")
  87. #define INPUT_OPEN _("Select a stream" )
  88. #define INPUT_PL _( "Existing playlist item" )
  89. #define CHOOSE_STREAM _("You must choose a stream")
  90. #define NO_PLAYLIST _("Uh Oh! Unable to find playlist !")
  91. #define PARTIAL _("Use this to read only a part of the stream. " 
  92.                   "You must be able to control the incoming stream " 
  93.                   "(for example, a file or a disc, but not an UDP " 
  94.                   "network stream.)n" 
  95.                   "Enter the starting and ending times (in seconds)")
  96. #define INPUT_BUTTON _("Choose")
  97. /* Transcode 1 */
  98. #define TRANSCODE1_TITLE _("Transcode")
  99. #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).")
  100. #define TR_VIDEO_TEXT0 _("If your stream has video and you want to " 
  101.                          "transcode it, enable this")
  102. #define TR_VIDEO_TEXT _("Select your video codec. Click one to get more " 
  103.                         "information")
  104. #define TR_AUDIO_TEXT0 _("If your stream has audio and you want to "
  105.                          "transcode it, enable this")
  106. #define TR_AUDIO_TEXT _("Select your audio codec. Click one to get more " 
  107.                         "information")
  108. /* Streaming 1 */
  109. #define STREAMING1_TITLE _("Streaming")
  110. #define STREAMING1_TEXT _("In this page, you will select how your input stream will be sent.")
  111. #define INVALID_MCAST_ADDRESS _("This does not appear to be a valid " 
  112.                                 "multicast address" )
  113. #define NO_ADDRESS _("You need to enter an address" )
  114. /* Encap  */
  115. #define ENCAP_TITLE _("Encapsulation format")
  116. #define ENCAP_TEXT _("In this page, you will select how the stream will be "
  117.                      "encapsulated. Depending on the choices you made, all "
  118.                      "formats won't be available." )
  119. /* Transcode 2 */
  120. #define EXTRATRANSCODE_TITLE _("Additional transcode options")
  121. #define EXTRATRANSCODE_TEXT _("In this page, you will define a few " 
  122.                               "additionnal parameters for your transcoding" )
  123. #define CHOOSE_OUTFILE _("You must choose a file to save to")
  124. /* Streaming 2 */
  125. #define EXTRASTREAMING_TITLE _("Additional streaming options")
  126. #define EXTRASTREAMING_TEXT _("In this page, you will define a few " 
  127.                               "additionnal parameters for your stream" )
  128. #define TTL _("Define the TTL (Time-To-Live) of the stream. This parameter " 
  129.               "is the maximum number of routers your stream can go through. " 
  130.               "If you don't know what it means, or if you want to stream on " 
  131.               "your local network only, leave this setting to 1." )
  132. #define SAP _("When streaming using UDP, you can announce your streams " 
  133.               "using the SAP/SDP announcing protocol. This way, the clients " 
  134.               "won't have to type in the multicast address, it will appear " 
  135.               "in their playlist if they enable the SAP extra interface.n" 
  136.               "If you want to give a name to your stream, enter it here, " 
  137.               "else, a default name will be used" )
  138. /*****************************************************************************
  139.  * All the pages of the wizard, declaration
  140.  *****************************************************************************/
  141. /* Declare classes */
  142. class wizHelloPage : public wxWizardPageSimple
  143. {
  144.     public:
  145.         wizHelloPage( wxWizard *parent);
  146.         void OnActionChange(wxEvent& event);
  147.         void OnWizardPageChanging(wxWizardEvent& event);
  148.         void OnMoreInfo( wxCommandEvent& event );
  149.     protected:
  150.         int i_action;
  151.         WizardDialog *p_parent;
  152.         wxRadioButton *action_radios[2];
  153.         DECLARE_EVENT_TABLE()
  154. };
  155. BEGIN_EVENT_TABLE(wizHelloPage, wxWizardPageSimple)
  156.     EVT_RADIOBUTTON( ActionRadio0_Event, wizHelloPage::OnActionChange)
  157.     EVT_RADIOBUTTON( ActionRadio1_Event, wizHelloPage::OnActionChange)
  158.     EVT_BUTTON( MoreInfoStreaming_Event, wizHelloPage::OnMoreInfo )
  159.     EVT_BUTTON( MoreInfoTranscode_Event, wizHelloPage::OnMoreInfo )
  160.     EVT_WIZARD_PAGE_CHANGING(-1, wizHelloPage::OnWizardPageChanging)
  161. END_EVENT_TABLE()
  162. class wizInputPage : public wxWizardPage
  163. {
  164.     public:
  165.         wizInputPage( wxWizard *, wxWizardPage *, intf_thread_t *);
  166.         wizInputPage::~wizInputPage();
  167.         void OnWizardPageChanging(wxWizardEvent& event);
  168.         void OnInputChange(wxEvent& event);
  169.         void OnEnablePartial(wxCommandEvent& event);
  170.         virtual wxWizardPage *GetPrev() const;
  171.         virtual wxWizardPage *GetNext() const;
  172.         void SetStreamingPage( wxWizardPage *page);
  173.         void SetTranscodePage( wxWizardPage *page);
  174.         void SetAction( int i_action );
  175.         void SetPintf( intf_thread_t *p_intf );
  176.         void SetUri( char *psz_uri );
  177.         void SetPartial( int i_from, int i_to );
  178.     protected:
  179.         bool b_chosen;
  180.         intf_thread_t *p_intf;
  181.         int i_action;
  182.         int i_input;
  183.         void OnChoose( wxCommandEvent& event );
  184.         WizardDialog *p_parent;
  185.         wxRadioButton *input_radios[2];
  186.         wxCheckBox *enable_checkbox;
  187.         wxBoxSizer *mainSizer;
  188.         wxArrayString mrl;
  189.         wxTextCtrl *mrl_text;
  190.         wxTextCtrl *from_text;
  191.         wxTextCtrl *to_text;
  192.         OpenDialog *p_open_dialog;
  193.         wxListView *listview;
  194.         wxPanel *open_panel;
  195.         wxPanel *pl_panel;
  196.         wxWizardPage *p_prev;
  197.         wxWizardPage *p_streaming_page;
  198.         wxWizardPage *p_transcode_page;
  199.         DECLARE_EVENT_TABLE()
  200. };
  201. BEGIN_EVENT_TABLE(wizInputPage, wxWizardPage)
  202.     EVT_RADIOBUTTON( InputRadio0_Event, wizInputPage::OnInputChange)
  203.     EVT_RADIOBUTTON( InputRadio1_Event, wizInputPage::OnInputChange)
  204.     EVT_BUTTON( Choose_Event, wizInputPage::OnChoose)
  205.     EVT_CHECKBOX( PartialEnable_Event, wizInputPage::OnEnablePartial)
  206.     EVT_WIZARD_PAGE_CHANGING(-1, wizInputPage::OnWizardPageChanging)
  207. END_EVENT_TABLE()
  208. class wizTranscodeCodecPage : public wxWizardPage
  209. {
  210. public:
  211.     wizTranscodeCodecPage( wxWizard *parent, wxWizardPage *next);
  212.     ~wizTranscodeCodecPage();
  213.     void wizTranscodeCodecPage::OnWizardPageChanging(wxWizardEvent& event);
  214.     virtual wxWizardPage *GetPrev() const;
  215.     virtual wxWizardPage *GetNext() const;
  216.     void SetPrev( wxWizardPage *page);
  217. protected:
  218.     wxCheckBox *video_checkbox;
  219.     wxComboBox *video_combo;
  220.     wxComboBox *vb_combo;
  221.     wxStaticText * video_text;
  222.     wxCheckBox *audio_checkbox;
  223.     wxComboBox *audio_combo;
  224.     wxComboBox *ab_combo;
  225.     wxStaticText * audio_text;
  226.     WizardDialog *p_parent;
  227.     int i_audio_codec;
  228.     int i_video_codec;
  229.     char *vcodec;
  230.     char *acodec;
  231.     wxWizardPage *p_prev;
  232.     wxWizardPage *p_next;
  233.     void OnVideoCodecChange(wxCommandEvent& event);
  234.     void OnAudioCodecChange(wxCommandEvent& event);
  235.     void OnEnableVideo(wxCommandEvent& event);
  236.     void OnEnableAudio(wxCommandEvent& event);
  237.     DECLARE_EVENT_TABLE()
  238. };
  239. BEGIN_EVENT_TABLE(wizTranscodeCodecPage, wxWizardPage)
  240.    EVT_CHECKBOX( VideoEnable_Event, wizTranscodeCodecPage::OnEnableVideo)
  241.    EVT_CHECKBOX( AudioEnable_Event, wizTranscodeCodecPage::OnEnableAudio)
  242.    EVT_COMBOBOX( VideoCodec_Event, wizTranscodeCodecPage::OnVideoCodecChange)
  243.    EVT_COMBOBOX( AudioCodec_Event, wizTranscodeCodecPage::OnAudioCodecChange)
  244.    EVT_WIZARD_PAGE_CHANGING(-1, wizTranscodeCodecPage::OnWizardPageChanging)
  245. END_EVENT_TABLE()
  246. class wizStreamingMethodPage : public wxWizardPage
  247. {
  248. public:
  249.     wizStreamingMethodPage( wxWizard *parent, wxWizardPage *next);
  250.     void OnWizardPageChanging(wxWizardEvent& event);
  251.     virtual wxWizardPage *GetPrev() const;
  252.     virtual wxWizardPage *GetNext() const;
  253.     void SetPrev( wxWizardPage *page);
  254. protected:
  255.     DECLARE_EVENT_TABLE()
  256.     int i_method;
  257.     wxBoxSizer *mainSizer;
  258.     wxStaticBoxSizer *address_sizer;
  259.     wxStaticText *address_text;
  260.     wxTextCtrl *address_txtctrl;
  261.     WizardDialog * p_parent;
  262.     void OnMethodChange(wxEvent& event);
  263.     wxRadioButton *method_radios[4];
  264.     wxWizardPage *p_prev;
  265.     wxWizardPage *p_next;
  266. };
  267. BEGIN_EVENT_TABLE(wizStreamingMethodPage, wxWizardPage)
  268.     EVT_RADIOBUTTON( MethodRadio0_Event, wizStreamingMethodPage::OnMethodChange)
  269.     EVT_RADIOBUTTON( MethodRadio1_Event, wizStreamingMethodPage::OnMethodChange)
  270.     EVT_RADIOBUTTON( MethodRadio2_Event, wizStreamingMethodPage::OnMethodChange)
  271.     EVT_RADIOBUTTON( MethodRadio3_Event, wizStreamingMethodPage::OnMethodChange)
  272.     EVT_WIZARD_PAGE_CHANGING(-1, wizStreamingMethodPage::OnWizardPageChanging)
  273. END_EVENT_TABLE()
  274. class wizEncapPage : public wxWizardPage
  275. {
  276. public:
  277.     wizEncapPage( wxWizard *parent);
  278.     wizEncapPage::~wizEncapPage();
  279.     void OnWizardPageChanging(wxWizardEvent& event);
  280.     virtual wxWizardPage *GetPrev() const;
  281.     virtual wxWizardPage *GetNext() const;
  282.     void SetStreamingPage( wxWizardPage *page);
  283.     void SetTranscodePage( wxWizardPage *page);
  284.     void SetPrev( wxWizardPage *page);
  285.     void SetAction( int );
  286.     void EnableEncap( int encap );
  287. protected:
  288.     DECLARE_EVENT_TABLE()
  289.     int i_encap;
  290.     int i_mux;
  291.     int i_action;
  292.     void OnEncapChange(wxEvent& event);
  293.     wxRadioButton *encap_radios[MUXERS_NUMBER];
  294.     WizardDialog *p_parent;
  295.     wxWizardPage *p_prev;
  296.     wxWizardPage *p_streaming_page;
  297.     wxWizardPage *p_transcode_page;
  298. };
  299. BEGIN_EVENT_TABLE(wizEncapPage, wxWizardPage)
  300.     EVT_WIZARD_PAGE_CHANGING(-1, wizEncapPage::OnWizardPageChanging)
  301.     EVT_RADIOBUTTON( EncapRadio0_Event, wizEncapPage::OnEncapChange)
  302.     EVT_RADIOBUTTON( EncapRadio1_Event, wizEncapPage::OnEncapChange)
  303.     EVT_RADIOBUTTON( EncapRadio2_Event, wizEncapPage::OnEncapChange)
  304.     EVT_RADIOBUTTON( EncapRadio3_Event, wizEncapPage::OnEncapChange)
  305.     EVT_RADIOBUTTON( EncapRadio4_Event, wizEncapPage::OnEncapChange)
  306.     EVT_RADIOBUTTON( EncapRadio5_Event, wizEncapPage::OnEncapChange)
  307.     EVT_RADIOBUTTON( EncapRadio6_Event, wizEncapPage::OnEncapChange)
  308.     EVT_RADIOBUTTON( EncapRadio7_Event, wizEncapPage::OnEncapChange)
  309.     EVT_RADIOBUTTON( EncapRadio8_Event, wizEncapPage::OnEncapChange)
  310.     EVT_RADIOBUTTON( EncapRadio9_Event, wizEncapPage::OnEncapChange)
  311.     EVT_RADIOBUTTON( EncapRadio10_Event, wizEncapPage::OnEncapChange)
  312. END_EVENT_TABLE()
  313. /* Additional settings for transcode */
  314. class wizTranscodeExtraPage : public wxWizardPage
  315. {
  316. public:
  317.     wizTranscodeExtraPage( wxWizard *parent, wxWizardPage *prev,
  318.                             wxWizardPage *next);
  319.     virtual wxWizardPage *GetPrev() const;
  320.     virtual wxWizardPage *GetNext() const;
  321.     void OnWizardPageChanging( wxWizardEvent& event );
  322. protected:
  323.     DECLARE_EVENT_TABLE()
  324.     void wizTranscodeExtraPage::OnSelectFile(wxCommandEvent&);
  325.     wxTextCtrl *file_text;
  326.     WizardDialog *p_parent;
  327.     wxWizardPage *p_prev;
  328.     wxWizardPage *p_next;
  329. };
  330. BEGIN_EVENT_TABLE(wizTranscodeExtraPage, wxWizardPage)
  331.     EVT_BUTTON( Open_Event, wizTranscodeExtraPage::OnSelectFile)
  332.     EVT_WIZARD_PAGE_CHANGING(-1, wizTranscodeExtraPage::OnWizardPageChanging)
  333. END_EVENT_TABLE()
  334. /* Additional settings for streaming */
  335. class wizStreamingExtraPage : public wxWizardPage
  336. {
  337. public:
  338.     wizStreamingExtraPage( wxWizard *parent, wxWizardPage *prev,
  339.                             wxWizardPage *next);
  340.     virtual wxWizardPage *GetPrev() const;
  341.     virtual wxWizardPage *GetNext() const;
  342.     void OnWizardPageChanging(wxWizardEvent&);
  343.     void OnSAP( wxCommandEvent&);
  344.     wxCheckBox *sap_checkbox;
  345.     wxTextCtrl *sap_text;
  346. protected:
  347.     friend class wizEncapPage;
  348.     DECLARE_EVENT_TABLE()
  349.     WizardDialog *p_parent;
  350.     wxWizardPage *p_prev;
  351.     wxWizardPage *p_next;
  352.     wxSpinCtrl *ttl_spin;
  353. };
  354. BEGIN_EVENT_TABLE(wizStreamingExtraPage, wxWizardPage)
  355.     EVT_CHECKBOX( SAP_Event, wizStreamingExtraPage::OnSAP )
  356.     EVT_WIZARD_PAGE_CHANGING(-1, wizStreamingExtraPage::OnWizardPageChanging)
  357. END_EVENT_TABLE()
  358. /* Local functions */
  359. static int ismult( char *psz_uri );
  360. static void pageHeader( wxWindow *window, wxBoxSizer *sizer,
  361.                        char *psz_title, char *psz_text);
  362. static void pageHeader( wxWindow *window, wxBoxSizer *sizer,
  363.                         char *psz_title, char *psz_text)
  364. {
  365.     wxStaticText *wtitle = new wxStaticText( window, -1, wxU( psz_title ) );
  366.     wxFont font = wtitle->GetFont();
  367.     font.SetPointSize(14);
  368.     wtitle->SetFont(font);
  369.     sizer->Add( wtitle, 0, wxALL, 5 );
  370.     sizer->Add( new wxStaticText( window, -1,
  371.                 wxU( vlc_wraptext( psz_text , TEXTWIDTH, false ) ) ),
  372.                         0, wxALL, 5 );
  373. }
  374. /***************************************************************************
  375.  * Implementation of the pages
  376.  ***************************************************************************/
  377. /***************************************************
  378.  * First page: choose between stream and transcode *
  379.  ***************************************************/
  380. wizHelloPage::wizHelloPage( wxWizard *parent) : wxWizardPageSimple(parent)
  381. {
  382.         i_action = 0;
  383.         p_parent = (WizardDialog *)parent;
  384.         wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
  385.         /* Create the texts */
  386.         pageHeader( this, mainSizer, HELLO_TITLE, HELLO_TEXT );
  387.         /* Create the radio buttons with their helps */
  388.         action_radios[0] = new wxRadioButton( this, ActionRadio0_Event,
  389.                                               wxU( HELLO_STREAMING ) );
  390.         action_radios[1] = new wxRadioButton( this, ActionRadio1_Event,
  391.                                               wxU( HELLO_TRANSCODE ) );
  392.         i_action = 0;
  393.         mainSizer->Add( 0, 0, 1 );
  394.         wxBoxSizer *stream_sizer = new wxBoxSizer( wxHORIZONTAL );
  395.         stream_sizer->Add( action_radios[0], 0, wxALL, 5 );
  396.         stream_sizer->Add( 0,0,1 );
  397.         stream_sizer->Add( new wxButton( this, MoreInfoStreaming_Event,
  398.                                 wxU( _("More Info")) ), 0, 0, 0 );
  399.         mainSizer->Add( stream_sizer, 0, wxALL | wxEXPAND , 5 );
  400.         wxBoxSizer *transcode_sizer = new wxBoxSizer( wxHORIZONTAL );
  401.         transcode_sizer->Add( action_radios[1], 0, wxALL, 5 );
  402.         transcode_sizer->Add( 0,0,1);
  403.         transcode_sizer->Add( new wxButton( this, MoreInfoTranscode_Event,
  404.                                 wxU( _("More Info")) ), 0 ,  0 , 0 );
  405.         mainSizer->Add( transcode_sizer, 0, wxALL | wxEXPAND, 5 );
  406.         mainSizer->Add( 0, 0, 1 );
  407.         mainSizer->Add( new wxStaticLine(this, -1 ), 0, wxEXPAND| wxTOP|
  408.                         wxBOTTOM, 5 );
  409.         mainSizer->Add( new wxStaticText(this, -1,
  410.                         wxU( vlc_wraptext(HELLO_NOTICE , TEXTWIDTH , false ))),
  411.                         0, wxALL, 5 );
  412.         SetSizer(mainSizer);
  413.         mainSizer->Fit(this);
  414.     }
  415. void wizHelloPage::OnMoreInfo(wxCommandEvent& event)
  416. {
  417.     wxString msg;
  418.     msg.Printf( wxString( wxU( event.GetId() == MoreInfoStreaming_Event ?
  419.                                     MOREINFO_STREAM :
  420.                                     MOREINFO_TRANSCODE ) ) );
  421.     wxMessageBox( msg, wxU(_("More information")),
  422.                   wxOK | wxICON_INFORMATION, this->p_parent );
  423. }
  424. void wizHelloPage::OnActionChange(wxEvent& event)
  425. {
  426.     i_action = event.GetId() - ActionRadio0_Event;
  427.     ((wizInputPage *)GetNext())->SetAction( i_action );
  428.     p_parent->SetAction( i_action );
  429. }
  430. void wizHelloPage::OnWizardPageChanging(wxWizardEvent& event)
  431. {
  432.     ((wizInputPage *)GetNext())->SetAction( i_action );
  433.     p_parent->SetAction( i_action );
  434. }
  435. /************************************
  436.  * Second page: choose input stream *
  437.  ************************************/
  438. wizInputPage::wizInputPage( wxWizard *parent, wxWizardPage *prev, intf_thread_t *_p_intf) :
  439.               wxWizardPage(parent)
  440. {
  441.     p_prev = prev;
  442.     p_intf = _p_intf;
  443.     p_parent = (WizardDialog *)parent;
  444.     b_chosen = false;
  445.     p_open_dialog = NULL;
  446.     pl_panel = NULL;
  447.     mainSizer = new wxBoxSizer(wxVERTICAL);
  448.     /* Create the texts */
  449.     pageHeader( this, mainSizer, INPUT_TITLE, INPUT_TEXT );
  450.     /* Create the radio buttons */
  451.     input_radios[0] = new wxRadioButton( this, InputRadio0_Event ,
  452.                                wxU( INPUT_OPEN ) );
  453.     mainSizer->Add( input_radios[0], 0, wxALL, 5 );
  454.     input_radios[1] = new wxRadioButton( this, InputRadio1_Event ,
  455.                                wxU( INPUT_PL ) );
  456.     i_input = 0;
  457.     mainSizer->Add( input_radios[1], 0, wxALL, 5 );
  458.     /* Open Panel */
  459.     open_panel = new wxPanel(this, -1);
  460.     open_panel->SetAutoLayout( TRUE );
  461.     wxBoxSizer *openSizer = new wxBoxSizer(wxHORIZONTAL);
  462.     mrl_text = new wxTextCtrl( open_panel, -1, wxU( "" ), wxDefaultPosition,
  463.                               wxSize(200,25) );
  464.     openSizer->Add( mrl_text, 0 , wxALL, 5 );
  465.     openSizer->Add( new wxButton( open_panel, Choose_Event, wxU(_("Choose...")) ), 0, wxALL, 5 );
  466.     open_panel->SetSizer( openSizer );
  467.     openSizer->Layout();
  468.     openSizer->Fit(open_panel);
  469.     mainSizer->Add( open_panel );
  470.     playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
  471.                                        VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  472.     if( p_playlist )
  473.     {
  474.         if( p_playlist->i_size > 0)
  475.         {
  476.             pl_panel = new wxPanel(this, -1);
  477.             wxBoxSizer *plSizer = new wxBoxSizer( wxHORIZONTAL );
  478.             listview = new wxListView( pl_panel, ListView_Event,
  479.                                        wxDefaultPosition, wxSize(300,300),
  480.                                        wxLC_REPORT | wxSUNKEN_BORDER );
  481.             listview->InsertColumn( 0, wxU(_("Name")) );
  482.             listview->InsertColumn( 1, wxU(_("URI")) );
  483.             listview->SetColumnWidth( 0, 250 );
  484.             listview->SetColumnWidth( 1, 100 );
  485.             for( int i=0 ; i < p_playlist->i_size ; i++ )
  486.             {
  487.                 wxString filename = wxL2U( p_playlist->pp_items[i]->input.
  488.                                                                     psz_name );
  489.                 listview->InsertItem( i, filename );
  490.                 listview->SetItem( i, 1, wxL2U( p_playlist->pp_items[i]->
  491.                                                             input.psz_uri) );
  492.             }
  493.             listview->Select( p_playlist->i_index , TRUE);
  494.             plSizer->Add( listview, 1, wxALL | wxEXPAND , 5 );
  495.             pl_panel->SetSizer( plSizer );
  496.             plSizer->Layout();
  497.             mainSizer->Add( pl_panel, 1, wxALL|wxEXPAND, 5 );
  498.             pl_panel->Hide();
  499.             mainSizer->Hide( pl_panel );
  500.             mainSizer->Layout();
  501.         }
  502.         else
  503.         {
  504.             input_radios[1]->Disable();
  505.         }
  506.         vlc_object_release( p_playlist );
  507.     }
  508.     else
  509.     {
  510.         input_radios[1]->Disable();
  511.     }
  512.     /* Partial Extract Box */
  513.     mainSizer->Add( 0, 10, 0 );
  514.     wxStaticBox *partial_box = new wxStaticBox( this, -1,
  515.                     wxU(_("Partial Extract")) );
  516.     wxStaticBoxSizer *partial_sizer = new wxStaticBoxSizer( partial_box,
  517.                                                           wxVERTICAL );
  518.     enable_checkbox = new wxCheckBox( this, PartialEnable_Event,
  519.                                                 wxU(_("Enable") ) );
  520.     enable_checkbox->SetToolTip(wxU(_(PARTIAL) ) ) ;
  521.     partial_sizer->Add( enable_checkbox, 0 , wxLEFT , 5 );
  522.     wxFlexGridSizer *partial_sizer2 = new wxFlexGridSizer( 4 , 1 , 20 );
  523.     partial_sizer2->Add( new wxStaticText(this, -1, wxU(_( "From" ) ) ),
  524.                          0 , wxLEFT , 5 );
  525.     from_text = new wxTextCtrl( this, -1, wxT(""),
  526.                                 wxDefaultPosition, wxSize( 80,25 ) );
  527.     partial_sizer2->Add( from_text, 0 , wxALIGN_RIGHT);
  528.     partial_sizer2->Add( new wxStaticText(this, -1, wxU(_( "To" ) ) ),
  529.                          0 , wxLEFT , 5 );
  530.     to_text = new wxTextCtrl( this, -1, wxT(""),
  531.                                   wxDefaultPosition, wxSize( 80 , 25 ) );
  532.     partial_sizer2->Add( to_text, 0 , wxALIGN_RIGHT );
  533.     partial_sizer->Add( partial_sizer2, 0, wxALL, 0 );
  534.     partial_sizer->Fit( partial_box );
  535.     mainSizer->Add( partial_sizer, 0, 0, 0 );
  536.     from_text->Disable();
  537.     to_text->Disable();
  538.     SetSizer(mainSizer);
  539.     mainSizer->Fit(this);
  540.     mainSizer->Layout();
  541. }
  542. wizInputPage::~wizInputPage()
  543. {
  544. }
  545. void wizInputPage::OnInputChange(wxEvent& event)
  546. {
  547.     i_input = event.GetId() - InputRadio0_Event;
  548.     if( i_input == 0 )
  549.     {
  550.         if( pl_panel )
  551.         {
  552.             pl_panel->Hide();
  553.             mainSizer->Hide( pl_panel );
  554.             open_panel->Show();
  555.             mainSizer->Show( open_panel );
  556.             mainSizer->Layout();
  557.         }
  558.     }
  559.     else
  560.     {
  561.         open_panel->Hide();
  562.         mainSizer->Hide( open_panel );
  563.         pl_panel->Show();
  564.         mainSizer->Show( pl_panel );
  565.         mainSizer->Layout();
  566.     }
  567. }
  568. void wizInputPage::OnEnablePartial(wxCommandEvent& event)
  569. {
  570.    from_text->Enable( event.IsChecked() );
  571.    to_text->Enable( event.IsChecked() );
  572. }
  573. void wizInputPage::OnChoose(wxCommandEvent& event)
  574. {
  575.     p_open_dialog = new OpenDialog( p_intf, this, -1, -1, OPEN_STREAM );
  576.     if(  p_open_dialog->ShowModal() == wxID_OK )
  577.     {
  578.         mrl_text->SetValue(p_open_dialog->mrl[0] );
  579.     }
  580.     delete p_open_dialog;
  581.     p_open_dialog = NULL;
  582. }
  583. void wizInputPage::OnWizardPageChanging(wxWizardEvent& event)
  584. {
  585.     if( i_input == 0)
  586.     {
  587.         if( mrl_text->GetValue().IsSameAs( wxT(""), TRUE ) &&
  588.                         event.GetDirection() )
  589.         {
  590.             wxMessageBox( wxU( CHOOSE_STREAM ), wxU( ERROR_MSG ),
  591.                           wxICON_WARNING | wxOK, this->p_parent );
  592.             event.Veto();
  593.             return;
  594.         }
  595.         else
  596.         {
  597.             p_parent->SetMrl( (const char *)mrl_text->GetValue().mb_str() );
  598.         }
  599.     }
  600.     else
  601.     {
  602.         int i = -1;
  603.         wxListItem listitem;
  604.         i = listview->GetNextItem( i , wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
  605.         if( i != -1 )
  606.         {
  607.             listitem.SetId( i );
  608.             listitem.SetColumn( 1 );
  609.             listview->GetItem( listitem );
  610.             p_parent->SetMrl( (const char*) listitem.GetText().mb_str() );
  611.         }
  612.     }
  613.     if( enable_checkbox->IsChecked() )
  614.     {
  615.         int i_from = atoi( from_text->GetValue().mb_str() );
  616.         int i_to = atoi( to_text->GetValue().mb_str() );
  617.         msg_Dbg( p_intf, "Partial streaming enabled, from %i to %i",
  618.                          i_from,i_to);
  619.         p_parent->SetPartial( i_from, i_to );
  620.     }
  621.     return;
  622. }
  623. wxWizardPage *wizInputPage::GetPrev() const { return p_prev; }
  624. wxWizardPage *wizInputPage::GetNext() const
  625. {
  626.     if( i_action == ACTION_STREAM )
  627.         return p_streaming_page;
  628.     else
  629.        return p_transcode_page;
  630. }
  631. void wizInputPage::SetStreamingPage( wxWizardPage *page)
  632. {
  633.     p_streaming_page = page;
  634. }
  635. void wizInputPage::SetTranscodePage( wxWizardPage *page)
  636. {
  637.     p_transcode_page = page;
  638. }
  639. void wizInputPage::SetAction( int i_action )
  640. {
  641.     this->i_action = i_action;
  642. }
  643. void wizInputPage::SetPintf( intf_thread_t *p_intf )
  644. {
  645.     this->p_intf = p_intf;
  646. }
  647. void wizInputPage::SetUri( char *psz_uri )
  648. {
  649.     mrl_text->SetValue( wxU( psz_uri ) );
  650. }
  651. void wizInputPage::SetPartial( int i_from, int i_to )
  652. {
  653.    wxString msg;
  654.    msg.Printf( wxString( wxT( "%i") ), i_from );
  655.    from_text->Enable( TRUE );
  656.    from_text->SetValue( msg );
  657.    msg.Printf( wxString( wxT( "%i") ), i_to );
  658.    to_text->Enable( TRUE );
  659.    to_text->SetValue( msg );
  660.    enable_checkbox->SetValue( TRUE );
  661. }
  662. /***************************************************
  663.  * First transcode page: choose codecs             *
  664.  ***************************************************/
  665. wizTranscodeCodecPage::wizTranscodeCodecPage( wxWizard *parent,
  666.                        wxWizardPage *next) : wxWizardPage(parent)
  667. {
  668.     p_next = next;
  669.     acodec = NULL;
  670.     vcodec = NULL;
  671.     p_parent = (WizardDialog *) parent;
  672.     wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL);
  673.     /* Header */
  674.     pageHeader( this, main_sizer,  TRANSCODE1_TITLE, TRANSCODE1_TEXT );
  675.     /* Video Box */
  676.     wxStaticBox *video_box = new wxStaticBox( this, -1, wxU(_("Video")) );
  677.     wxStaticBoxSizer *video_sizer = new wxStaticBoxSizer( video_box,
  678.                                                           wxVERTICAL );
  679.     /* Line 1 : only the checkbox */
  680.     wxFlexGridSizer *video_sizer1 = new wxFlexGridSizer( 2,3,20 );
  681.     video_sizer1->Add( new wxCheckBox( this, VideoEnable_Event,
  682.                        wxU(_("Transcode video") ) ), 0 , 0 , 5 );
  683.     video_sizer1->Add( 0,0,1);
  684.     /* Line 2 : codec */
  685.     video_sizer1->Add( new wxStaticText(this, -1, wxU(_("Codec"))),0,wxLEFT ,5);
  686.     video_combo = new wxComboBox( this, VideoCodec_Event, wxT(""),
  687.                                   wxDefaultPosition, wxSize(200,25) );
  688.     for( int i= 0; vcodecs_array[i].psz_display != NULL; i++ )
  689.     {
  690.         video_combo->Append( wxU( vcodecs_array[i].psz_display ) ,
  691.                             (void *)&vcodecs_array[i] );
  692.     }
  693.     video_sizer1->Add( video_combo, 0 , wxALIGN_LEFT , 0 );
  694.     video_sizer1->Add( new wxStaticText(this, -1, wxU(_("Bitrate (kb/s)"))),0,
  695.                        wxLEFT ,5);
  696.     vb_combo = new wxComboBox( this, VideoBitrate_Event, wxT("1024"),
  697.                                wxDefaultPosition, wxDefaultSize,
  698.                                WXSIZEOF(vbitrates_array), vbitrates_array );
  699.     video_sizer1->Add( vb_combo, 0, wxALIGN_LEFT , 0 );
  700.     /* Line 3 : text */
  701.     video_text = new wxStaticText( this, -1,
  702.                      wxU( vlc_wraptext( TR_VIDEO_TEXT, TEXTWIDTH, false) ) );
  703.     /* Fill the main video sizer */
  704.     video_sizer->Add( video_sizer1 , 0, wxEXPAND , 5 );
  705.     video_sizer->Add( video_text, 0, wxLEFT|wxTOP , 5 );
  706.     /* Audio box */
  707.     wxStaticBox *audio_box = new wxStaticBox( this, -1, wxU(_("Audio")) );
  708.     wxStaticBoxSizer *audio_sizer = new wxStaticBoxSizer( audio_box,
  709.                                                           wxVERTICAL );
  710.     /* Line1: enabler */
  711.     wxFlexGridSizer *audio_sizer1 = new wxFlexGridSizer( 2,3,20);
  712.     audio_sizer1->Add( new wxCheckBox( this, AudioEnable_Event,
  713.                             wxU(_("Transcode audio") ) ), 0 , wxLEFT, 5 );
  714.     audio_sizer1->Add( 0, 0, 1 );
  715.     /* Line 2 : codec */
  716.     audio_sizer1->Add( new wxStaticText(this, -1, wxU(_("Codec"))),0,wxLEFT,5);
  717.     audio_combo = new wxComboBox( this, AudioCodec_Event, wxT(""),
  718.                                   wxDefaultPosition, wxSize(200,25) );
  719.     for( int i= 0; acodecs_array[i].psz_display != NULL; i++ )
  720.     {
  721.         audio_combo->Append( wxU( acodecs_array[i].psz_display ) ,
  722.                             (void *)&acodecs_array[i] );
  723.     }
  724.     audio_sizer1->Add( audio_combo, 0 , wxALIGN_LEFT, 0 );
  725.     audio_sizer1->Add( new wxStaticText(this, -1, wxU(_("Bitrate (kb/s)"))),0,
  726.                        wxLEFT ,5);
  727.     ab_combo = new wxComboBox( this, AudioBitrate_Event, wxT("192"),
  728.                                wxDefaultPosition, wxDefaultSize,
  729.                                WXSIZEOF(abitrates_array), abitrates_array );
  730.     audio_sizer1->Add( ab_combo, 0, wxALIGN_LEFT, 0 );
  731.     /* Line 3 : text */
  732.     audio_text = new wxStaticText( this, -1,
  733.                      wxU( vlc_wraptext( TR_AUDIO_TEXT, TEXTWIDTH, false) ) );
  734.     audio_sizer->Add(audio_sizer1, 0, wxEXPAND, 5);
  735.     audio_sizer->Add( audio_text, 0, wxLEFT | wxTOP, 5 );
  736.     main_sizer->Add( video_sizer, 1, wxGROW, 0 );
  737.     main_sizer->Add( audio_sizer, 1, wxGROW, 0 );
  738.     main_sizer->Layout();
  739.     SetSizerAndFit( main_sizer );
  740.     /* Default disabled */
  741.     video_combo->Disable(); video_text->Disable();vb_combo->Disable();
  742.     audio_combo->Disable(); audio_text->Disable();ab_combo->Disable();
  743. }
  744. wizTranscodeCodecPage::~wizTranscodeCodecPage()
  745. {
  746.     if( acodec ) free( acodec );
  747.     if( vcodec ) free( vcodec );
  748. }
  749. void wizTranscodeCodecPage::OnEnableVideo(wxCommandEvent& event)
  750. {
  751.    video_combo->Enable( event.IsChecked() );
  752.    vb_combo->Enable( event.IsChecked() );
  753.    video_text->Enable( event.IsChecked() );
  754. }
  755. void wizTranscodeCodecPage::OnEnableAudio(wxCommandEvent& event)
  756. {
  757.    audio_combo->Enable( event.IsChecked() );
  758.    ab_combo->Enable( event.IsChecked() );
  759.    audio_text->Enable( event.IsChecked() );
  760. }
  761. void wizTranscodeCodecPage::OnVideoCodecChange(wxCommandEvent& event)
  762. {
  763.     struct codec *c = (struct codec*)
  764.              (video_combo->GetClientData(video_combo->GetSelection()));
  765.     video_text->SetLabel( wxU( vlc_wraptext(c->psz_descr, TEXTWIDTH, false) ) );
  766.     i_video_codec = video_combo->GetSelection();
  767.     vcodec = strdup(c->psz_codec);
  768. }
  769. void wizTranscodeCodecPage::OnAudioCodecChange(wxCommandEvent& event)
  770. {
  771.     struct codec *c = (struct codec*)
  772.              (audio_combo->GetClientData(audio_combo->GetSelection()));
  773.     audio_text->SetLabel( wxU( vlc_wraptext(c->psz_descr, TEXTWIDTH, false) ) );
  774.     i_audio_codec = audio_combo->GetSelection();
  775.     acodec = strdup(c->psz_codec);
  776. }
  777. void wizTranscodeCodecPage::OnWizardPageChanging(wxWizardEvent& event)
  778. {
  779.     unsigned int i,j;
  780.     if( !event.GetDirection() )
  781.     {
  782.             GetPrev()->Enable();
  783.             return;
  784.     }
  785.     /* Set the dummy codec ( accept all muxers ) if needed */
  786.     if( !video_combo->IsEnabled() )
  787.     {
  788.         i_video_codec = VCODECS_NUMBER;
  789.     }
  790.     if( !audio_combo->IsEnabled() )
  791.     {
  792.         i_audio_codec = ACODECS_NUMBER;
  793.     }
  794.     ((wizEncapPage *)GetNext())->SetPrev(this);
  795.     for( i = 0 ; i< MUXERS_NUMBER ; i++ )
  796.     {
  797.         if( vcodecs_array[i_video_codec].muxers[i] != -1 )
  798.         {
  799.             for( j = 0 ; j<  MUXERS_NUMBER ; j++ )
  800.             {
  801.                 if( acodecs_array[i_audio_codec].muxers[j] ==
  802.                               vcodecs_array[i_video_codec].muxers[i] )
  803.                 {
  804.                     ((wizEncapPage*)GetNext())->EnableEncap(
  805.                                vcodecs_array[i_video_codec].muxers[i] );
  806.                 }
  807.             }
  808.         }
  809.     }
  810.     struct codec *c = (struct codec*)
  811.              (video_combo->GetClientData( video_combo->IsEnabled() ?
  812.                                           video_combo->GetSelection(): i_video_codec ));
  813.     vcodec = strdup(c->psz_codec);
  814.     c = (struct codec*)
  815.            (audio_combo->GetClientData( audio_combo->IsEnabled() ?
  816.                                        audio_combo->GetSelection() : i_audio_codec ));
  817.     acodec = strdup(c->psz_codec);
  818.     int vb = atoi(vb_combo->GetValue().mb_str() );
  819.     if( vb == 0 )
  820.     {
  821.          vb = 1024;
  822.     }
  823.     int ab = atoi(ab_combo->GetValue().mb_str() );
  824.     if( ab == 0)
  825.     {
  826.         ab = 192;
  827.     }
  828.     p_parent->SetTranscode( vcodec, vb , acodec, ab );
  829.     ((wizEncapPage*)GetNext())->SetAction( p_parent->GetAction() );
  830.     p_parent->SetAction( p_parent->GetAction() );
  831.     return;
  832. }
  833. wxWizardPage *wizTranscodeCodecPage::GetPrev() const { return p_prev; }
  834. wxWizardPage *wizTranscodeCodecPage::GetNext() const { return p_next; }
  835. void wizTranscodeCodecPage::SetPrev( wxWizardPage *page) {p_prev = page; }
  836. /***************************************************
  837.  * First streaming page: choose method             *
  838.  ***************************************************/
  839. wizStreamingMethodPage::wizStreamingMethodPage( wxWizard *parent,
  840.     wxWizardPage *next) : wxWizardPage(parent)
  841. {
  842.     int i;
  843.     p_next = next;
  844.     p_parent = (WizardDialog *)parent;
  845.     mainSizer = new wxBoxSizer(wxVERTICAL);
  846.     /* Create the texts */
  847.     pageHeader( this, mainSizer,  STREAMING1_TITLE, STREAMING1_TEXT );
  848.     mainSizer->Add( 0,0,1 );
  849.     i_method = 0;
  850.     wxStaticBox *method_box = new wxStaticBox( this, -1,
  851.                                                wxU(_("Streaming method")) );
  852.     wxStaticBoxSizer *method_sizer = new wxStaticBoxSizer(method_box,
  853.                                                           wxHORIZONTAL );
  854.     for( i = 0 ; i< 3 ; i++ )
  855.     {
  856.         method_radios[i] = new wxRadioButton( this, MethodRadio0_Event + i,
  857.                                wxU( methods_array[i].psz_method ) );
  858.         method_radios[i]->SetToolTip( wxU(_( methods_array[i].psz_descr ) ) );
  859.         method_sizer->Add( method_radios[i], 0, wxALL, 5 );
  860.     }
  861.     method_sizer->Layout();
  862.     wxStaticBox *address_box = new wxStaticBox( this, -1,
  863.                     wxU(_("Destination")) );
  864.     address_sizer = new wxStaticBoxSizer(address_box,
  865.                                          wxVERTICAL );
  866.     /* Big kludge, we take the longest text to get the size */
  867.     address_text = new wxStaticText(this, -1,
  868.                wxU( vlc_wraptext(methods_array[2].psz_address,
  869.                                  TEXTWIDTH, false ) ),
  870.                wxDefaultPosition, wxDefaultSize );
  871.     address_txtctrl = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
  872.                                       wxSize(200,25));
  873.     address_sizer->Add( address_text, 0, wxALL, 5 );
  874.     address_sizer->Add( address_txtctrl, 0, wxALL, 5 );
  875.     address_sizer->Layout();
  876.     /* Set the minimum size */
  877.     address_sizer->SetMinSize( address_sizer->GetSize() );
  878.     address_text->SetLabel( wxU(
  879.      vlc_wraptext( _(methods_array[0].psz_address), TEXTWIDTH, false)));
  880.     mainSizer->Add( method_sizer, 0, wxALL | wxEXPAND, 5 );
  881.     mainSizer->Add( address_sizer, 0, wxALL | wxEXPAND, 5 );
  882.     mainSizer->Add( 0,0,1 );
  883.     mainSizer->Layout();
  884.     SetSizer(mainSizer);
  885.     mainSizer->Fit(this);
  886.     return;
  887. }
  888. void wizStreamingMethodPage::OnWizardPageChanging(wxWizardEvent& event)
  889. {
  890.     unsigned int i;
  891.     if( !event.GetDirection() ) return;
  892.     /* Check valid address */
  893.     if( i_method == 1 && !ismult((char *) address_txtctrl->GetValue().c_str()) )
  894.     {
  895.         wxMessageBox( wxU( INVALID_MCAST_ADDRESS ) , wxU( ERROR_MSG ),
  896.                       wxICON_WARNING | wxOK, this->p_parent );
  897.         event.Veto();
  898.     }
  899.     else if( i_method == 0 && address_txtctrl->GetValue().IsEmpty() )
  900.     {
  901.         wxMessageBox( wxU( NO_ADDRESS ) , wxU( ERROR_MSG ),
  902.                       wxICON_WARNING | wxOK, this->p_parent );
  903.         event.Veto();
  904.     }
  905.     ((wizEncapPage *)GetNext())->SetPrev(this);
  906.     for( i = 0 ; i< MUXERS_NUMBER ; i++ )
  907.     {
  908.         if( methods_array[i_method].muxers[i] != -1 )
  909.         {
  910.             ((wizEncapPage*)GetNext())->EnableEncap(
  911.                                methods_array[i_method].muxers[i] );
  912.         }
  913.     }
  914.     p_parent->SetStream( methods_array[i_method].psz_access ,
  915.                          (char *)address_txtctrl->GetValue().c_str() );
  916.     /* Set the action for the muxer page */
  917.     ((wizEncapPage*)GetNext())->SetAction( p_parent->GetAction() );
  918.     return;
  919. }
  920. wxWizardPage *wizStreamingMethodPage::GetPrev() const { return p_prev; }
  921. wxWizardPage *wizStreamingMethodPage::GetNext() const { return p_next; }
  922. void wizStreamingMethodPage::SetPrev( wxWizardPage *page) {p_prev = page; }
  923. void wizStreamingMethodPage::OnMethodChange(wxEvent& event)
  924. {
  925.     i_method = event.GetId() - MethodRadio0_Event;
  926.     address_text->SetLabel( wxU(
  927.      vlc_wraptext( _(methods_array[i_method].psz_address), TEXTWIDTH, false)));
  928. }
  929. /***************************************************
  930.  * Choose encapsulation format                     *
  931.  ***************************************************/
  932. wizEncapPage::wizEncapPage( wxWizard *parent ) : wxWizardPage(parent)
  933. {
  934.     int i;
  935.     i_mux = 0;
  936.     p_parent = (WizardDialog *)parent;
  937.     p_streaming_page = NULL;
  938.     p_transcode_page = NULL;
  939.     p_prev = NULL;
  940.     wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
  941.     /* Create the texts */
  942.     pageHeader( this, mainSizer, ENCAP_TITLE, ENCAP_TEXT );
  943.     mainSizer->Add( 0,0,1 );
  944.     for( i = 0 ; i< MUXERS_NUMBER ; i++ )
  945.     {
  946.         encap_radios[i] = new wxRadioButton( this, EncapRadio0_Event + i,
  947.                                wxU( encaps_array[i].psz_encap ) );
  948.         encap_radios[i]->SetToolTip( wxU(_( encaps_array[i].psz_descr ) ) );
  949.         mainSizer->Add( encap_radios[i], 0, wxLEFT, 5 );
  950.         encap_radios[i]->Disable();
  951.     }
  952.     mainSizer->Add( 0,0,1 );
  953.     SetSizer(mainSizer);
  954.     mainSizer->Fit(this);
  955. }
  956. wizEncapPage::~wizEncapPage()
  957. {
  958. }
  959. void wizEncapPage::OnWizardPageChanging(wxWizardEvent& event)
  960. {
  961.     int i;
  962.     if( !event.GetDirection() )
  963.     {
  964.         for( i = 0 ; i< MUXERS_NUMBER ; i++ )
  965.         {
  966.             encap_radios[i]->Disable();
  967.         }
  968.     }
  969.     p_parent->SetMux( encaps_array[i_mux].psz_mux );
  970.     if( p_parent->GetAction() == ACTION_STREAM )
  971.     {
  972.         if( strstr( p_parent->method, "udp" ))
  973.         {
  974.             ((wizStreamingExtraPage *)GetNext())->sap_checkbox->Enable();
  975.             ((wizStreamingExtraPage *)GetNext())->sap_text->Enable(false);
  976.         }
  977.         else
  978.         {
  979.            ((wizStreamingExtraPage *)GetNext())->sap_checkbox->Enable( false );
  980.            ((wizStreamingExtraPage *)GetNext())->sap_text->Enable( false );
  981.         }
  982.     }
  983.     return;
  984. }
  985. void wizEncapPage::OnEncapChange(wxEvent& event)
  986. {
  987.     i_mux = event.GetId() - EncapRadio0_Event;
  988. }
  989. void wizEncapPage::EnableEncap( int encap )
  990. {
  991.     int i;
  992.     for( i = 0 ; i< MUXERS_NUMBER ; i++)
  993.     {
  994.         if( encaps_array[i].id == encap )
  995.         {
  996.             encap_radios[i]->Enable();
  997.             encap_radios[i]->SetValue(true);
  998.             i_mux = i;
  999.         }
  1000.     }
  1001. }
  1002. void wizEncapPage::SetStreamingPage( wxWizardPage *page)
  1003. {
  1004.     p_streaming_page = page;
  1005. }
  1006. void wizEncapPage::SetTranscodePage( wxWizardPage *page)
  1007. {
  1008.     p_transcode_page = page;
  1009. }
  1010. wxWizardPage *wizEncapPage::GetPrev() const { return p_prev; }
  1011. wxWizardPage *wizEncapPage::GetNext() const
  1012. {
  1013.     if( i_action== ACTION_STREAM )
  1014.         return p_streaming_page;
  1015.     else
  1016.        return p_transcode_page;
  1017. }
  1018. void wizEncapPage::SetAction( int i_act  ) { i_action = i_act; }
  1019. void wizEncapPage::SetPrev( wxWizardPage *page) { p_prev = page; }
  1020. /***************************************************
  1021.  * Extra transcoding page : Select file            *
  1022.  ***************************************************/
  1023. wizTranscodeExtraPage::wizTranscodeExtraPage( wxWizard *parent,
  1024.                        wxWizardPage *prev,
  1025.                        wxWizardPage *next) : wxWizardPage(parent)
  1026. {
  1027.     p_next = next;
  1028.     p_prev = prev;
  1029.     p_parent = (WizardDialog *) parent;
  1030.     wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
  1031.     /* Create the texts */
  1032.     pageHeader( this, mainSizer, EXTRATRANSCODE_TITLE, EXTRATRANSCODE_TEXT );
  1033.     mainSizer->Add( 0, 0, 1 );
  1034.     wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 2, 1 );
  1035.     sizer->Add( new wxStaticText( this, -1,
  1036.                     wxU(_("Select the file to save to") ) ),
  1037.                     0, wxALL, 5 );
  1038.     sizer->Add( 0, 0, 1 );
  1039.     file_text = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
  1040.                                 wxSize( 150, -1 ) );
  1041.     sizer->Add( file_text, 0,  wxALL, 5 );
  1042.     sizer->Add( new wxButton( this, Open_Event, wxU("Choose") ) );
  1043.     mainSizer->Add( sizer, 0, 0, 0) ;
  1044.     mainSizer->Add( 0, 0, 1 );
  1045.     SetSizer(mainSizer);
  1046.     mainSizer->Fit(this);
  1047. }
  1048. void wizTranscodeExtraPage::OnSelectFile( wxCommandEvent &event)
  1049. {
  1050.     wxFileDialog *file_dialog =  new wxFileDialog( this, wxU(_("Open File")),
  1051.                    wxT(""), wxT(""), wxT("*"), wxSAVE );
  1052.     if( file_dialog && file_dialog->ShowModal() == wxID_OK )
  1053.     {
  1054.         if( file_dialog->GetFilename().mb_str() )
  1055.         {
  1056.             file_text->SetValue( file_dialog->GetFilename() );
  1057.         }
  1058.     }
  1059. }
  1060. void wizTranscodeExtraPage::OnWizardPageChanging( wxWizardEvent& event )
  1061. {
  1062.     if( event.GetDirection() && file_text->GetValue().IsEmpty() )
  1063.     {
  1064.         wxMessageBox( wxU( CHOOSE_OUTFILE ), wxU( ERROR_MSG ),
  1065.                       wxICON_WARNING | wxOK, this->p_parent );
  1066.         event.Veto();
  1067.     }
  1068.     if( event.GetDirection() )
  1069.     {
  1070.        p_parent->SetTranscodeOut( (char *)file_text->GetValue().c_str());
  1071.     }
  1072. }
  1073. wxWizardPage *wizTranscodeExtraPage::GetPrev() const { return p_prev; }
  1074. wxWizardPage *wizTranscodeExtraPage::GetNext() const {return p_next; }
  1075. /***********************************************************
  1076.  *  Extra streaming page
  1077.  ***********************************************************/
  1078. wizStreamingExtraPage::wizStreamingExtraPage( wxWizard *parent,
  1079.                        wxWizardPage *prev,
  1080.                        wxWizardPage *next) : wxWizardPage(parent)
  1081. {
  1082.     p_next = next;
  1083.     p_prev = prev;
  1084.     p_parent = (WizardDialog *) parent;
  1085.     wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
  1086.     /* Create the texts */
  1087.     pageHeader( this, mainSizer, EXTRASTREAMING_TITLE, EXTRASTREAMING_TEXT );
  1088.     mainSizer->Add( 0, 0, 1 );
  1089.     wxFlexGridSizer *sizer = new wxFlexGridSizer( 2,2,1) ;
  1090.     /* TTL */
  1091.     sizer->Add( new wxStaticText( this, -1, wxU(_("Time-To-Live (TTL)"))),
  1092.                     0, wxALL,  5 );
  1093.     ttl_spin = new wxSpinCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize,
  1094.                     0, 1, 255, 1 );
  1095.     ttl_spin->SetToolTip(wxU(_(TTL) ) ) ;
  1096.     sizer->Add( ttl_spin, 0, wxALL , 5 );
  1097.     /* SAP announce */
  1098.     sap_checkbox =  new wxCheckBox( this, SAP_Event, wxU(_("SAP Announce")) );
  1099.     sap_checkbox->SetToolTip( wxU(_( SAP ) ) );
  1100.     sizer->Add( sap_checkbox, 0, 0 , 0 );
  1101.     sap_text = new wxTextCtrl( this, -1, wxU(""), wxDefaultPosition,
  1102.                     wxSize(100,25) );
  1103.     sap_text->SetToolTip( wxU(_( SAP ) ) );
  1104.     sizer->Add( sap_text, 0, wxALL , 5 );
  1105.     mainSizer->Add(sizer, 0, wxALL, 5 );
  1106.     mainSizer->Add( 0, 0, 1 );
  1107.     SetSizer(mainSizer);
  1108.     mainSizer->Fit(this);
  1109. }
  1110. void wizStreamingExtraPage::OnSAP( wxCommandEvent &event )
  1111. {
  1112.     sap_text->Enable( event.IsChecked() );
  1113. }
  1114. void wizStreamingExtraPage::OnWizardPageChanging(wxWizardEvent& event)
  1115. {
  1116.     if( sap_checkbox->IsChecked() )
  1117.     {
  1118.         if( sap_text->GetValue().IsEmpty() )
  1119.         {
  1120.             p_parent->SetSAP( true, NULL );
  1121.         }
  1122.         else
  1123.         {
  1124.             p_parent->SetSAP( true,
  1125.                              (const char *)sap_text->GetValue().mb_str() );
  1126.         }
  1127.     }
  1128.     else
  1129.     {
  1130.         p_parent->SetSAP( false, NULL );
  1131.     }
  1132.     p_parent->SetTTL( ttl_spin->GetValue() );
  1133. }
  1134. wxWizardPage *wizStreamingExtraPage::GetPrev() const { return p_prev; }
  1135. wxWizardPage *wizStreamingExtraPage::GetNext() const {return p_next; }
  1136. /***************************************************************************
  1137.  * Implementation of the wizard itself
  1138.  ***************************************************************************/
  1139. wizHelloPage *page1;
  1140. wizInputPage *page2 ;
  1141. wizTranscodeCodecPage *tr_page1 ;
  1142. wizStreamingMethodPage *st_page1;
  1143. wizTranscodeExtraPage *tr_page2 ;
  1144. wizStreamingExtraPage *st_page2;
  1145. wizEncapPage *encap_page;
  1146. WizardDialog::WizardDialog(intf_thread_t *_p_intf, wxWindow *_p_parent,
  1147.                            char *psz_uri, int _i_from, int _i_to  ) :
  1148. wxWizard( _p_parent, -1, wxU(_("Streaming/Transcoding Wizard")), wxNullBitmap, wxDefaultPosition)
  1149. {
  1150.     /* Initializations */
  1151.     p_intf = _p_intf;
  1152.     SetPageSize(wxSize(400,420));
  1153.     /* Initialize structure */
  1154.     i_action = 0;
  1155.     i_from = _i_from;
  1156.     i_to = _i_to;
  1157.     i_ttl = 1;
  1158.     vb = 0;
  1159.     ab = 0;
  1160.     acodec=NULL;
  1161.     vcodec=NULL;
  1162.     page1 = new wizHelloPage(this);
  1163.     page2 = new wizInputPage(this, page1, p_intf);
  1164.     if( psz_uri )
  1165.     {
  1166.         page2->SetUri( psz_uri );
  1167.     }
  1168.     if( i_from != 0 || i_to != 0 )
  1169.     {
  1170.         page2->SetPartial( i_from, i_to );
  1171.     }
  1172.     encap_page = new wizEncapPage(this );
  1173.     tr_page1 = new wizTranscodeCodecPage(this, encap_page );
  1174.     st_page1 = new wizStreamingMethodPage(this, encap_page);
  1175.     tr_page2 = new wizTranscodeExtraPage(this, encap_page, NULL );
  1176.     st_page2 = new wizStreamingExtraPage(this, encap_page, NULL );
  1177.     /* Page 1 -> 2 */
  1178.     page1->SetNext( page2 );
  1179.     /* 2->1 in constructor of 2 */
  1180.     /* Page 2 -> 3 */
  1181.     page2->SetTranscodePage(tr_page1);
  1182.     page2->SetStreamingPage(st_page1);
  1183.     page2->SetPintf( p_intf );
  1184.     tr_page1->SetPrev(page2);
  1185.     st_page1->SetPrev(page2);
  1186.     /* Page 3 -> 4 */
  1187.     encap_page->SetTranscodePage( tr_page2 );
  1188.     encap_page->SetStreamingPage( st_page2 );
  1189.     /* 3->4 in constructor of 3 */
  1190. //    encap_page->SetPrev(tr_page1);
  1191. }
  1192. WizardDialog::~WizardDialog()
  1193. {
  1194.     Destroy();
  1195.     delete page1;
  1196.     delete page2;
  1197.     delete tr_page1;
  1198.     delete st_page1 ;
  1199.     delete st_page2;
  1200.     delete tr_page2;
  1201.     delete encap_page;
  1202. }
  1203. void WizardDialog::SetMrl( const char *mrl )
  1204. {
  1205.     this->mrl = strdup( mrl );
  1206. }
  1207. void WizardDialog::SetTTL( int i_ttl )
  1208. {
  1209.     this->i_ttl = i_ttl;
  1210. }
  1211. void WizardDialog::SetSAP( bool b_enabled, const char *psz_text )
  1212. {
  1213.     this->b_sap = b_enabled;
  1214.     if( b_enabled )
  1215.     {
  1216.         if( psz_text != NULL )
  1217.         {
  1218.             this->psz_sap_name = strdup( psz_text );
  1219.         }
  1220.         else
  1221.         {
  1222.             this->psz_sap_name = NULL;
  1223.         }
  1224.     }
  1225. }
  1226. void WizardDialog::SetPartial( int i_from, int i_to )
  1227. {
  1228.     this->i_from = i_from;
  1229.     this->i_to = i_to;
  1230. }
  1231. void WizardDialog::SetTranscode( char *vcodec, int vb, char *acodec,int ab)
  1232. {
  1233.     if( strcmp( vcodec, "dummy") )
  1234.     {
  1235.         this->vcodec= strdup(vcodec);
  1236.     }
  1237.     if( strcmp( acodec, "dummy" ) )
  1238.     {
  1239.         this->acodec = strdup(acodec);
  1240.     }
  1241.     this->vb = vb;
  1242.     this->ab = ab;
  1243. }
  1244. void WizardDialog::SetStream( char *method, char *address )
  1245. {
  1246.     this->method = strdup( method );
  1247.     this->address = strdup( address );
  1248. }
  1249. void WizardDialog::SetTranscodeOut( char *address )
  1250. {
  1251.     this->address = strdup( address );
  1252. }
  1253. void WizardDialog::SetMux( char *mux )
  1254. {
  1255.     this->mux = strdup( mux );
  1256. }
  1257. void WizardDialog::SetAction( int i_action )
  1258. {
  1259.     this->i_action = i_action;
  1260. }
  1261. int WizardDialog::GetAction()
  1262. {
  1263.     return i_action;
  1264. }
  1265. void WizardDialog::Run()
  1266. {
  1267.     msg_Dbg( p_intf,"starting wizard");
  1268.     if( RunWizard(page1) )
  1269.     {
  1270.         int i_size;
  1271.         char *psz_opt;
  1272.         msg_Dbg( p_intf,"wizard completed");
  1273.         if( i_action == ACTION_TRANSCODE )
  1274.         {
  1275.             msg_Dbg( p_intf,"Starting transcode of %s to file %s",
  1276.                                   mrl, address);
  1277.             msg_Dbg( p_intf,"Using %s (%i kbps) / %s (%i kbps),encap %s",
  1278.                                 vcodec,vb,acodec,ab,mux);
  1279.             int i_tr_size = 0 ; /* 10 = ab + vb */
  1280.             i_tr_size += vcodec ? strlen(vcodec) + strlen("vcodec=") +strlen("vb="): 0;
  1281.             i_tr_size += acodec ? strlen(acodec) + strlen("acodec=") +strlen("ab=") : 0;
  1282.             char *psz_transcode = (char *)malloc( i_tr_size * sizeof(char));
  1283.             if( vcodec || acodec )
  1284.             {
  1285.                 sprintf( psz_transcode, "transcode{" );
  1286.             }
  1287.             else
  1288.             {
  1289.                 snprintf( psz_transcode, 1 , "%c", 0 );
  1290.             }
  1291.             if( vcodec )
  1292.             {
  1293.                 i_tr_size += 5 + strlen(vcodec);
  1294.                 snprintf( psz_transcode, i_tr_size , "%svcodec=%s,vb=%i",
  1295.                           psz_transcode, vcodec, vb );
  1296.             }
  1297.             if( acodec )
  1298.             {
  1299.                 i_tr_size += 6 + strlen(acodec);
  1300.                 /* FIXME */
  1301.                 sprintf( psz_transcode, "%s%cacodec=%s,ab=%i",
  1302.                           psz_transcode, vcodec ? ',' : ' ', acodec, ab );
  1303.             }
  1304.             if( vcodec || acodec )
  1305.             {
  1306.                 i_tr_size +=2;
  1307.                 sprintf( psz_transcode , "%s}:", psz_transcode );
  1308.             }
  1309.             i_size = 73 + strlen(mux) + strlen(address) + strlen(psz_transcode);
  1310.             psz_opt = (char *)malloc( i_size * sizeof(char) );
  1311.             snprintf( psz_opt, i_size, ":sout=#%sstandard{mux=%s,url=%s,"
  1312.                       "access=file}",
  1313.                        psz_transcode, mux, address );
  1314.         }
  1315.         else
  1316.         {
  1317.             msg_Dbg( p_intf, "Starting stream of %s to %s using %s, encap %s",
  1318.                                mrl, address, method, mux);
  1319.             if( b_sap )
  1320.             {
  1321.                 char *psz_sap_option = NULL;
  1322.                 if( psz_sap_name )
  1323.                 {
  1324.                     psz_sap_option = (char *) malloc( strlen( psz_sap_name )
  1325.                                                + 15 );
  1326.                     snprintf( psz_sap_option,strlen( psz_sap_name ) + 15,
  1327.                              "sap,name="%s"",psz_sap_name );
  1328.                 }
  1329.                 else
  1330.                 {
  1331.                     psz_sap_option = (char *) malloc( 5 );
  1332.                     snprintf( psz_sap_option, 5, "sap" );
  1333.                 }
  1334.                 i_size = 40 + strlen(mux) + strlen(address) +
  1335.                               strlen( psz_sap_option);
  1336.                 psz_opt = (char *)malloc( i_size * sizeof(char) );
  1337.                 snprintf( psz_opt, i_size,
  1338.                           ":sout=#standard{mux=%s,url=%s,access=%s,%s}",
  1339.                           mux, address,method, psz_sap_option);
  1340.                 msg_Dbg( p_intf, "Sap enabled: %s", psz_sap_option);
  1341.                 if( psz_sap_option ) free( psz_sap_option );
  1342.             }
  1343.             else
  1344.             {
  1345.                 i_size = 40 + strlen(mux) + strlen(address);
  1346.                 psz_opt = (char *)malloc( i_size * sizeof(char) );
  1347.                 snprintf( psz_opt, i_size,
  1348.                           ":sout=#standard{mux=%s,url=%s,access=%s}",
  1349.                           mux, address,method);
  1350.             }
  1351.         }
  1352.         playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf,
  1353.                             VLC_OBJECT_PLAYLIST, FIND_ANYWHERE);
  1354.         if( p_playlist )
  1355.         {
  1356.             playlist_item_t *p_item = playlist_ItemNew( p_playlist, mrl,
  1357.                                                         ITEM_NAME );
  1358.             playlist_ItemAddOption( p_item, psz_opt);
  1359.             if( i_from != 0)
  1360.             {
  1361.                 char psz_from[20];
  1362.                 msg_Dbg( p_intf, "Setting starttime");
  1363.                 snprintf( psz_from, 20, "start-time=%i", i_from);
  1364.                 playlist_ItemAddOption( p_item, psz_from);
  1365.             }
  1366.             if( i_to != 0)
  1367.             {
  1368.                 char psz_to[20];
  1369.                 snprintf( psz_to, 20, "stop-time=%i", i_to);
  1370.                 playlist_ItemAddOption( p_item, psz_to);
  1371.             }
  1372.             char psz_ttl[20];
  1373.             snprintf( psz_ttl, 20, "ttl=%i",i_ttl );
  1374.             playlist_ItemAddOption( p_item, psz_ttl );
  1375.             playlist_AddItem( p_playlist, p_item, PLAYLIST_GO, PLAYLIST_END );
  1376.             vlc_object_release(p_playlist);
  1377.         }
  1378.         else
  1379.         {
  1380.             wxMessageBox( wxU( NO_PLAYLIST ), wxU( ERROR_MSG ),
  1381.                           wxICON_WARNING | wxOK, this );
  1382.         }
  1383.     }
  1384.     else
  1385.     {
  1386.         msg_Dbg( p_intf, "wizard was cancelled");
  1387.     }
  1388. }
  1389. /****************************************************************
  1390.  * Local helper functions
  1391.  ****************************************************************/
  1392. static int ismult( char *psz_uri )
  1393. {
  1394.     char *psz_end;
  1395.     int  i_value;
  1396.     i_value = strtol( psz_uri, &psz_end, 0 );
  1397.     /* IPv6 */
  1398.     if( psz_uri[0] == '[')
  1399.     {
  1400.             if( strncasecmp( &psz_uri[1], "FF0" , 3) ||
  1401.                             strncasecmp( &psz_uri[2], "FF0" , 3))
  1402.                     return( VLC_TRUE );
  1403.             else
  1404.                     return( VLC_FALSE );
  1405.     }
  1406.     if( *psz_end != '.' ) { return( VLC_FALSE ); }
  1407.     return( i_value < 224 ? VLC_FALSE : VLC_TRUE );
  1408. }