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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * sout.cpp : Stream output dialog ( old-style )
  3.  ****************************************************************************
  4.  * Copyright (C) 2007-2009 the VideoLAN team
  5.  *
  6.  * $Id: c6950e7b19243519c8ba6480cfce0b9f0b1c6a42 $
  7.  *
  8.  * Authors: Clément Stenac <zorglub@videolan.org>
  9.  *          Jean-Baptiste Kempf <jb@videolan.org>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * ( at your option ) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  24.  *****************************************************************************/
  25. #ifdef HAVE_CONFIG_H
  26. # include "config.h"
  27. #endif
  28. #include "dialogs/sout.hpp"
  29. #include "util/qt_dirs.hpp"
  30. #include "components/sout/sout_widgets.hpp"
  31. #include <QString>
  32. #include <QFileDialog>
  33. #include <QToolButton>
  34. #include <assert.h>
  35. SoutDialog::SoutDialog( QWidget *parent, intf_thread_t *_p_intf, const QString& inputMRL )
  36.            : QVLCDialog( parent,  _p_intf )
  37. {
  38.     setWindowTitle( qtr( "Stream Output" ) );
  39.     /* UI stuff */
  40.     ui.setupUi( this );
  41.     ui.inputBox->setMRL( inputMRL );
  42.     ui.helpEdit->setPlainText( qtr("This dialog will allow you to stream or "
  43.             "convert your media for use locally, on your private network, "
  44.             "or on the Internet.n"
  45.             "You should start by checking that source matches what you want "
  46.             "your input to be and then press the "Next" "
  47.             "button to continue.n") );
  48.     ui.mrlEdit->setToolTip ( qtr( "Stream output string.n"
  49.                 "This is automatically generated "
  50.                  "when you change the above settings,n"
  51.                  "but you can change it manually." ) ) ;
  52. #if 0
  53.     /* This needs Qt4.5 to be cool */
  54.     ui.destTab->setTabsClosable( true );
  55. #else
  56.     closeTabButton = new QToolButton( this );
  57.     ui.destTab->setCornerWidget( closeTabButton );
  58.     closeTabButton->hide();
  59.     closeTabButton->setAutoRaise( true );
  60.     closeTabButton->setIcon( QIcon( ":/clear" ) );
  61.     BUTTONACT( closeTabButton, closeTab() );
  62. #endif
  63.     CONNECT( ui.destTab, currentChanged( int ), this, tabChanged( int ) );
  64.     ui.destTab->setTabIcon( 0, QIcon( ":/playlist_add" ) );
  65.     ui.destBox->addItem( qtr( "File" ) );
  66.     ui.destBox->addItem( "HTTP" );
  67.     ui.destBox->addItem( "MMS" );
  68.     ui.destBox->addItem( "UDP" );
  69.     ui.destBox->addItem( "RTP" );
  70.     ui.destBox->addItem( "IceCast" );
  71.     BUTTONACT( ui.addButton, addDest() );
  72. //     /* Connect everything to the updateMRL function */
  73. #define CB( x ) CONNECT( ui.x, toggled( bool ), this, updateMRL() );
  74. #define CT( x ) CONNECT( ui.x, textChanged( const QString& ), this, updateMRL() );
  75. #define CS( x ) CONNECT( ui.x, valueChanged( int ), this, updateMRL() );
  76. #define CC( x ) CONNECT( ui.x, currentIndexChanged( int ), this, updateMRL() );
  77.     /* Misc */
  78.     CB( soutAll ); CB( soutKeep );  CS( ttl ); CT( sapName ); CT( sapGroup );
  79.     CB( localOutput ); CB( transcodeBox );
  80.     CONNECT( ui.profileSelect, optionsChanged(), this, updateMRL() );
  81.     okButton = new QPushButton( qtr( "&Stream" ) );
  82.     QPushButton *cancelButton = new QPushButton( qtr( "&Cancel" ) );
  83.     okButton->setDefault( true );
  84.     ui.acceptButtonBox->addButton( okButton, QDialogButtonBox::AcceptRole );
  85.     ui.acceptButtonBox->addButton( cancelButton, QDialogButtonBox::RejectRole );
  86.     BUTTONACT( okButton, ok() );
  87.     BUTTONACT( cancelButton, cancel() );
  88.     BUTTONACT( ui.nextButton, next() );
  89.     BUTTONACT( ui.nextButton2, next() );
  90.     BUTTONACT( ui.prevButton, prev() );
  91.     BUTTONACT( ui.prevButton2, prev() );
  92. #undef CC
  93. #undef CS
  94. #undef CT
  95. #undef CB
  96. }
  97. void SoutDialog::next()
  98. {
  99.     ui.toolBox->setCurrentIndex( ui.toolBox->currentIndex() + 1 );
  100. }
  101. void SoutDialog::prev()
  102. {
  103.     ui.toolBox->setCurrentIndex( ui.toolBox->currentIndex() - 1 );
  104. }
  105. void SoutDialog::tabChanged( int i )
  106. {
  107.     closeTabButton->setVisible( (i != 0) );
  108. }
  109. void SoutDialog::closeTab()
  110. {
  111.     int i = ui.destTab->currentIndex();
  112.     if( i == 0 ) return;
  113.     QWidget *temp = ui.destTab->currentWidget();
  114.     ui.destTab->removeTab( i );
  115.     delete temp;
  116.     updateMRL();
  117. }
  118. void SoutDialog::addDest( )
  119. {
  120.     int index;
  121.     switch( ui.destBox->currentIndex() )
  122.     {
  123.         case 0:
  124.             {
  125.                 FileDestBox *fdb = new FileDestBox( this );
  126.                 index = ui.destTab->addTab( fdb, "File" );
  127.                 CONNECT( fdb, mrlUpdated(), this, updateMRL() );
  128.             }
  129.             break;
  130.         case 1:
  131.             {
  132.                 HTTPDestBox *hdb = new HTTPDestBox( this );
  133.                 index = ui.destTab->addTab( hdb, "HTTP" );
  134.                 CONNECT( hdb, mrlUpdated(), this, updateMRL() );
  135.             }
  136.             break;
  137.         case 2:
  138.             {
  139.                 MMSHDestBox *mdb = new MMSHDestBox( this );
  140.                 index = ui.destTab->addTab( mdb, "MMSH" );
  141.                 CONNECT( mdb, mrlUpdated(), this, updateMRL() );
  142.             }
  143.             break;
  144.         case 3:
  145.             {
  146.                 UDPDestBox *udb = new UDPDestBox( this );
  147.                 index = ui.destTab->addTab( udb, "UDP" );
  148.                 CONNECT( udb, mrlUpdated(), this, updateMRL() );
  149.             }
  150.             break;
  151.         case 4:
  152.             {
  153.                 RTPDestBox *rdb = new RTPDestBox( this );
  154.                 index = ui.destTab->addTab( rdb, "RTP" );
  155.                 CONNECT( rdb, mrlUpdated(), this, updateMRL() );
  156.             }
  157.             break;
  158.         case 5:
  159.             {
  160.                 ICEDestBox *idb = new ICEDestBox( this );
  161.                 index = ui.destTab->addTab( idb, "Icecast" );
  162.                 CONNECT( idb, mrlUpdated(), this, updateMRL() );
  163.             }
  164.             break;
  165.         default:
  166.             assert(0);
  167.     }
  168.     ui.destTab->setCurrentIndex( index );
  169.     updateMRL();
  170. }
  171. void SoutDialog::ok()
  172. {
  173.     mrl = ui.mrlEdit->toPlainText();
  174.     accept();
  175. }
  176. void SoutDialog::cancel()
  177. {
  178.     mrl.clear();
  179.     reject();
  180. }
  181. void SoutDialog::updateMRL()
  182. {
  183.     QString qs_mux = ui.profileSelect->getMux();
  184.     SoutMrl smrl( ":sout=#" );
  185.     if( !ui.profileSelect->getTranscode().isEmpty() && ui.transcodeBox->isChecked() )
  186.     {
  187.         smrl.begin( ui.profileSelect->getTranscode() );
  188.         smrl.end();
  189.     }
  190.     bool multi = false;
  191.     if( ui.destTab->count() >= 3 ||
  192.         ( ui.destTab->count() == 2 && ui.localOutput->isChecked() ) )
  193.         multi = true;
  194.     if( multi )
  195.         smrl.begin( "duplicate" );
  196.     for( int i = 1; i < ui.destTab->count(); i++ )
  197.     {
  198.         VirtualDestBox *vdb = qobject_cast<VirtualDestBox *>(ui.destTab->widget( i ));
  199.         QString tempMRL = vdb->getMRL( qs_mux );
  200.         if( tempMRL.isEmpty() ) continue;
  201.         if( multi )
  202.             smrl.option( "dst", tempMRL );
  203.         else
  204.         {
  205.             smrl.begin( tempMRL);
  206.             smrl.end();
  207.         }
  208.     }
  209.     if( ui.localOutput->isChecked() )
  210.     {
  211.         if( multi )
  212.             smrl.option( "dst", "display" );
  213.         else
  214.         {
  215.             smrl.begin( "display" );
  216.             smrl.end();
  217.         }
  218.     }
  219.     if ( multi ) smrl.end();
  220.     mrl = smrl.getMrl();
  221.     /* FIXME, deal with SAP
  222.     sout.b_sap = ui.sap->isChecked();
  223.     sout.psz_group = strdup( qtu( ui.sapGroup->text() ) );
  224.     sout.psz_name = strdup( qtu( ui.sapName->text() ) ); */
  225.     if( ui.soutAll->isChecked() )  mrl.append( " :sout-all" );
  226.     if( ui.soutKeep->isChecked() ) mrl.append( " :sout-keep" );
  227.     ui.mrlEdit->setPlainText( mrl );
  228. }