]> git.sesse.net Git - vlc/commitdiff
* modules/gui/wxwindows/streamout.cpp: updated the stream output dialog to use the...
authorGildas Bazin <gbazin@videolan.org>
Thu, 15 May 2003 01:33:53 +0000 (01:33 +0000)
committerGildas Bazin <gbazin@videolan.org>
Thu, 15 May 2003 01:33:53 +0000 (01:33 +0000)
modules/gui/wxwindows/streamout.cpp
modules/gui/wxwindows/wxwindows.h

index 64e18b94311340e324d69b4c4b0fb2dfd2967ad0..b6166f006eae4328f5813d75023337113e47addd 100644 (file)
@@ -2,7 +2,7 @@
  * streamout.cpp : wxWindows plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: streamout.cpp,v 1.9 2003/05/12 17:33:19 gbazin Exp $
+ * $Id: streamout.cpp,v 1.10 2003/05/15 01:33:53 gbazin Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 
 enum
 {
-    FILE_ACCESS_OUT = 0,
+    PLAY_ACCESS_OUT = 0,
+    FILE_ACCESS_OUT,
     HTTP_ACCESS_OUT,
     UDP_ACCESS_OUT,
-    RTP_ACCESS_OUT
+    RTP_ACCESS_OUT,
+    ACCESS_OUT_NUM
 };
 
 enum
@@ -72,7 +74,9 @@ enum
     TS_ENCAPSULATION = 0,
     PS_ENCAPSULATION,
     AVI_ENCAPSULATION,
-    OGG_ENCAPSULATION
+    MP4_ENCAPSULATION,
+    OGG_ENCAPSULATION,
+    ENCAPS_NUM
 };
 
 /*****************************************************************************
@@ -88,14 +92,17 @@ enum
     FileBrowse_Event,
     FileName_Event,
 
-    AccessType_Event,
-    AccessRadio1_Event, AccessRadio2_Event,
-    AccessRadio3_Event, AccessRadio4_Event,
+    AccessType1_Event, AccessType2_Event, AccessType3_Event,
+    AccessType4_Event, AccessType5_Event,
     NetPort_Event,
     NetAddr_Event,
 
     EncapsulationRadio1_Event, EncapsulationRadio2_Event,
     EncapsulationRadio3_Event, EncapsulationRadio4_Event,
+    EncapsulationRadio5_Event,
+
+    VideoTranscEnable_Event, VideoTranscCodec_Event, VideoTranscBitrate_Event,
+    AudioTranscEnable_Event, AudioTranscCodec_Event, AudioTranscBitrate_Event,
 };
 
 BEGIN_EVENT_TABLE(SoutDialog, wxDialog)
@@ -104,10 +111,11 @@ BEGIN_EVENT_TABLE(SoutDialog, wxDialog)
     EVT_BUTTON(wxID_CANCEL, SoutDialog::OnCancel)
 
     /* Events generated by the access output panel */
-    EVT_RADIOBUTTON(AccessRadio1_Event, SoutDialog::OnAccessTypeChange)
-    EVT_RADIOBUTTON(AccessRadio2_Event, SoutDialog::OnAccessTypeChange)
-    EVT_RADIOBUTTON(AccessRadio3_Event, SoutDialog::OnAccessTypeChange)
-    EVT_RADIOBUTTON(AccessRadio4_Event, SoutDialog::OnAccessTypeChange)
+    EVT_CHECKBOX(AccessType1_Event, SoutDialog::OnAccessTypeChange)
+    EVT_CHECKBOX(AccessType2_Event, SoutDialog::OnAccessTypeChange)
+    EVT_CHECKBOX(AccessType3_Event, SoutDialog::OnAccessTypeChange)
+    EVT_CHECKBOX(AccessType4_Event, SoutDialog::OnAccessTypeChange)
+    EVT_CHECKBOX(AccessType5_Event, SoutDialog::OnAccessTypeChange)
     EVT_TEXT(FileName_Event, SoutDialog::OnFileChange)
     EVT_BUTTON(FileBrowse_Event, SoutDialog::OnFileBrowse)
     EVT_TEXT(NetPort_Event, SoutDialog::OnNetChange)
@@ -123,6 +131,16 @@ BEGIN_EVENT_TABLE(SoutDialog, wxDialog)
                     SoutDialog::OnEncapsulationChange)
     EVT_RADIOBUTTON(EncapsulationRadio4_Event,
                     SoutDialog::OnEncapsulationChange)
+    EVT_RADIOBUTTON(EncapsulationRadio5_Event,
+                    SoutDialog::OnEncapsulationChange)
+
+    /* Events generated by the transcoding panel */
+    EVT_CHECKBOX(VideoTranscEnable_Event, SoutDialog::OnTranscodingEnable)
+    EVT_CHECKBOX(AudioTranscEnable_Event, SoutDialog::OnTranscodingEnable)
+    EVT_COMBOBOX(VideoTranscCodec_Event, SoutDialog::OnTranscodingChange)
+    EVT_COMBOBOX(AudioTranscCodec_Event, SoutDialog::OnTranscodingChange)
+    EVT_COMBOBOX(VideoTranscBitrate_Event, SoutDialog::OnTranscodingChange)
+    EVT_COMBOBOX(AudioTranscBitrate_Event, SoutDialog::OnTranscodingChange)
 
 END_EVENT_TABLE()
 
@@ -161,10 +179,13 @@ SoutDialog::SoutDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
     mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
 
     /* Create the output encapsulation panel */
-    encapsulation_panel = EncapsulationPanel( panel );
+    wxPanel *encapsulation_panel = EncapsulationPanel( panel );
 
     /* Create the access output panel */
-    access_panel = AccessPanel( panel );
+    wxPanel *access_panel = AccessPanel( panel );
+
+    /* Create the transcoding panel */
+    wxPanel *transcoding_panel = TranscodingPanel( panel );
 
     /* Separation */
     wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
@@ -185,6 +206,7 @@ SoutDialog::SoutDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
     panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
     panel_sizer->Add( access_panel, 1, wxEXPAND | wxALL, 5 );
     panel_sizer->Add( encapsulation_panel, 0, wxEXPAND | wxALL, 5 );
+    panel_sizer->Add( transcoding_panel, 0, wxEXPAND | wxALL, 5 );
     panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
     panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
                       wxALL, 5 );
@@ -207,47 +229,101 @@ SoutDialog::~SoutDialog()
  *****************************************************************************/
 void SoutDialog::UpdateMRL()
 {
-    wxString encapsulation;
+    /* Let's start with the transcode options */
+    wxString transcode;
+    if( video_transc_checkbox->IsChecked() ||
+        audio_transc_checkbox->IsChecked() )
+    {
+        transcode = wxT("transcode{");
+        if( video_transc_checkbox->IsChecked() )
+        {
+            transcode += wxT("vcodec=") + video_codec_combo->GetValue();
+            transcode += wxT(",vb=") + video_bitrate_combo->GetValue();
+            if( audio_transc_checkbox->IsChecked() ) transcode += wxT(",");
+        }
+        if( audio_transc_checkbox->IsChecked() )
+        {
+            transcode += wxT("acodec=") + audio_codec_combo->GetValue();
+            transcode += wxT(",ab=") + audio_bitrate_combo->GetValue();
+        }
+        transcode += wxT("}");
+    }
 
+    /* Encapsulation */
+    wxString encapsulation;
     switch( i_encapsulation_type )
     {
     case PS_ENCAPSULATION:
-        encapsulation = wxT("/ps");
+        encapsulation = wxT("ps");
         break;
     case AVI_ENCAPSULATION:
-        encapsulation = wxT("/avi");
+        encapsulation = wxT("avi");
         break;
     case OGG_ENCAPSULATION:
-        encapsulation = wxT("/ogg");
+        encapsulation = wxT("ogg");
+        break;
+    case MP4_ENCAPSULATION:
+        encapsulation = wxT("mp4");
         break;
     case TS_ENCAPSULATION:
     default:
-        encapsulation = wxT("/ts");
+        encapsulation = wxT("ts");
         break;
     }
 
-    switch( i_access_type )
+    /* Now continue with the duplicate option */
+    wxString dup_opts;
+    if( access_checkboxes[PLAY_ACCESS_OUT]->IsChecked() )
     {
-    case FILE_ACCESS_OUT:
-        mrl = wxT("file") + encapsulation + wxT(":") + file_combo->GetValue();
-        break;
-
-    case HTTP_ACCESS_OUT:
-        mrl = wxT("http") + encapsulation + wxT(":") + net_addr->GetLineText(0)
-              + wxString::Format( wxT(":%d"), net_port->GetValue() );
-        break;
+        dup_opts += wxT("dst=display");
+    }
+    if( access_checkboxes[FILE_ACCESS_OUT]->IsChecked() )
+    {
+        if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+        dup_opts += wxT("dst=std{access=file,mux=");
+        dup_opts += encapsulation + wxT(",url=");
+        dup_opts += file_combo->GetValue() + wxT("}");
+    }
+    if( access_checkboxes[HTTP_ACCESS_OUT]->IsChecked() )
+    {
+        if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+        dup_opts += wxT("dst=std{access=http,mux=");
+        dup_opts += encapsulation + wxT(",url=");
+        dup_opts += net_addr->GetLineText(0);
+        dup_opts += wxString::Format( wxT(":%d"), net_port->GetValue() );
+        dup_opts += wxT("}");
+    }
+    if( access_checkboxes[UDP_ACCESS_OUT]->IsChecked() )
+    {
+        if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+        dup_opts += wxT("dst=std{access=udp,mux=");
+        dup_opts += encapsulation + wxT(",url=");
+        dup_opts += net_addr->GetLineText(0);
+        dup_opts += wxString::Format( wxT(":%d"), net_port->GetValue() );
+        dup_opts += wxT("}");
+    }
+    if( access_checkboxes[UDP_ACCESS_OUT]->IsChecked() )
+    {
+        if( !dup_opts.IsEmpty() ) dup_opts += wxT(",");
+        dup_opts += wxT("dst=std{access=rtp,mux=");
+        dup_opts += encapsulation + wxT(",url=");
+        dup_opts += net_addr->GetLineText(0);
+        dup_opts += wxString::Format( wxT(":%d"), net_port->GetValue() );
+        dup_opts += wxT("}");
+    }
 
-    case UDP_ACCESS_OUT:
-    case RTP_ACCESS_OUT:
-        mrl = ( i_access_type == UDP_ACCESS_OUT ) ? wxT("udp") : wxT("rtp");
-        mrl += encapsulation + wxT(":") + net_addr->GetLineText(0);
-        if( net_port->GetValue() != config_GetInt( p_intf, "server-port" ) )
-        {
-            mrl += wxString::Format( wxT(":%d"), net_port->GetValue() );
-        }
-        break;
+    wxString duplicate;
+    if( !dup_opts.IsEmpty() )
+    {
+        if( !transcode.IsEmpty() ) duplicate = wxT(":");
+        duplicate += wxT("duplicate{") + dup_opts + wxT("}");
     }
 
+    if( !transcode.IsEmpty() || !duplicate.IsEmpty() )
+        mrl = wxT("#") + transcode + duplicate;
+    else
+        mrl = wxT("");
+
     mrl_combo->SetValue( mrl );
 }
 
@@ -259,37 +335,40 @@ wxPanel *SoutDialog::AccessPanel( wxWindow* parent )
 
     wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 4, 20 );
     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
-                                              wxU(_("Output Method")) );
+                                              wxU(_("Output Methods")) );
     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
                                                           wxHORIZONTAL );
 
     static const wxString access_output_array[] =
     {
+        wxU(_("Play locally")),
         wxU(_("File")),
         wxU(_("HTTP")),
         wxU(_("UDP")),
         wxU(_("RTP"))
     };
 
-    for( i=0; i<4; i++ )
+    for( i=0; i < ACCESS_OUT_NUM; i++ )
     {
-        access_radios[i] = new wxRadioButton( panel, AccessRadio1_Event + i,
-                                              access_output_array[i],
-                                              wxDefaultPosition, wxDefaultSize,
-                                              wxRB_SINGLE );
-
-        access_subpanels[i] = new wxPanel( panel, -1,
-                                           wxDefaultPosition, wxDefaultSize );
+        access_checkboxes[i] = new wxCheckBox( panel, AccessType1_Event + i,
+                                               access_output_array[i] );
+        access_subpanels[i] = new wxPanel( panel, -1 );
     }
 
-    /* File row */
+    /* Play locally row */
     wxFlexGridSizer *subpanel_sizer;
     wxStaticText *label;
+    label = new wxStaticText( access_subpanels[0], -1, wxT("") );
+    subpanel_sizer = new wxFlexGridSizer( 1, 1, 20 );
+    subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    access_subpanels[0]->SetSizerAndFit( subpanel_sizer );
+
+    /* File row */
     subpanel_sizer = new wxFlexGridSizer( 3, 1, 20 );
-    label = new wxStaticText( access_subpanels[0], -1, wxU(_("Filename")) );
-    file_combo = new wxComboBox( access_subpanels[0], FileName_Event, wxT(""),
+    label = new wxStaticText( access_subpanels[1], -1, wxU(_("Filename")) );
+    file_combo = new wxComboBox( access_subpanels[1], FileName_Event, wxT(""),
                                  wxPoint(20,25), wxSize(200, -1), 0, NULL );
-    wxButton *browse_button = new wxButton( access_subpanels[0],
+    wxButton *browse_button = new wxButton( access_subpanels[1],
                                   FileBrowse_Event, wxU(_("Browse...")) );
     subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
     subpanel_sizer->Add( file_combo, 1,
@@ -297,37 +376,42 @@ wxPanel *SoutDialog::AccessPanel( wxWindow* parent )
     subpanel_sizer->Add( browse_button, 0,
                          wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
 
-    access_subpanels[0]->SetSizerAndFit( subpanel_sizer );
+    access_subpanels[1]->SetSizerAndFit( subpanel_sizer );
 
-    /* Net row */
-    subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
-    label = new wxStaticText( access_subpanels[2], -1, wxU(_("Address")) );
-    net_addr = new wxTextCtrl( access_subpanels[2], NetAddr_Event, wxT(""),
-                               wxDefaultPosition, wxSize( 200, -1 ),
-                               wxTE_PROCESS_ENTER);
-    subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
-    subpanel_sizer->Add( net_addr, 1,
-                         wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
-
-    int val = config_GetInt( p_intf, "server-port" );
-    label = new wxStaticText( access_subpanels[2], -1, wxU(_("Port")) );
-    net_port = new wxSpinCtrl( access_subpanels[2], NetPort_Event,
-                               wxString::Format(wxT("%d"), val),
-                               wxDefaultPosition, wxDefaultSize,
-                               wxSP_ARROW_KEYS,
-                               0, 16000, val );
-
-    subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
-    subpanel_sizer->Add( net_port, 0,
-                         wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
-
-    access_subpanels[2]->SetSizerAndFit( subpanel_sizer );
+    /* Net rows */
+    for( i=2; i < ACCESS_OUT_NUM; i++ )
+    {
+        subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
+        label = new wxStaticText( access_subpanels[i], -1, wxU(_("Address")) );
+        net_addr = new wxTextCtrl( access_subpanels[i], NetAddr_Event, wxT(""),
+                                   wxDefaultPosition, wxSize( 200, -1 ),
+                                   wxTE_PROCESS_ENTER);
+        subpanel_sizer->Add( label, 0,
+                             wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+        subpanel_sizer->Add( net_addr, 1, wxEXPAND |
+                             wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+
+        int val = config_GetInt( p_intf, "server-port" );
+        label = new wxStaticText( access_subpanels[i], -1, wxU(_("Port")) );
+        net_port = new wxSpinCtrl( access_subpanels[i], NetPort_Event,
+                                   wxString::Format(wxT("%d"), val),
+                                   wxDefaultPosition, wxDefaultSize,
+                                   wxSP_ARROW_KEYS,
+                                   0, 16000, val );
+
+        subpanel_sizer->Add( label, 0,
+                             wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+        subpanel_sizer->Add( net_port, 0,
+                             wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
+
+        access_subpanels[i]->SetSizerAndFit( subpanel_sizer );
+    }
 
 
     /* Stuff everything into the main panel */
-    for( i=0; i<4; i++ )
+    for( i=0; i < ACCESS_OUT_NUM; i++ )
     {
-        sizer->Add( access_radios[i], 0,
+        sizer->Add( access_checkboxes[i], 0,
                     wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
         sizer->Add( access_subpanels[i], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL
                     | wxALIGN_LEFT );
@@ -337,6 +421,12 @@ wxPanel *SoutDialog::AccessPanel( wxWindow* parent )
 
     panel->SetSizerAndFit( panel_sizer );
 
+    /* Update access type panel */
+    for( i=1; i < ACCESS_OUT_NUM; i++ )
+    {
+        access_subpanels[i]->Disable();
+    }
+
     return panel;
 }
 
@@ -353,14 +443,15 @@ wxPanel *SoutDialog::EncapsulationPanel( wxWindow* parent )
 
     static const wxString encapsulation_array[] =
     {
-        wxU(_("MPEG TS")),
-        wxU(_("MPEG PS")),
-        wxU(_("AVI")),
-        wxU(_("Ogg"))
+        wxT("MPEG TS"),
+        wxT("MPEG PS"),
+        wxT("AVI"),
+        wxT("MP4/MOV"),
+        wxT("Ogg")
     };
 
     /* Stuff everything into the main panel */
-    for( i=0; i<4; i++ )
+    for( i=0; i < ENCAPS_NUM; i++ )
     {
         encapsulation_radios[i] =
             new wxRadioButton( panel, EncapsulationRadio1_Event + i,
@@ -378,6 +469,122 @@ wxPanel *SoutDialog::EncapsulationPanel( wxWindow* parent )
     return panel;
 }
 
+wxPanel *SoutDialog::TranscodingPanel( wxWindow* parent )
+{
+    wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+                                  wxSize(200, 200) );
+
+    wxStaticBox *panel_box = new wxStaticBox( panel, -1,
+                                              wxU(_("Transcoding options")) );
+    wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
+                                                          wxVERTICAL );
+
+    /* Create video transcoding checkox */
+#   define VCODECS_NUM 8
+    static const wxString vcodecs_array[] =
+    {
+        wxT("mpgv"),
+        wxT("mp4v"),
+        wxT("DIV1"),
+        wxT("DIV2"),
+        wxT("DIV3"),
+        wxT("H263"),
+        wxT("I263"),
+        wxT("WMV1"),
+    };
+#   define VBITRATES_NUM 9
+    static const wxString vbitrates_array[] =
+    {
+        wxT("3000"),
+        wxT("2000"),
+        wxT("1000"),
+        wxT("750"),
+        wxT("500"),
+        wxT("400"),
+        wxT("200"),
+        wxT("150"),
+        wxT("100")
+    };
+
+    wxFlexGridSizer *video_sizer = new wxFlexGridSizer( 4, 1, 20 );
+    video_transc_checkbox =
+        new wxCheckBox( panel, VideoTranscEnable_Event, wxU(_("Video codec")));
+    video_codec_combo =
+        new wxComboBox( panel, VideoTranscCodec_Event, wxT("mp4v"),
+                        wxPoint(20,25), wxDefaultSize,
+                        VCODECS_NUM, vcodecs_array, wxCB_READONLY );
+    wxStaticText *bitrate_label =
+        new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
+    video_bitrate_combo =
+        new wxComboBox( panel, VideoTranscBitrate_Event, wxT("1000"),
+                        wxPoint(20,25), wxDefaultSize,
+                        VBITRATES_NUM, vbitrates_array );
+    video_sizer->Add( video_transc_checkbox, 0,
+                      wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    video_sizer->Add( video_codec_combo, 1,
+                      wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    video_sizer->Add( bitrate_label, 0,
+                      wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    video_sizer->Add( video_bitrate_combo, 1,
+                      wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+
+    /* Create audio transcoding checkox */
+#   define ACODECS_NUM 2
+    static const wxString acodecs_array[] =
+    {
+        wxT("mpga"),
+        wxT("a52")
+    };
+#   define ABITRATES_NUM 5
+    static const wxString abitrates_array[] =
+    {
+        wxT("512"),
+        wxT("256"),
+        wxT("192"),
+        wxT("128"),
+        wxT("96")
+    };
+
+    wxFlexGridSizer *audio_sizer = new wxFlexGridSizer( 4, 1, 20 );
+    audio_transc_checkbox =
+        new wxCheckBox( panel, AudioTranscEnable_Event, wxU(_("Audio codec")));
+    audio_codec_combo =
+        new wxComboBox( panel, AudioTranscCodec_Event, wxT("mpga"),
+                        wxPoint(20,25), wxDefaultSize,
+                        ACODECS_NUM, acodecs_array, wxCB_READONLY );
+    bitrate_label =
+        new wxStaticText( panel, -1, wxU(_("Bitrate (kb/s)")));
+    audio_bitrate_combo =
+        new wxComboBox( panel, AudioTranscBitrate_Event, wxT("192"),
+                        wxPoint(20,25), wxDefaultSize,
+                        ABITRATES_NUM, abitrates_array );
+    audio_sizer->Add( audio_transc_checkbox, 0,
+                      wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    audio_sizer->Add( audio_codec_combo, 1,
+                      wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    audio_sizer->Add( bitrate_label, 0,
+                      wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+    audio_sizer->Add( audio_bitrate_combo, 1,
+                      wxEXPAND | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
+
+    /* Stuff everything into the main panel */
+    panel_sizer->Add( video_sizer, 0,
+                      wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+    panel_sizer->Add( audio_sizer, 0,
+                      wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+
+    panel->SetSizerAndFit( panel_sizer );
+
+    /* Update transcoding panel */
+    wxCommandEvent event( 0, VideoTranscEnable_Event );
+    event.SetInt( 0 );
+    OnTranscodingEnable( event );
+    event.SetId( AudioTranscEnable_Event );
+    OnTranscodingEnable( event );
+
+    return panel;
+}
+
 void SoutDialog::ParseMRL()
 {
     /* Initialise MRL value */
@@ -453,7 +660,7 @@ void SoutDialog::ParseMRL()
 
     /* Update access output panel */
     wxCommandEvent dummy_event;
-    dummy_event.SetId( AccessRadio1_Event + i_access_type );
+    dummy_event.SetId( AccessType1_Event + i_access_type );
     OnAccessTypeChange( dummy_event );
 
     /* Update encapsulation output panel */
@@ -485,49 +692,26 @@ void SoutDialog::OnMRLChange( wxCommandEvent& event )
 void SoutDialog::OnAccessTypeChange( wxCommandEvent& event )
 {
     int i;
-    i_access_type = event.GetId() - AccessRadio1_Event;
+    i_access_type = event.GetId() - AccessType1_Event;
+
+    access_subpanels[i_access_type]->Enable( event.GetInt() );
 
     switch( i_access_type )
     {
-    case FILE_ACCESS_OUT:
-        access_subpanels[0]->Enable();
-        access_subpanels[2]->Disable();
-        access_subpanels[3]->Disable();
-        for( i = 1; i < 4; i++ )
-        {
-            encapsulation_radios[i]->Enable();
-        }
-        break;
-
-    case HTTP_ACCESS_OUT:
-        access_subpanels[0]->Disable();
-        access_subpanels[2]->Enable();
-        access_subpanels[3]->Disable();
-        for( i = 1; i < 4; i++ )
-        {
-            encapsulation_radios[i]->Enable();
-        }
-        break;
-
     case UDP_ACCESS_OUT:
     case RTP_ACCESS_OUT:
-        access_subpanels[0]->Disable();
-        access_subpanels[2]->Enable();
-        access_subpanels[3]->Enable();
-        for( i = 1; i < 4; i++ )
+        for( i = 1; i < ENCAPS_NUM; i++ )
         {
-            encapsulation_radios[i]->Disable();
+            encapsulation_radios[i]->Enable( !event.GetInt() );
+        }
+        if( event.GetInt() )
+        {
+            encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
+            i_encapsulation_type = TS_ENCAPSULATION;
         }
-        encapsulation_radios[TS_ENCAPSULATION]->SetValue(true);
-        i_encapsulation_type = TS_ENCAPSULATION;
         break;
     }
 
-    for( i = 0; i < 4; i++ )
-    {
-        access_radios[i]->SetValue( event.GetId() == (AccessRadio1_Event+i) );
-    }
-
     UpdateMRL();
 }
 
@@ -567,3 +751,28 @@ void SoutDialog::OnEncapsulationChange( wxCommandEvent& event )
     i_encapsulation_type = event.GetId() - EncapsulationRadio1_Event;
     UpdateMRL();
 }
+
+/*****************************************************************************
+ * Transcoding panel event methods.
+ *****************************************************************************/
+void SoutDialog::OnTranscodingEnable( wxCommandEvent& event )
+{
+    switch( event.GetId() )
+    {
+    case VideoTranscEnable_Event:
+        video_codec_combo->Enable( event.GetInt() );
+        video_bitrate_combo->Enable( event.GetInt() );
+        break;
+    case AudioTranscEnable_Event:
+        audio_codec_combo->Enable( event.GetInt() );
+        audio_bitrate_combo->Enable( event.GetInt() );
+        break;
+    }
+
+    UpdateMRL();
+}
+
+void SoutDialog::OnTranscodingChange( wxCommandEvent& event )
+{
+    UpdateMRL();
+}
index 01af6ffb0edf620cf0aac9e2ce875c6acf21c9c8..5c800984e939411abf64632eb1503fd1e0e6a636 100644 (file)
@@ -2,7 +2,7 @@
  * wxwindows.h: private wxWindows interface description
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: wxwindows.h,v 1.25 2003/05/13 22:59:16 gbazin Exp $
+ * $Id: wxwindows.h,v 1.26 2003/05/15 01:33:53 gbazin Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -301,6 +301,7 @@ private:
     void UpdateMRL();
     wxPanel *AccessPanel( wxWindow* parent );
     wxPanel *EncapsulationPanel( wxWindow* parent );
+    wxPanel *TranscodingPanel( wxWindow* parent );
     void    ParseMRL();
 
     /* Event handlers (these functions should _not_ be virtual) */
@@ -319,18 +320,20 @@ private:
     /* Event handlers for the encapsulation panel */
     void OnEncapsulationChange( wxCommandEvent& event );
 
+    /* Event handlers for the transcoding panel */
+    void OnTranscodingEnable( wxCommandEvent& event );
+    void OnTranscodingChange( wxCommandEvent& event );
+
     DECLARE_EVENT_TABLE();
 
     intf_thread_t *p_intf;
     wxWindow *p_parent;
 
     wxComboBox *mrl_combo;
-    wxPanel *access_panel;
-    wxPanel *encapsulation_panel;
 
     /* Controls for the access outputs */
-    wxPanel *access_subpanels[4];
-    wxRadioButton *access_radios[4];
+    wxPanel *access_subpanels[5];
+    wxCheckBox *access_checkboxes[5];
 
     int i_access_type;
 
@@ -339,9 +342,16 @@ private:
     wxTextCtrl *net_addr;
 
     /* Controls for the encapsulation */
-    wxRadioButton *encapsulation_radios[4];
+    wxRadioButton *encapsulation_radios[5];
     int i_encapsulation_type;
 
+    /* Controls for transcoding */
+    wxCheckBox *video_transc_checkbox;
+    wxComboBox *video_codec_combo;
+    wxComboBox *audio_codec_combo;
+    wxCheckBox *audio_transc_checkbox;
+    wxComboBox *video_bitrate_combo;
+    wxComboBox *audio_bitrate_combo;
 };
 
 /* Subtitles File Dialog */