[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-04-05 15:54:32
Message-ID: 1207410872.561039.27408.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 793919 by mkretz:

Patch by Kevin Kofler. Thanks a lot.

fixes Phonon not to crash if deinterlacing is not available

BUG: 160414


 M  +48 -38    kcm/xineoptions.cpp  
 M  +1 -0      kcm/xineoptions.h  
 M  +1 -1      kcm/xineoptions.ui  
 M  +25 -25    xinestream.cpp  


--- trunk/KDE/kdebase/runtime/phonon/xine/kcm/xineoptions.cpp #793918:793919
@@ -30,7 +30,7 @@
 K_EXPORT_PLUGIN(XineOptionsFactory("kcm_phononxine"))
 
 XineOptions::XineOptions(QWidget *parent, const QVariantList &args)
-    : KCModule(XineOptionsFactory::componentData(), parent, args)
+    : KCModule(XineOptionsFactory::componentData(), parent, args), \
m_noDeinterlace(false)  {
     setupUi(this);
 
@@ -60,35 +60,39 @@
         xine_init(xine);
         xine_video_port_t *nullVideoPort = xine_open_video_driver(xine, "auto", \
                XINE_VISUAL_TYPE_NONE, 0);
         xine_post_t *deinterlacer = xine_post_init(xine, "tvtime", 1, 0, \
                &nullVideoPort);
-        Q_ASSERT(deinterlacer);
-        xine_post_in_t *paraInput = xine_post_input(deinterlacer, "parameters");
-        Q_ASSERT(paraInput);
-        Q_ASSERT(paraInput->data);
-        xine_post_api_t *api = reinterpret_cast<xine_post_api_t *>(paraInput->data);
-        xine_post_api_descr_t *desc = api->get_param_descr();
-        for (int i = 0; desc->parameter[i].type != POST_PARAM_TYPE_LAST; ++i) {
-            xine_post_api_parameter_t &p = desc->parameter[i];
-            switch (p.type) {
-            case POST_PARAM_TYPE_INT:          /* integer (or vector of integers)    \
                */
-                if (0 == strcmp(p.name, "method") && p.enum_values) {
-                    for (int j = 0; p.enum_values[j]; ++j) {
-                        deinterlaceMethodBox->addItem(p.enum_values[j]);
+        if (deinterlacer) {
+            xine_post_in_t *paraInput = xine_post_input(deinterlacer, "parameters");
+            Q_ASSERT(paraInput);
+            Q_ASSERT(paraInput->data);
+            xine_post_api_t *api = reinterpret_cast<xine_post_api_t \
*>(paraInput->data); +            xine_post_api_descr_t *desc = \
api->get_param_descr(); +            for (int i = 0; desc->parameter[i].type != \
POST_PARAM_TYPE_LAST; ++i) { +                xine_post_api_parameter_t &p = \
desc->parameter[i]; +                switch (p.type) {
+                case POST_PARAM_TYPE_INT:          /* integer (or vector of \
integers)    */ +                    if (0 == strcmp(p.name, "method") && \
p.enum_values) { +                        for (int j = 0; p.enum_values[j]; ++j) {
+                            deinterlaceMethodBox->addItem(p.enum_values[j]);
+                        }
                     }
+                    break;
+                case POST_PARAM_TYPE_DOUBLE:       /* double (or vector of doubles)  \
*/ +                case POST_PARAM_TYPE_CHAR:         /* char (or vector of chars = \
string) */ +                case POST_PARAM_TYPE_STRING:       /* (char *), ASCIIZ    \
*/ +                case POST_PARAM_TYPE_STRINGLIST:   /* (char **) list, NULL \
terminated    */ +                case POST_PARAM_TYPE_BOOL:         /* integer (0 or \
1)                   */ +                    break;
+                case POST_PARAM_TYPE_LAST:         /* terminator of parameter list   \
*/ +                default:
+                    kFatal() << "invalid type";
                 }
-                break;
-            case POST_PARAM_TYPE_DOUBLE:       /* double (or vector of doubles)      \
                */
-            case POST_PARAM_TYPE_CHAR:         /* char (or vector of chars = string) \
                */
-            case POST_PARAM_TYPE_STRING:       /* (char *), ASCIIZ                   \
                */
-            case POST_PARAM_TYPE_STRINGLIST:   /* (char **) list, NULL terminated    \
                */
-            case POST_PARAM_TYPE_BOOL:         /* integer (0 or 1)                   \
                */
-                break;
-            case POST_PARAM_TYPE_LAST:         /* terminator of parameter list       \
                */
-            default:
-                kFatal() << "invalid type";
             }
+
+            xine_post_dispose(xine, deinterlacer);
+        } else {
+            m_noDeinterlace = true;
+            deinterlaceGroupBox->setEnabled(false);
         }
-
-        xine_post_dispose(xine, deinterlacer);
         xine_close_video_driver(xine, nullVideoPort);
         xine_exit(xine);
     }
@@ -108,29 +112,35 @@
 {
     KConfigGroup cg(m_config, "Settings");
     m_ossCheckbox->setChecked(cg.readEntry("showOssDevices", false));
-    deinterlaceMediaList->item(0)->setCheckState(cg.readEntry("deinterlaceDVD", \
                true) ? Qt::Checked : Qt::Unchecked);
-    deinterlaceMediaList->item(1)->setCheckState(cg.readEntry("deinterlaceVCD", \
                false) ? Qt::Checked : Qt::Unchecked);
-    deinterlaceMediaList->item(2)->setCheckState(cg.readEntry("deinterlaceFile", \
                false) ? Qt::Checked : Qt::Unchecked);
-    deinterlaceMethodBox->setCurrentIndex(cg.readEntry("deinterlaceMethod", 0));
+    if (!m_noDeinterlace) {
+        deinterlaceMediaList->item(0)->setCheckState(cg.readEntry("deinterlaceDVD", \
true) ? Qt::Checked : Qt::Unchecked); +        \
deinterlaceMediaList->item(1)->setCheckState(cg.readEntry("deinterlaceVCD", false) ? \
Qt::Checked : Qt::Unchecked); +        \
deinterlaceMediaList->item(2)->setCheckState(cg.readEntry("deinterlaceFile", false) ? \
Qt::Checked : Qt::Unchecked); +        \
deinterlaceMethodBox->setCurrentIndex(cg.readEntry("deinterlaceMethod", 0)); +    }
 }
 
 void XineOptions::save()
 {
     KConfigGroup cg(m_config, "Settings");
     cg.writeEntry("showOssDevices", m_ossCheckbox->isChecked());
-    cg.writeEntry("deinterlaceDVD", deinterlaceMediaList->item(0)->checkState() == \
                Qt::Checked);
-    cg.writeEntry("deinterlaceVCD", deinterlaceMediaList->item(1)->checkState() == \
                Qt::Checked);
-    cg.writeEntry("deinterlaceFile", deinterlaceMediaList->item(2)->checkState() == \
                Qt::Checked);
-    cg.writeEntry("deinterlaceMethod", deinterlaceMethodBox->currentIndex());
+    if (!m_noDeinterlace) {
+        cg.writeEntry("deinterlaceDVD", deinterlaceMediaList->item(0)->checkState() \
== Qt::Checked); +        cg.writeEntry("deinterlaceVCD", \
deinterlaceMediaList->item(1)->checkState() == Qt::Checked); +        \
cg.writeEntry("deinterlaceFile", deinterlaceMediaList->item(2)->checkState() == \
Qt::Checked); +        cg.writeEntry("deinterlaceMethod", \
deinterlaceMethodBox->currentIndex()); +    }
 }
 
 void XineOptions::defaults()
 {
     m_ossCheckbox->setChecked(false);
-    deinterlaceMediaList->item(0)->setCheckState(Qt::Checked);
-    deinterlaceMediaList->item(1)->setCheckState(Qt::Unchecked);
-    deinterlaceMediaList->item(2)->setCheckState(Qt::Unchecked);
-    deinterlaceMethodBox->setCurrentIndex(0);
+    if (!m_noDeinterlace) {
+        deinterlaceMediaList->item(0)->setCheckState(Qt::Checked);
+        deinterlaceMediaList->item(1)->setCheckState(Qt::Unchecked);
+        deinterlaceMediaList->item(2)->setCheckState(Qt::Unchecked);
+        deinterlaceMethodBox->setCurrentIndex(0);
+    }
 }
 
 #include "xineoptions.moc"
--- trunk/KDE/kdebase/runtime/phonon/xine/kcm/xineoptions.h #793918:793919
@@ -42,6 +42,7 @@
 
     private:
         KSharedConfigPtr m_config;
+        bool m_noDeinterlace;
 };
 
 #endif // PHONON_XINEOPTIONS_H
--- trunk/KDE/kdebase/runtime/phonon/xine/kcm/xineoptions.ui #793918:793919
@@ -85,7 +85,7 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox" >
+    <widget class="QGroupBox" name="deinterlaceGroupBox" >
      <property name="title" >
       <string>Deinterlacing</string>
      </property>
--- trunk/KDE/kdebase/runtime/phonon/xine/xinestream.cpp #793918:793919
@@ -178,33 +178,33 @@
             videoPort = XineEngine::nullVideoPort();
         }
         m_deinterlacer = xine_post_init(XineEngine::xine(), "tvtime", 1, 0, \
                &videoPort);
-        Q_ASSERT(m_deinterlacer);
+        if (m_deinterlacer) {
+            // set method
+            xine_post_in_t *paraInput = xine_post_input(m_deinterlacer, \
"parameters"); +            Q_ASSERT(paraInput);
+            Q_ASSERT(paraInput->data);
+            xine_post_api_t *api = reinterpret_cast<xine_post_api_t \
*>(paraInput->data); +            xine_post_api_descr_t *desc = \
api->get_param_descr(); +            char *pluginParams = static_cast<char \
*>(malloc(desc->struct_size)); +            api->get_parameters(m_deinterlacer, \
pluginParams); +            for (int i = 0; desc->parameter[i].type != \
POST_PARAM_TYPE_LAST; ++i) { +                xine_post_api_parameter_t &p = \
desc->parameter[i]; +                if (p.type == POST_PARAM_TYPE_INT && 0 == \
strcmp(p.name, "method")) { +                    int *value = reinterpret_cast<int \
*>(pluginParams + p.offset); +                    *value = \
XineEngine::deinterlaceMethod(); +                    break;
+                }
+            }
+            api->set_parameters(m_deinterlacer, pluginParams);
+            free(pluginParams);
 
-        // set method
-        xine_post_in_t *paraInput = xine_post_input(m_deinterlacer, "parameters");
-        Q_ASSERT(paraInput);
-        Q_ASSERT(paraInput->data);
-        xine_post_api_t *api = reinterpret_cast<xine_post_api_t *>(paraInput->data);
-        xine_post_api_descr_t *desc = api->get_param_descr();
-        char *pluginParams = static_cast<char *>(malloc(desc->struct_size));
-        api->get_parameters(m_deinterlacer, pluginParams);
-        for (int i = 0; desc->parameter[i].type != POST_PARAM_TYPE_LAST; ++i) {
-            xine_post_api_parameter_t &p = desc->parameter[i];
-            if (p.type == POST_PARAM_TYPE_INT && 0 == strcmp(p.name, "method")) {
-                int *value = reinterpret_cast<int *>(pluginParams + p.offset);
-                *value = XineEngine::deinterlaceMethod();
-                break;
-            }
+            // connect to xine_stream_t
+            xine_post_in_t *x = xine_post_input(m_deinterlacer, "video");
+            Q_ASSERT(x);
+            xine_post_out_t *videoOutputPort = xine_get_video_source(m_stream);
+            Q_ASSERT(videoOutputPort);
+            xine_post_wire(videoOutputPort, x);
         }
-        api->set_parameters(m_deinterlacer, pluginParams);
-        free(pluginParams);
-
-        // connect to xine_stream_t
-        xine_post_in_t *x = xine_post_input(m_deinterlacer, "video");
-        Q_ASSERT(x);
-        xine_post_out_t *videoOutputPort = xine_get_video_source(m_stream);
-        Q_ASSERT(videoOutputPort);
-        xine_post_wire(videoOutputPort, x);
     } else if (m_deinterlacer) {
         xine_post_dispose(XineEngine::xine(), m_deinterlacer);
         m_deinterlacer = 0;


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

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