Commit cec03a34 authored by François Cartegnie's avatar François Cartegnie 🤞

Qt: profiles_editor: display muxers capabilities.

Also shows possible warning for non native muxers.
parent e3611943
......@@ -210,6 +210,7 @@ DEPS_res = \
pixmaps/win7/win7thumbnail_next.png \
pixmaps/win7/win7thumbnail_play.png \
pixmaps/update.png \
pixmaps/valid.png \
pixmaps/search_clear.png \
pixmaps/lock.png
......
......@@ -34,6 +34,7 @@
#include <QRadioButton>
#include <assert.h>
#include <vlc_modules.h>
VLCProfileSelector::VLCProfileSelector( QWidget *_parent ): QWidget( _parent )
{
......@@ -239,6 +240,7 @@ VLCProfileEditor::VLCProfileEditor( const QString& qs_name, const QString& value
ui.profileLine->setText( qs_name );
ui.profileLine->setReadOnly( true );
}
loadCapabilities();
registerCodecs();
CONNECT( ui.transcodeVideo, toggled( bool ),
this, setVTranscodeOptions( bool ) );
......@@ -259,24 +261,50 @@ VLCProfileEditor::VLCProfileEditor( const QString& qs_name, const QString& value
BUTTONACT( cancelButton, reject() );
fillProfile( value );
muxSelected();
}
void VLCProfileEditor::loadCapabilities()
{
size_t count;
module_t **p_all = module_list_get (&count);
module_t *p_module;
/* Parse the module list for capabilities and probe each of them */
for (size_t i = 0; (p_module = p_all[i]) != NULL; i++)
{
if( module_provides( p_module, "sout mux" ) )
caps["muxers"].insert( module_get_object( p_module ) );
// else if ( module_provides( p_module, "encoder" ) )
// caps["encoders"].insert( module_get_object( p_module ) );
}
module_list_free (p_all);
}
inline void VLCProfileEditor::registerCodecs()
{
#define SETMUX( button, val ) ui.button->setProperty( "sout", val );
SETMUX( PSMux, "ps" )
SETMUX( TSMux, "ts" )
SETMUX( WEBMux, "webm" )
SETMUX( MPEG1Mux, "mpeg1" )
SETMUX( OggMux, "ogg" )
SETMUX( ASFMux, "asf" )
SETMUX( MOVMux, "mp4" )
SETMUX( WAVMux, "wav" )
SETMUX( RAWMux, "raw" )
SETMUX( FLVMux, "flv" )
SETMUX( MKVMux, "mkv" )
SETMUX( AVIMux, "avi" )
SETMUX( MJPEGMux, "mpjpeg" )
#define SETMUX( button, val, vid, aud, men, sub, stream, chaps ) \
ui.button->setProperty( "sout", val );\
ui.button->setProperty( "capvideo", vid );\
ui.button->setProperty( "capaudio", aud );\
ui.button->setProperty( "capmenu", men );\
ui.button->setProperty( "capsubs", sub );\
ui.button->setProperty( "capstream", stream );\
ui.button->setProperty( "capchaps", chaps );\
CONNECT( ui.button, clicked(bool), this, muxSelected() );
SETMUX( PSMux, "ps", true, true, false, true, false, true )
SETMUX( TSMux, "ts", true, true, false, true, true, false )
SETMUX( WEBMux, "webm", true, true, false, false, true, false )
SETMUX( MPEG1Mux, "mpeg1", true, true, false, false, false, false )
SETMUX( OggMux, "ogg", true, true, false, false, true, true )
SETMUX( ASFMux, "asf", true, true, false, true, true, true )
SETMUX( MOVMux, "mp4", true, true, true, true, true, false )
SETMUX( WAVMux, "wav", false, true, false, false, false, false )
SETMUX( RAWMux, "raw", true, true, false, false, false, false )
SETMUX( FLVMux, "flv", true, true, false, false, true, false )
SETMUX( MKVMux, "mkv", true, true, true, true, true, true )
SETMUX( AVIMux, "avi", true, true, false, false, false, false )
SETMUX( MJPEGMux, "mpjpeg", true, false, false, false, false, false )
#undef SETMUX
#define ADD_VCODEC( name, fourcc ) ui.vCodecBox->addItem( name, QVariant( fourcc ) );
......@@ -334,6 +362,38 @@ inline void VLCProfileEditor::registerCodecs()
#undef ADD_SCODEC
}
void VLCProfileEditor::muxSelected()
{
#define SETYESNOSTATE( name, prop ) \
ui.name->setChecked( current->property( prop ).toBool() )
for ( int i=0; i< ui.muxer->layout()->count(); i++ )
{
QRadioButton *current =
qobject_cast<QRadioButton *>(ui.muxer->layout()->itemAt(i)->widget());
if ( unlikely( !current ) ) continue;
if ( !current->isChecked() ) continue;
/* dumb :/ */
SETYESNOSTATE( capvideo, "capvideo" );
SETYESNOSTATE( capaudio, "capaudio" );
SETYESNOSTATE( capmenu, "capmenu" );
SETYESNOSTATE( capsubs, "capsubs" );
SETYESNOSTATE( capstream, "capstream" );
SETYESNOSTATE( capchaps, "capchaps" );
bool b = caps["muxers"].contains( "mux_" + current->property("sout").toString() );
if ( b )
ui.muxerwarning->setText(
QString( "<img src=\":/menu/info\"/> %1" )
.arg( qtr( "This muxer is not provided directly by VLC: It could be missing." ) )
);
else
ui.muxerwarning->setText("");
return;
}
#undef SETYESNOSTATE
}
void VLCProfileEditor::fillProfile( const QString& qs )
{
QStringList options = qs.split( ";" );
......
......@@ -27,6 +27,8 @@
#include "qt4.hpp"
#include <QWidget>
#include <QSet>
#include <QHash>
#include "util/qvlcframe.hpp"
#include "ui/profiles.h"
......@@ -70,12 +72,16 @@ public:
private:
void registerCodecs();
void fillProfile( const QString& qs );
typedef QSet<QString> resultset;
QHash<QString, resultset> caps;
void loadCapabilities();
protected slots:
virtual void close();
private slots:
void setVTranscodeOptions( bool );
void setATranscodeOptions( bool );
void setSTranscodeOptions( bool );
void muxSelected();
};
#endif
......@@ -44,102 +44,205 @@
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="muxer">
<widget class="QWidget" name="muxertab">
<attribute name="title">
<string>Encapsulation</string>
</attribute>
<layout class="QGridLayout">
<item row="2" column="0">
<widget class="QRadioButton" name="TSMux">
<property name="text">
<string>MPEG-TS</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="PSMux">
<property name="text">
<string>MPEG-PS</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QRadioButton" name="WAVMux">
<property name="text">
<string>WAV</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QRadioButton" name="WEBMux">
<property name="text">
<string>Webm</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QRadioButton" name="ASFMux">
<property name="text">
<string>ASF/WMV</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QRadioButton" name="OggMux">
<property name="text">
<string>Ogg/Ogm</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QRadioButton" name="RAWMux">
<property name="text">
<string>RAW</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QRadioButton" name="MPEG1Mux">
<property name="text">
<string>MPEG 1</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="muxer" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QRadioButton" name="TSMux">
<property name="text">
<string>MPEG-TS</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="PSMux">
<property name="text">
<string>MPEG-PS</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="MPEG1Mux">
<property name="text">
<string>MPEG 1</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="ASFMux">
<property name="text">
<string>ASF/WMV</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="WEBMux">
<property name="text">
<string>Webm</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="MJPEGMux">
<property name="text">
<string>MJPEG</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QRadioButton" name="MKVMux">
<property name="text">
<string>MKV</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QRadioButton" name="OggMux">
<property name="text">
<string>Ogg/Ogm</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QRadioButton" name="WAVMux">
<property name="text">
<string>WAV</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QRadioButton" name="RAWMux">
<property name="text">
<string>RAW</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QRadioButton" name="MOVMux">
<property name="text">
<string>MP4/MOV</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QRadioButton" name="FLVMux">
<property name="text">
<string>FLV</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QRadioButton" name="AVIMux">
<property name="text">
<string>AVI</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="3">
<widget class="QRadioButton" name="FLVMux">
<property name="text">
<string>FLV</string>
<item>
<widget class="QGroupBox" name="muxcaps">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QRadioButton" name="AVIMux">
<property name="text">
<string>AVI</string>
<property name="title">
<string>Features</string>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="3">
<widget class="YesNoCheckBox" name="capsubs">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Subtitles</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="YesNoCheckBox" name="capstream">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Streamable</string>
</property>
</widget>
</item>
<item row="2" column="4">
<widget class="YesNoCheckBox" name="capchaps">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Chapters</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="YesNoCheckBox" name="capaudio">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Audio</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="YesNoCheckBox" name="capvideo">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Video</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="YesNoCheckBox" name="capmenu">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Menus</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="3">
<widget class="QRadioButton" name="MOVMux">
<property name="text">
<string>MP4/MOV</string>
<item>
<widget class="QLabel" name="muxerwarning">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QRadioButton" name="MJPEGMux">
<property name="text">
<string>MJPEG</string>
<property name="styleSheet">
<string notr="true"/>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QRadioButton" name="MKVMux">
<property name="text">
<string>MKV</string>
<string/>
</property>
</widget>
</item>
......@@ -503,22 +606,16 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>YesNoCheckBox</class>
<extends>QCheckBox</extends>
<header>../util/customwidgets.hpp</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>profileLine</tabstop>
<tabstop>tabWidget</tabstop>
<tabstop>TSMux</tabstop>
<tabstop>WEBMux</tabstop>
<tabstop>OggMux</tabstop>
<tabstop>MOVMux</tabstop>
<tabstop>PSMux</tabstop>
<tabstop>MJPEGMux</tabstop>
<tabstop>WAVMux</tabstop>
<tabstop>FLVMux</tabstop>
<tabstop>MPEG1Mux</tabstop>
<tabstop>MKVMux</tabstop>
<tabstop>RAWMux</tabstop>
<tabstop>AVIMux</tabstop>
<tabstop>ASFMux</tabstop>
<tabstop>transcodeVideo</tabstop>
<tabstop>keepVideo</tabstop>
<tabstop>vCodecBox</tabstop>
......
......@@ -401,3 +401,18 @@ void QToolButtonExt::clickedSlot()
else if( shortClick )
emit shortClicked();
}
YesNoCheckBox::YesNoCheckBox( QWidget *parent ) : QCheckBox( parent )
{
setEnabled( false );
setStyleSheet("\
QCheckBox::indicator:unchecked:hover,\
QCheckBox::indicator:unchecked {\
image: url(:/menu/quit);\
}\
QCheckBox::indicator:checked:hover,\
QCheckBox::indicator:checked {\
image: url(:/valid);\
}\
");
}
......@@ -32,12 +32,14 @@
#include <QLabel>
#include <QStackedWidget>
#include <QSpinBox>
#include <QCheckBox>
#include <QList>
#include <QTimer>
#include <QToolButton>
#include <QAbstractAnimation>
class QPixmap;
class QWidget;
class QFramelessButton : public QPushButton
{
......@@ -149,6 +151,13 @@ private:
PixmapAnimator *animator;
};
class YesNoCheckBox : public QCheckBox
{
Q_OBJECT
public:
YesNoCheckBox( QWidget *parent );
};
/* VLC Key/Wheel hotkeys interactions */
class QKeyEvent;
......
......@@ -99,6 +99,7 @@
<file alias="lock">pixmaps/lock.png</file>
<file alias="search_clear">pixmaps/search_clear.png</file>
<file alias="dropzone">pixmaps/playlist/dropzone.png</file>
<file alias="valid">pixmaps/valid.png</file>
</qresource>
<qresource prefix="/prefsmenu">
<file alias="cone_audio_64">pixmaps/prefs/spref_cone_Audio_64.png</file>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment