#include "gstengine.h" #include <QDebug> #include <gst/interfaces/xoverlay.h> #include <QWidget> GstEngine::GstEngine(QObject *parent) : QObject(parent) { gst_init(NULL, NULL); mPlayer = gst_element_factory_make("playbin2", "play"); GstElement *videosink = gst_element_factory_make("xvimagesink", "videosink"); g_object_set(G_OBJECT(mPlayer), "video-sink", videosink, NULL); //gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(m_players[id].player)), bus_cb, &m_players[id]); //gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE(m_players[id].player)), message_cb, NULL); } GstEngine::~GstEngine() { gst_object_unref(GST_OBJECT (mPlayer)); } void GstEngine::setUrl(const QUrl &url) { g_object_set(G_OBJECT (mPlayer), "uri", qPrintable(url.toString()), NULL); gst_element_set_state (mPlayer, GST_STATE_PAUSED); } void GstEngine::play() { gst_element_set_state(mPlayer, GST_STATE_PLAYING); } void GstEngine::stop() { gst_element_set_state(mPlayer, GST_STATE_NULL); } void GstEngine::pause() { gst_element_set_state (mPlayer, GST_STATE_PAUSED); } bool GstEngine::isPlaying() const { GstState state; gst_element_get_state (mPlayer, &state, NULL, -1 ); return state == GST_STATE_PLAYING; } bool GstEngine::isPaused() const { GstState state; gst_element_get_state (mPlayer, &state, NULL, -1 ); return state == GST_STATE_PAUSED; } bool GstEngine::seek(uint ms) { gst_element_get_state(mPlayer, NULL, NULL, 100*GST_MSECOND); if (!gst_element_seek (mPlayer, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, ms*GST_MSECOND, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { qWarning("Can't seek"); return false; } return true; } uint GstEngine::position() const { GstFormat fmt = GST_FORMAT_TIME; gint64 value = 0; gst_element_query_position( mPlayer, &fmt, &value ); return static_cast<uint>( ( value / GST_MSECOND ) ); } uint GstEngine::duration() const { GstFormat fmt = GST_FORMAT_TIME; gint64 value = 0; gst_element_query_duration( mPlayer, &fmt, &value ); return static_cast<uint>( ( value / GST_MSECOND ) ); } void GstEngine::setVolume(int percent) { g_object_set(G_OBJECT(mPlayer), "volume", percent*0.01, NULL ); } int GstEngine::volume() { double volume; g_object_get(G_OBJECT(mPlayer), "volume", &volume, NULL ); return volume * 100; } bool GstEngine::setVideoWidget(QWidget *w) { GstElement *videosink = 0; g_object_get(mPlayer, "video-sink", &videosink, NULL); if (videosink && GST_IS_X_OVERLAY(videosink) ) { gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), w->winId() ); return true; } return false; }