profile_selector.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:14k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * profile_selector.cpp : A small profile selector and editor
  3.  ****************************************************************************
  4.  * Copyright (C) 2009 the VideoLAN team
  5.  * $Id: 064cd8db32080d18d7aa1655e3191c3bbf9eb799 $
  6.  *
  7.  * Authors: Jean-Baptiste Kempf <jb@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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include "components/sout/profile_selector.hpp"
  24. #include "components/sout/profiles.hpp"
  25. #include "dialogs/sout.hpp"
  26. #include <QHBoxLayout>
  27. #include <QToolButton>
  28. #include <QComboBox>
  29. #include <QLabel>
  30. #include <QMessageBox>
  31. #include <assert.h>
  32. VLCProfileSelector::VLCProfileSelector( QWidget *_parent ): QWidget( _parent )
  33. {
  34.     QHBoxLayout *layout = new QHBoxLayout( this );
  35.     QLabel *prLabel = new QLabel( qtr( "Profile"), this );
  36.     layout->addWidget( prLabel );
  37.     profileBox = new QComboBox( this );
  38.     layout->addWidget( profileBox );
  39.     QToolButton *editButton = new QToolButton( this );
  40.     editButton->setIcon( QIcon( ":/preferences" ) );
  41.     editButton->setToolTip( qtr( "Edit selected profile" ) );
  42.     layout->addWidget( editButton );
  43.     QToolButton *deleteButton = new QToolButton( this );
  44.     deleteButton->setIcon( QIcon( ":/clear" ) );
  45.     deleteButton->setToolTip( qtr( "Delete selected profile" ) );
  46.     layout->addWidget( deleteButton );
  47.     QToolButton *newButton = new QToolButton( this );
  48.     newButton->setIcon( QIcon( ":/new" ) );
  49.     newButton->setToolTip( qtr( "Create a new profile" ) );
  50.     layout->addWidget(newButton);
  51.     BUTTONACT( newButton, newProfile() );
  52.     BUTTONACT( editButton, editProfile() );
  53.     BUTTONACT( deleteButton, deleteProfile() );
  54.     fillProfilesCombo();
  55.     CONNECT( profileBox, activated( int ),
  56.              this, updateOptions( int ) );
  57.     updateOptions( 0 );
  58. }
  59. inline void VLCProfileSelector::fillProfilesCombo()
  60. {
  61.     QSettings settings(
  62. #ifdef WIN32
  63.             QSettings::IniFormat,
  64. #else
  65.             QSettings::NativeFormat,
  66. #endif
  67.             QSettings::UserScope, "vlc", "vlc-qt-interface" );
  68.     int i_size = settings.beginReadArray( "codecs-profiles" );
  69.     for( int i = 0; i < i_size; i++ )
  70.     {
  71.         settings.setArrayIndex( i );
  72.         if( settings.value( "Profile-Name" ).toString().isEmpty() ) continue;
  73.         profileBox->addItem( settings.value( "Profile-Name" ).toString(),
  74.                 settings.value( "Profile-Value" ) );
  75.     }
  76.     if( i_size == 0 )
  77.     {
  78.         for( int i = 0; i < NB_PROFILE; i++ )
  79.         {
  80.             profileBox->addItem( video_profile_name_list[i],
  81.                                  video_profile_value_list[i] );
  82.         }
  83.     }
  84.     settings.endArray();
  85. }
  86. void VLCProfileSelector::newProfile()
  87. {
  88.     editProfile( "", "" );
  89. }
  90. void VLCProfileSelector::editProfile()
  91. {
  92.     editProfile( profileBox->currentText(),
  93.                  profileBox->itemData( profileBox->currentIndex() ).toString() );
  94. }
  95. void VLCProfileSelector::editProfile( const QString& qs, const QString& value )
  96. {
  97.     /* Create the Profile Editor */
  98.     VLCProfileEditor *editor = new VLCProfileEditor( qs, value, this );
  99.     /* Show it */
  100.     if( QDialog::Accepted == editor->exec() )
  101.     {
  102.         /* New Profile */
  103.         if( qs.isEmpty() )
  104.             profileBox->addItem( editor->name, QVariant( editor->transcodeValue() ) );
  105.         /* Update old profile */
  106.         else
  107.         {
  108.             /* Look for the profile */
  109.             int i_profile = profileBox->findText( qs );
  110.             assert( i_profile != -1 );
  111.             profileBox->setItemText( i_profile, editor->name );
  112.             profileBox->setItemData( i_profile, QVariant( editor->transcodeValue() ) );
  113.             /* Force mrl recreation */
  114.             updateOptions( i_profile );
  115.         }
  116.     }
  117.     delete editor;
  118.     saveProfiles();
  119.     emit optionsChanged();
  120. }
  121. void VLCProfileSelector::deleteProfile()
  122. {
  123.     profileBox->removeItem( profileBox->currentIndex() );
  124. }
  125. void VLCProfileSelector::saveProfiles()
  126. {
  127.     QSettings settings(
  128. #ifdef WIN32
  129.             QSettings::IniFormat,
  130. #else
  131.             QSettings::NativeFormat,
  132. #endif
  133.             QSettings::UserScope, "vlc", "vlc-qt-interface" );
  134.     settings.beginWriteArray( "codecs-profiles" );
  135.     for( int i = 0; i < profileBox->count(); i++ )
  136.     {
  137.         settings.setArrayIndex( i );
  138.         settings.setValue( "Profile-Name", profileBox->itemText( i ) );
  139.         settings.setValue( "Profile-Value", profileBox->itemData( i ).toString() );
  140.     }
  141.     settings.endArray();
  142. }
  143. void VLCProfileSelector::updateOptions( int i )
  144. {
  145.     QStringList options = profileBox->itemData( i ).toString().split( ";" );
  146.     if( options.size() < 16 )
  147.         return;
  148.     mux = options[0];
  149.     SoutMrl smrl;
  150.     if( options[1].toInt() || options[2].toInt() || options[3].toInt() )
  151.     {
  152.         smrl.begin( "transcode" );
  153.         if( options[1].toInt() )
  154.         {
  155.             smrl.option( "vcodec", options[4] );
  156.             if( options[4] != "none" )
  157.             {
  158.                 smrl.option( "vb", options[5].toInt() );
  159.                 if( !options[7].isEmpty() && options[7].toInt() > 0 )
  160.                     smrl.option( "fps", options[7] );
  161.                 if( !options[6].isEmpty() )
  162.                     smrl.option( "scale", options[6] );
  163.                 if( !options[8].isEmpty() && options[8].toInt() > 0 )
  164.                     smrl.option( "width", options[8].toInt() );
  165.                 if( !options[9].isEmpty() && options[9].toInt() > 0 )
  166.                     smrl.option( "height", options[9].toInt() );
  167.             }
  168.         }
  169.         if( options[2].toInt() )
  170.         {
  171.             smrl.option( "acodec", options[10] );
  172.             if( options[10] != "none" )
  173.             {
  174.                 smrl.option( "ab", options[11].toInt() );
  175.                 smrl.option( "channels", options[12].toInt() );
  176.                 smrl.option( "samplerate", options[13].toInt() );
  177.             }
  178.         }
  179.         if( options[3].toInt() )
  180.         {
  181.             smrl.option( "scodec", options[14] );
  182.             if( options[15].toInt() )
  183.                 smrl.option( "soverlay" );
  184.         }
  185.         smrl.end();
  186.         transcode = smrl.getMrl();
  187.     }
  188.     else
  189.         transcode = "";
  190.     emit optionsChanged();
  191. }
  192. /**
  193.  * VLCProfileEditor
  194.  **/
  195. VLCProfileEditor::VLCProfileEditor( const QString& qs_name, const QString& value,
  196.         QWidget *_parent )
  197.                  : QVLCDialog( _parent, NULL )
  198. {
  199.     ui.setupUi( this );
  200.     if( !qs_name.isEmpty() )
  201.     {
  202.         ui.profileLine->setText( qs_name );
  203.         ui.profileLine->setReadOnly( true );
  204.     }
  205.     registerCodecs();
  206.     CONNECT( ui.transcodeVideo, toggled( bool ),
  207.             this, setVTranscodeOptions( bool ) );
  208.     CONNECT( ui.transcodeAudio, toggled( bool ),
  209.             this, setATranscodeOptions( bool ) );
  210.     CONNECT( ui.transcodeSubs, toggled( bool ),
  211.             this, setSTranscodeOptions( bool ) );
  212.     setVTranscodeOptions( false );
  213.     setATranscodeOptions( false );
  214.     setSTranscodeOptions( false );
  215.     QPushButton *saveButton = new QPushButton( qtr( "Save" ) );
  216.     ui.buttonBox->addButton( saveButton, QDialogButtonBox::AcceptRole );
  217.     BUTTONACT( saveButton, close() );
  218.     QPushButton *cancelButton = new QPushButton( qtr( "Cancel" ) );
  219.     ui.buttonBox->addButton( cancelButton, QDialogButtonBox::RejectRole );
  220.     BUTTONACT( cancelButton, reject() );
  221.     fillProfile( value );
  222. }
  223. inline void VLCProfileEditor::registerCodecs()
  224. {
  225. #define ADD_VCODEC( name, fourcc ) ui.vCodecBox->addItem( name, QVariant( fourcc ) );
  226.     ADD_VCODEC( "MPEG-1", "mp1v" )
  227.     ADD_VCODEC( "MPEG-2", "mp2v" )
  228.     ADD_VCODEC( "MPEG-4", "mp4v" )
  229.     ADD_VCODEC( "DIVX 1" , "DIV1" )
  230.     ADD_VCODEC( "DIVX 2" , "DIV2" )
  231.     ADD_VCODEC( "DIVX 3" , "DIV3" )
  232.     ADD_VCODEC( "H-263", "H263" )
  233.     ADD_VCODEC( "H-264", "h264" )
  234.     ADD_VCODEC( "WMV1", "WMV1" )
  235.     ADD_VCODEC( "WMV2" , "WMV2" )
  236.     ADD_VCODEC( "M-JPEG", "MJPG" )
  237.     ADD_VCODEC( "Theora", "theo" )
  238.     ADD_VCODEC( "Dirac", "drac" )
  239. #undef ADD_VCODEC
  240. #define ADD_ACODEC( name, fourcc ) ui.aCodecBox->addItem( name, QVariant( fourcc ) );
  241.     ADD_ACODEC( "MPEG Audio", "mpga" )
  242.     ADD_ACODEC( "MP3", "mp3" )
  243.     ADD_ACODEC( "MPEG 4 Audio ( AAC )", "mp4a" )
  244.     ADD_ACODEC( "A52/AC-3", "a52" )
  245.     ADD_ACODEC( "Vorbis", "vorb" )
  246.     ADD_ACODEC( "Flac", "flac" )
  247.     ADD_ACODEC( "Speex", "spx" )
  248.     ADD_ACODEC( "WAV", "s16l" )
  249.     ADD_ACODEC( "WMA2", "wma2" )
  250. #undef ADD_ACODEC
  251. #define ADD_SCALING( factor ) ui.vScaleBox->addItem( factor );
  252.     ADD_SCALING( "1" )
  253.     ADD_SCALING( "0.25" )
  254.     ADD_SCALING( "0.5" )
  255.     ADD_SCALING( "0.75" )
  256.     ADD_SCALING( "1.25" )
  257.     ADD_SCALING( "1.5" )
  258.     ADD_SCALING( "1.75" )
  259.     ADD_SCALING( "2" )
  260. #undef ADD_SCALING
  261. #define ADD_SAMPLERATE( sample ) ui.aSampleBox->addItem( sample );
  262.     ADD_SAMPLERATE( "11250" )
  263.     ADD_SAMPLERATE( "22500" )
  264.     ADD_SAMPLERATE( "44100" )
  265.     ADD_SAMPLERATE( "48000" )
  266. #undef ADD_SAMPLERATE
  267. #define ADD_SCODEC( name, fourcc ) ui.subsCodecBox->addItem( name, QVariant( fourcc ) );
  268.     ADD_SCODEC( "DVB subtitle", "dvbs" )
  269.     ADD_SCODEC( "T.140", "t140" )
  270. #undef ADD_SCODEC
  271. }
  272. void VLCProfileEditor::fillProfile( const QString& qs )
  273. {
  274.     QStringList options = qs.split( ";" );
  275.     if( options.size() < 16 )
  276.         return;
  277.     const QString mux = options[0];
  278. #define CHECKMUX( button, text) if( text == mux ) ui.button->setChecked( true ); else
  279.     CHECKMUX( PSMux, "ps" )
  280.     CHECKMUX( TSMux, "ts" )
  281.     CHECKMUX( MPEG1Mux, "mpeg1" )
  282.     CHECKMUX( OggMux, "ogg" )
  283.     CHECKMUX( ASFMux, "asf" )
  284.     CHECKMUX( MOVMux, "mp4" )
  285.     CHECKMUX( WAVMux, "wav" )
  286.     CHECKMUX( RAWMux, "raw" )
  287.     CHECKMUX( FLVMux, "flv" )
  288.     CHECKMUX( MKVMux, "mkv" )
  289.     CHECKMUX( AVIMux, "avi" )
  290.     CHECKMUX( MJPEGMux, "mpjpeg" ){}
  291. #undef CHECKMUX
  292.     ui.keepVideo->setChecked( !options[1].toInt() );
  293.     ui.transcodeVideo->setChecked( ( options[4] != "none" ) );
  294.     ui.keepAudio->setChecked( !options[2].toInt() );
  295.     ui.transcodeAudio->setChecked( ( options[10] != "none" ) );
  296.     ui.transcodeSubs->setChecked( options[3].toInt() );
  297.     ui.vCodecBox->setCurrentIndex( ui.vCodecBox->findData( options[4] ) );
  298.     ui.vBitrateSpin->setValue( options[5].toInt() );
  299.     ui.vScaleBox->setEditText( options[6] );
  300.     ui.vFrameBox->setValue( options[7].toDouble() );
  301.     ui.widthBox->setText( options[8] );
  302.     ui.heightBox->setText( options[9] );
  303.     ui.aCodecBox->setCurrentIndex( ui.aCodecBox->findData( options[10] ) );
  304.     ui.aBitrateSpin->setValue( options[11].toInt() );
  305.     ui.aChannelsSpin->setValue( options[12].toInt() );
  306.     ui.aSampleBox->setCurrentIndex( ui.aSampleBox->findText( options[13] ) );
  307.     ui.subsCodecBox->setCurrentIndex( ui.subsCodecBox->findData( options[14] ) );
  308.     ui.subsOverlay->setChecked( options[15].toInt() );
  309. }
  310. void VLCProfileEditor::setVTranscodeOptions( bool b_trans )
  311. {
  312.     ui.vCodecLabel->setEnabled( b_trans );
  313.     ui.vCodecBox->setEnabled( b_trans );
  314.     ui.vBitrateLabel->setEnabled( b_trans );
  315.     ui.vBitrateSpin->setEnabled( b_trans );
  316.     ui.vScaleLabel->setEnabled( b_trans );
  317.     ui.vScaleBox->setEnabled( b_trans );
  318.     ui.heightBox->setEnabled( b_trans );
  319.     ui.heightLabel->setEnabled( b_trans );
  320.     ui.widthBox->setEnabled( b_trans );
  321.     ui.widthLabel->setEnabled( b_trans );
  322.     ui.vFrameBox->setEnabled( b_trans );
  323.     ui.vFrameLabel->setEnabled( b_trans );
  324.     ui.keepVideo->setEnabled( b_trans );
  325. }
  326. void VLCProfileEditor::setATranscodeOptions( bool b_trans )
  327. {
  328.     ui.aCodecLabel->setEnabled( b_trans );
  329.     ui.aCodecBox->setEnabled( b_trans );
  330.     ui.aBitrateLabel->setEnabled( b_trans );
  331.     ui.aBitrateSpin->setEnabled( b_trans );
  332.     ui.aChannelsLabel->setEnabled( b_trans );
  333.     ui.aChannelsSpin->setEnabled( b_trans );
  334.     ui.aSampleLabel->setEnabled( b_trans );
  335.     ui.aSampleBox->setEnabled( b_trans );
  336.     ui.keepAudio->setEnabled( b_trans );
  337. }
  338. void VLCProfileEditor::setSTranscodeOptions( bool b_trans )
  339. {
  340.     ui.subsCodecBox->setEnabled( b_trans );
  341.     ui.subsOverlay->setEnabled( b_trans );
  342. }
  343. void VLCProfileEditor::close()
  344. {
  345.     if( ui.profileLine->text().isEmpty() )
  346.     {
  347.         QMessageBox::warning( this, qtr(" Profile Name Missing" ),
  348.                 qtr( "You must set a name for the profile." ) );
  349.         ui.profileLine->setFocus();
  350.         return;
  351.     }
  352.     name = ui.profileLine->text();
  353.     accept();
  354. }
  355. QString VLCProfileEditor::transcodeValue()
  356. {
  357. #define SMUX( x, txt ) if( ui.x->isChecked() ) muxValue =  txt; else
  358.     SMUX( PSMux, "ps" )
  359.     SMUX( TSMux, "ts" )
  360.     SMUX( MPEG1Mux, "mpeg1" )
  361.     SMUX( OggMux, "ogg" )
  362.     SMUX( ASFMux, "asf" )
  363.     SMUX( MOVMux, "mp4" )
  364.     SMUX( WAVMux, "wav" )
  365.     SMUX( RAWMux, "raw" )
  366.     SMUX( FLVMux, "flv" )
  367.     SMUX( MKVMux, "mkv" )
  368.     SMUX( AVIMux, "avi" )
  369.     SMUX( MJPEGMux, "mpjpeg" ){}
  370. #undef SMUX
  371. #define currentData( box ) box->itemData( box->currentIndex() )
  372.     QString qs_acodec, qs_vcodec;
  373.     qs_vcodec = ( ui.transcodeVideo->isChecked() ) ? currentData( ui.vCodecBox ).toString()
  374.                                                    : "none";
  375.     qs_acodec = ( ui.transcodeAudio->isChecked() ) ? currentData( ui.aCodecBox ).toString()
  376.                                                    : "none";
  377.     QStringList transcodeMRL;
  378.     transcodeMRL
  379.             << muxValue
  380.             << QString::number( !ui.keepVideo->isChecked() )
  381.             << QString::number( !ui.keepAudio->isChecked() )
  382.             << QString::number( ui.transcodeSubs->isChecked() )
  383.             << qs_vcodec
  384.             << QString::number( ui.vBitrateSpin->value() )
  385.             << ui.vScaleBox->currentText()
  386.             << QString::number( ui.vFrameBox->value() )
  387.             << ui.widthBox->text()
  388.             << ui.heightBox->text()
  389.             << qs_acodec
  390.             << QString::number( ui.aBitrateSpin->value() )
  391.             << QString::number( ui.aChannelsSpin->value() )
  392.             << ui.aSampleBox->currentText()
  393.             << currentData( ui.subsCodecBox ).toString()
  394.             << QString::number( ui.subsOverlay->isChecked() );
  395. #undef currentData
  396.     return transcodeMRL.join( ";" );
  397. }