mirror of
https://github.com/clementine-player/Clementine
synced 2025-01-28 18:19:42 +01:00
More debug output in CanDecode, and set the gst path in GstEngine rather than main()
This commit is contained in:
parent
06aaaf15f5
commit
7263983e0c
@ -28,6 +28,9 @@
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
|
||||
#include <QTimer>
|
||||
#include <QRegExp>
|
||||
@ -38,7 +41,6 @@
|
||||
#include <QTimeLine>
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
using std::vector;
|
||||
@ -70,6 +72,27 @@ GstEngine::~GstEngine() {
|
||||
|
||||
|
||||
bool GstEngine::Init() {
|
||||
QString scanner_path;
|
||||
QString plugin_path;
|
||||
|
||||
#if defined(Q_OS_DARWIN)
|
||||
scanner_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gst-plugin-scanner";
|
||||
plugin_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gstreamer";
|
||||
#elif defined(Q_OS_WIN32)
|
||||
plugin_path = QCoreApplication::applicationDirPath() + "/gstreamer-plugins";
|
||||
#endif
|
||||
|
||||
// Use putenv instead of setenv because windows doesn't have setenv.
|
||||
// Use data() instead of constData() because linux's putenv takes non-const char*.
|
||||
// :-(
|
||||
if (!scanner_path.isEmpty())
|
||||
putenv(QString("GST_PLUGIN_SCANNER=%1").arg(scanner_path).toAscii().data());
|
||||
if (!plugin_path.isEmpty()) {
|
||||
putenv(QString("GST_PLUGIN_PATH=%1").arg(plugin_path).toAscii().data());
|
||||
// Never load plugins from anywhere else.
|
||||
putenv(QString("GST_PLUGIN_SYSTEM_PATH=%1").arg(plugin_path).toAscii().data());
|
||||
}
|
||||
|
||||
// GStreamer initialization
|
||||
GError *err;
|
||||
if ( !gst_init_check( NULL, NULL, &err ) ) {
|
||||
@ -77,13 +100,6 @@ bool GstEngine::Init() {
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
// Set the plugin path on windows
|
||||
GstRegistry* registry = gst_registry_get_default();
|
||||
gst_registry_add_path(registry, QString(
|
||||
QCoreApplication::applicationDirPath() + "/gstreamer-plugins").toLocal8Bit().constData());
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -110,19 +126,25 @@ bool GstEngine::CanDecode(const QUrl &url) {
|
||||
can_decode_last_ = false;
|
||||
|
||||
// Create the pipeline
|
||||
GstElement* pipeline = CreateElement("pipeline");
|
||||
GstElement* src = CreateElement("giosrc", pipeline);
|
||||
GstElement* bin = CreateElement("decodebin", pipeline);
|
||||
shared_ptr<GstElement> pipeline(gst_pipeline_new("pipeline"),
|
||||
boost::bind(gst_object_unref, _1));
|
||||
if (!pipeline) return false;
|
||||
GstElement* src = CreateElement("giosrc", pipeline.get()); if (!src) return false;
|
||||
GstElement* bin = CreateElement("decodebin", pipeline.get()); if (!bin) return false;
|
||||
|
||||
gst_element_link(src, bin);
|
||||
g_signal_connect(G_OBJECT(bin), "new-decoded-pad", G_CALLBACK(CanDecodeNewPadCallback), this);
|
||||
g_signal_connect(G_OBJECT(bin), "no-more-pads", G_CALLBACK(CanDecodeLastCallback), this);
|
||||
|
||||
// These handlers just print out errors to stderr
|
||||
gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline.get())), CanDecodeBusCallbackSync, 0);
|
||||
gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(pipeline.get())), CanDecodeBusCallback, 0);
|
||||
|
||||
// Set the file we're testing
|
||||
g_object_set(G_OBJECT(src), "location", url.toEncoded().constData(), NULL);
|
||||
|
||||
// Start the pipeline playing
|
||||
gst_element_set_state(pipeline, GST_STATE_PLAYING);
|
||||
gst_element_set_state(pipeline.get(), GST_STATE_PLAYING);
|
||||
|
||||
// Wait until found audio stream
|
||||
int count = 0;
|
||||
@ -132,12 +154,13 @@ bool GstEngine::CanDecode(const QUrl &url) {
|
||||
}
|
||||
|
||||
// Stop playing
|
||||
gst_element_set_state(pipeline, GST_STATE_NULL);
|
||||
gst_object_unref(pipeline);
|
||||
gst_element_set_state(pipeline.get(), GST_STATE_NULL);
|
||||
|
||||
return can_decode_success_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GstEngine::CanDecodeNewPadCallback(GstElement*, GstPad* pad, gboolean, gpointer self) {
|
||||
GstEngine* instance = reinterpret_cast<GstEngine*>(self);
|
||||
|
||||
@ -155,6 +178,30 @@ void GstEngine::CanDecodeLastCallback(GstElement*, gpointer self) {
|
||||
instance->can_decode_last_ = true;
|
||||
}
|
||||
|
||||
void GstEngine::PrintGstError(GstMessage *msg) {
|
||||
GError* error;
|
||||
gchar* debugs;
|
||||
|
||||
gst_message_parse_error(msg, &error, &debugs);
|
||||
qDebug() << error->message;
|
||||
qDebug() << debugs;
|
||||
|
||||
g_error_free(error);
|
||||
free(debugs);
|
||||
}
|
||||
|
||||
GstBusSyncReply GstEngine::CanDecodeBusCallbackSync(GstBus*, GstMessage* msg, gpointer) {
|
||||
if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR)
|
||||
PrintGstError(msg);
|
||||
return GST_BUS_PASS;
|
||||
}
|
||||
|
||||
gboolean GstEngine::CanDecodeBusCallback(GstBus*, GstMessage* msg, gpointer) {
|
||||
if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR)
|
||||
PrintGstError(msg);
|
||||
return GST_BUS_DROP;
|
||||
}
|
||||
|
||||
|
||||
uint GstEngine::position() const {
|
||||
if (!current_pipeline_)
|
||||
|
@ -107,6 +107,9 @@ class GstEngine : public Engine::Base {
|
||||
// Callbacks
|
||||
static void CanDecodeNewPadCallback(GstElement*, GstPad*, gboolean, gpointer);
|
||||
static void CanDecodeLastCallback(GstElement*, gpointer);
|
||||
static GstBusSyncReply CanDecodeBusCallbackSync(GstBus*, GstMessage*, gpointer);
|
||||
static gboolean CanDecodeBusCallback(GstBus*, GstMessage*, gpointer);
|
||||
static void PrintGstError(GstMessage* msg);
|
||||
|
||||
PluginDetailsList GetPluginList(const QString& classname) const;
|
||||
|
||||
|
@ -133,15 +133,6 @@ int main(int argc, char *argv[]) {
|
||||
MPRIS mpris;
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_DARWIN
|
||||
QString scanner_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gst-plugin-scanner";
|
||||
QString plugin_path = QCoreApplication::applicationDirPath() + "/../PlugIns/gstreamer";
|
||||
setenv("GST_PLUGIN_SCANNER", scanner_path.toAscii().constData(), 1);
|
||||
setenv("GST_PLUGIN_PATH", plugin_path.toAscii().constData(), 1);
|
||||
// Never load plugins from anywhere else.
|
||||
setenv("GST_PLUGIN_SYSTEM_PATH", plugin_path.toAscii().constData(), 1);
|
||||
#endif
|
||||
|
||||
// Window
|
||||
MainWindow w(&network, options.engine());
|
||||
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <QResource>
|
||||
#include <QDir>
|
||||
#include <QSet>
|
||||
#include <QSignalSpy>
|
||||
#include <QtDebug>
|
||||
|
||||
namespace {
|
||||
|
||||
@ -91,7 +93,14 @@ TEST_P(FileformatsTest, GstCanDecode) {
|
||||
QTemporaryFile temp(temp_filetemplate_);
|
||||
SaveToTempFile(&temp);
|
||||
|
||||
QSignalSpy spy(sGstEngine, SIGNAL(Error(QString)));
|
||||
|
||||
EXPECT_TRUE(sGstEngine->CanDecode(QUrl::fromLocalFile(temp.fileName())));
|
||||
|
||||
QList<QList<QVariant> > calls(spy);
|
||||
foreach (const QList<QVariant>& call, calls) {
|
||||
qDebug() << "GstEngine::Error emitted:" << call[0].toString();
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(Formats, FileformatsTest, ::testing::Values(
|
||||
|
Loading…
x
Reference in New Issue
Block a user