Index: trunk/kdesupport/phonon/ds9/mediaobject.h
===================================================================
--- trunk/kdesupport/phonon/ds9/mediaobject.h	(revision 971606)
+++ trunk/kdesupport/phonon/ds9/mediaobject.h	(working copy)
@@ -182,6 +182,7 @@
             void stop();
             void ensureStopped();
             void seek(qint64 time);
+            void setRate(double rate);
 
             QString errorString() const;
             Phonon::ErrorType errorType() const;
@@ -251,6 +252,10 @@
             void totalTimeChanged(qint64 length) const;
             void currentSourceChanged(const MediaSource &);
 
+            // Of all the signals, not one can be safely used to denote a load
+            // completion.
+            void loadingFinished();
+
         protected:
             void setState(Phonon::State);
             void timerEvent(QTimerEvent *e);
Index: trunk/kdesupport/phonon/ds9/mediaobject.cpp
===================================================================
--- trunk/kdesupport/phonon/ds9/mediaobject.cpp	(revision 971606)
+++ trunk/kdesupport/phonon/ds9/mediaobject.cpp	(working copy)
@@ -650,6 +650,10 @@
             }
         }
 
+        void MediaObject::setRate(double rate) {
+            currentGraph()->setRate(rate);
+        }
+
         QString MediaObject::errorString() const
         {
             return m_errorString;
@@ -786,6 +790,8 @@
                 emit metaDataChanged(currentGraph()->metadata());
                 emit totalTimeChanged(totalTime());
 
+                emit loadingFinished();
+
                 //let's put the next state
                 switch(m_nextState)
                 {
Index: trunk/kdesupport/phonon/ds9/mediagraph.h
===================================================================
--- trunk/kdesupport/phonon/ds9/mediagraph.h	(revision 971606)
+++ trunk/kdesupport/phonon/ds9/mediagraph.h	(working copy)
@@ -47,6 +47,7 @@
             void stop();
             void pause();
             void absoluteSeek(qint64);
+            void setRate(double rate);
 
             QMultiMap<QString, QString> metadata() const;
 
Index: trunk/kdesupport/phonon/ds9/mediagraph.cpp
===================================================================
--- trunk/kdesupport/phonon/ds9/mediagraph.cpp	(revision 971606)
+++ trunk/kdesupport/phonon/ds9/mediagraph.cpp	(working copy)
@@ -372,6 +372,11 @@
             m_seekId = m_mediaObject->workerThread()->addSeekRequest(m_graph, time);
         }
 
+        void MediaGraph::setRate(double rate) {
+            ComPointer<IMediaSeeking> mediaSeeking(m_graph, IID_IMediaSeeking);
+            mediaSeeking->SetRate(rate);
+        }
+
         HRESULT MediaGraph::removeFilter(const Filter& filter)
         {
             FILTER_INFO info;
Index: trunk/kdesupport/phonon/ds9/videowidget.cpp
===================================================================
--- trunk/kdesupport/phonon/ds9/videowidget.cpp	(revision 971606)
+++ trunk/kdesupport/phonon/ds9/videowidget.cpp	(working copy)
@@ -171,6 +171,9 @@
             //initialisation of the widget
             m_widget = new VideoWindow(parent, this);
 
+            // Bugfix here. VideoWindow has some arbitrary default size. Follow parent's size.
+            m_widget->setFixedSize(parent->size());
+
             //initialization of the renderers
             qMemSet(m_renderers, 0, sizeof(m_renderers));
 
