int32_t i_http; /*< http port number */
int32_t i_mms; /*< mms port number */
int32_t i_rtp; /*< rtp port number */
+ int32_t i_rtp_audio; /*< rtp port number */
+ int32_t i_rtp_video; /*< rtp port number */
int32_t i_udp; /*< udp port number */
int32_t i_icecast; /*< icecast port number */
#define CT( x ) CONNECT( ui.x, textChanged( const QString ), this, updateMRL() );
#define CS( x ) CONNECT( ui.x, valueChanged( int ), this, updateMRL() );
#define CC( x ) CONNECT( ui.x, currentIndexChanged( int ), this, updateMRL() );
-// /* Output */
+ /* Output */
CB( fileOutput ); CB( HTTPOutput ); CB( localOutput );
CB( RTPOutput ); CB( MMSHOutput ); CB( rawInput ); CB( UDPOutput );
CT( fileEdit ); CT( HTTPEdit ); CT( RTPEdit ); CT( MMSHEdit ); CT( UDPEdit );
CT( IcecastEdit ); CT( IcecastMountpointEdit ); CT( IcecastNamePassEdit );
- CS( HTTPPort ); CS( RTPPort ); CS( MMSHPort ); CS( UDPPort );
-// /* Transcode */
+ CS( HTTPPort ); CS( RTPPort ); CS( RTPPort2 ); CS( MMSHPort ); CS( UDPPort );
+ /* Transcode */
CC( vCodecBox ); CC( subsCodecBox ); CC( aCodecBox ) ;
CB( transcodeVideo ); CB( transcodeAudio ); CB( transcodeSubs );
-// CB( sOverlay );
+ /* CB( sOverlay ); */
CS( vBitrateSpin ); CS( aBitrateSpin ); CS( aChannelsSpin ); CC( vScaleBox );
-// /* Mux */
+ /* Mux */
CB( PSMux ); CB( TSMux ); CB( MPEG1Mux ); CB( OggMux ); CB( ASFMux );
CB( MP4Mux ); CB( MOVMux ); CB( WAVMux ); CB( RAWMux ); CB( FLVMux );
-// /* Misc */
+ /* Misc */
CB( soutAll ); CS( ttl ); CT( sapName ); CT( sapGroup );
-//
+
CONNECT( ui.profileBox, activated( const QString & ), this, setOptions() );
CONNECT( ui.fileSelectButton, clicked() , this, fileBrowse() );
- CONNECT( ui.transcodeVideo, toggled( bool ), this, setVTranscodeOptions( bool ) );
- CONNECT( ui.transcodeAudio, toggled( bool ), this, setATranscodeOptions( bool ) );
- CONNECT( ui.transcodeSubs, toggled( bool ), this, setSTranscodeOptions( bool ) );
+ CONNECT( ui.transcodeVideo, toggled( bool ),
+ this, setVTranscodeOptions( bool ) );
+ CONNECT( ui.transcodeAudio, toggled( bool ),
+ this, setATranscodeOptions( bool ) );
+ CONNECT( ui.transcodeSubs, toggled( bool ),
+ this, setSTranscodeOptions( bool ) );
CONNECT( ui.rawInput, toggled( bool ), this, setRawOptions( bool ) );
okButton = new QPushButton( qtr( "&Stream" ) );
if( b_transcode_only ) toggleSout();
- CONNECT( ui.UDPOutput, toggled( bool ), this, changeUDPandRTPmess( bool ) );}
+ CONNECT( ui.UDPOutput, toggled( bool ), this, changeUDPandRTPmess( bool ) );
+ CONNECT( ui.RTPOutput, clicked(bool), this, RTPtoggled( bool ) );
+}
void SoutDialog::fileBrowse()
{
ui.RTPPortLabel->setVisible( !b_udp );
ui.UDPEdit->setVisible( b_udp );
ui.UDPLabel->setVisible( b_udp );
- ui.UDPPortLabel->setText( b_udp ? qtr( "Port:") : qtr( "Video Port:" ) );
- ui.RTPPortLabel->setText( b_udp ? qtr( "Port:") : qtr( "Audio Port:" ) );
+ ui.UDPPortLabel->setText( b_udp ? qtr( "Port:") : qtr( "Audio Port:" ) );
+ ui.RTPPort2->setVisible( !b_udp );
+ ui.RTPPortLabel2->setVisible( !b_udp );
+}
+
+void SoutDialog::RTPtoggled( bool b_en )
+{
+ if( !b_en )
+ {
+ if( ui.RTPPort->value() == ui.UDPPort->value() )
+ {
+ ui.UDPPort->setValue( ui.UDPPort->value() + 1 );
+ }
+
+ while( ui.RTPPort2->value() == ui.UDPPort->value() ||
+ ui.RTPPort2->value() == ui.RTPPort->value() )
+ {
+ ui.RTPPort2->setValue( ui.RTPPort2->value() + 1 );
+ }
+ }
+ ui.sap->setEnabled( b_en );
+ ui.RTPLabel->setEnabled( b_en );
+ ui.RTPEdit->setEnabled( b_en );
+ ui.UDPOutput->setEnabled( b_en );
+ ui.UDPPort->setEnabled( b_en );
+ ui.UDPPortLabel->setEnabled( b_en );
+ ui.RTPPort2->setEnabled( b_en );
+ ui.RTPPortLabel2->setEnabled( b_en );
}
void SoutDialog::ok()
sout.i_http = ui.HTTPPort->value();
sout.i_mms = ui.MMSHPort->value();
sout.i_rtp = ui.RTPPort->value();
- sout.i_udp = ui.UDPPort->value();
+ sout.i_rtp_audio = sout.i_udp = ui.UDPPort->value();
+ sout.i_rtp_video = ui.RTPPort2->value();
sout.i_icecast = ui.IcecastPort->value();
sout.i_ab = ui.aBitrateSpin->value();
sout.i_vb = ui.vBitrateSpin->value();
mrl.append( "}" );
}
+ /* Protocol output */
if ( sout.b_local || sout.b_file || sout.b_http ||
- sout.b_mms || sout.b_rtp || sout.b_udp )
+ sout.b_mms || sout.b_rtp || sout.b_udp || sout.b_icecast )
{
-#define ISMORE() if ( more ) mrl.append( "," );
-#define ATLEASTONE() if ( counter ) mrl.append( "dst=" );
+#define ISMORE() if ( more ) mrl.append( "," )
+#define ATLEASTONE() if ( counter ) mrl.append( "dst=" )
#define CHECKMUX() \
if( sout.psz_mux ) \
}
if ( trans )
- {
mrl.append( ":" );
- }
else
- {
mrl = ":sout=#";
- }
if ( counter )
- {
mrl.append( "duplicate{" );
- }
if ( sout.b_local )
{
ISMORE();
- ATLEASTONE()
- mrl.append( "display" );
+ ATLEASTONE();
+ mrl.append( "display" );
more = true;
}
if ( sout.b_file )
{
ISMORE();
- ATLEASTONE()
- mrl.append( "std{access=file" );
+ ATLEASTONE();
+ mrl.append( "std{access=file" );
CHECKMUX();
mrl.append( ",dst=" );
mrl.append( sout.psz_file );
if ( sout.b_http )
{
ISMORE();
- ATLEASTONE()
- mrl.append( "std{access=http" );
+ ATLEASTONE();
+ mrl.append( "std{access=http" );
CHECKMUX();
mrl.append( ",dst=" );
mrl.append( sout.psz_http );
if ( sout.b_mms )
{
ISMORE();
- ATLEASTONE()
- mrl.append( "std{access=mmsh" );
+ ATLEASTONE();
+ mrl.append( "std{access=mmsh" );
CHECKMUX();
mrl.append( ",dst=" );
mrl.append( sout.psz_mms );
if ( sout.b_rtp )
{
ISMORE();
- ATLEASTONE()
+ ATLEASTONE();
+ if ( sout.b_udp )
+ {
+ mrl.append( "std{access=udp" );
+ CHECKMUX();
+ mrl.append( ",dst=" );
+ mrl.append( sout.psz_udp );
+ mrl.append( ":" );
+ mrl.append( QString::number( sout.i_udp,10 ) );
+ }
+ else
+ {
mrl.append( "rtp{" );
- CHECKMUX();
- mrl.append( ",dst=" );
- mrl.append( sout.psz_rtp );
- mrl.append( ":" );
- mrl.append( QString::number( sout.i_rtp,10 ) );
- mrl.append( "}" );
- more = true;
- }
+ mrl.append( "dst=" );
+ mrl.append( sout.psz_rtp );
+ CHECKMUX();
+ mrl.append( ",port=" );
+ mrl.append( QString::number( sout.i_rtp,10 ) );
+ if( !sout.psz_mux || strncmp( sout.psz_mux, "ts", 2 ) )
+ {
+ mrl.append( ",port-audio=" );
+ mrl.append( QString::number( sout.i_rtp_audio, 10 ) );
+ mrl.append( ",port-video=" );
+ mrl.append( QString::number( sout.i_rtp_video, 10 ) );
+ }
+ }
- if ( sout.b_udp )
- {
- ISMORE();
- ATLEASTONE()
- mrl.append( "std{access=udp" );
- CHECKMUX();
- mrl.append( ",dst=" );
- mrl.append( sout.psz_udp );
- mrl.append( ":" );
- mrl.append( QString::number( sout.i_udp,10 ) );
+ /* SAP */
if ( sout.b_sap )
{
mrl.append( ",sap," );
mrl.append( sout.psz_name );
mrl.append( "\"" );
}
+
mrl.append( "}" );
more = true;
}
if( sout.b_icecast )
{
- // TODO
+ ISMORE();
+ ATLEASTONE();
+ mrl.append( "std{access=shout,mux=ogg" );
+ mrl.append( ",dst=" );
+ mrl.append( sout.sa_icecast.psz_username );
+ mrl.append( "@" );
+ mrl.append( sout.psz_icecast );
+ mrl.append( ":" );
+ mrl.append( QString::number( sout.i_icecast, 10 ) );
+ mrl.append( "/" );
+ mrl.append( sout.psz_icecast_mountpoint );
+ mrl.append( "}" );
+ more = true;
}
if ( counter )
<x>0</x>
<y>0</y>
<width>726</width>
- <height>782</height>
+ <height>823</height>
</rect>
</property>
<property name="sizePolicy" >
</property>
</widget>
</item>
- <item row="6" column="0" >
+ <item row="7" column="0" >
<widget class="QCheckBox" name="IcecastOutput" >
<property name="text" >
<string>IceCast</string>
</property>
</widget>
</item>
- <item row="6" column="1" >
+ <item row="7" column="1" >
<widget class="QLabel" name="IcecastLabel" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
- <item row="6" column="2" >
+ <item row="7" column="2" >
<widget class="QLineEdit" name="IcecastEdit" />
</item>
- <item row="6" column="3" >
+ <item row="7" column="3" >
<widget class="QLabel" name="IcecastPortLabel" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
- <item row="6" column="4" >
+ <item row="7" column="4" >
<widget class="QSpinBox" name="IcecastPort" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
- <item row="7" column="1" >
+ <item row="8" column="1" >
<widget class="QLabel" name="IcecastMountpointLabel" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
- <item row="7" column="2" >
+ <item row="8" column="2" >
<widget class="QLineEdit" name="IcecastMountpointEdit" />
</item>
- <item row="7" column="3" >
+ <item row="8" column="3" >
<widget class="QLabel" name="IcecastNameLabel" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
- <item row="7" column="4" >
+ <item row="8" column="4" >
<widget class="QLineEdit" name="IcecastNamePassEdit" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
+ <item row="6" column="4" >
+ <widget class="QSpinBox" name="RTPPort2" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>90</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="accelerated" >
+ <bool>true</bool>
+ </property>
+ <property name="maximum" >
+ <number>65355</number>
+ </property>
+ <property name="value" >
+ <number>1234</number>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3" >
+ <widget class="QLabel" name="RTPPortLabel2" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>_("Video Port")</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2" >
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>29</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</item>
</layout>
<item row="3" column="0" colspan="2" >
<widget class="QTabWidget" name="tabWidget" >
<property name="currentIndex" >
- <number>1</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="muxer" >
<property name="geometry" >
<x>0</x>
<y>0</y>
<width>704</width>
- <height>148</height>
+ <height>154</height>
</rect>
</property>
<attribute name="title" >
<x>0</x>
<y>0</y>
<width>704</width>
- <height>148</height>
+ <height>154</height>
</rect>
</property>
<attribute name="title" >
<x>0</x>
<y>0</y>
<width>704</width>
- <height>148</height>
+ <height>154</height>
</rect>
</property>
<attribute name="title" >
<x>0</x>
<y>0</y>
<width>704</width>
- <height>148</height>
+ <height>154</height>
</rect>
</property>
<attribute name="title" >
</widget>
<resources/>
<connections>
- <connection>
- <sender>RTPOutput</sender>
- <signal>clicked(bool)</signal>
- <receiver>sap</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>68</x>
- <y>175</y>
- </hint>
- <hint type="destinationlabel" >
- <x>80</x>
- <y>467</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>RTPOutput</sender>
- <signal>clicked(bool)</signal>
- <receiver>RTPLabel</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>58</x>
- <y>174</y>
- </hint>
- <hint type="destinationlabel" >
- <x>147</x>
- <y>184</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>RTPOutput</sender>
- <signal>clicked(bool)</signal>
- <receiver>RTPEdit</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel" >
- <x>63</x>
- <y>186</y>
- </hint>
- <hint type="destinationlabel" >
- <x>244</x>
- <y>186</y>
- </hint>
- </hints>
- </connection>
<connection>
<sender>MMSHOutput</sender>
<signal>clicked(bool)</signal>
</hint>
</hints>
</connection>
+ <connection>
+ <sender>RTPOutput</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>RTPPort2</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>190</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>597</x>
+ <y>260</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RTPOutput</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>RTPPortLabel2</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>190</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>497</x>
+ <y>260</y>
+ </hint>
+ </hints>
+ </connection>
</connections>
</ui>