You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
7.7 KiB
194 lines
7.7 KiB
From 90b9271771927a72dc27e71957376dd67c8f6d43 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim.muller@collabora.co.uk>
|
|
Date: Sun, 29 Jul 2012 19:14:05 +0200
|
|
Subject: [PATCH 1/7] tentative initial attempt at re-work for new playbin
|
|
|
|
Change-Id: I257bdda8469be624d0cbeab21cff2c2e1c94cc6f
|
|
Signed-off-by: David Tardon <dtardon@redhat.com>
|
|
---
|
|
avmedia/source/gstreamer/gstplayer.cxx | 94 ++++++++++++++++++++++++++--------
|
|
1 file changed, 74 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/avmedia/source/gstreamer/gstplayer.cxx b/avmedia/source/gstreamer/gstplayer.cxx
|
|
index 863d1e8..d95342a 100644
|
|
--- a/avmedia/source/gstreamer/gstplayer.cxx
|
|
+++ b/avmedia/source/gstreamer/gstplayer.cxx
|
|
@@ -38,7 +38,9 @@
|
|
#include "gstframegrabber.hxx"
|
|
#include "gstwindow.hxx"
|
|
|
|
-#include <gst/interfaces/xoverlay.h>
|
|
+#ifndef AVMEDIA_GST_0_10
|
|
+# include <gst/video/videooverlay.h>
|
|
+#endif
|
|
|
|
#define AVMEDIA_GST_PLAYER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Player_GStreamer"
|
|
#define AVMEDIA_GST_PLAYER_SERVICENAME "com.sun.star.media.Player_GStreamer"
|
|
@@ -96,7 +98,7 @@ Player::~Player()
|
|
if( mpPlaybin )
|
|
{
|
|
gst_element_set_state( mpPlaybin, GST_STATE_NULL );
|
|
- gst_object_unref( GST_OBJECT( mpPlaybin ) );
|
|
+ g_object_unref( G_OBJECT( mpPlaybin ) );
|
|
|
|
mpPlaybin = NULL;
|
|
}
|
|
@@ -110,7 +112,7 @@ Player::~Player()
|
|
|
|
// ------------------------------------------------------------------------------
|
|
|
|
-static gboolean gst_pipeline_bus_callback( GstBus *, GstMessage *message, gpointer data )
|
|
+static gboolean pipeline_bus_callback( GstBus *, GstMessage *message, gpointer data )
|
|
{
|
|
Player* pPlayer = static_cast<Player*>(data);
|
|
|
|
@@ -119,7 +121,7 @@ static gboolean gst_pipeline_bus_callback( GstBus *, GstMessage *message, gpoint
|
|
return TRUE;
|
|
}
|
|
|
|
-static GstBusSyncReply gst_pipeline_bus_sync_handler( GstBus *, GstMessage * message, gpointer data )
|
|
+static GstBusSyncReply pipeline_bus_sync_handler( GstBus *, GstMessage * message, gpointer data )
|
|
{
|
|
Player* pPlayer = static_cast<Player*>(data);
|
|
|
|
@@ -144,7 +146,7 @@ void Player::processMessage( GstMessage *message )
|
|
if( newstate == GST_STATE_PAUSED &&
|
|
pendingstate == GST_STATE_VOID_PENDING &&
|
|
mpXOverlay )
|
|
- gst_x_overlay_expose( mpXOverlay );
|
|
+ gst_video_overlay_expose( mpXOverlay );
|
|
|
|
if (mbPlayPending)
|
|
mbPlayPending = ((newstate == GST_STATE_READY) || (newstate == GST_STATE_PAUSED));
|
|
@@ -154,6 +156,26 @@ void Player::processMessage( GstMessage *message )
|
|
}
|
|
}
|
|
|
|
+static gboolean wrap_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
|
|
+{
|
|
+#ifdef AVMEDIA_GST_0_10
|
|
+ GstFormat my_format = format;
|
|
+ return gst_element_query_position( mpPlaybin, &my_format, cur) && my_format == format && *cur > 0L;
|
|
+#else
|
|
+ return gst_element_query_position( element, format, cur );
|
|
+#endif
|
|
+}
|
|
+
|
|
+static gboolean wrap_element_query_duration (GstElement *element, GstFormat format, gint64 *duration)
|
|
+{
|
|
+#ifdef AVMEDIA_GST_0_10
|
|
+ GstFormat my_format = format;
|
|
+ return gst_element_query_duration( mpPlaybin, &my_format, duration) && my_format == format && *duration > 0L;
|
|
+#else
|
|
+ return gst_element_query_duration( element, format, duration );
|
|
+#endif
|
|
+}
|
|
+
|
|
GstBusSyncReply Player::processSyncMessage( GstMessage *message )
|
|
{
|
|
DBG( "%p processSyncMessage: %s", this, GST_MESSAGE_TYPE_NAME( message ) );
|
|
@@ -169,17 +191,17 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
|
|
}
|
|
#endif
|
|
|
|
- if (message->structure) {
|
|
- if( !strcmp( gst_structure_get_name( message->structure ), "prepare-xwindow-id" ) && mnWindowID != 0 ) {
|
|
- if( mpXOverlay )
|
|
- g_object_unref( G_OBJECT ( mpXOverlay ) );
|
|
- mpXOverlay = GST_X_OVERLAY( GST_MESSAGE_SRC( message ) );
|
|
- g_object_ref( G_OBJECT ( mpXOverlay ) );
|
|
- gst_x_overlay_set_xwindow_id( mpXOverlay, mnWindowID );
|
|
- return GST_BUS_DROP;
|
|
- }
|
|
+ if (gst_message_has_name (message, "prepare-xwindow-id") && mnWindowID != 0 )
|
|
+ {
|
|
+ if( mpXOverlay )
|
|
+ g_object_unref( G_OBJECT ( mpXOverlay ) );
|
|
+ mpXOverlay = GST_VIDEO_OVERLAY( GST_MESSAGE_SRC( message ) );
|
|
+ g_object_ref( G_OBJECT ( mpXOverlay ) );
|
|
+ gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
|
|
+ return GST_BUS_DROP;
|
|
}
|
|
|
|
+#ifdef AVMEDIA_GST_0_10
|
|
if( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_STATE_CHANGED ) {
|
|
if( message->src == GST_OBJECT( mpPlaybin ) ) {
|
|
GstState newstate, pendingstate;
|
|
@@ -193,10 +215,8 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
|
|
DBG( "%p change to paused received", this );
|
|
|
|
if( mnDuration == 0) {
|
|
- GstFormat format = GST_FORMAT_TIME;
|
|
gint64 gst_duration = 0L;
|
|
-
|
|
- if( gst_element_query_duration( mpPlaybin, &format, &gst_duration) && format == GST_FORMAT_TIME && gst_duration > 0L )
|
|
+ if( wrap_element_query_duration( mpPlaybin, GST_FORMAT_TIME, &gst_duration) )
|
|
mnDuration = gst_duration;
|
|
}
|
|
|
|
@@ -234,6 +254,40 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
|
|
}
|
|
}
|
|
}
|
|
+#else
|
|
+ // We get to use the exciting new playbin2 ! (now known as playbin)
|
|
+ if( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_ASYNC_DONE ) {
|
|
+ if( mnDuration == 0) {
|
|
+ gint64 gst_duration = 0L;
|
|
+ if( wrap_element_query_duration( mpPlaybin, GST_FORMAT_TIME, &gst_duration) )
|
|
+ mnDuration = gst_duration;
|
|
+ }
|
|
+ if( mnWidth == 0 ) {
|
|
+ GstPad *pad = NULL;
|
|
+ GstCaps *caps;
|
|
+
|
|
+ g_signal_emit_by_name( mpPlaybin, "get-video-pad", 0, &pad );
|
|
+
|
|
+ if( pad ) {
|
|
+ int w = 0, h = 0;
|
|
+
|
|
+ caps = gst_pad_get_current_caps( pad );
|
|
+
|
|
+ if( gst_structure_get( gst_caps_get_structure (caps, 0),
|
|
+ "width", G_TYPE_INT, &w,
|
|
+ "height", G_TYPE_INT, &h,
|
|
+ NULL ) ) {
|
|
+ mnWidth = w;
|
|
+ mnHeight = h;
|
|
+
|
|
+ DBG( "queried size: %d x %d", mnWidth, mnHeight );
|
|
+
|
|
+ maSizeCondition.set();
|
|
+ }
|
|
+ gst_caps_unref( caps );
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
} else if( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_ERROR ) {
|
|
if( mnWidth == 0 ) {
|
|
// an error occurred, set condition so that OOo thread doesn't wait for us
|
|
@@ -265,9 +319,9 @@ void Player::preparePlaybin( const ::rtl::OUString& rURL, bool bFakeVideo )
|
|
g_object_set( G_OBJECT( mpPlaybin ), "uri", ascURL.getStr() , NULL );
|
|
|
|
pBus = gst_element_get_bus( mpPlaybin );
|
|
- gst_bus_add_watch( pBus, gst_pipeline_bus_callback, this );
|
|
+ gst_bus_add_watch( pBus, pipeline_bus_callback, this );
|
|
DBG( "%p set sync handler", this );
|
|
- gst_bus_set_sync_handler( pBus, gst_pipeline_bus_sync_handler, this );
|
|
+ gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this );
|
|
g_object_unref( pBus );
|
|
}
|
|
|
|
@@ -387,7 +441,7 @@ double SAL_CALL Player::getMediaTime( )
|
|
// get current position in the stream
|
|
GstFormat format = GST_FORMAT_TIME;
|
|
gint64 gst_position;
|
|
- if( gst_element_query_position( mpPlaybin, &format, &gst_position ) && format == GST_FORMAT_TIME && gst_position > 0L )
|
|
+ if( wrap_element_query_position( mpPlaybin, GST_FORMAT_TIME, &gst_position ) )
|
|
position = gst_position / 1E9;
|
|
}
|
|
|
|
--
|
|
1.7.11.4
|
|
|