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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * profile_selector.cpp : A small profile selector and editor
  3.  ****************************************************************************
  4.  * Copyright (C) 2007-2009 the VideoLAN team
  5.  * Copyright (C) 2007 Société des arts technologiques
  6.  * Copyright (C) 2007 Savoir-faire Linux
  7.  * $Id: 7961c49b7b061074d1392094ccd2d8a770faf4ec $
  8.  *
  9.  * Authors: Jean-Baptiste Kempf <jb@videolan.org>
  10.  *          Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  25.  *****************************************************************************/
  26. #include "components/sout/sout_widgets.hpp"
  27. #include "dialogs/sout.hpp"
  28. #include "util/qt_dirs.hpp"
  29. #include <QGroupBox>
  30. #include <QGridLayout>
  31. #include <QLabel>
  32. #include <QLineEdit>
  33. #include <QFileDialog>
  34. SoutInputBox::SoutInputBox( QWidget *_parent, const QString& mrl ) : QGroupBox( _parent )
  35. {
  36.     /**
  37.      * Source Block
  38.      **/
  39.     setTitle( qtr( "Source" ) );
  40.     QGridLayout *sourceLayout = new QGridLayout( this );
  41.     QLabel *sourceLabel = new QLabel( qtr( "Source:" ) );
  42.     sourceLayout->addWidget( sourceLabel, 0, 0 );
  43.     sourceLine = new QLineEdit;
  44.     sourceLine->setReadOnly( true );
  45.     sourceLine->setText( mrl );
  46.     sourceLabel->setBuddy( sourceLine );
  47.     sourceLayout->addWidget( sourceLine, 0, 1 );
  48.     QLabel *sourceTypeLabel = new QLabel( qtr( "Type:" ) );
  49.     sourceLayout->addWidget( sourceTypeLabel, 1, 0 );
  50.     sourceValueLabel = new QLabel;
  51.     sourceLayout->addWidget( sourceValueLabel, 1, 1 );
  52.     /* Line */
  53.     QFrame *line = new QFrame;
  54.     line->setFrameStyle( QFrame::HLine |QFrame::Sunken );
  55.     sourceLayout->addWidget( line, 2, 0, 1, -1 );
  56. }
  57. void SoutInputBox::setMRL( const QString& mrl )
  58. {
  59.     sourceLine->setText( mrl );
  60.     QString type;
  61.     int i = mrl.indexOf( "://" );
  62.     if( i != -1 )
  63.     {
  64.         type = mrl.left( i );
  65.     }
  66.     else
  67.         type = qtr( "File/Directory" );
  68.     sourceValueLabel->setText( type );
  69. }
  70. #define CT( x ) connect( x, SIGNAL( textChanged( const QString& ) ), this, SIGNAL( mrlUpdated() ) );
  71. #define CS( x ) connect( x, SIGNAL( valueChanged( int ) ), this, SIGNAL( mrlUpdated() ) );
  72. /* FileDest Box */
  73. FileDestBox::FileDestBox( QWidget *_parent ) : VirtualDestBox( _parent )
  74. {
  75.     QPushButton *fileSelectButton;
  76.     QGridLayout *layout = new QGridLayout( this );
  77.     QLabel *fileOutput = new QLabel(
  78.          qtr( "This module writes the transcoded stream to a file."), this );
  79.     layout->addWidget(fileOutput, 0, 0, 1, -1);
  80.     QLabel *fileLabel = new QLabel( qtr( "Filename"), this );
  81.     layout->addWidget(fileLabel, 1, 0, 1, 1);
  82.     fileEdit = new QLineEdit(this);
  83.     layout->addWidget(fileEdit, 1, 4, 1, 1);
  84.     fileSelectButton = new QPushButton( qtr( "Browse..." ), this );
  85.     QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
  86.     fileSelectButton->setSizePolicy(sizePolicy);
  87.     layout->addWidget(fileSelectButton, 1, 5, 1, 1);
  88.     CT( fileEdit );
  89.     BUTTONACT( fileSelectButton, fileBrowse() );
  90. }
  91. QString FileDestBox::getMRL( const QString& mux )
  92. {
  93.     if( fileEdit->text().isEmpty() ) return "";
  94.     SoutMrl m;
  95.     m.begin( "std" );
  96.     m.option( "access", "file" );
  97.     if( !mux.isEmpty() )
  98.         m.option( "mux", mux ); //FIXME: alert if ext doesn't match
  99.     m.option( "dst", fileEdit->text() );
  100.     m.end();
  101.     return m.getMrl();
  102. }
  103. void FileDestBox::fileBrowse()
  104. {
  105.     QString fileName = QFileDialog::getSaveFileName( this, qtr( "Save file..." ),
  106.             "", qtr( "Containers (*.ps *.ts *.mpg *.ogg *.asf *.mp4 *.mov *.wav *.raw *.flv)" ) );
  107.     fileEdit->setText( toNativeSeparators( fileName ) );
  108.     emit mrlUpdated();
  109. }
  110. HTTPDestBox::HTTPDestBox( QWidget *_parent ) : VirtualDestBox( _parent )
  111. {
  112.     QGridLayout *layout = new QGridLayout( this );
  113.     QLabel *httpOutput = new QLabel(
  114.         qtr( "This module outputs the transcoded stream to a network via HTTP."),
  115.         this );
  116.     layout->addWidget(httpOutput, 0, 0, 1, -1);
  117.     QLabel *HTTPLabel = new QLabel( qtr("Address"), this );
  118.     QLabel *HTTPPortLabel = new QLabel( qtr("Port"), this );
  119.     layout->addWidget(HTTPLabel, 1, 0, 1, 1);
  120.     layout->addWidget(HTTPPortLabel, 2, 0, 1, 1);
  121.     HTTPEdit = new QLineEdit(this);
  122.     HTTPEdit->setText( "0.0.0.0" );
  123.     HTTPPort = new QSpinBox(this);
  124.     HTTPPort->setMaximumSize(QSize(90, 16777215));
  125.     HTTPPort->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  126.     HTTPPort->setMinimum(1);
  127.     HTTPPort->setMaximum(65535);
  128.     HTTPPort->setValue(8080);
  129.     layout->addWidget(HTTPEdit, 1, 1, 1, 1);
  130.     layout->addWidget(HTTPPort, 2, 1, 1, 1);
  131.     CS( HTTPPort );
  132.     CT( HTTPEdit );
  133. }
  134. QString HTTPDestBox::getMRL( const QString& mux )
  135. {
  136.     if( HTTPEdit->text().isEmpty() ) return "";
  137.     SoutMrl m;
  138.     m.begin( "std" );
  139.     m.option(  "access", "http" );
  140.     if( !mux.isEmpty() )
  141.         m.option( "mux", mux );
  142.     m.option( "dst", HTTPEdit->text(), HTTPPort->value() );
  143.     m.end();
  144.     return m.getMrl();
  145. }
  146. MMSHDestBox::MMSHDestBox( QWidget *_parent ) : VirtualDestBox( _parent )
  147. {
  148.     QGridLayout *layout = new QGridLayout( this );
  149.     QLabel *mmshOutput = new QLabel(
  150.         qtr( "This module outputs the transcoded stream to a network "
  151.              " via the mms protocol." ), this );
  152.     layout->addWidget(mmshOutput, 0, 0, 1, -1);
  153.     QLabel *MMSHLabel = new QLabel( qtr("Address"), this );
  154.     QLabel *MMSHPortLabel = new QLabel( qtr("Port"), this );
  155.     layout->addWidget(MMSHLabel, 1, 0, 1, 1);
  156.     layout->addWidget(MMSHPortLabel, 2, 0, 1, 1);
  157.     MMSHEdit = new QLineEdit(this);
  158.     MMSHEdit->setText( "0.0.0.0" );
  159.     MMSHPort = new QSpinBox(this);
  160.     MMSHPort->setMaximumSize(QSize(90, 16777215));
  161.     MMSHPort->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  162.     MMSHPort->setMinimum(1);
  163.     MMSHPort->setMaximum(65535);
  164.     MMSHPort->setValue(8080);
  165.     layout->addWidget(MMSHEdit, 1, 1, 1, 1);
  166.     layout->addWidget(MMSHPort, 2, 1, 1, 1);
  167.     CS( MMSHPort );
  168.     CT( MMSHEdit );
  169. }
  170. QString MMSHDestBox::getMRL( const QString& mux )
  171. {
  172.     if( MMSHEdit->text().isEmpty() ) return "";
  173.     SoutMrl m;
  174.     m.begin( "std" );
  175.     m.option(  "access", "mmsh" );
  176.     m.option( "mux", "asfh" );
  177.     m.option( "dst", MMSHEdit->text(), MMSHPort->value() );
  178.     m.end();
  179.     return m.getMrl();
  180. }
  181. UDPDestBox::UDPDestBox( QWidget *_parent ) : VirtualDestBox( _parent )
  182. {
  183.     QGridLayout *layout = new QGridLayout( this );
  184.     QLabel *udpOutput = new QLabel(
  185.         qtr( "This module outputs the transcoded stream to a network via UDP."),
  186.         this );
  187.     layout->addWidget(udpOutput, 0, 0, 1, -1);
  188.     QLabel *UDPLabel = new QLabel( qtr("Address"), this );
  189.     QLabel *UDPPortLabel = new QLabel( qtr("Port"), this );
  190.     layout->addWidget(UDPLabel, 1, 0, 1, 1);
  191.     layout->addWidget(UDPPortLabel, 2, 0, 1, 1);
  192.     UDPEdit = new QLineEdit(this);
  193.     UDPPort = new QSpinBox(this);
  194.     UDPPort->setMaximumSize(QSize(90, 16777215));
  195.     UDPPort->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  196.     UDPPort->setMinimum(1);
  197.     UDPPort->setMaximum(65535);
  198.     UDPPort->setValue(1234);
  199.     layout->addWidget(UDPEdit, 1, 1, 1, 1);
  200.     layout->addWidget(UDPPort, 2, 1, 1, 1);
  201.     CS( UDPPort );
  202.     CT( UDPEdit );
  203. }
  204. QString UDPDestBox::getMRL( const QString& mux )
  205. {
  206.     if( UDPEdit->text().isEmpty() ) return "";
  207.     SoutMrl m;
  208.     m.begin( "std" );
  209.     m.option(  "access", "udp" );
  210.     if( !mux.isEmpty() )
  211.         m.option( "mux", mux );
  212.     m.option( "dst", UDPEdit->text(), UDPPort->value() );
  213.     m.end();
  214.     return m.getMrl();
  215. }
  216. RTPDestBox::RTPDestBox( QWidget *_parent ) : VirtualDestBox( _parent )
  217. {
  218.     QGridLayout *layout = new QGridLayout( this );
  219.     QLabel *rtpOutput = new QLabel(
  220.         qtr( "This module outputs the transcoded stream to a network via RTP."),
  221.         this );
  222.     layout->addWidget(rtpOutput, 0, 0, 1, -1);
  223.     QLabel *RTPLabel = new QLabel( qtr("Address"), this );
  224.     QLabel *RTPPortLabel = new QLabel( qtr("Port"), this );
  225.     layout->addWidget(RTPLabel, 1, 0, 1, 1);
  226.     layout->addWidget(RTPPortLabel, 2, 0, 1, 1);
  227.     RTPEdit = new QLineEdit(this);
  228.     RTPPort = new QSpinBox(this);
  229.     RTPPort->setMaximumSize(QSize(90, 16777215));
  230.     RTPPort->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  231.     RTPPort->setMinimum(1);
  232.     RTPPort->setMaximum(65535);
  233.     RTPPort->setValue(5004);
  234.     RTPPortAudio = new QSpinBox(this);
  235.     RTPPortAudio->setMaximumSize(QSize(90, 16777215));
  236.     RTPPortAudio->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  237.     RTPPortAudio->setMinimum(-1);
  238.     RTPPortAudio->setMaximum(65535);
  239.     RTPPortAudio->setValue(-1);
  240.     RTPPortVideo = new QSpinBox(this);
  241.     RTPPortVideo->setMaximumSize(QSize(90, 16777215));
  242.     RTPPortVideo->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  243.     RTPPortVideo->setMinimum(-1);
  244.     RTPPortVideo->setMaximum(65535);
  245.     RTPPortVideo->setValue(-1);
  246.     layout->addWidget(RTPEdit, 1, 1, 1, 1);
  247.     layout->addWidget(RTPPort, 2, 1, 1, 1);
  248.     QLabel *RTPPortAudioLabel = new QLabel( qtr("Audio Port"), this );
  249.     QLabel *RTPPortVideoLabel = new QLabel( qtr("Video Port"), this );
  250.     layout->addWidget(RTPPortAudioLabel, 3, 0, 1, 1);
  251.     layout->addWidget(RTPPortAudio, 3, 1, 1, 1);
  252.     layout->addWidget(RTPPortVideoLabel, 3, 2, 1, 1);
  253.     layout->addWidget(RTPPortVideo, 3, 3, 1, 1);
  254.     CS( RTPPort );
  255.     CS( RTPPortAudio );
  256.     CS( RTPPortVideo );
  257.     CT( RTPEdit );
  258. }
  259. QString RTPDestBox::getMRL( const QString& mux )
  260. {
  261.     if( RTPEdit->text().isEmpty() ) return "";
  262.     SoutMrl m;
  263.     m.begin( "rtp" );
  264.     m.option( "dst", RTPEdit->text() );
  265.     m.option( "port", RTPPort->value() );
  266.     if( !mux.isEmpty() )
  267.         m.option( "mux", mux );
  268.     if( mux.isEmpty() || mux.compare( "ts", Qt::CaseInsensitive ) )
  269.     {
  270.         m.option( "port-audio", RTPPortAudio->value() );
  271.         m.option( "port-video", RTPPortVideo->value() );
  272.     }
  273.     m.end();
  274.     return m.getMrl();
  275. }
  276. ICEDestBox::ICEDestBox( QWidget *_parent ) : VirtualDestBox( _parent )
  277. {
  278.     QGridLayout *layout = new QGridLayout( this );
  279.     QLabel *iceOutput = new QLabel(
  280.         qtr( "This module outputs the transcoded stream to an Icecast server."),
  281.         this );
  282.     layout->addWidget(iceOutput, 0, 0, 1, -1);
  283.     QLabel *ICELabel = new QLabel( qtr("Address"), this );
  284.     QLabel *ICEPortLabel = new QLabel( qtr("Port"), this );
  285.     layout->addWidget(ICELabel, 1, 0, 1, 1);
  286.     layout->addWidget(ICEPortLabel, 2, 0, 1, 1);
  287.     ICEEdit = new QLineEdit(this);
  288.     ICEPort = new QSpinBox(this);
  289.     ICEPort->setMaximumSize(QSize(90, 16777215));
  290.     ICEPort->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
  291.     ICEPort->setMinimum(1);
  292.     ICEPort->setMaximum(65535);
  293.     ICEPort->setValue(8000);
  294.     layout->addWidget(ICEEdit, 1, 1, 1, 1);
  295.     layout->addWidget(ICEPort, 2, 1, 1, 1);
  296.     QLabel *IcecastMountpointLabel = new QLabel( qtr( "Mount Point" ), this );
  297.     QLabel *IcecastNameLabel = new QLabel( qtr( "Login:pass" ), this );
  298.     ICEMountEdit = new QLineEdit( this );
  299.     ICEPassEdit = new QLineEdit( this );
  300.     layout->addWidget(IcecastMountpointLabel, 3, 0, 1, 1 );
  301.     layout->addWidget(ICEMountEdit, 3, 1, 1, -1 );
  302.     layout->addWidget(IcecastNameLabel, 4, 0, 1, 1 );
  303.     layout->addWidget(ICEPassEdit, 4, 1, 1, -1 );
  304.     CS( ICEPort );
  305.     CT( ICEEdit );
  306.     CT( ICEMountEdit );
  307.     CT( ICEPassEdit );
  308. }
  309. #undef CS
  310. #undef CT
  311. QString ICEDestBox::getMRL( const QString& mux )
  312. {
  313.     if( ICEEdit->text().isEmpty() ) return "";
  314.     SoutMrl m;
  315.     m.begin( "std" );
  316.     m.option( "access", "shout" );
  317.     m.option( "mux", "ogg" );
  318.     QString url = ICEPassEdit->text() + "@"
  319.         + ICEEdit->text()
  320.         + ":" + QString::number( ICEPort->value(), 10 )
  321.         + "/" + ICEMountEdit->text();
  322.     m.option( "dst", url );
  323.     m.end();
  324.     return m.getMrl();
  325. }