[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/runtime/phonon/xine
From:       Matthias Kretz <kretz () kde ! org>
Date:       2008-08-10 20:10:25
Message-ID: 1218399025.170852.11123.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 844875 by mkretz:

make VideoDataOutput work using Experimental::VideoDataOutputInterface

add some debug on connect


 M  +1 -1      CMakeLists.txt  
 M  +10 -8     backend.cpp  
 M  +124 -35   videodataoutput.cpp  
 M  +4 -0      videodataoutput.h  


--- trunk/KDE/kdebase/runtime/phonon/xine/CMakeLists.txt #844874:844875
@@ -14,7 +14,7 @@
     effect.cpp
     audiooutput.cpp
     mediaobject.cpp
-    #videodataoutput.cpp
+   videodataoutput.cpp
     visualization.cpp
     backend.cpp
     volumefadereffect.cpp
--- trunk/KDE/kdebase/runtime/phonon/xine/backend.cpp #844874:844875
@@ -20,7 +20,7 @@
 */
 
 #include "backend.h"
-//#include <phonon/experimental/backendinterface.h>
+#include <phonon/experimental/backendinterface.h>
 #include "mediaobject.h"
 #include "effect.h"
 #include "events.h"
@@ -29,7 +29,7 @@
 #include "nullsink.h"
 #include "visualization.h"
 #include "volumefadereffect.h"
-//#include "videodataoutput.h"
+#include "videodataoutput.h"
 #include "videowidget.h"
 #include "wirecall.h"
 #include "xinethread.h"
@@ -157,10 +157,9 @@
         return new AudioDataOutput(parent);
     case VisualizationClass:
         return new Visualization(parent);
-    case VideoDataOutputClass:
-    //case Phonon::Experimental::BackendInterface::VideoDataOutputClass:
-        //return new VideoDataOutput(parent);
-        return 0;
+    //case VideoDataOutputClass:
+    case Phonon::Experimental::BackendInterface::VideoDataOutputClass:
+        return new VideoDataOutput(parent);
     case EffectClass:
         {
             Q_ASSERT(args.size() == 1);
@@ -352,7 +351,7 @@
 
 bool Backend::connectNodes(QObject *_source, QObject *_sink)
 {
-    kDebug(610);
+    kDebug(610) << _source << "->" << _sink;
     SourceNode *source = qobject_cast<SourceNode *>(_source);
     SinkNode *sink = qobject_cast<SinkNode *>(_sink);
     if (!source || !sink) {
@@ -391,12 +390,13 @@
 
 bool Backend::disconnectNodes(QObject *_source, QObject *_sink)
 {
-    kDebug(610);
+    kDebug(610) << _source << "XX" << _sink;
     SourceNode *source = qobject_cast<SourceNode *>(_source);
     SinkNode *sink = qobject_cast<SinkNode *>(_sink);
     if (!source || !sink) {
         return false;
     }
+    kDebug(610) << source->threadSafeObject().data() << "XX" << \
                sink->threadSafeObject().data();
     const MediaStreamTypes types = source->outputMediaStreamTypes() & \
sink->inputMediaStreamTypes();  if (!source->sinks().contains(sink) || sink->source() \
!= source) {  return false;
@@ -464,6 +464,8 @@
                 }
             }
             sink->findXineEngine();
+        } else if (!source) {
+            kDebug(610) << q << "is neither a source nor a sink";
         }
         ConnectNotificationInterface *connectNotify = \
qobject_cast<ConnectNotificationInterface *>(q);  if (connectNotify) {
--- trunk/KDE/kdebase/runtime/phonon/xine/videodataoutput.cpp #844874:844875
@@ -1,5 +1,5 @@
 /*  This file is part of the KDE project
-    Copyright (C) 2006 Matthias Kretz <kretz@kde.org>
+    Copyright (C) 2006,2008 Matthias Kretz <kretz@kde.org>
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -19,12 +19,20 @@
 */
 
 #include "videodataoutput.h"
-#include <kdebug.h>
+
+#include "events.h"
+#include "keepreference.h"
 #include "sourcenode.h"
+#include "wirecall.h"
+#include "xinethread.h"
+
+#include <QtCore/QCoreApplication>
+
+#include <KDE/KDebug>
+
 #include <Phonon/Experimental/AbstractVideoDataOutput>
+#include <Phonon/Experimental/VideoFrame2>
 
-#define K_XT(type) (static_cast<type *>(SinkNode::threadSafeObject().data()))
-
 namespace Phonon
 {
 namespace Xine
@@ -34,49 +42,44 @@
     public:
         VideoDataOutputXT();
         ~VideoDataOutputXT();
-        xine_video_port_t *videoPort() const { return m_videoPort; }
+        xine_video_port_t *videoPort() const;
         void rewireTo(SourceNodeXT *);
+        bool setFrontendObject(Experimental::AbstractVideoDataOutput *x);
 
         Phonon::Experimental::AbstractVideoDataOutput *m_frontend;
     private:
-        struct Frame
-        {
-            int format;
-            int width;
-            int height;
-            double aspectRatio;
-            void *data0;
-            void *data1;
-            void *data2;
-        };
+#ifdef XINE_VISUAL_TYPE_RAW
         static void raw_output_cb(void *user_data, int frame_format, int \
                frame_width,
                 int frame_height, double frame_aspect, void *data0, void *data1, \
                void *data2);
         static void raw_overlay_cb(void *user_data, int num_ovl, raw_overlay_t \
                *overlay_array);
-
-#ifdef XINE_VISUAL_TYPE_RAW
         raw_visual_t m_visual;
 #endif
+        int m_supported_formats;
+    public:
+        bool m_needNewPort;
         xine_video_port_t *m_videoPort;
 };
 
+#ifdef XINE_VISUAL_TYPE_RAW
 void VideoDataOutputXT::raw_output_cb(void *user_data, int format, int width,
         int height, double aspect, void *data0, void *data1, void *data2)
 {
+    kDebug(610);
     VideoDataOutputXT* vw = reinterpret_cast<VideoDataOutputXT *>(user_data);
-    const Experimental::VideoFrame f = {
+    const Experimental::VideoFrame2 f = {
         width,
         height,
         aspect,
-        ((format == XINE_VORAW_YV12) ? Experimental::VideoFrame::Format_YV12 :
-         (format == XINE_VORAW_YUY2) ? Experimental::VideoFrame::Format_YUY2 :
-         (format == XINE_VORAW_RGB ) ? Experimental::VideoFrame::Format_RGB888 :
-                                       Experimental::VideoFrame::Format_Invalid),
+        ((format == XINE_VORAW_YV12) ? Experimental::VideoFrame2::Format_YV12 :
+         (format == XINE_VORAW_YUY2) ? Experimental::VideoFrame2::Format_YUY2 :
+         (format == XINE_VORAW_RGB ) ? Experimental::VideoFrame2::Format_RGB888 :
+                                       Experimental::VideoFrame2::Format_Invalid),
         QByteArray::fromRawData(reinterpret_cast<const char *>(data0), ((format == \
                XINE_VORAW_RGB) ? 3 : (format == XINE_VORAW_YUY2) ? 2 : 1) * width * \
                height),
         QByteArray::fromRawData(reinterpret_cast<const char *>(data1), (format == \
                XINE_VORAW_YV12) ? (width >> 1) + (height >> 1) : 0),
         QByteArray::fromRawData(reinterpret_cast<const char *>(data2), (format == \
XINE_VORAW_YV12) ? (width >> 1) + (height >> 1) : 0)  };
     if (vw->m_frontend) {
-        //kDebug(610) << "send frame to frontend";
+        kDebug(610) << "calling frameReady on the frontend";
         vw->m_frontend->frameReady(f);
     }
 }
@@ -87,19 +90,19 @@
     Q_UNUSED(vw);
     Q_UNUSED(num_ovl);
     Q_UNUSED(overlay_array);
+    // TODO do we want to handle overlays? How?
 }
+#endif
 
 VideoDataOutputXT::VideoDataOutputXT()
     : m_frontend(0),
+#ifdef XINE_VISUAL_TYPE_RAW
+    m_supported_formats(XINE_VORAW_YV12 | XINE_VORAW_YUY2 | XINE_VORAW_RGB),
+    m_needNewPort(true),
+#endif
     m_videoPort(0)
 {
-#ifdef XINE_VISUAL_TYPE_RAW
-    m_visual.user_data = static_cast<void *>(this);
-    m_visual.raw_output_cb = &Phonon::Xine::VideoDataOutputXT::raw_output_cb;
-    m_visual.raw_overlay_cb = &Phonon::Xine::VideoDataOutputXT::raw_overlay_cb;
-    m_visual.supported_formats = /*XINE_VORAW_YV12 | XINE_VORAW_YUY2 |*/ \
                XINE_VORAW_RGB; // TODO
-    m_videoPort = xine_open_video_driver(XineEngine::xine(), "auto", \
                XINE_VISUAL_TYPE_RAW, static_cast<void *>(&m_visual));
-#endif
+    m_xine = Backend::xine();
 }
 
 VideoDataOutputXT::~VideoDataOutputXT()
@@ -108,7 +111,9 @@
         xine_video_port_t *vp = m_videoPort;
         m_videoPort = 0;
 
-        xine_close_video_driver(XineEngine::xine(), vp);
+        if (vp) {
+            xine_close_video_driver(m_xine, vp);
+        }
     }
 }
 
@@ -122,26 +127,110 @@
 {
 }
 
+xine_video_port_t *VideoDataOutputXT::videoPort() const
+{
+#ifdef XINE_VISUAL_TYPE_RAW
+    if (m_needNewPort) {
+        VideoDataOutputXT *that = const_cast<VideoDataOutputXT *>(this);
+        that->m_needNewPort = false;
+        that->m_visual.user_data = static_cast<void *>(that);
+        that->m_visual.supported_formats = m_supported_formats;
+        that->m_visual.raw_output_cb = \
&Phonon::Xine::VideoDataOutputXT::raw_output_cb; +        \
that->m_visual.raw_overlay_cb = &Phonon::Xine::VideoDataOutputXT::raw_overlay_cb; +   \
kDebug(610) << "create new raw video port with supported_formats =" << \
that->m_visual.supported_formats; +        xine_video_port_t *newVideoPort = \
xine_open_video_driver(m_xine, "auto", XINE_VISUAL_TYPE_RAW, static_cast<void \
*>(&that->m_visual)); +        if (m_videoPort) {
+            // TODO delayed destruction of m_videoPort
+        }
+        that->m_videoPort = newVideoPort;
+        return newVideoPort;
+    }
+#endif
+    return m_videoPort;
+}
+
 void VideoDataOutputXT::rewireTo(SourceNodeXT *source)
 {
+    kDebug(610);
     if (!source->videoOutputPort()) {
         return;
     }
+    kDebug(610) << "do something";
     xine_post_wire_video_port(source->videoOutputPort(), videoPort());
 }
 
 Experimental::AbstractVideoDataOutput *VideoDataOutput::frontendObject() const
 {
-    return K_XT(const VideoDataOutputXT)->m_frontend;
+    K_XT(const VideoDataOutput);
+    return xt->m_frontend;
 }
 
+bool VideoDataOutputXT::setFrontendObject(Experimental::AbstractVideoDataOutput *x)
+{
+    m_frontend = x;
+#ifdef XINE_VISUAL_TYPE_RAW
+    if (m_frontend) {
+        int supported_formats = 0;
+        if (m_frontend->allowedFormats().contains(Experimental::VideoFrame2::Format_RGB888)) \
{ +            supported_formats |= XINE_VORAW_RGB;
+        }
+        if (m_frontend->allowedFormats().contains(Experimental::VideoFrame2::Format_YV12)) \
{ +            supported_formats |= XINE_VORAW_YV12;
+        }
+        if (m_frontend->allowedFormats().contains(Experimental::VideoFrame2::Format_YUY2)) \
{ +            supported_formats |= XINE_VORAW_YUY2;
+        }
+        if (m_supported_formats != supported_formats) {
+            m_supported_formats = supported_formats;
+            m_needNewPort = true;
+            return true;
+        }
+    }
+#endif
+    return false;
+}
+
 void VideoDataOutput::setFrontendObject(Experimental::AbstractVideoDataOutput *x)
 {
-    K_XT(VideoDataOutputXT)->m_frontend = x;
+    K_XT(VideoDataOutput);
+    if (xt->setFrontendObject(x)) {
+        // we need to recreate and rewire the output
+        SourceNode *src = source();
+        if (src) {
+            QList<WireCall> wireCall;
+            wireCall << WireCall(src, this);
+            QCoreApplication::postEvent(XineThread::instance(), new \
RewireEvent(wireCall, QList<WireCall>())); +        }
+    }
 }
 
+void VideoDataOutput::aboutToChangeXineEngine()
+{
+    kDebug();
+    K_XT(VideoDataOutput);
+    if (xt->m_videoPort) {
+        VideoDataOutputXT *xt2 = new VideoDataOutputXT();
+        xt2->m_xine = xt->m_xine;
+        xt2->m_videoPort = xt->m_videoPort;
+        xt2->m_needNewPort = false;
+        xt->m_needNewPort = true;
+        xt->m_videoPort = 0;
+        KeepReference<> *keep = new KeepReference<>;
+        keep->addObject(xt2);
+        keep->ready();
+    }
+}
+
+void VideoDataOutput::xineEngineChanged()
+{
+//X     kDebug();
+//X     K_XT(VideoDataOutput);
+//X     if (xt->m_xine) {
+//X         Q_ASSERT(!xt->m_videoPort);
+//X         xt->createVideoPort();
+//X     }
+}
+
 }} //namespace Phonon::Xine
 
-#undef K_XT
-
 #include "videodataoutput.moc"
--- trunk/KDE/kdebase/runtime/phonon/xine/videodataoutput.h #844874:844875
@@ -50,6 +50,10 @@
 
         Experimental::AbstractVideoDataOutput *frontendObject() const;
         void setFrontendObject(Experimental::AbstractVideoDataOutput *);
+
+    protected:
+        void aboutToChangeXineEngine();
+        void xineEngineChanged();
 };
 }} //namespace Phonon::Xine
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic