[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