2014-02-24 23:13:42 +01:00
///////////////////////////////////////////////////////////////////////////////
// Simple x264 Launcher
2016-01-01 23:59:55 +01:00
// Copyright (C) 2004-2016 LoRd_MuldeR <MuldeR2@GMX.de>
2014-02-24 23:13:42 +01:00
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////
# pragma once
# include "source_vapoursynth.h"
# include "global.h"
# include <QDir>
# include <QProcess>
2014-08-13 16:07:57 +02:00
static const unsigned int VER_X264_VSPIPE_API = 3 ;
static const unsigned int VER_X264_VSPIPE_VER = 24 ;
2014-02-24 23:13:42 +01:00
2015-08-02 21:16:36 +02:00
// ------------------------------------------------------------
// Encoder Info
// ------------------------------------------------------------
class VapoursyntSourceInfo : public AbstractSourceInfo
{
public :
virtual QString getBinaryPath ( const SysinfoModel * sysinfo , const bool & x64 ) const
{
return QString ( " %1/core%2/vspipe.exe " ) . arg ( sysinfo - > getVPSPath ( ) , ( x64 ? " 64 " : " 32 " ) ) ;
}
} ;
static const VapoursyntSourceInfo s_vapoursynthEncoderInfo ;
const AbstractSourceInfo & VapoursynthSource : : getSourceInfo ( void )
{
return s_vapoursynthEncoderInfo ;
}
// ------------------------------------------------------------
// Constructor & Destructor
// ------------------------------------------------------------
2014-02-24 23:13:42 +01:00
VapoursynthSource : : VapoursynthSource ( JobObject * jobObject , const OptionsModel * options , const SysinfoModel * const sysinfo , const PreferencesModel * const preferences , JobStatus & jobStatus , volatile bool * abort , volatile bool * pause , QSemaphore * semaphorePause , const QString & sourceFile )
:
2015-08-02 21:16:36 +02:00
AbstractSource ( jobObject , options , sysinfo , preferences , jobStatus , abort , pause , semaphorePause , sourceFile )
2014-02-24 23:13:42 +01:00
{
/*Nothing to do here*/
}
VapoursynthSource : : ~ VapoursynthSource ( void )
{
/*Nothing to do here*/
}
2015-08-02 19:16:37 +02:00
QString VapoursynthSource : : getName ( void ) const
2014-02-26 16:08:06 +01:00
{
2015-08-02 21:16:36 +02:00
return tr ( " VapourSynth (vpy) " ) ;
2014-02-26 16:08:06 +01:00
}
2014-02-26 00:55:11 +01:00
// ------------------------------------------------------------
// Check Version
// ------------------------------------------------------------
2014-02-25 22:44:39 +01:00
bool VapoursynthSource : : isSourceAvailable ( )
{
2015-08-02 21:16:36 +02:00
if ( ! ( m_sysinfo - > hasVapourSynth ( ) & & ( ! m_sysinfo - > getVPSPath ( ) . isEmpty ( ) ) & & QFileInfo ( getBinaryPath ( ) ) . isFile ( ) ) )
2014-02-25 22:44:39 +01:00
{
log ( tr ( " \n VPY INPUT REQUIRES VAPOURSYNTH, BUT IT IS *NOT* AVAILABLE !!! " ) ) ;
return false ;
}
return true ;
}
2014-02-24 23:13:42 +01:00
void VapoursynthSource : : checkVersion_init ( QList < QRegExp * > & patterns , QStringList & cmdLine )
{
2014-08-13 16:07:57 +02:00
cmdLine < < " --version " ;
2014-02-25 22:44:39 +01:00
patterns < < new QRegExp ( " \\ bVapourSynth \\ b " , Qt : : CaseInsensitive ) ;
patterns < < new QRegExp ( " \\ bCore \\ s+r( \\ d+) \\ b " , Qt : : CaseInsensitive ) ;
patterns < < new QRegExp ( " \\ bAPI \\ s+r( \\ d+) \\ b " , Qt : : CaseInsensitive ) ;
2014-02-24 23:13:42 +01:00
}
2014-05-06 00:22:18 +02:00
void VapoursynthSource : : checkVersion_parseLine ( const QString & line , QList < QRegExp * > & patterns , unsigned int & core , unsigned int & build , bool & modified )
2014-02-24 23:13:42 +01:00
{
int offset = - 1 ;
2014-02-26 00:55:11 +01:00
2014-02-25 22:44:39 +01:00
if ( ( offset = patterns [ 1 ] - > lastIndexIn ( line ) ) > = 0 )
2014-02-24 23:13:42 +01:00
{
2014-02-25 22:44:39 +01:00
bool ok = false ;
unsigned int temp = patterns [ 1 ] - > cap ( 1 ) . toUInt ( & ok ) ;
2014-05-06 00:22:18 +02:00
if ( ok ) build = temp ;
2014-02-24 23:13:42 +01:00
}
2014-02-25 22:44:39 +01:00
else if ( ( offset = patterns [ 2 ] - > lastIndexIn ( line ) ) > = 0 )
2014-02-24 23:13:42 +01:00
{
2014-02-25 22:44:39 +01:00
bool ok = false ;
unsigned int temp = patterns [ 2 ] - > cap ( 1 ) . toUInt ( & ok ) ;
2014-05-06 00:22:18 +02:00
if ( ok ) core = temp ;
2014-02-24 23:13:42 +01:00
}
2014-02-26 00:55:11 +01:00
if ( ! line . isEmpty ( ) )
{
log ( line ) ;
}
2014-02-24 23:13:42 +01:00
}
2014-02-26 17:39:36 +01:00
QString VapoursynthSource : : printVersion ( const unsigned int & revision , const bool & modified )
2014-02-24 23:13:42 +01:00
{
2014-05-06 00:22:18 +02:00
unsigned int core , build ;
splitRevision ( revision , core , build ) ;
return tr ( " \n VapourSynth version: r%1 (API r%2) " ).arg(QString::number(build), QString::number(core)) ;
2014-02-24 23:13:42 +01:00
}
bool VapoursynthSource : : isVersionSupported ( const unsigned int & revision , const bool & modified )
{
2014-05-06 00:22:18 +02:00
unsigned int core , build ;
splitRevision ( revision , core , build ) ;
2014-08-13 16:07:57 +02:00
if ( ( build < VER_X264_VSPIPE_VER ) | | ( core < VER_X264_VSPIPE_API ) )
2014-02-24 23:13:42 +01:00
{
2014-08-13 16:07:57 +02:00
if ( core < VER_X264_VSPIPE_API )
{
log ( tr ( " \n ERROR: Your version of VapourSynth is unsupported! (requires API r%1 or newer) " ) . arg ( QString : : number ( VER_X264_VSPIPE_API ) ) ) ;
}
if ( build < VER_X264_VSPIPE_VER )
{
log ( tr ( " \n ERROR: Your version of VapourSynth is unsupported! (requires version r%1 or newer) " ) . arg ( QString : : number ( VER_X264_VSPIPE_VER ) ) ) ;
}
2014-02-25 22:44:39 +01:00
log ( tr ( " You can find the latest VapourSynth version at: http://www.vapoursynth.com/ " ) ) ;
2014-02-24 23:13:42 +01:00
return false ;
}
2014-08-13 16:07:57 +02:00
if ( core ! = VER_X264_VSPIPE_API )
{
log ( tr ( " \n WARNING: Running with an unknown VapourSynth API version, problem may appear! (this application works best with API r%1) " ) . arg ( QString : : number ( VER_X264_VSPIPE_API ) ) ) ;
}
2014-02-24 23:13:42 +01:00
return true ;
}
2014-02-26 00:55:11 +01:00
// ------------------------------------------------------------
// Check Source Properties
// ------------------------------------------------------------
2014-02-24 23:13:42 +01:00
void VapoursynthSource : : checkSourceProperties_init ( QList < QRegExp * > & patterns , QStringList & cmdLine )
{
2014-08-13 16:07:57 +02:00
cmdLine < < " --info " ;
2014-02-24 23:13:42 +01:00
cmdLine < < QDir : : toNativeSeparators ( x264_path2ansi ( m_sourceFile , true ) ) ;
2014-08-13 16:07:57 +02:00
cmdLine < < " - " ;
2014-02-24 23:13:42 +01:00
patterns < < new QRegExp ( " \\ bFrames: \\ s+( \\ d+) \\ b " ) ;
patterns < < new QRegExp ( " \\ bWidth: \\ s+( \\ d+) \\ b " ) ;
patterns < < new QRegExp ( " \\ bHeight: \\ s+( \\ d+) \\ b " ) ;
2014-02-26 16:08:06 +01:00
patterns < < new QRegExp ( " \\ bFPS: \\ s+( \\ d+) \\ b " ) ;
patterns < < new QRegExp ( " \\ bFPS: \\ s+( \\ d+)/( \\ d+) \\ b " ) ;
2014-02-24 23:13:42 +01:00
}
void VapoursynthSource : : checkSourceProperties_parseLine ( const QString & line , QList < QRegExp * > & patterns , unsigned int & frames , unsigned int & fSizeW , unsigned int & fSizeH , unsigned int & fpsNom , unsigned int & fpsDen )
{
int offset = - 1 ;
2014-02-26 00:55:11 +01:00
2014-02-24 23:13:42 +01:00
if ( ( offset = patterns [ 0 ] - > lastIndexIn ( line ) ) > = 0 )
{
bool ok = false ;
unsigned int temp = patterns [ 0 ] - > cap ( 1 ) . toUInt ( & ok ) ;
if ( ok ) frames = temp ;
}
if ( ( offset = patterns [ 1 ] - > lastIndexIn ( line ) ) > = 0 )
{
bool ok = false ;
unsigned int temp = patterns [ 1 ] - > cap ( 1 ) . toUInt ( & ok ) ;
if ( ok ) fSizeW = temp ;
}
if ( ( offset = patterns [ 2 ] - > lastIndexIn ( line ) ) > = 0 )
{
bool ok = false ;
unsigned int temp = patterns [ 2 ] - > cap ( 1 ) . toUInt ( & ok ) ;
if ( ok ) fSizeH = temp ;
}
2014-02-26 16:08:06 +01:00
if ( ( offset = patterns [ 3 ] - > lastIndexIn ( line ) ) > = 0 )
{
bool ok = false ;
unsigned int temp = patterns [ 3 ] - > cap ( 1 ) . toUInt ( & ok ) ;
if ( ok ) fpsNom = temp ;
}
if ( ( offset = patterns [ 4 ] - > lastIndexIn ( line ) ) > = 0 )
{
bool ok1 = false , ok2 = false ;
unsigned int temp1 = patterns [ 4 ] - > cap ( 1 ) . toUInt ( & ok1 ) ;
unsigned int temp2 = patterns [ 4 ] - > cap ( 2 ) . toUInt ( & ok2 ) ;
if ( ok1 & & ok2 )
{
fpsNom = temp1 ;
fpsDen = temp2 ;
}
}
2014-02-26 00:55:11 +01:00
2014-02-24 23:13:42 +01:00
if ( ! line . isEmpty ( ) )
{
log ( line ) ;
}
}
2014-02-26 00:55:11 +01:00
// ------------------------------------------------------------
// Check Source Properties
// ------------------------------------------------------------
2014-02-24 23:13:42 +01:00
void VapoursynthSource : : buildCommandLine ( QStringList & cmdLine )
{
2014-08-13 16:07:57 +02:00
cmdLine < < " --y4m " ;
2014-02-24 23:13:42 +01:00
cmdLine < < QDir : : toNativeSeparators ( x264_path2ansi ( m_sourceFile , true ) ) ;
2014-08-13 16:07:57 +02:00
cmdLine < < " - " ;
2014-02-24 23:13:42 +01:00
}
void VapoursynthSource : : flushProcess ( QProcess & processInput )
{
while ( processInput . bytesAvailable ( ) > 0 )
{
log ( tr ( " vpyp [info]: %1 " ) . arg ( QString : : fromUtf8 ( processInput . readLine ( ) ) . simplified ( ) ) ) ;
}
if ( processInput . exitCode ( ) ! = EXIT_SUCCESS )
{
const int exitCode = processInput . exitCode ( ) ;
log ( tr ( " \n WARNING: Input process exited with error (code: %1), your encode might be *incomplete* !!! " ) . arg ( QString : : number ( exitCode ) ) ) ;
if ( ( exitCode < 0 ) | | ( exitCode > = 32 ) )
{
log ( tr ( " \n IMPORTANT: The Vapoursynth process terminated abnormally. This means Vapoursynth or one of your Vapoursynth-Plugin's just crashed. " ) ) ;
}
}
}