Hello community,

here is the log from the commit of package QMPlay2 for openSUSE:Factory checked 
in at 2015-08-03 17:20:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/QMPlay2 (Old)
 and      /work/SRC/openSUSE:Factory/.QMPlay2.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "QMPlay2"

Changes:
--------
--- /work/SRC/openSUSE:Factory/QMPlay2/QMPlay2.changes  2015-07-12 
22:52:30.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.QMPlay2.new/QMPlay2.changes     2015-08-03 
17:21:29.000000000 +0200
@@ -1,0 +2,7 @@
+Mon Jul 13 18:06:19 UTC 2015 - [email protected]
+
+- Update to 15.07.13 (changes since 15.06.26):
+  * fixed problem with playing video
+    (sometimes video plays at maximum speed).
+
+-------------------------------------------------------------------

Old:
----
  QMPlay2-src-15.06.26.tar.bz2

New:
----
  QMPlay2-src-15.07.13.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ QMPlay2.spec ++++++
--- /var/tmp/diff_new_pack.Ys3e0U/_old  2015-08-03 17:21:29.000000000 +0200
+++ /var/tmp/diff_new_pack.Ys3e0U/_new  2015-08-03 17:21:29.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           QMPlay2
-Version:        15.06.26
+Version:        15.07.13
 Release:        0
 Summary:        A Qt based media player, streamer and downloader
 License:        LGPL-3.0+
@@ -63,7 +63,6 @@
 %prep
 %setup -q -n %{name}-src
 
-
 %build
 export QT_SUFFIX="-qt5"
 NOTERM=1 SYSTEM_BUILD=1 ./compile_unix `echo "%{?_smp_mflags}" | grep -o 
'[0-9]*'`
@@ -88,12 +87,10 @@
 # Setting icon to 'pixmaps' instead of 'icons'.
 mv %{buildroot}/%{_datadir}/{icons,pixmaps}
 
-
 %post   -p /sbin/ldconfig
 
 %postun -p /sbin/ldconfig
 
-
 %files
 %defattr(-,root,root)
 %doc COPYING TODO

++++++ QMPlay2-src-15.06.26.tar.bz2 -> QMPlay2-src-15.07.13.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/ChangeLog new/QMPlay2-src/ChangeLog
--- old/QMPlay2-src/ChangeLog   2015-06-26 15:43:44.000000000 +0200
+++ new/QMPlay2-src/ChangeLog   2015-07-12 23:27:07.000000000 +0200
@@ -1,3 +1,14 @@
+Changes in QMPlay2 build 15.07.13:
+       - fixed problem from previous release with playing video (sometimes 
video plays at maximum speed),
+
+Changes in QMPlay2 build 15.07.12:
+       - keyboard shortcut (Shift+L) for locking widgets,
+       - fixed seeking by searching key frames in buffer,
+       - aspect ratio is now correctly updated,
+       - fixed playback in live streams,
+       - small fixes in video playback,
+       - VAApi bugfix,
+
 Changes in QMPlay2 build 15.06.26:
        - better VSync support for OpenGL video output,
        - OpenSLES audio output (for Android),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/TODO new/QMPlay2-src/TODO
--- old/QMPlay2-src/TODO        2015-06-05 14:17:33.000000000 +0200
+++ new/QMPlay2-src/TODO        2015-07-11 13:55:16.000000000 +0200
@@ -1,3 +1,4 @@
+HEVC (H.265) on VA-API and VDPAU
 Touch screen support: scrolling
 Better radio stations
 YouTube playlists
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/compile_unix new/QMPlay2-src/compile_unix
--- old/QMPlay2-src/compile_unix        2015-06-04 17:36:29.000000000 +0200
+++ new/QMPlay2-src/compile_unix        2015-07-11 14:07:07.000000000 +0200
@@ -25,7 +25,7 @@
        fi
 fi
 
-# lupdate$QT_SUFFIX -locations none QMPlay2.pro
+# lupdate-qt4 -locations none QMPlay2.pro
 
 lrelease$QT_SUFFIX QMPlay2.pro
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/lang/de.ts new/QMPlay2-src/lang/de.ts
--- old/QMPlay2-src/lang/de.ts  2015-06-25 01:24:35.000000000 +0200
+++ new/QMPlay2-src/lang/de.ts  2015-07-11 14:07:10.000000000 +0200
@@ -2414,8 +2414,8 @@
         <translation>Nicht unterstützter 
De-Interlacing-Algorithmus</translation>
     </message>
     <message>
-        <source>Nie można otworzyć filtrów usuwających przeplot</source>
-        <translation>Kann den Filter zum Entfernen von Zeilensprung nicht 
öffnen</translation>
+        <source>Nie można otworzyć filtrów obrazu</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/lang/en.ts new/QMPlay2-src/lang/en.ts
--- old/QMPlay2-src/lang/en.ts  2015-06-25 01:24:42.000000000 +0200
+++ new/QMPlay2-src/lang/en.ts  2015-07-11 14:07:10.000000000 +0200
@@ -2400,8 +2400,8 @@
         <translation>Not supported deinterlacing algorithm</translation>
     </message>
     <message>
-        <source>Nie można otworzyć filtrów usuwających przeplot</source>
-        <translation>Cannot open deinterlacing filters</translation>
+        <source>Nie można otworzyć filtrów obrazu</source>
+        <translation>Cannot open video filters</translation>
     </message>
 </context>
 <context>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/lang/fr.ts new/QMPlay2-src/lang/fr.ts
--- old/QMPlay2-src/lang/fr.ts  2015-06-25 01:24:55.000000000 +0200
+++ new/QMPlay2-src/lang/fr.ts  2015-07-11 14:07:10.000000000 +0200
@@ -2400,8 +2400,8 @@
         <translation>Algorithme de désentrelacement non supporté</translation>
     </message>
     <message>
-        <source>Nie można otworzyć filtrów usuwających przeplot</source>
-        <translation>Ne peut ouvrir les filtres de 
désentrelacement</translation>
+        <source>Nie można otworzyć filtrów obrazu</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/lang/ru.ts new/QMPlay2-src/lang/ru.ts
--- old/QMPlay2-src/lang/ru.ts  2015-06-25 01:24:50.000000000 +0200
+++ new/QMPlay2-src/lang/ru.ts  2015-07-11 14:07:10.000000000 +0200
@@ -2400,8 +2400,8 @@
         <translation>Алгоритм деинтерлейсинга не поддерживается</translation>
     </message>
     <message>
-        <source>Nie można otworzyć filtrów usuwających przeplot</source>
-        <translation>Не удалось открыть фильтры деинтерлейсинга</translation>
+        <source>Nie można otworzyć filtrów obrazu</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/AVThread.cpp 
new/QMPlay2-src/src/gui/AVThread.cpp
--- old/QMPlay2-src/src/gui/AVThread.cpp        2015-06-04 17:36:29.000000000 
+0200
+++ new/QMPlay2-src/src/gui/AVThread.cpp        2015-07-12 23:15:11.000000000 
+0200
@@ -39,19 +39,28 @@
        if ( !mutex.tryLock( MUTEXWAIT_TIMEOUT ) )
        {
                emit QMPlay2Core.waitCursor();
-               bool ret = mutex.tryLock( MUTEXWAIT_TIMEOUT );
+               const bool ret = mutex.tryLock( MUTEXWAIT_TIMEOUT );
                emit QMPlay2Core.restoreCursor();
-               return ret;
+               if ( !ret )
+               {
+                       br2 = false;
+                       return false;
+               }
        }
        return true;
 }
+void AVThread::unlock()
+{
+       br2 = false;
+       mutex.unlock();
+}
 
 void AVThread::stop( bool _terminate )
 {
        if ( _terminate )
                return terminate();
 
-       br = br2 = true;
+       br = true;
        mutex.unlock();
        playC.emptyBufferCond.wakeAll();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/AVThread.hpp 
new/QMPlay2-src/src/gui/AVThread.hpp
--- old/QMPlay2-src/src/gui/AVThread.hpp        2015-06-04 17:36:29.000000000 
+0200
+++ new/QMPlay2-src/src/gui/AVThread.hpp        2015-07-12 19:27:28.000000000 
+0200
@@ -20,10 +20,7 @@
        }
 
        bool lock();
-       inline void unlock()
-       {
-               mutex.unlock();
-       }
+       void unlock();
 
        inline bool isWaiting() const
        {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/AudioThr.cpp 
new/QMPlay2-src/src/gui/AudioThr.cpp
--- old/QMPlay2-src/src/gui/AudioThr.cpp        2015-06-21 00:01:00.000000000 
+0200
+++ new/QMPlay2-src/src/gui/AudioThr.cpp        2015-07-12 19:50:35.000000000 
+0200
@@ -221,7 +221,6 @@
 
                        int decodedSize = decoded.size();
                        int decodedPos = 0;
-                       br2 = false;
                        while ( decodedSize > 0 && !playC.paused && !br && !br2 
)
                        {
                                const double max_len = 0.02; //TODO: zrobić 
opcje?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/DemuxerThr.cpp 
new/QMPlay2-src/src/gui/DemuxerThr.cpp
--- old/QMPlay2-src/src/gui/DemuxerThr.cpp      2015-06-05 01:49:53.000000000 
+0200
+++ new/QMPlay2-src/src/gui/DemuxerThr.cpp      2015-07-12 23:24:59.000000000 
+0200
@@ -445,7 +445,7 @@
 
                Packet packet;
                int streamIdx = -1;
-               if ( demuxer->read( packet, streamIdx, packet.ts, 
packet.duration ) )
+               if ( demuxer->read( packet, streamIdx ) )
                {
                        qApp->processEvents();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/MainWidget.cpp 
new/QMPlay2-src/src/gui/MainWidget.cpp
--- old/QMPlay2-src/src/gui/MainWidget.cpp      2015-06-25 00:02:59.000000000 
+0200
+++ new/QMPlay2-src/src/gui/MainWidget.cpp      2015-07-12 14:18:58.000000000 
+0200
@@ -259,7 +259,16 @@
 
        if ( QMPlay2Core.getSettings().getBool( "MainWidget/TabPositionNorth" ) 
)
                setTabPosition( Qt::AllDockWidgetAreas, QTabWidget::North );
-       lockWidgets( QMPlay2Core.getSettings().getBool( 
"MainWidget/WidgetsLocked", false ) );
+
+       const bool widgetsLocked = QMPlay2Core.getSettings().getBool( 
"MainWidget/WidgetsLocked", false ) ;
+       lockWidgets( widgetsLocked );
+       lockWidgetsAct = new QAction( tr( "&Zablokuj widgety" ), menuBar );
+       lockWidgetsAct->setCheckable( true );
+       lockWidgetsAct->setAutoRepeat( false );
+       lockWidgetsAct->setChecked( widgetsLocked );
+       lockWidgetsAct->setShortcut( QKeySequence( "Shift+L" ) );
+       connect( lockWidgetsAct, SIGNAL( triggered( bool ) ), this, SLOT( 
lockWidgets( bool ) ) );
+       addAction( lockWidgetsAct );
 
        fullScreenDockWidgetState = QMPlay2Core.getSettings().getByteArray( 
"MainWidget/FullScreenDockWidgetState" );
 #if defined Q_OS_MAC || defined Q_OS_ANDROID
@@ -1003,18 +1012,23 @@
 
 void MainWidget::lockWidgets( bool l )
 {
-       foreach ( QObject *o, children() )
+       if ( fullScreen || isCompactView )
+               qobject_cast< QAction * >( sender() )->setChecked( !l );
+       else
        {
-               DockWidget *dW = dynamic_cast< DockWidget * >( o );
-               if ( dW )
+               foreach ( QObject *o, children() )
                {
-                       if ( dW->isFloating() )
-                               dW->setFloating( false );
-                       dW->setGlobalTitleBarVisible( !l );
+                       DockWidget *dW = dynamic_cast< DockWidget * >( o );
+                       if ( dW )
+                       {
+                               if ( dW->isFloating() )
+                                       dW->setFloating( false );
+                               dW->setGlobalTitleBarVisible( !l );
+                       }
                }
+               mainTB->setMovable( !l );
+               QMPlay2Core.getSettings().set( "MainWidget/WidgetsLocked", l );
        }
-       mainTB->setMovable( !l );
-       QMPlay2Core.getSettings().set( "MainWidget/WidgetsLocked", l );
 }
 
 void MainWidget::hideDocksSlot()
@@ -1053,12 +1067,12 @@
 QMenu *MainWidget::createPopupMenu()
 {
        QMenu *popupMenu = QMainWindow::createPopupMenu();
-       popupMenu->addSeparator();
-       QAction *act = popupMenu->addAction( tr( "&Zablokuj widgety" ) );
-       act->setCheckable( true );
-       act->setChecked( QMPlay2Core.getSettings().getBool( 
"MainWidget/WidgetsLocked" ) );
-       connect( act, SIGNAL( triggered( bool ) ), this, SLOT( lockWidgets( 
bool ) ) );
-       foreach ( act, popupMenu->actions() )
+       if ( !fullScreen && !isCompactView )
+       {
+               popupMenu->addSeparator();
+               popupMenu->addAction( lockWidgetsAct );
+       }
+       foreach ( QAction *act, popupMenu->actions() )
                act->setEnabled( isVisible() && !fullScreen && !isCompactView );
        return popupMenu;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/MainWidget.hpp 
new/QMPlay2-src/src/gui/MainWidget.hpp
--- old/QMPlay2-src/src/gui/MainWidget.hpp      2015-06-24 20:12:47.000000000 
+0200
+++ new/QMPlay2-src/src/gui/MainWidget.hpp      2015-07-12 13:41:50.000000000 
+0200
@@ -137,6 +137,8 @@
        AboutWidget *aboutW;
        bool isCompactView, wasShow, fullScreen;
 
+       QAction *lockWidgetsAct;
+
 #ifdef UPDATER
        Updater updater;
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/PacketBuffer.cpp 
new/QMPlay2-src/src/gui/PacketBuffer.cpp
--- old/QMPlay2-src/src/gui/PacketBuffer.cpp    2015-06-04 17:36:29.000000000 
+0200
+++ new/QMPlay2-src/src/gui/PacketBuffer.cpp    2015-07-12 23:19:59.000000000 
+0200
@@ -30,7 +30,7 @@
                                durationToChange += pkt.duration;
                                sizeToChange += pkt.size();
                        }
-                       else
+                       else if ( pkt.hasKeyFrame )
                        {
                                remaining_duration -= durationToChange;
                                backward_duration += durationToChange;
@@ -46,7 +46,7 @@
                const Packet &pkt = at( i );
                durationToChange += pkt.duration;
                sizeToChange += pkt.size();
-               if ( pkt.ts <= seek_pos )
+               if ( pkt.hasKeyFrame && pkt.ts <= seek_pos )
                {
                        remaining_duration += durationToChange;
                        backward_duration -= durationToChange;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/PlayClass.cpp 
new/QMPlay2-src/src/gui/PlayClass.cpp
--- old/QMPlay2-src/src/gui/PlayClass.cpp       2015-06-26 00:22:11.000000000 
+0200
+++ new/QMPlay2-src/src/gui/PlayClass.cpp       2015-07-11 20:55:58.000000000 
+0200
@@ -103,7 +103,7 @@
        Brightness = Saturation = Contrast = Hue = 0;
 
        connect( &timTerminate, SIGNAL( timeout() ), this, SLOT( 
timTerminateFinished() ) );
-       connect( this, SIGNAL( aRatioUpdate() ), this, SLOT( aRatioUpdated() ) 
);
+       connect( this, SIGNAL( aRatioUpdate( double ) ), this, SLOT( 
aRatioUpdated( double ) ) );
 }
 
 void PlayClass::play( const QString &_url )
@@ -829,13 +829,15 @@
        }
 }
 
-void PlayClass::aRatioUpdated() //jeżeli współczynnik proporcji zmieni się 
podczas odtwarzania
+void PlayClass::aRatioUpdated( double aRatio ) //jeżeli współczynnik proporcji 
zmieni się podczas odtwarzania
 {
        if ( aRatioName == "auto" && vThr && demuxThr && demuxThr->demuxer && 
videoStream > -1 )
        {
+               demuxThr->demuxer->streamsInfo()[ videoStream ]->aspect_ratio = 
aRatio;
                double aspect_ratio = getARatio();
                if ( ass )
                        ass->setARatio( aspect_ratio );
+               vThr->setDeleteOSD();
                vThr->setARatio( aspect_ratio );
                vThr->processParams();
                demuxThr->emitInfo();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/PlayClass.hpp 
new/QMPlay2-src/src/gui/PlayClass.hpp
--- old/QMPlay2-src/src/gui/PlayClass.hpp       2015-06-24 19:30:52.000000000 
+0200
+++ new/QMPlay2-src/src/gui/PlayClass.hpp       2015-07-11 20:01:48.000000000 
+0200
@@ -156,7 +156,7 @@
        void screenShot();
        void nextFrame();
 
-       void aRatioUpdated();
+       void aRatioUpdated( double aRatio );
 
        void demuxThrFinished();
 
@@ -164,7 +164,7 @@
 
        void load( Demuxer * );
 signals:
-       void aRatioUpdate();
+       void aRatioUpdate( double aRatio );
        void chText( const QString & );
        void updateLength( int );
        void updatePos( int );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/VideoThr.cpp 
new/QMPlay2-src/src/gui/VideoThr.cpp
--- old/QMPlay2-src/src/gui/VideoThr.cpp        2015-06-26 12:14:20.000000000 
+0200
+++ new/QMPlay2-src/src/gui/VideoThr.cpp        2015-07-12 23:18:29.000000000 
+0200
@@ -15,6 +15,7 @@
 using Functions::gettime;
 using Functions::s_wait;
 
+#include <QDebug>
 #include <QImage>
 #include <QDir>
 
@@ -94,7 +95,7 @@
        Settings &QMPSettings = QMPlay2Core.getSettings();
 
        if ( processParams )
-               lock();
+               filtersMutex.lock();
 
        filters.clear();
 
@@ -149,7 +150,7 @@
 
        if ( processParams )
        {
-               unlock();
+               filtersMutex.unlock();
                if ( writer && writer->hasParam( "Deinterlace" ) )
                        writer->processParams();
        }
@@ -157,7 +158,12 @@
 
 bool VideoThr::processParams()
 {
-       return writer ? writer->processParams() : false;
+       if ( writer )
+       {
+               lastSampleAspectRatio = writer->getParam( "AspectRatio" 
).toDouble() / ( double )W * ( double )H;
+               return writer->processParams();
+       }
+       return false;
 }
 
 void VideoThr::updateSubs()
@@ -174,7 +180,7 @@
 void VideoThr::run()
 {
        bool skip = false, paused = false, oneFrame = false, useLastDelay = 
false, lastOSDListEmpty = true;
-       double tmp_time = 0.0, sync_last_pts = 0.0, frame_timer = 0.0, 
sync_timer = 0.0;
+       double tmp_time = 0.0, sync_last_pts = 0.0, frame_timer = -1.0, 
sync_timer = 0.0;
        QMutex emptyBufferMutex;
        QByteArray frame;
        unsigned fast = 0;
@@ -186,6 +192,7 @@
                if ( deleteFrame )
                {
                        VideoFrame::unref( frame );
+                       frame_timer = -1.0;
                        deleteFrame = false;
                }
 
@@ -205,6 +212,7 @@
                        {
                                emit pause();
                                paused = true;
+                               frame_timer = -1.0;
                        }
                        playC.vPackets.unlock();
 
@@ -218,7 +226,10 @@
                        emptyBufferMutex.lock();
                        playC.emptyBufferCond.wait( &emptyBufferMutex, 
MUTEXWAIT_TIMEOUT );
                        emptyBufferMutex.unlock();
-                       frame_timer = gettime();
+
+                       if ( frame_timer != -1.0 )
+                               frame_timer = gettime();
+
                        continue;
                }
                paused = waiting = false;
@@ -312,8 +323,12 @@
                deleteSubs = deleteOSD = false;
                /**/
 
+               filtersMutex.lock();
                if ( playC.flushVideo )
+               {
                        filters.clearBuffers();
+                       frame_timer = -1.0;
+               }
 
                if ( !packet.isEmpty() )
                {
@@ -332,10 +347,15 @@
                }
 
                const bool ptsIsValid = filters.getFrame( frame, packet.ts );
+               filtersMutex.unlock();
+
                if ( packet.ts.isValid() )
                {
-                       if ( dec->aspectRatioChanged() )
-                               emit playC.aRatioUpdate();
+                       if ( packet.sampleAspectRatio && lastSampleAspectRatio 
!= -1.0 && fabs( lastSampleAspectRatio - packet.sampleAspectRatio ) >= 0.000001 
) //zmiana współczynnika proporcji
+                       {
+                               lastSampleAspectRatio = -1.0; //Needs to be 
updated later
+                               emit playC.aRatioUpdate( 
packet.sampleAspectRatio * ( double )W / ( double )H ); //Sets 
lastSampleAspectRatio because it calls processParams()
+                       }
                        if ( ptsIsValid || packet.ts > playC.pos )
                                playC.chPos( packet.ts );
 
@@ -422,36 +442,34 @@
                                fast = 0;
                        }
 
-                       mutex.unlock();
-
                        if ( !frame.isEmpty() )
                        {
+                               if ( frame_timer != -1.0 )
+                               {
+                                       const double delay_diff = gettime() - 
frame_timer;
+                                       if ( syncVtoA && true_delay > 0.0 && 
delay_diff > true_delay )
+                                               ++fast;
+                                       delay -= delay_diff;
+                                       while ( delay > 0.0 && !playC.paused && 
!br && !br2 )
+                                       {
+                                               const double sleepTime = qMin( 
delay, 0.1 );
+                                               s_wait( sleepTime );
+                                               delay -= sleepTime;
+                                       }
+                               }
                                if ( !skip && canWrite )
                                {
                                        oneFrame = canWrite = false;
                                        VideoFrame::ref( frame );
                                        emit write( frame );
                                }
-
-                               const double delay_diff = gettime() - 
frame_timer;
-                               if ( syncVtoA && true_delay > 0.0 && delay_diff 
> true_delay )
-                                       ++fast;
-
-                               delay -= delay_diff;
-                               while ( delay > 0.25 )
-                               {
-                                       s_wait( 0.25 );
-                                       if ( br || playC.flushVideo || br2 )
-                                               delay = 0.0;
-                                       else
-                                               delay -= 0.25;
-                               }
-                               s_wait( delay );
+                               frame_timer = gettime();
                        }
-                       frame_timer = gettime();
+                       else if ( frame_timer != -1.0 )
+                               frame_timer = gettime();
                }
-               else
-                       mutex.unlock();
+
+               mutex.unlock();
        }
 
        VideoFrame::unref( frame );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/gui/VideoThr.hpp 
new/QMPlay2-src/src/gui/VideoThr.hpp
--- old/QMPlay2-src/src/gui/VideoThr.hpp        2015-06-26 12:14:20.000000000 
+0200
+++ new/QMPlay2-src/src/gui/VideoThr.hpp        2015-07-12 19:37:51.000000000 
+0200
@@ -25,6 +25,10 @@
        {
                syncVtoA = b;
        }
+       inline void setDeleteOSD()
+       {
+               deleteOSD = true;
+       }
 
        void destroySubtitlesDecoder();
        inline void setSubtitlesDecoder( Decoder *dec )
@@ -50,11 +54,13 @@
        void run();
 
        bool deleteSubs, syncVtoA, doScreenshot, canWrite, HWAccel, deleteOSD, 
deleteFrame;
+       double lastSampleAspectRatio;
        int W, H;
 
        Decoder *sDec;
        QMPlay2_OSD *subtitles;
        VideoFilters filters;
+       QMutex filtersMutex;
 private slots:
        void write_slot( const QByteArray & );
        void screenshot_slot( const QByteArray & );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/AudioCD/AudioCD.cpp 
new/QMPlay2-src/src/modules/AudioCD/AudioCD.cpp
--- old/QMPlay2-src/src/modules/AudioCD/AudioCD.cpp     2015-06-05 
12:35:39.000000000 +0200
+++ new/QMPlay2-src/src/modules/AudioCD/AudioCD.cpp     2015-07-11 
11:49:51.000000000 +0200
@@ -17,7 +17,7 @@
 AudioCD::AudioCD() :
        Module( "AudioCD" ),
        cdioDestroyTimer( new CDIODestroyTimer ),
-       AudioCDPlaylist( QDir::tempPath() + "/"AudioCDName".pls" )
+       AudioCDPlaylist( QDir::tempPath() + "/" AudioCDName".pls" )
 {
        moduleImg = QImage( ":/AudioCD" );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/AudioCD/AudioCD.pro 
new/QMPlay2-src/src/modules/AudioCD/AudioCD.pro
--- old/QMPlay2-src/src/modules/AudioCD/AudioCD.pro     2015-06-22 
22:52:24.000000000 +0200
+++ new/QMPlay2-src/src/modules/AudioCD/AudioCD.pro     2015-07-12 
21:32:25.000000000 +0200
@@ -12,7 +12,7 @@
        QMAKE_LIBDIR += ../../../app/lib
 }
 
-win32: LIBS += -Wl,-Bstatic -lcdio -lcddb -lregex -Wl,-Bdynamic -lwinmm 
-lws2_32
+win32: LIBS += -Wl,-Bstatic -lcdio -liconv -lcddb -lregex -Wl,-Bdynamic 
-lwinmm -lws2_32
 else {
        macx: QT_CONFIG -= no-pkg-config
        CONFIG += link_pkgconfig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.cpp 
new/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.cpp
--- old/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.cpp        2015-06-05 
13:58:58.000000000 +0200
+++ new/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.cpp        2015-07-12 
23:33:16.000000000 +0200
@@ -1,5 +1,7 @@
 #include <AudioCDDemux.hpp>
 
+#include <Packet.hpp>
+
 #ifdef Q_OS_WIN
        #include <QDir>
 #else
@@ -155,7 +157,7 @@
 {
        return ( sector = s / duration ) < numSectors;
 }
-bool AudioCDDemux::read( QByteArray &decoded, int &idx, TimeStamp &ts, double 
&duration )
+bool AudioCDDemux::read( Packet &decoded, int &idx )
 {
        if ( aborted || numSectors <= sector || isData )
                return false;
@@ -169,8 +171,8 @@
                        decoded_data[ i ] = cd_samples[ i ] / 32768.0f;
 
                idx = 0;
-               duration = this->duration;
-               ts = sector * duration;
+               decoded.ts = sector * duration;
+               decoded.duration = duration;
 
                ++sector;
                return true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.hpp 
new/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.hpp
--- old/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.hpp        2015-06-05 
02:49:46.000000000 +0200
+++ new/QMPlay2-src/src/modules/AudioCD/AudioCDDemux.hpp        2015-07-11 
00:49:02.000000000 +0200
@@ -51,7 +51,7 @@
        int bitrate() const;
 
        bool seek( int, bool );
-       bool read( QByteArray &, int &, TimeStamp &, double & );
+       bool read( Packet &, int &  );
        void abort();
 
        bool open( const QString & );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFCommon.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFCommon.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFCommon.cpp     2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFCommon.cpp     2015-07-11 
11:49:47.000000000 +0200
@@ -25,7 +25,7 @@
                if ( url.left( 4 ) == "http" )
                        av_dict_set( &options, "icy", "1", 0 );
 #endif
-               av_dict_set( &options, "user-agent", "QMPlay2/"QMPlay2Version, 
0 );
+               av_dict_set( &options, "user-agent", "QMPlay2/" QMPlay2Version, 
0 );
                if ( isLocal )
                        *isLocal = false;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFDec.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFDec.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFDec.cpp        2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFDec.cpp        2015-07-12 
01:12:21.000000000 +0200
@@ -1,4 +1,6 @@
 #include <FFDec.hpp>
+#include <FFCommon.hpp>
+
 #include <StreamInfo.hpp>
 
 extern "C"
@@ -24,18 +26,6 @@
        av_free( codec_ctx );
 }
 
-bool FFDec::aspectRatioChanged() const
-{
-       if ( codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO )
-       {
-               const int aspect_ratio = av_q2d( codec_ctx->sample_aspect_ratio 
) * 1000;
-               const bool b = last_aspect_ratio != aspect_ratio;
-               last_aspect_ratio = aspect_ratio;
-               return b;
-       }
-       return false;
-}
-
 
 AVCodec *FFDec::init( StreamInfo *_streamInfo )
 {
@@ -53,7 +43,7 @@
                codec_ctx->pix_fmt = ( AVPixelFormat )streamInfo->img_fmt;
                codec_ctx->coded_width = codec_ctx->width = streamInfo->W;
                codec_ctx->coded_height = codec_ctx->height = streamInfo->H;
-       //      codec_ctx->debug_mv = FF_DEBUG_VIS_MV_P_FOR | 
FF_DEBUG_VIS_MV_B_FOR || FF_DEBUG_VIS_MV_B_BACK;
+//             codec_ctx->debug_mv = FF_DEBUG_VIS_MV_P_FOR | 
FF_DEBUG_VIS_MV_B_FOR || FF_DEBUG_VIS_MV_B_BACK;
                if ( codec->type != AVMEDIA_TYPE_SUBTITLE && 
!streamInfo->data.isEmpty() )
                {
                        codec_ctx->extradata = ( uint8_t * 
)streamInfo->data.data();
@@ -75,7 +65,6 @@
        switch ( codec_ctx->codec_type )
        {
                case AVMEDIA_TYPE_VIDEO:
-                       last_aspect_ratio = av_q2d( 
codec_ctx->sample_aspect_ratio ) * 1000.0;
                case AVMEDIA_TYPE_AUDIO:
                        frame = av_frame_alloc();
                        break;
@@ -94,4 +83,17 @@
        packet.pts = round( encodedPacket.ts.pts() / time_base );
        if ( flush )
                avcodec_flush_buffers( codec_ctx );
+       codec_ctx->reordered_opaque = ( int64_t & 
)encodedPacket.sampleAspectRatio;
+}
+void FFDec::decodeLastStep( Packet &encodedPacket, AVFrame *frame )
+{
+       const int64_t ts = av_frame_get_best_effort_timestamp( frame );
+       if ( ts != QMPLAY2_NOPTS_VALUE )
+               encodedPacket.ts = ts * time_base;
+       if ( codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO )
+       {
+               double &sampleAspectRatio = ( double & )frame->reordered_opaque;
+               if ( !sampleAspectRatio && frame->sample_aspect_ratio.num )
+                       encodedPacket.sampleAspectRatio = av_q2d( 
frame->sample_aspect_ratio );
+       }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFDec.hpp 
new/QMPlay2-src/src/modules/FFMpeg/FFDec.hpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFDec.hpp        2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFDec.hpp        2015-07-11 
19:47:01.000000000 +0200
@@ -18,19 +18,17 @@
        FFDec( QMutex & );
        virtual ~FFDec();
 
-       bool aspectRatioChanged() const;
-
        /**/
 
        AVCodec *init( StreamInfo *streamInfo );
        bool openCodec( AVCodec *codec );
 
        void decodeFirstStep( AVPacket &packet, const Packet &encodedPacket, 
bool flush );
+       void decodeLastStep( Packet &encodedPacket, AVFrame *frame );
 
        AVCodecContext *codec_ctx;
        AVFrame *frame;
        double time_base;
-       mutable int last_aspect_ratio;
        bool codecIsOpen;
 
        QMutex &avcodec_mutex;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFDecHWAccel.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFDecHWAccel.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFDecHWAccel.cpp 2015-06-10 
21:02:50.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFDecHWAccel.cpp 2015-07-11 
19:46:30.000000000 +0200
@@ -46,8 +46,7 @@
        if ( frameFinished )
        {
                VideoFrame::create( decoded, frame->data, frame->linesize, 
frame->interlaced_frame, frame->top_field_first );
-               if ( frame->best_effort_timestamp != QMPLAY2_NOPTS_VALUE )
-                       encodedPacket.ts = frame->best_effort_timestamp * 
time_base;
+               decodeLastStep( encodedPacket, frame );
        }
        else
                encodedPacket.ts.setInvalid();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFDecSW.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFDecSW.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFDecSW.cpp      2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFDecSW.cpp      2015-07-12 
01:14:26.000000000 +0200
@@ -5,8 +5,6 @@
 #include <VideoFrame.hpp>
 #include <StreamInfo.hpp>
 
-#include <QThread> //to detect number of CPUs or CPU cores
-
 extern "C"
 {
        #include <libavformat/avformat.h>
@@ -55,13 +53,9 @@
        }
 
        int _threads = sets().getInt( "Threads" );
-       if ( _threads <= 0 )
-       {
-               _threads = QThread::idealThreadCount();
-               if ( _threads < 1 )
-                       _threads = 1;
-       }
-       if ( _threads > 16 )
+       if ( _threads < 0 )
+               _threads = 0; //Autodetect by FFMpeg
+       else if ( _threads > 16 )
                _threads = 16;
        if ( threads != _threads )
        {
@@ -204,10 +198,7 @@
        }
 
        if ( frameFinished )
-       {
-               if ( frame->best_effort_timestamp != QMPLAY2_NOPTS_VALUE )
-                       encodedPacket.ts = frame->best_effort_timestamp * 
time_base;
-       }
+               decodeLastStep( encodedPacket, frame );
        else
                encodedPacket.ts.setInvalid();
 
@@ -289,8 +280,8 @@
                if ( codec_ctx->pix_fmt == AV_PIX_FMT_NONE || streamInfo->W <= 
0 || streamInfo->H <= 0 )
                        return false;
                if ( codec->capabilities & CODEC_CAP_DR1 )
-                       codec_ctx->flags |= CODEC_FLAG_EMU_EDGE;
-               if ( ( codec_ctx->thread_count = threads ) > 1 )
+                       codec_ctx->flags |= CODEC_FLAG_EMU_EDGE; //Does nothing 
since FFMpeg 2.2
+               if ( ( codec_ctx->thread_count = threads ) != 1 )
                {
                        if ( !thread_type_slice )
                                codec_ctx->thread_type = FF_THREAD_FRAME;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFDemux.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFDemux.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFDemux.cpp      2015-06-22 
18:12:41.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFDemux.cpp      2015-07-11 
21:07:10.000000000 +0200
@@ -1,6 +1,8 @@
 #include <FFDemux.hpp>
 #include <FFCommon.hpp>
 
+#include <Packet.hpp>
+
 #include <QDebug>
 
 extern "C"
@@ -292,7 +294,7 @@
        }
        return false;
 }
-bool FFDemux::read( QByteArray &encoded, int &idx, TimeStamp &ts, double 
&duration )
+bool FFDemux::read( Packet &encoded, int &idx )
 {
        if ( aborted )
                return false;
@@ -303,14 +305,14 @@
                av_read_play( formatCtx );
        }
 
-       class Packet : public AVPacket
+       class AvQMPlay2Packet : public AVPacket
        {
        public:
-               inline Packet()
+               inline AvQMPlay2Packet()
                {
                        data = NULL;
                }
-               inline ~Packet()
+               inline ~AvQMPlay2Packet()
                {
                        if ( data )
                                av_free_packet( this );
@@ -387,24 +389,28 @@
        const double time_base = av_q2d( streams[ ff_idx ]->time_base );
 
        if ( seekByByteOffset < 0 )
-               ts.set( packet.dts * time_base, packet.pts * time_base, 
start_time );
+               encoded.ts.set( packet.dts * time_base, packet.pts * time_base, 
start_time );
        else if ( packet.pos > -1 && length() > 0.0 )
-               lastTime = ts = ( ( packet.pos - seekByByteOffset ) * length() 
) / ( avio_size( formatCtx->pb ) - seekByByteOffset );
+               lastTime = encoded.ts = ( ( packet.pos - seekByByteOffset ) * 
length() ) / ( avio_size( formatCtx->pb ) - seekByByteOffset );
        else
-               ts = lastTime;
+               encoded.ts = lastTime;
 
        if ( packet.duration > 0 )
-               duration = packet.duration * time_base;
-       else if ( !ts || ( duration = ts - lastTS ) < 0.0 /* Calculate packet 
duration if doesn't exists */ )
-               duration = 0.0;
-       lastTS = ts;
+               encoded.duration = packet.duration * time_base;
+       else if ( !encoded.ts || ( encoded.duration = encoded.ts - lastTS ) < 
0.0 /* Calculate packet duration if doesn't exists */ )
+               encoded.duration = 0.0;
+       lastTS = encoded.ts;
 
-       if ( isStreamed )
+       if ( isStreamed && isOneStreamOgg )
        {
-               ts = lastTime;
-               lastTime += duration;
+               encoded.ts = lastTime;
+               lastTime += encoded.duration;
        }
 
+       encoded.hasKeyFrame = packet.flags & AV_PKT_FLAG_KEY;
+       if ( streams[ ff_idx ]->sample_aspect_ratio.num )
+               encoded.sampleAspectRatio = av_q2d( streams[ ff_idx 
]->sample_aspect_ratio );
+
        idx = index_map.at( ff_idx );
 
        return true;
@@ -463,6 +469,8 @@
        if ( seekByByteOffset > -1 && ( isStreamed || name() != "mp3" ) )
                seekByByteOffset = -1;
 
+       isOneStreamOgg = name() == "ogg" && formatCtx->nb_streams == 1;
+
        if ( ( start_time = formatCtx->start_time / ( double )AV_TIME_BASE ) < 
0.0 )
                start_time = 0.0;
 
@@ -523,7 +531,6 @@
        const AVCodecID codecID = stream->codec->codec_id;
        if
        (
-               !stream ||
                ( stream->disposition & AV_DISPOSITION_ATTACHED_PIC ) ||
                ( stream->codec->codec_type == AVMEDIA_TYPE_DATA )    ||
                ( stream->codec->codec_type == AVMEDIA_TYPE_ATTACHMENT && 
codecID != AV_CODEC_ID_TTF && codecID != AV_CODEC_ID_OTF )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFDemux.hpp 
new/QMPlay2-src/src/modules/FFMpeg/FFDemux.hpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFDemux.hpp      2015-06-22 
18:10:39.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFDemux.hpp      2015-07-11 
21:07:10.000000000 +0200
@@ -1,5 +1,7 @@
 #include <Demuxer.hpp>
 
+#include <TimeStamp.hpp>
+
 extern "C"
 {
        #include <libavformat/version.h>
@@ -34,7 +36,7 @@
        bool localStream() const;
 
        bool seek( int, bool );
-       bool read( QByteArray &, int &, TimeStamp &, double & );
+       bool read( Packet &, int & );
        void pause();
        void abort();
 
@@ -44,7 +46,7 @@
 
        StreamInfo *getStreamInfo( AVStream *stream ) const;
        AVDictionary *getMetadata() const;
-private:
+
        QVector< int > index_map;
        QList< AVStream * > streams;
        AVFormatContext *formatCtx;
@@ -54,6 +56,7 @@
        mutable bool isMetadataChanged;
        double lastTime, start_time;
        qint64 seekByByteOffset;
+       bool isOneStreamOgg;
 
        int lastErr;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFMpeg.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFMpeg.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFMpeg.cpp       2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFMpeg.cpp       2015-07-11 
16:54:27.000000000 +0200
@@ -57,7 +57,9 @@
        static bool firstTime = true;
        if ( firstTime )
        {
+#ifndef QT_DEBUG
                av_log_set_level( AV_LOG_FATAL );
+#endif
                av_register_all();
                firstTime = false;
        }
@@ -98,7 +100,7 @@
 void *FFMpeg::createInstance( const QString &name )
 {
        if ( name == DemuxerName && getBool( "DemuxerEnabled" ) )
-               return static_cast< Demuxer * >( new FFDemux( mutex, *this ) );
+               return new FFDemux( mutex, *this );
        else if ( name == DecoderName && getBool( "DecoderEnabled" ) )
                return new FFDecSW( mutex, *this );
 #ifdef QMPlay2_VDPAU
@@ -114,7 +116,7 @@
                return new FFDecVAAPI( mutex, *this );
 #endif
        else if ( name == FFReaderName )
-               return new FFReader( *this );
+               return new FFReader;
        return NULL;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFReader.cpp 
new/QMPlay2-src/src/modules/FFMpeg/FFReader.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFReader.cpp     2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFReader.cpp     2015-07-11 
16:54:22.000000000 +0200
@@ -13,12 +13,10 @@
 
 /**/
 
-FFReader::FFReader( Module &module ) :
+FFReader::FFReader() :
        avioCtx( NULL ),
        aborted( false ), paused( false ), canRead( false )
-{
-       SetModule( module );
-}
+{}
 
 bool FFReader::readyRead() const
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/FFReader.hpp 
new/QMPlay2-src/src/modules/FFMpeg/FFReader.hpp
--- old/QMPlay2-src/src/modules/FFMpeg/FFReader.hpp     2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/FFReader.hpp     2015-07-11 
16:54:15.000000000 +0200
@@ -8,7 +8,7 @@
 class FFReader : public Reader
 {
 public:
-       FFReader( Module &module );
+       FFReader();
 private:
        bool readyRead() const;
        bool canSeek() const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.cpp 
new/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.cpp
--- old/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.cpp  2015-06-26 
11:54:47.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.cpp  2015-07-11 
14:06:52.000000000 +0200
@@ -142,7 +142,7 @@
 #ifdef HAVE_VPP
        if ( use_vpp )
        {
-               const bool do_vpp_deint = field != 0 && vpp_deint != 
VA_INVALID_ID;
+               const bool do_vpp_deint = field != 0 && vpp_buffers[ 
VAProcFilterDeinterlacing ] != VA_INVALID_ID;
                bool vpp_ok = false;
 
                if ( !do_vpp_deint )
@@ -159,10 +159,10 @@
                if ( do_vpp_deint && !vpp_second )
                {
                        VAProcFilterParameterBufferDeinterlacing *deint_params 
= NULL;
-                       if ( vaMapBuffer( VADisp, vpp_deint, ( void ** 
)&deint_params ) == VA_STATUS_SUCCESS )
+                       if ( vaMapBuffer( VADisp, vpp_buffers[ 
VAProcFilterDeinterlacing ], ( void ** )&deint_params ) == VA_STATUS_SUCCESS )
                        {
                                deint_params->flags = field == VA_TOP_FIELD ? 
VPP_TFF : VPP_BFF;
-                               vaUnmapBuffer( VADisp, vpp_deint );
+                               vaUnmapBuffer( VADisp, vpp_buffers[ 
VAProcFilterDeinterlacing ] );
                        }
                }
 
@@ -175,13 +175,17 @@
                                memset( pipeline_param, 0, sizeof 
*pipeline_param );
                                pipeline_param->surface = curr_id;
                                pipeline_param->output_background_color = 
0xFF000000;
-                               if ( do_vpp_deint )
+
+                               pipeline_param->num_filters = 1;
+                               if ( !do_vpp_deint )
+                                       pipeline_param->filters = &vpp_buffers[ 
VAProcFilterNone ];
+                               else
                                {
-                                       pipeline_param->num_filters = 1;
-                                       pipeline_param->filters = &vpp_deint;
+                                       pipeline_param->filters = &vpp_buffers[ 
VAProcFilterDeinterlacing ];
                                        pipeline_param->num_forward_references 
= 1;
                                        pipeline_param->forward_references = 
&forward_reference;
                                }
+
                                vaUnmapBuffer( VADisp, pipeline_buf );
                                if ( vaBeginPicture( VADisp, context_vpp, 
id_vpp ) == VA_STATUS_SUCCESS )
                                {
@@ -498,6 +502,11 @@
                        num_filters = 0;
                if ( num_filters )
                {
+                       /* Creating dummy filter (some drivers/api versions 
crashes without any filter) */
+                       VAProcFilterParameterBufferBase none_params = { 
VAProcFilterNone };
+                       if ( vaCreateBuffer( VADisp, context_vpp, 
VAProcFilterParameterBufferType, sizeof none_params, 1, &none_params, 
&vpp_buffers[ VAProcFilterNone ] ) != VA_STATUS_SUCCESS )
+                               vpp_buffers[ VAProcFilterNone ] = VA_INVALID_ID;
+                       /* Searching deinterlacing filter */
                        if ( vpp_deint_type != VAProcDeinterlacingNone )
                                for ( unsigned i = 0 ; i < num_filters ; ++i )
                                        if ( filters[ i ] == 
VAProcFilterDeinterlacing )
@@ -534,16 +543,16 @@
                                                if ( vpp_deint_type != 
VAProcDeinterlacingNone )
                                                {
                                                        
VAProcFilterParameterBufferDeinterlacing deint_params = { 
VAProcFilterDeinterlacing, vpp_deint_type, VPP_TFF };
-                                                       if ( vaCreateBuffer( 
VADisp, context_vpp, VAProcFilterParameterBufferType, sizeof deint_params, 1, 
&deint_params, &vpp_deint ) != VA_STATUS_SUCCESS )
-                                                               vpp_deint = 
VA_INVALID_ID;
+                                                       if ( vaCreateBuffer( 
VADisp, context_vpp, VAProcFilterParameterBufferType, sizeof deint_params, 1, 
&deint_params, &vpp_buffers[ VAProcFilterDeinterlacing ] ) != VA_STATUS_SUCCESS 
)
+                                                               vpp_buffers[ 
VAProcFilterDeinterlacing ] = VA_INVALID_ID;
                                                }
                                                break;
                                        }
                        return;
                }
        }
-       if ( vpp_deint_type != VAProcDeinterlacingNone )
-               QMPlay2Core.log( tr( "Nie można otworzyć filtrów usuwających 
przeplot" ), ErrorLog | LogOnce );
+       if ( vpp_deint_type != VAProcDeinterlacingNone ) //Show error only when 
filter is required
+               QMPlay2Core.log( "VA-API :: " + tr( "Nie można otworzyć filtrów 
obrazu" ), ErrorLog | LogOnce );
        clr_vpp();
 #endif
 }
@@ -696,8 +705,9 @@
 #ifdef HAVE_VPP
        if ( use_vpp )
        {
-               if ( vpp_deint != VA_INVALID_ID )
-                       vaDestroyBuffer( VADisp, vpp_deint );
+               for ( int i = 0 ; i < VAProcFilterCount ; ++i )
+                       if ( vpp_buffers[ i ] != VA_INVALID_ID )
+                               vaDestroyBuffer( VADisp, vpp_buffers[ i ] );
                if ( id_vpp != VA_INVALID_SURFACE )
                        vaDestroySurfaces( VADisp, &id_vpp, 1 );
                if ( context_vpp )
@@ -707,7 +717,8 @@
                use_vpp = false;
        }
        id_vpp = forward_reference = VA_INVALID_SURFACE;
-       vpp_deint = VA_INVALID_ID;
+       for ( int i = 0 ; i < VAProcFilterCount ; ++i )
+               vpp_buffers[ i ] = VA_INVALID_ID;
        vpp_second = false;
        context_vpp = 0;
        config_vpp = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.hpp 
new/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.hpp
--- old/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.hpp  2015-06-10 
21:07:48.000000000 +0200
+++ new/QMPlay2-src/src/modules/FFMpeg/VAApiWriter.hpp  2015-07-11 
13:52:38.000000000 +0200
@@ -113,7 +113,7 @@
 #ifdef HAVE_VPP //Postprocessing
        VAContextID context_vpp;
        VAConfigID config_vpp;
-       VABufferID vpp_deint;
+       VABufferID vpp_buffers[ VAProcFilterCount ]; //TODO implement all 
filters
        VAProcDeinterlacingType vpp_deint_type;
        VASurfaceID id_vpp, forward_reference;
        bool use_vpp, vpp_second;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Inputs/PCM.cpp 
new/QMPlay2-src/src/modules/Inputs/PCM.cpp
--- old/QMPlay2-src/src/modules/Inputs/PCM.cpp  2015-06-04 17:36:29.000000000 
+0200
+++ new/QMPlay2-src/src/modules/Inputs/PCM.cpp  2015-07-11 17:41:04.000000000 
+0200
@@ -1,6 +1,7 @@
 #include <PCM.hpp>
 
 #include <ByteArray.hpp>
+#include <Packet.hpp>
 #include <Reader.hpp>
 
 /**/
@@ -61,12 +62,12 @@
        int filePos = offset + s * srate * chn * bytes[ fmt ];
        return reader->seek( filePos );
 }
-bool PCM::read( QByteArray &decoded, int &idx, TimeStamp &ts, double &duration 
)
+bool PCM::read( Packet &decoded, int &idx )
 {
        if ( reader.isAborted() )
                return false;
 
-       ts = ( reader->pos() - offset ) / ( double )bytes[ fmt ] / chn / srate;
+       decoded.ts = ( reader->pos() - offset ) / ( double )bytes[ fmt ] / chn 
/ srate;
 
        QByteArray dataBA = reader->read( chn * bytes[ fmt ] * 256 );
        const int samples_with_channels = dataBA.size() / bytes[ fmt ];
@@ -104,7 +105,7 @@
        }
 
        idx = 0;
-       duration = decoded.size() / chn / sizeof( float ) / ( double )srate;
+       decoded.duration = decoded.size() / chn / sizeof( float ) / ( double 
)srate;
 
        return decoded.size();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Inputs/PCM.hpp 
new/QMPlay2-src/src/modules/Inputs/PCM.hpp
--- old/QMPlay2-src/src/modules/Inputs/PCM.hpp  2015-06-04 17:36:29.000000000 
+0200
+++ new/QMPlay2-src/src/modules/Inputs/PCM.hpp  2015-07-11 00:48:37.000000000 
+0200
@@ -19,7 +19,7 @@
        int bitrate() const;
 
        bool seek( int, bool );
-       bool read( QByteArray &, int &, TimeStamp &, double & );
+       bool read( Packet &, int & );
        void abort();
 
        bool open( const QString & );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Inputs/Rayman2.cpp 
new/QMPlay2-src/src/modules/Inputs/Rayman2.cpp
--- old/QMPlay2-src/src/modules/Inputs/Rayman2.cpp      2015-06-20 
23:45:05.000000000 +0200
+++ new/QMPlay2-src/src/modules/Inputs/Rayman2.cpp      2015-07-11 
17:41:04.000000000 +0200
@@ -1,6 +1,7 @@
 #include <Rayman2.hpp>
 
 #include <ByteArray.hpp>
+#include <Packet.hpp>
 #include <Reader.hpp>
 
 /**/
@@ -104,12 +105,12 @@
        }
        return true;
 }
-bool Rayman2::read( QByteArray &decoded, int &idx, TimeStamp &ts, double 
&duration )
+bool Rayman2::read( Packet &decoded, int &idx )
 {
        if ( reader.isAborted() )
                return false;
 
-       ts = ( reader->pos() - 0x64 ) * 2.0 / chn / srate;
+       decoded.ts = ( reader->pos() - 0x64 ) * 2.0 / chn / srate;
 
        QByteArray sampleCodes = reader->read( chn * 256 );
        for ( int i = 0 ; !reader.isAborted() && i + chn <= sampleCodes.size() 
; i += chn )
@@ -124,7 +125,7 @@
                return false;
 
        idx = 0;
-       duration = decoded.size() / chn / sizeof( float ) / ( double )srate;
+       decoded.duration = decoded.size() / chn / sizeof( float ) / ( double 
)srate;
 
        return !reader.isAborted();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Inputs/Rayman2.hpp 
new/QMPlay2-src/src/modules/Inputs/Rayman2.hpp
--- old/QMPlay2-src/src/modules/Inputs/Rayman2.hpp      2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/Inputs/Rayman2.hpp      2015-07-11 
00:49:11.000000000 +0200
@@ -17,7 +17,7 @@
        int bitrate() const;
 
        bool seek( int, bool );
-       bool read( QByteArray &, int &, TimeStamp &, double & );
+       bool read( Packet &, int & );
        void abort();
 
        bool open( const QString & );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Inputs/ToneGenerator.cpp 
new/QMPlay2-src/src/modules/Inputs/ToneGenerator.cpp
--- old/QMPlay2-src/src/modules/Inputs/ToneGenerator.cpp        2015-06-05 
13:38:52.000000000 +0200
+++ new/QMPlay2-src/src/modules/Inputs/ToneGenerator.cpp        2015-07-11 
17:41:04.000000000 +0200
@@ -1,5 +1,7 @@
 #include <ToneGenerator.hpp>
 
+#include <Packet.hpp>
+
 #include <QUrl>
 #if QT_VERSION < 0x050000
        #define QUrlQuery( url ) url
@@ -76,7 +78,7 @@
 {
        return false;
 }
-bool ToneGenerator::read( QByteArray &decoded, int &idx, TimeStamp &ts, double 
&duration )
+bool ToneGenerator::read( Packet &decoded, int &idx )
 {
        if ( aborted )
                return false;
@@ -91,9 +93,9 @@
                        samples[ i+c ] = sin( 2.0 * M_PI * freqs[ c ] * i / 
srate / chn ); //don't use sinf()!
 
        idx = 0;
-       ts = pos;
-       duration = 1.0;
-       pos += duration;
+       decoded.ts = pos;
+       decoded.duration = 1.0;
+       pos += decoded.duration;
 
        return true;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Inputs/ToneGenerator.hpp 
new/QMPlay2-src/src/modules/Inputs/ToneGenerator.hpp
--- old/QMPlay2-src/src/modules/Inputs/ToneGenerator.hpp        2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/Inputs/ToneGenerator.hpp        2015-07-11 
00:47:46.000000000 +0200
@@ -20,7 +20,7 @@
        bool dontUseBuffer() const;
 
        bool seek( int, bool );
-       bool read( QByteArray &, int &, TimeStamp &, double & );
+       bool read( Packet &, int & );
        void abort();
 
        bool open( const QString & );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Modplug/MPDemux.cpp 
new/QMPlay2-src/src/modules/Modplug/MPDemux.cpp
--- old/QMPlay2-src/src/modules/Modplug/MPDemux.cpp     2015-06-20 
23:55:58.000000000 +0200
+++ new/QMPlay2-src/src/modules/Modplug/MPDemux.cpp     2015-07-11 
17:41:04.000000000 +0200
@@ -1,6 +1,8 @@
 #include <MPDemux.hpp>
-#include <Reader.hpp>
+
 #include <Functions.hpp>
+#include <Packet.hpp>
+#include <Reader.hpp>
 
 #include <libmodplug/modplug.h>
 
@@ -110,7 +112,7 @@
        pos = val;
        return true;
 }
-bool MPDemux::read( QByteArray &decoded, int &idx, TimeStamp &ts, double 
&duration )
+bool MPDemux::read( Packet &decoded, int &idx )
 {
        if ( aborted )
                return false;
@@ -127,9 +129,9 @@
                decodedFloat[ i ] = decodedInt[ i ] / 2147483648.0;
 
        idx = 0;
-       ts = pos;
-       duration = ( double )decoded.size() / ( 44100*2*4 ); //SRATE * CHN * 
BITS/8
-       pos += duration;
+       decoded.ts = pos;
+       decoded.duration = ( double )decoded.size() / ( 44100*2*4 ); //SRATE * 
CHN * BITS/8
+       pos += decoded.duration;
 
        return true;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/modules/Modplug/MPDemux.hpp 
new/QMPlay2-src/src/modules/Modplug/MPDemux.hpp
--- old/QMPlay2-src/src/modules/Modplug/MPDemux.hpp     2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/modules/Modplug/MPDemux.hpp     2015-07-11 
00:47:25.000000000 +0200
@@ -23,7 +23,7 @@
        int bitrate() const;
 
        bool seek( int, bool );
-       bool read( QByteArray &, int &, TimeStamp &, double & );
+       bool read( Packet &, int & );
        void abort();
 
        bool open( const QString & );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/qmplay2/headers/Decoder.hpp 
new/QMPlay2-src/src/qmplay2/headers/Decoder.hpp
--- old/QMPlay2-src/src/qmplay2/headers/Decoder.hpp     2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/qmplay2/headers/Decoder.hpp     2015-07-11 
16:34:34.000000000 +0200
@@ -19,7 +19,6 @@
 
        virtual QString name() const = 0;
 
-       virtual bool aspectRatioChanged() const { return false; }
        virtual Writer *HWAccel() const { return NULL; }
 
        /*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/qmplay2/headers/Demuxer.hpp 
new/QMPlay2-src/src/qmplay2/headers/Demuxer.hpp
--- old/QMPlay2-src/src/qmplay2/headers/Demuxer.hpp     2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/qmplay2/headers/Demuxer.hpp     2015-07-11 
00:50:07.000000000 +0200
@@ -4,10 +4,11 @@
 #include <ModuleCommon.hpp>
 #include <IOController.hpp>
 #include <StreamInfo.hpp>
-#include <TimeStamp.hpp>
 
 #include <QString>
 
+struct Packet;
+
 class Demuxer : protected ModuleCommon, public BasicIO
 {
 public:
@@ -70,7 +71,7 @@
        }
 
        virtual bool seek( int, bool backward = false ) = 0;
-       virtual bool read( QByteArray &, int &, TimeStamp &, double & ) = 0;
+       virtual bool read( Packet &, int & ) = 0;
 
        virtual ~Demuxer() {}
 private:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/qmplay2/headers/Packet.hpp 
new/QMPlay2-src/src/qmplay2/headers/Packet.hpp
--- old/QMPlay2-src/src/qmplay2/headers/Packet.hpp      2015-06-04 
17:36:29.000000000 +0200
+++ new/QMPlay2-src/src/qmplay2/headers/Packet.hpp      2015-07-11 
19:57:53.000000000 +0200
@@ -7,13 +7,19 @@
 
 struct Packet : public QByteArray
 {
+       inline Packet() :
+               sampleAspectRatio( 0.0 ),
+               hasKeyFrame( true )
+       {}
+
        inline void reset()
        {
                *this = Packet();
        }
 
        TimeStamp ts;
-       double duration;
+       double duration, sampleAspectRatio;
+       bool hasKeyFrame;
 };
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/QMPlay2-src/src/qmplay2/headers/QMPlay2Core.hpp 
new/QMPlay2-src/src/qmplay2/headers/QMPlay2Core.hpp
--- old/QMPlay2-src/src/qmplay2/headers/QMPlay2Core.hpp 2015-06-26 
15:43:37.000000000 +0200
+++ new/QMPlay2-src/src/qmplay2/headers/QMPlay2Core.hpp 2015-07-12 
23:02:39.000000000 +0200
@@ -1,7 +1,7 @@
 #ifndef QMPLAY2CORE_HPP
 #define QMPLAY2CORE_HPP
 
-#define QMPlay2Version "15.06.26"
+#define QMPlay2Version "15.07.13"
 
 #if defined(__i386) || defined(__i386__) || defined(_M_IX86) || (__x86_64) || 
defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
        #define QMPLAY2_CPU_X86


Reply via email to