[meego-commits] 24317: Changes to devel:tv:1.2/UMMS
zwu28
no_reply at build.meego.com
Thu Oct 20 09:04:48 UTC 2011
Hi,
I have made the following changes to UMMS in project devel:tv:1.2. Please review and accept ASAP.
Thank You,
zwu28
[This message was auto-generated]
---
Request #24317:
submit: home:zwu28:branches:devel:tv:1.2/UMMS(r16)(update) -> devel:tv:1.2/UMMS
Message:
None
State: new 2011-10-20T01:52:00 zwu28
Comment: None
changes files:
--------------
--- umms.changes
+++ umms.changes
@@ -0,0 +1,7 @@
+Thu Oct 20 2011 Zhiwen Wu <zhiwen.wu at intel.com>- 0.0.1
+- Fix Bug "Incorrect value displays when setting the volume as "1 or 70"".
+- Improve buffering mechanism.
+
+Thu Oct 20 2011 Jieke Wu <jieke.wu at intel.com>- 0.0.1
+- Add cross platform feature.
+
spec files:
-----------
--- umms.spec
+++ umms.spec
@@ -13,6 +13,7 @@
License: LGPLv2.1
Source0: %{name}-%{version}.tar.gz
Source1: umms.yaml
+Source100: umms.yaml
BuildRequires: pkgconfig(glib-2.0)
BuildRequires: pkgconfig(dbus-glib-1)
BuildRequires: pkgconfig(gstreamer-0.10)
@@ -44,9 +45,6 @@
make %{?jobs:-j%jobs}
# >> build post
-%autogen --disable-static
-%configure --disable-static
-make %{?jobs:-j%jobs}
# << build post
%install
rm -rf %{buildroot}
@@ -65,8 +63,8 @@
%files
%defattr(-,root,root,-)
%{_libexecdir}/umms-server
-%{_datadir}/dbus-1/system-services/com.meego.UMMS.service
-/etc/dbus-1/system.d/com.meego.UMMS.conf
+%{_datadir}/dbus-1/system-services/com.UMMS.service
+/etc/dbus-1/system.d/com.UMMS.conf
# >> files
# << files
other changes:
--------------
++++++ umms-0.0.1.tar.gz
--- configure.in
+++ configure.in
@@ -3,7 +3,7 @@
AC_PREREQ([2.65])
AC_INIT(umms, 0.0.1, http://www.intel.com)
-AC_CONFIG_SRCDIR([src/meego-media-player-gstreamer.h])
+AC_CONFIG_SRCDIR([src/media-player-factory.h])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE(umms, 0.0.1)
--- examples/client.py
+++ examples/client.py
@@ -77,8 +77,8 @@
def get_player(self, name):
print "Create proxy for remote player '%s'" % (name)
bus=dbus.SessionBus()
- bus_obj=bus.get_object("com.meego.UMMS", name)
- proxy=dbus.Interface(bus_obj, 'com.meego.UMMS.MediaPlayer')
+ bus_obj=bus.get_object("com.UMMS", name)
+ proxy=dbus.Interface(bus_obj, 'com.UMMS.MediaPlayer')
proxy.connect_to_signal("Initialized", initialized_cb)
proxy.connect_to_signal("Eof", eof_cb)
proxy.connect_to_signal("Buffering", begin_buffering_cb)
@@ -246,8 +246,8 @@
bus=dbus.SessionBus()
- bus_obj=bus.get_object('com.meego.UMMS', '/com/meego/UMMS/ObjectManager')
- iface=dbus.Interface(bus_obj, 'com.meego.UMMS.ObjectManager.iface')
+ bus_obj=bus.get_object('com.UMMS', '/com/UMMS/ObjectManager')
+ iface=dbus.Interface(bus_obj, 'com.UMMS.ObjectManager.iface')
gobject.threads_init()
dbus.glib.init_threads()
--- libummsclient/libummsclient.py
+++ libummsclient/libummsclient.py
@@ -21,20 +21,20 @@
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus=dbus.SystemBus()
- bus_obj=bus.get_object('com.meego.UMMS', '/com/meego/UMMS/ObjectManager')
- obj_mngr=dbus.Interface(bus_obj, 'com.meego.UMMS.ObjectManager.iface')
+ bus_obj=bus.get_object('com.UMMS', '/com/UMMS/ObjectManager')
+ obj_mngr=dbus.Interface(bus_obj, 'com.UMMS.ObjectManager.iface')
print "New obj_mngr"
- bus_obj=bus.get_object('com.meego.UMMS', '/com/meego/UMMS/PlayingContentMetadataViewer')
- metadata_viewer=dbus.Interface(bus_obj, 'com.meego.UMMS.PlayingContentMetadataViewer')
+ bus_obj=bus.get_object('com.UMMS', '/com/UMMS/PlayingContentMetadataViewer')
+ metadata_viewer=dbus.Interface(bus_obj, 'com.UMMS.PlayingContentMetadataViewer')
print "New metadata_viewer"
- bus_obj=bus.get_object('com.meego.UMMS', '/com/meego/UMMS/AudioManager')
- audio_manager =dbus.Interface(bus_obj, 'com.meego.UMMS.AudioManager')
+ bus_obj=bus.get_object('com.UMMS', '/com/UMMS/AudioManager')
+ audio_manager =dbus.Interface(bus_obj, 'com.UMMS.AudioManager')
print "New audio_manager"
def need_reply_cb (obj_path):
- client_monitor = get_iface (obj_path, 'com.meego.UMMS.MediaPlayer')
+ client_monitor = get_iface (obj_path, 'com.UMMS.MediaPlayer')
client_monitor.Reply()
#print "Reply to object '%s'" % obj_path
@@ -42,9 +42,9 @@
#print "Getting interface '%s' from '%s'" % (iface_name, obj_path)
proxy = None
bus=dbus.SystemBus()
- bus_obj=bus.get_object("com.meego.UMMS", obj_path)
- if iface_name == 'com.meego.UMMS.MediaPlayer':
- proxy=dbus.Interface(bus_obj, 'com.meego.UMMS.MediaPlayer')
+ bus_obj=bus.get_object("com.UMMS", obj_path)
+ if iface_name == 'com.UMMS.MediaPlayer':
+ proxy=dbus.Interface(bus_obj, 'com.UMMS.MediaPlayer')
else :
print "Unknown interface '%s'" % iface_name
return proxy
@@ -62,7 +62,7 @@
else:
(token, player_name) = obj_mngr.RequestMediaPlayerUnattended(time_to_execution)
- player = get_iface (player_name, 'com.meego.UMMS.MediaPlayer')
+ player = get_iface (player_name, 'com.UMMS.MediaPlayer')
if (attended) :
connect_to_need_reply_sig(player)
--- spec/umms-audio-manager.xml
+++ spec/umms-audio-manager.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<node name="/com/meego/UMMS/AudioManager">
- <interface name="com.meego.UMMS.AudioManager">
+<node name="/com/UMMS/AudioManager">
+ <interface name="com.UMMS.AudioManager">
<method name="SetVolume">
<arg name="output_type" type="i"/>
<arg name="volume" type="i"/>
--- spec/umms-media-player.xml
+++ spec/umms-media-player.xml
@@ -2,7 +2,7 @@
<node name="/Media_Player_Iface">
- <interface name="com.meego.UMMS.MediaPlayer">
+ <interface name="com.UMMS.MediaPlayer">
<method name="SetUri">
<arg name="uri" type="s"/>
--- spec/umms-object-manager.xml
+++ spec/umms-object-manager.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<node name="/com/meego/UMMS/ObjectManager">
- <interface name="com.meego.UMMS.ObjectManager.iface">
+<node name="/com/UMMS/ObjectManager">
+ <interface name="com.UMMS.ObjectManager.iface">
<method name="RequestMediaPlayer">
<arg name="object_path" type="s" direction="out"/>
</method>
--- spec/umms-playing-content-metadata-viewer.xml
+++ spec/umms-playing-content-metadata-viewer.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<node name="/com/meego/UMMS/PlayingContentMetadataViewer">
- <interface name="com.meego.UMMS.PlayingContentMetadataViewer">
+<node name="/com/UMMS/PlayingContentMetadataViewer">
+ <interface name="com.UMMS.PlayingContentMetadataViewer">
<method name="GetPlayingContentMetadata">
<arg name="PlayingContentMetadata" type="aa{sv}" direction="out"/>
</method>
--- src/Makefile.am
+++ src/Makefile.am
@@ -23,14 +23,16 @@
umms-error.h \
umms-error.c \
umms-server-main.c \
- meego-media-player.c \
- meego-media-player.h \
- meego-media-player-gstreamer.c \
- meego-media-player-gstreamer.h \
- meego-media-player-control.c \
- meego-media-player-control.h \
+ media-player.c \
+ media-player.h \
+ media-player-factory.c \
+ media-player-factory.h \
+ media-player-control.c \
+ media-player-control.h \
engine-gst.c \
engine-gst.h \
+ engine-generic.c \
+ engine-generic.h \
umms-object-manager.c \
umms-object-manager.h \
param-table.c \
@@ -58,7 +60,7 @@
./glue/%-glue.h: ../spec/%.xml Makefile.am
$(AM_V_GEN)mkdir -p glue
$(LIBTOOL) --mode=execute dbus-binding-tool --prefix=umms_object_manager --mode=glib-server ../spec/umms-object-manager.xml > ./glue/umms-object-manager-glue.h
- $(LIBTOOL) --mode=execute dbus-binding-tool --prefix=meego_media_player --mode=glib-server ../spec/umms-media-player.xml > ./glue/umms-media-player-glue.h
+ $(LIBTOOL) --mode=execute dbus-binding-tool --prefix=media_player --mode=glib-server ../spec/umms-media-player.xml > ./glue/umms-media-player-glue.h
$(LIBTOOL) --mode=execute dbus-binding-tool --prefix=umms_playing_content_metadata_viewer --mode=glib-server ../spec/umms-playing-content-metadata-viewer.xml > ./glue/umms-playing-content-metadata-viewer-glue.h
$(LIBTOOL) --mode=execute dbus-binding-tool --prefix=umms_audio_manager --mode=glib-server ../spec/umms-audio-manager.xml > ./glue/umms-audio-manager-glue.h
@@ -73,11 +75,11 @@
servicedir = $(datadir)/dbus-1/system-services/
-service_in_files = com.meego.UMMS.service.in
-service_DATA = com.meego.UMMS.service
+service_in_files = com.UMMS.service.in
+service_DATA = com.UMMS.service
confdir = /etc/dbus-1/system.d/
-dist_conf_DATA = com.meego.UMMS.conf
+dist_conf_DATA = com.UMMS.conf
CLEANFILES = $(GENERATED_SOURCE) $(service_DATA)
EXTRA_DIST = $(MARSHALS_LISTS) $(service_in_files)
--- src/audio-manager-engine.c
+++ src/audio-manager-engine.c
@@ -70,6 +70,7 @@
GstElement *asink;
};
+
static gboolean
audio_manager_engine_set_volume (AudioManagerInterface *self, gint type, gint vol)
{
@@ -191,14 +192,14 @@
{
AudioManagerInterfaceClass *klass = (AudioManagerInterfaceClass *)iface;
- audio_manager_interface_implement_set_volume (klass,
- audio_manager_engine_set_volume);
- audio_manager_interface_implement_get_volume (klass,
- audio_manager_engine_get_volume);
- audio_manager_interface_implement_set_state (klass,
- audio_manager_engine_set_state);
- audio_manager_interface_implement_get_state (klass,
- audio_manager_engine_get_state);
+// audio_manager_interface_implement_set_volume (klass,
+// audio_manager_engine_set_volume);
+// audio_manager_interface_implement_get_volume (klass,
+// audio_manager_engine_get_volume);
+// audio_manager_interface_implement_set_state (klass,
+// audio_manager_engine_set_state);
+// audio_manager_interface_implement_get_state (klass,
+// audio_manager_engine_get_state);
}
static void
@@ -253,6 +254,7 @@
object_class->set_property = audio_manager_engine_set_property;
object_class->dispose = audio_manager_engine_dispose;
object_class->finalize = audio_manager_engine_finalize;
+
}
static void
--- src/audio-manager-interface.c
+++ src/audio-manager-interface.c
@@ -62,6 +62,11 @@
audio_manager_interface_set_volume (AudioManagerInterface *self,
gint type, gint volume)
{
+ /*disalbe audio setting while in generic mode*/
+ if(self == NULL){
+ g_warning ("%s: Method not implemented\n", __FUNCTION__);
+ return TRUE;
+ }
audio_manager_interface_set_volume_impl impl = (AUDIO_MANAGER_INTERFACE_GET_CLASS (self)->set_volume);
if (impl != NULL) {
@@ -83,6 +88,11 @@
audio_manager_interface_get_volume (AudioManagerInterface *self,
gint type, gint *volume)
{
+ /*disalbe audio setting while in generic mode*/
+ if(self == NULL){
+ g_warning ("%s: Method not implemented\n", __FUNCTION__);
+ return TRUE;
+ }
audio_manager_interface_get_volume_impl impl = (AUDIO_MANAGER_INTERFACE_GET_CLASS (self)->get_volume);
if (impl != NULL) {
@@ -104,6 +114,13 @@
audio_manager_interface_set_state (AudioManagerInterface *self,
gint type, gint state)
{
+
+ /*disalbe audio setting while in generic mode*/
+ if(self == NULL){
+ g_warning ("%s: Method not implemented\n", __FUNCTION__);
+ return TRUE;
+ }
+
audio_manager_interface_set_state_impl impl = (AUDIO_MANAGER_INTERFACE_GET_CLASS (self)->set_state);
if (impl != NULL) {
@@ -125,6 +142,12 @@
audio_manager_interface_get_state (AudioManagerInterface *self,
gint type, gint *state)
{
+
+ /*disalbe audio setting while in generic mode*/
+ if(self == NULL){ /*for client-test.py: #32*/
+ g_warning ("%s: Method not implemented\n", __FUNCTION__);
+ return TRUE;
+ }
audio_manager_interface_get_state_impl impl = (AUDIO_MANAGER_INTERFACE_GET_CLASS (self)->get_state);
if (impl != NULL) {
--- src/com.UMMS.conf
+++ src/com.UMMS.conf
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
+
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy context="default">
+ <allow own="com.UMMS"/>
+ <allow send_destination="com.UMMS"/>
+ </policy>
+</busconfig>
--- src/com.UMMS.service.in
+++ src/com.UMMS.service.in
+[D-BUS Service]
+Name=com.UMMS
+Exec=@dir@/umms-server
+User=root
--- src/dvb-player.c
+++ src/dvb-player.c
@@ -19,20 +19,20 @@
#include "umms-error.h"
#include "umms-resource-manager.h"
#include "dvb-player.h"
-#include "meego-media-player-control.h"
+#include "media-player-control.h"
#include "param-table.h"
/* add PAT, CAT, NIT, SDT, EIT to pids filter for dvbsrc */
#define INIT_PIDS "0:1:16:17:18"
#define DVB_SRC
-static void meego_media_player_control_init (MeegoMediaPlayerControl* iface);
+static void media_player_control_init (MediaPlayerControl* iface);
static gpointer socket_listen_thread(DvbPlayer* dvd_player);
-static void socket_thread_join(MeegoMediaPlayerControl* dvd_player);
+static void socket_thread_join(MediaPlayerControl* dvd_player);
static void send_socket_data(GstBuffer* buf, gpointer user_data);
G_DEFINE_TYPE_WITH_CODE (DvbPlayer, dvb_player, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (MEEGO_TYPE_MEDIA_PLAYER_CONTROL, meego_media_player_control_init))
+ G_IMPLEMENT_INTERFACE (TYPE_MEDIA_PLAYER_CONTROL, media_player_control_init))
#define PLAYER_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), DVB_TYPE_PLAYER, DvbPlayerPrivate))
@@ -131,11 +131,11 @@
gint sock_exit_flag;
};
-static gboolean _stop_pipe (MeegoMediaPlayerControl *control);
-static gboolean dvb_player_set_video_size (MeegoMediaPlayerControl *self, guint x, guint y, guint w, guint h);
-static gboolean create_xevent_handle_thread (MeegoMediaPlayerControl *self);
-static gboolean destroy_xevent_handle_thread (MeegoMediaPlayerControl *self);
-static void release_resource (MeegoMediaPlayerControl *self);
+static gboolean _stop_pipe (MediaPlayerControl *control);
+static gboolean dvb_player_set_video_size (MediaPlayerControl *self, guint x, guint y, guint w, guint h);
+static gboolean create_xevent_handle_thread (MediaPlayerControl *self);
+static gboolean destroy_xevent_handle_thread (MediaPlayerControl *self);
+static void release_resource (MediaPlayerControl *self);
static void pad_added_cb (GstElement *element, GstPad *pad, gpointer data);
static void no_more_pads_cb (GstElement *element, gpointer data);
static gboolean autoplug_pad(DvbPlayer *player, GstPad *pad, gint chain_type);
@@ -144,8 +144,8 @@
static gboolean autoplug_dec_element (DvbPlayer *player, GstElement * element);
static gboolean link_sink (DvbPlayer *player, GstPad *pad);
static GstPad *get_sink_pad (GstElement * element);
-static gboolean start_recording (MeegoMediaPlayerControl *self, gchar *location);
-static gboolean stop_recording (MeegoMediaPlayerControl *self);
+static gboolean start_recording (MediaPlayerControl *self, gchar *location);
+static gboolean stop_recording (MediaPlayerControl *self);
gboolean set_ismd_audio_sink_property (GstElement *asink, const gchar *prop_name, gpointer val);
gboolean get_ismd_audio_sink_property (GstElement *asink, const gchar *prop_name, gpointer val);
@@ -295,7 +295,7 @@
}
static gboolean
-dvb_player_set_uri (MeegoMediaPlayerControl *self,
+dvb_player_set_uri (MediaPlayerControl *self,
const gchar *uri)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -325,7 +325,7 @@
}
static gboolean
-get_video_rectangle (MeegoMediaPlayerControl *self, gint *ax, gint *ay, gint *w, gint *h, gint *rx, gint *ry)
+get_video_rectangle (MediaPlayerControl *self, gint *ax, gint *ay, gint *w, gint *h, gint *rx, gint *ry)
{
XWindowAttributes video_win_attr, app_win_attr;
gint app_x, app_y;
@@ -367,7 +367,7 @@
}
static gboolean
-cutout (MeegoMediaPlayerControl *self, gint x, gint y, gint w, gint h)
+cutout (MediaPlayerControl *self, gint x, gint y, gint w, gint h)
{
Atom property;
gchar data[256];
@@ -379,8 +379,8 @@
return FALSE;
}
- g_sprintf (data, "meego-tv-cutout-x=%d:meego-tv-cutout-y=%d:meego-tv-cutout-width=%d:"
- "meego-tv-cutout-height=%d:meego-tv-half-trans=0:meego-tv-full-window=0", x, y, w, h);
+ g_sprintf (data, "tv-cutout-x=%d:tv-cutout-y=%d:tv-cutout-width=%d:"
+ "tv-cutout-height=%d:tv-half-trans=0:tv-full-window=0", x, y, w, h);
UMMS_DEBUG ("Hints to mtv-mutter = \"%s\"", data);
@@ -390,7 +390,7 @@
}
static gboolean
-unset_xwindow_target (MeegoMediaPlayerControl *self)
+unset_xwindow_target (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -403,7 +403,7 @@
}
static void
-dvb_player_handle_xevents (MeegoMediaPlayerControl *control)
+dvb_player_handle_xevents (MediaPlayerControl *control)
{
XEvent e;
gint x, y, w, h, rx, ry;
@@ -428,7 +428,7 @@
}
static gpointer
-dvb_player_event_thread (MeegoMediaPlayerControl* control)
+dvb_player_event_thread (MediaPlayerControl* control)
{
DvbPlayerPrivate *priv = GET_PRIVATE (control);
@@ -449,7 +449,7 @@
}
static gboolean
-create_xevent_handle_thread (MeegoMediaPlayerControl *self)
+create_xevent_handle_thread (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -465,7 +465,7 @@
}
static gboolean
-destroy_xevent_handle_thread (MeegoMediaPlayerControl *self)
+destroy_xevent_handle_thread (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -479,7 +479,7 @@
return TRUE;
}
-static gboolean setup_ismd_vbin(MeegoMediaPlayerControl *self, gchar *rect, gint plane)
+static gboolean setup_ismd_vbin(MediaPlayerControl *self, gchar *rect, gint plane)
{
GstElement *new_vsink = NULL;
gboolean ret = TRUE;
@@ -509,7 +509,7 @@
return ret;
}
-static gboolean setup_gdl_plane_target (MeegoMediaPlayerControl *self, GHashTable *params)
+static gboolean setup_gdl_plane_target (MediaPlayerControl *self, GHashTable *params)
{
gchar *rect = NULL;
gint plane = INVALID_PLANE_ID;
@@ -539,7 +539,7 @@
* 1 and 2 are the case of xorg server.
* 3 is always satisfied, unless subwindow is requested from a process which is not the same process hosting the top-level window.
*/
-static Window get_top_level_win (MeegoMediaPlayerControl *self, Window sub_win)
+static Window get_top_level_win (MediaPlayerControl *self, Window sub_win)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
Display *disp = priv->disp;
@@ -578,7 +578,7 @@
return top_win;
}
-static gboolean setup_datacopy_target (MeegoMediaPlayerControl *self, GHashTable *params)
+static gboolean setup_datacopy_target (MediaPlayerControl *self, GHashTable *params)
{
gchar *rect = NULL;
GValue *val = NULL;
@@ -697,7 +697,7 @@
* 4. Create xevent handle thread.
*/
-static gboolean setup_xwindow_target (MeegoMediaPlayerControl *self, GHashTable *params)
+static gboolean setup_xwindow_target (MediaPlayerControl *self, GHashTable *params)
{
GValue *val;
gint x, y, w, h, rx, ry;
@@ -753,7 +753,7 @@
}
static gboolean
-unset_target (MeegoMediaPlayerControl *self)
+unset_target (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -785,7 +785,7 @@
}
static gboolean
-dvb_player_set_target (MeegoMediaPlayerControl *self, gint type, GHashTable *params)
+dvb_player_set_target (MediaPlayerControl *self, gint type, GHashTable *params)
{
gboolean ret = TRUE;
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -840,7 +840,7 @@
}
static gboolean
-prepare_plane (MeegoMediaPlayerControl *self)
+prepare_plane (MediaPlayerControl *self)
{
GstElement *vsink_bin;
gint plane;
@@ -892,7 +892,7 @@
res = umms_resource_manager_request_resource (priv->res_mngr, &req); \
if (!res) { \
release_resource(self); \
- meego_media_player_control_emit_error (self, \
+ media_player_control_emit_error (self, \
UMMS_RESOURCE_ERROR_NO_RESOURCE, \
e_msg); \
return FALSE; \
@@ -902,7 +902,7 @@
static gboolean
-request_resource (MeegoMediaPlayerControl *self)
+request_resource (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -919,7 +919,7 @@
}
static void
-release_resource (MeegoMediaPlayerControl *self)
+release_resource (MediaPlayerControl *self)
{
GList *g;
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -959,7 +959,7 @@
}
static gboolean
-dvb_player_play (MeegoMediaPlayerControl *self)
+dvb_player_play (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE(self);
@@ -973,7 +973,7 @@
}
static gboolean
-_stop_pipe (MeegoMediaPlayerControl *control)
+_stop_pipe (MediaPlayerControl *control)
{
DvbPlayerPrivate *priv = GET_PRIVATE (control);
@@ -993,7 +993,7 @@
}
static gboolean
-dvb_player_stop (MeegoMediaPlayerControl *self)
+dvb_player_stop (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
PlayerState old_state;
@@ -1005,15 +1005,15 @@
priv->player_state = PlayerStateStopped;
if (old_state != priv->player_state) {
- meego_media_player_control_emit_player_state_changed (self, old_state, priv->player_state);
+ media_player_control_emit_player_state_changed (self, old_state, priv->player_state);
}
- meego_media_player_control_emit_stopped (self);
+ media_player_control_emit_stopped (self);
return TRUE;
}
static gboolean
-dvb_player_set_video_size (MeegoMediaPlayerControl *self,
+dvb_player_set_video_size (MediaPlayerControl *self,
guint x, guint y, guint w, guint h)
{
@@ -1047,7 +1047,7 @@
}
static gboolean
-dvb_player_get_video_size (MeegoMediaPlayerControl *self,
+dvb_player_get_video_size (MediaPlayerControl *self,
guint *w, guint *h)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -1078,7 +1078,7 @@
}
static gboolean
-dvb_player_is_seekable (MeegoMediaPlayerControl *self, gboolean *seekable)
+dvb_player_is_seekable (MediaPlayerControl *self, gboolean *seekable)
{
DvbPlayerPrivate *priv = NULL;
GstElement *pipeline = NULL;
@@ -1087,7 +1087,7 @@
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (seekable != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipeline = priv->pipeline;
@@ -1123,13 +1123,13 @@
}
static gboolean
-dvb_player_set_volume (MeegoMediaPlayerControl *self, gint vol)
+dvb_player_set_volume (MediaPlayerControl *self, gint vol)
{
DvbPlayerPrivate *priv;
gdouble volume;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1141,13 +1141,13 @@
}
static gboolean
-dvb_player_get_volume (MeegoMediaPlayerControl *self, gint *vol)
+dvb_player_get_volume (MediaPlayerControl *self, gint *vol)
{
gdouble volume;
DvbPlayerPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1162,7 +1162,7 @@
}
static gboolean
-dvb_player_support_fullscreen (MeegoMediaPlayerControl *self, gboolean *support_fullscreen)
+dvb_player_support_fullscreen (MediaPlayerControl *self, gboolean *support_fullscreen)
{
//We are using ismd_vidrend_bin, so this function always return TRUE.
*support_fullscreen = TRUE;
@@ -1170,14 +1170,14 @@
}
static gboolean
-dvb_player_get_player_state (MeegoMediaPlayerControl *self,
+dvb_player_get_player_state (MediaPlayerControl *self,
gint *state)
{
DvbPlayerPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (state != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1186,13 +1186,13 @@
}
static gboolean
-dvb_player_set_mute (MeegoMediaPlayerControl *self, gint mute)
+dvb_player_set_mute (MediaPlayerControl *self, gint mute)
{
GstElement *pipeline;
DvbPlayerPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipeline = priv->pipeline;
@@ -1203,12 +1203,12 @@
}
static gboolean
-dvb_player_is_mute (MeegoMediaPlayerControl *self, gint *mute)
+dvb_player_is_mute (MediaPlayerControl *self, gint *mute)
{
DvbPlayerPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1217,7 +1217,7 @@
static gboolean
-dvb_player_set_scale_mode (MeegoMediaPlayerControl *self, gint scale_mode)
+dvb_player_set_scale_mode (MediaPlayerControl *self, gint scale_mode)
{
DvbPlayerPrivate *priv;
GstElement *vsink_bin;
@@ -1228,7 +1228,7 @@
GEnumValue *eval;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1288,7 +1288,7 @@
}
static gboolean
-dvb_player_get_scale_mode (MeegoMediaPlayerControl *self, gint *scale_mode)
+dvb_player_get_scale_mode (MediaPlayerControl *self, gint *scale_mode)
{
DvbPlayerPrivate *priv;
GstElement *vsink_bin;
@@ -1301,7 +1301,7 @@
*scale_mode = ScaleModeInvalid;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1358,26 +1358,26 @@
}
static gboolean
-dvb_player_get_protocol_name(MeegoMediaPlayerControl *self, gchar ** prot_name)
+dvb_player_get_protocol_name(MediaPlayerControl *self, gchar ** prot_name)
{
*prot_name = "dvb";
return TRUE;
}
static gboolean
-dvb_player_get_current_uri(MeegoMediaPlayerControl *self, gchar ** uri)
+dvb_player_get_current_uri(MediaPlayerControl *self, gchar ** uri)
{
DvbPlayerPrivate *priv = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
*uri = priv->uri;
return TRUE;
}
-static gboolean start_recording (MeegoMediaPlayerControl *self, gchar *location)
+static gboolean start_recording (MediaPlayerControl *self, gchar *location)
{
gboolean ret = FALSE;
@@ -1461,7 +1461,7 @@
goto out;
}
-static gboolean stop_recording (MeegoMediaPlayerControl *self)
+static gboolean stop_recording (MediaPlayerControl *self)
{
DvbPlayerPrivate *priv = GET_PRIVATE (self);
@@ -1485,12 +1485,12 @@
}
static gboolean
-dvb_player_record (MeegoMediaPlayerControl *self, gboolean to_record, gchar *location)
+dvb_player_record (MediaPlayerControl *self, gboolean to_record, gchar *location)
{
DvbPlayerPrivate *priv = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1505,7 +1505,7 @@
}
static gboolean
-dvb_player_get_pat (MeegoMediaPlayerControl *self, GPtrArray **pat)
+dvb_player_get_pat (MediaPlayerControl *self, GPtrArray **pat)
{
GValueArray *pat_info = NULL;
GPtrArray *pat_out = NULL;
@@ -1514,7 +1514,7 @@
gint i;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
g_return_val_if_fail (pat, FALSE);
priv = GET_PRIVATE (self);
@@ -1592,7 +1592,7 @@
*
*/
static gboolean
-dvb_player_get_pmt (MeegoMediaPlayerControl *self, guint *program_num, guint *pcr_pid, GPtrArray **stream_info)
+dvb_player_get_pmt (MediaPlayerControl *self, guint *program_num, guint *pcr_pid, GPtrArray **stream_info)
{
DvbPlayerPrivate *priv;
gboolean ret = FALSE;
@@ -1603,7 +1603,7 @@
GValueArray *stream_info_array = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
g_return_val_if_fail (program_num, FALSE);
g_return_val_if_fail (pcr_pid, FALSE);
g_return_val_if_fail (stream_info, FALSE);
@@ -1660,12 +1660,12 @@
}
static gboolean
-dvb_player_get_associated_data_channel (MeegoMediaPlayerControl *self, gchar **ip, gint *port)
+dvb_player_get_associated_data_channel (MediaPlayerControl *self, gchar **ip, gint *port)
{
DvbPlayerPrivate *priv = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
g_return_val_if_fail (ip, FALSE);
g_return_val_if_fail (port, FALSE);
@@ -1764,51 +1764,51 @@
}
static void
-meego_media_player_control_init (MeegoMediaPlayerControl *iface)
+media_player_control_init (MediaPlayerControl *iface)
{
- MeegoMediaPlayerControlClass *klass = (MeegoMediaPlayerControlClass *)iface;
+ MediaPlayerControlClass *klass = (MediaPlayerControlClass *)iface;
- meego_media_player_control_implement_set_uri (klass,
+ media_player_control_implement_set_uri (klass,
dvb_player_set_uri);
- meego_media_player_control_implement_set_target (klass,
+ media_player_control_implement_set_target (klass,
dvb_player_set_target);
- meego_media_player_control_implement_play (klass,
+ media_player_control_implement_play (klass,
dvb_player_play);
- meego_media_player_control_implement_stop (klass,
+ media_player_control_implement_stop (klass,
dvb_player_stop);
- meego_media_player_control_implement_set_video_size (klass,
+ media_player_control_implement_set_video_size (klass,
dvb_player_set_video_size);
- meego_media_player_control_implement_get_video_size (klass,
+ media_player_control_implement_get_video_size (klass,
dvb_player_get_video_size);
- meego_media_player_control_implement_is_seekable (klass,
+ media_player_control_implement_is_seekable (klass,
dvb_player_is_seekable);
- meego_media_player_control_implement_set_volume (klass,
+ media_player_control_implement_set_volume (klass,
dvb_player_set_volume);
- meego_media_player_control_implement_get_volume (klass,
+ media_player_control_implement_get_volume (klass,
dvb_player_get_volume);
- meego_media_player_control_implement_support_fullscreen (klass,
+ media_player_control_implement_support_fullscreen (klass,
dvb_player_support_fullscreen);
- meego_media_player_control_implement_get_player_state (klass,
+ media_player_control_implement_get_player_state (klass,
dvb_player_get_player_state);
- meego_media_player_control_implement_set_mute (klass,
+ media_player_control_implement_set_mute (klass,
dvb_player_set_mute);
- meego_media_player_control_implement_is_mute (klass,
+ media_player_control_implement_is_mute (klass,
dvb_player_is_mute);
- meego_media_player_control_implement_set_scale_mode (klass,
+ media_player_control_implement_set_scale_mode (klass,
dvb_player_set_scale_mode);
- meego_media_player_control_implement_get_scale_mode (klass,
+ media_player_control_implement_get_scale_mode (klass,
dvb_player_get_scale_mode);
- meego_media_player_control_implement_get_protocol_name (klass,
+ media_player_control_implement_get_protocol_name (klass,
dvb_player_get_protocol_name);
- meego_media_player_control_implement_get_current_uri (klass,
+ media_player_control_implement_get_current_uri (klass,
dvb_player_get_current_uri);
- meego_media_player_control_implement_record (klass,
+ media_player_control_implement_record (klass,
dvb_player_record);
- meego_media_player_control_implement_get_pat (klass,
+ media_player_control_implement_get_pat (klass,
dvb_player_get_pat);
- meego_media_player_control_implement_get_pmt (klass,
+ media_player_control_implement_get_pmt (klass,
dvb_player_get_pmt);
- meego_media_player_control_implement_get_associated_data_channel (klass,
+ media_player_control_implement_get_associated_data_channel (klass,
dvb_player_get_associated_data_channel);
}
@@ -1843,7 +1843,7 @@
int i;
UMMS_DEBUG ("Begin");
- dvb_player_stop ((MeegoMediaPlayerControl *)object);
+ dvb_player_stop ((MediaPlayerControl *)object);
TEARDOWN_ELEMENT(priv->source);
TEARDOWN_ELEMENT(priv->tsdemux);
@@ -1852,7 +1852,7 @@
TEARDOWN_ELEMENT(priv->pipeline);
if (priv->listen_thread) {
- socket_thread_join((MeegoMediaPlayerControl *)object);
+ socket_thread_join((MediaPlayerControl *)object);
priv->listen_thread = NULL;
}
@@ -1874,7 +1874,7 @@
}
if (priv->target_type == XWindow) {
- unset_xwindow_target ((MeegoMediaPlayerControl *)object);
+ unset_xwindow_target ((MediaPlayerControl *)object);
}
if (priv->disp) {
@@ -1949,7 +1949,7 @@
if (priv->player_state != old_player_state) {
UMMS_DEBUG ("emit state changed, old=%d, new=%d", old_player_state, priv->player_state);
- meego_media_player_control_emit_player_state_changed (self, old_player_state, priv->player_state);
+ media_player_control_emit_player_state_changed (self, old_player_state, priv->player_state);
}
}
@@ -1959,7 +1959,7 @@
DvbPlayer *self)
{
UMMS_DEBUG ("message::eos received on bus");
- meego_media_player_control_emit_eof (self);
+ media_player_control_emit_eof (self);
}
@@ -1973,9 +1973,9 @@
UMMS_DEBUG ("message::error received on bus");
gst_message_parse_error (message, &error, NULL);
- _stop_pipe (MEEGO_MEDIA_PLAYER_CONTROL(self));
+ _stop_pipe (MEDIA_PLAYER_CONTROL(self));
- meego_media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
+ media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
UMMS_DEBUG ("Error emitted with message = %s", error->message);
@@ -2005,7 +2005,7 @@
vsink = GST_ELEMENT(GST_MESSAGE_SRC (message));
UMMS_DEBUG ("sync-handler received on bus: prepare-gdl-plane, source: %s", GST_ELEMENT_NAME(vsink));
- if (!prepare_plane ((MeegoMediaPlayerControl *)engine)) {
+ if (!prepare_plane ((MediaPlayerControl *)engine)) {
//Since we are in streame thread, let the vsink to post the error message. Handle it in bus_message_error_cb().
err = g_error_new_literal (UMMS_RESOURCE_ERROR, UMMS_RESOURCE_ERROR_NO_RESOURCE, "Plane unavailable");
msg = gst_message_new_error (GST_OBJECT_CAST(priv->pipeline), err, "No resource");
@@ -2013,7 +2013,7 @@
g_error_free (err);
}
-// meego_media_player_control_emit_request_window (engine);
+// media_player_control_emit_request_window (engine);
if (message)
gst_message_unref (message);
@@ -2094,7 +2094,7 @@
g_object_unref (clock);
} else {
UMMS_DEBUG ("Can't get HW clock");
- meego_media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, "Can't get HW clock for live source");
+ media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, "Can't get HW clock for live source");
goto failed;
}
#endif
@@ -2149,12 +2149,12 @@
priv->artist = NULL;
//URI is one of metadatas whose change should be notified.
- meego_media_player_control_emit_metadata_changed (self);
+ media_player_control_emit_metadata_changed (self);
//Setup default target.
#define FULL_SCREEN_RECT "0,0,0,0"
- setup_ismd_vbin (MEEGO_MEDIA_PLAYER_CONTROL(self), FULL_SCREEN_RECT, UPP_A);
+ setup_ismd_vbin (MEDIA_PLAYER_CONTROL(self), FULL_SCREEN_RECT, UPP_A);
priv->target_type = ReservedType0;
priv->target_initialized = TRUE;
@@ -2686,7 +2686,7 @@
static void
-socket_thread_join(MeegoMediaPlayerControl* dvd_player)
+socket_thread_join(MediaPlayerControl* dvd_player)
{
DvbPlayerPrivate *priv = GET_PRIVATE (dvd_player);
struct sockaddr_in server_addr;
--- src/engine-generic.c
+++ src/engine-generic.c
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <gst/gst.h>
+#include <gst/interfaces/xoverlay.h>
+/* for the volume property */
+#include <gst/interfaces/streamvolume.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <glib/gprintf.h>
+#include "umms-common.h"
+#include "umms-debug.h"
+#include "umms-error.h"
+#include "umms-resource-manager.h"
+#include "engine-generic.h"
+#include "media-player-control.h"
+#include "param-table.h"
+
+static void media_player_control_init (MediaPlayerControl* iface);
+
+G_DEFINE_TYPE_WITH_CODE (EngineGeneric, engine_generic, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (TYPE_MEDIA_PLAYER_CONTROL, media_player_control_init))
+
+#define PLAYER_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), ENGINE_TYPE_GENERIC, EngineGenericPrivate))
+
+#define GET_PRIVATE(o) ((EngineGeneric *)o)->priv
+
+#define TEARDOWN_ELEMENT(ele) \
+ if (ele) { \
+ gst_element_set_state (ele, GST_STATE_NULL); \
+ g_object_unref (ele); \
+ ele = NULL; \
+ }
+
+#define INVALID_PLANE_ID -1
+
+static const gchar *gst_state[] = {
+ "GST_STATE_VOID_PENDING",
+ "GST_STATE_NULL",
+ "GST_STATE_READY",
+ "GST_STATE_PAUSED",
+ "GST_STATE_PLAYING"
+};
+
+
+/* list of URIs that we consider to be live source. */
+static gchar *live_src_uri[] = {"mms://", "mmsh://", "rtsp://",
+ "mmsu://", "mmst://", "fd://", "myth://", "ssh://", "ftp://", "sftp://",
+ NULL
+ };
+
+#define IS_LIVE_URI(uri) \
+({ \
+ gboolean ret = FALSE; \
+ gchar ** src = live_src_uri; \
+ while (*src) { \
+ if (!g_ascii_strncasecmp (uri, *src, strlen(*src))) { \
+ ret = TRUE; \
+ break; \
+ } \
+ src++; \
+ } \
+ ret; \
+})
+
+#define UMMS_MAX_SERV_CONNECTS 5
+#define UMMS_SOCKET_DEFAULT_PORT 112131
+#define UMMS_SOCKET_DEFAULT_ADDR NULL
+
+struct _EngineGenericPrivate {
+ GstElement *pipeline;
+
+ gchar *uri;
+ gint seekable;
+
+ GstElement *source;
+
+ //buffering stuff
+ gboolean buffering;
+ gint buffer_percent;
+
+ //UMMS defined player state
+ PlayerState player_state;//current state
+ PlayerState pending_state;//target state, for async state change(*==>PlayerStatePaused, PlayerStateNull/Stopped==>PlayerStatePlaying)
+
+ gboolean is_live;
+ gint64 duration;//ms
+ gint64 total_bytes;
+
+ gboolean target_initialized;
+
+ //XWindow target stuff
+ gboolean xwin_initialized;
+ gint target_type;
+ Window app_win_id;//top-level window
+ Window video_win_id;
+ Display *disp;
+ GThread *event_thread;
+ gboolean event_thread_running;
+
+ //http proxy
+ gchar *proxy_uri;
+ gchar *proxy_id;
+ gchar *proxy_pw;
+
+ //resource management
+ UmmsResourceManager *res_mngr;//no need to unref, since it is global singleton.
+ GList *res_list;
+
+ gboolean resource_prepared;
+ gboolean uri_parsed;
+ GstElement *uri_parse_pipe;
+ //flags to indicate resource needed by uri, should be reset before setting a new uri.
+ gboolean has_video;
+ gint hw_viddec;//number of HW viddec needed
+ gboolean has_audio;
+ gint hw_auddec;//number of HW auddec needed
+ gboolean has_sub;//FIXME: what resource needed by subtitle?
+
+ //suspend/restore
+ gboolean suspended;//child state of PlayerStateStopped
+
+ //snapshot of suspended execution
+ gint64 pos;
+
+ /* Use it to buffer the tag of the stream. */
+ GstTagList *tag_list;
+ gchar *title;
+ gchar *artist;
+};
+
+static gboolean _query_buffering_percent (GstElement *pipe, gdouble *percent);
+static void _source_changed_cb (GObject *object, GParamSpec *pspec, gpointer data);
+static gboolean _stop_pipe (MediaPlayerControl *control);
+static gboolean engine_generic_set_video_size (MediaPlayerControl *self, guint x, guint y, guint w, guint h);
+static gboolean create_xevent_handle_thread (MediaPlayerControl *self);
+static gboolean destroy_xevent_handle_thread (MediaPlayerControl *self);
+static void release_resource (MediaPlayerControl *self);
+
+
+static gboolean
+engine_generic_set_uri (MediaPlayerControl *self,
+ const gchar *uri)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ g_return_val_if_fail (uri, FALSE);
+
+ UMMS_DEBUG ("SetUri called: old = %s new = %s",
+ priv->uri,
+ uri);
+
+ if (priv->uri) {
+ _stop_pipe(self);
+ g_free (priv->uri);
+ }
+
+ priv->uri = g_strdup (uri);
+ g_object_set (priv->pipeline, "uri", uri, NULL);
+
+ //reset flags and object specific to uri.
+ TEARDOWN_ELEMENT (priv->uri_parse_pipe);
+ TEARDOWN_ELEMENT (priv->source);
+
+ priv->total_bytes = -1;
+ priv->duration = -1;
+ priv->seekable = -1;
+ priv->buffering = FALSE;
+ priv->buffer_percent = -1;
+ priv->player_state = PlayerStateStopped;
+ priv->pending_state = PlayerStateNull;
+
+ priv->resource_prepared = FALSE;
+ priv->uri_parsed = FALSE;
+ priv->has_video = FALSE;
+ priv->hw_viddec = 0;
+ priv->has_audio = FALSE;
+ priv->hw_auddec = FALSE;
+
+ if (priv->tag_list)
+ gst_tag_list_free(priv->tag_list);
+ priv->tag_list = NULL;
+ RESET_STR(priv->title);
+ RESET_STR(priv->artist);
+
+ //URI is one of metadatas whose change should be notified.
+ media_player_control_emit_metadata_changed (self);
+ //return parse_uri_async(self, priv->uri);//Mod
+ return TRUE;
+}
+
+static gboolean
+get_video_rectangle (MediaPlayerControl *self, gint *ax, gint *ay, gint *w, gint *h, gint *rx, gint *ry)
+{
+ XWindowAttributes video_win_attr, app_win_attr;
+ gint app_x, app_y;
+ Window junkwin;
+ Status status;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ status = XGetWindowAttributes (priv->disp, priv->app_win_id, &app_win_attr);
+ if (!status) {
+ UMMS_DEBUG ("Get top-level window attributes failed");
+ return FALSE;
+ }
+ status = XGetWindowAttributes (priv->disp, priv->video_win_id, &video_win_attr);
+ if (!status) {
+ UMMS_DEBUG ("Get top-level window attributes failed");
+ return FALSE;
+ }
+
+ (void) XTranslateCoordinates (priv->disp, priv->app_win_id, app_win_attr.root,
+ -app_win_attr.border_width,
+ -app_win_attr.border_width,
+ &app_x, &app_y, &junkwin);
+ UMMS_DEBUG ("app window app_absolute_x = %d, app_absolute_y = %d", app_x, app_y);
+
+ (void) XTranslateCoordinates (priv->disp, priv->video_win_id, video_win_attr.root,
+ -video_win_attr.border_width,
+ -video_win_attr.border_width,
+ ax, ay, &junkwin);
+
+ UMMS_DEBUG ("video window video_absolute_x = %d, video_absolute_y = %d", *ax, *ay);
+
+ *rx = *ax - app_x;
+ *ry = *ay - app_y;
+ *w = video_win_attr.width;
+ *h = video_win_attr.height;
+ UMMS_DEBUG ("video window video_relative_x = %d, video_relative_y = %d", *rx, *ry);
+ UMMS_DEBUG ("video w=%d,y=%d", *w, *h);
+ return TRUE;
+}
+
+static gboolean
+cutout (MediaPlayerControl *self, gint x, gint y, gint w, gint h)
+{
+ Atom property;
+ gchar data[256];
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ property = XInternAtom (priv->disp, "_MUTTER_HINTS", 0);
+ if (!property) {
+ UMMS_DEBUG ("XInternAtom failed");
+ return FALSE;
+ }
+
+ g_sprintf (data, "tv-cutout-x=%d:tv-cutout-y=%d:tv-cutout-width=%d:"
+ "tv-cutout-height=%d:tv-half-trans=0:tv-full-window=0", x, y, w, h);
+
+ UMMS_DEBUG ("Hints to mtv-mutter = \"%s\"", data);
+
+ XChangeProperty(priv->disp, priv->app_win_id, property, XA_STRING, 8, PropModeReplace,
+ (unsigned char *)data, strlen(data));
+ return TRUE;
+}
+
+
+static Window
+get_app_win (MediaPlayerControl *self, Window win)
+{
+
+ Window root_win, parent_win, grandparent_win;
+ unsigned int num_children;
+ Window *child_list;
+
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ Display *dpy = priv->disp;
+
+ if (!XQueryTree(dpy, win, &root_win, &parent_win, &child_list,
+ &num_children)) {
+ UMMS_DEBUG("Can't query window(%lx)'s parent.", win);
+ return 0;
+ }
+ UMMS_DEBUG("root=(%lx),window(%lx)'s parent = (%lx)", root_win, win, parent_win);
+ if (child_list) XFree((gchar *)child_list);
+ if (root_win == parent_win) {
+ UMMS_DEBUG("Parent is root, so we got the app window(%lx)", win);
+ return win;
+ }
+
+ if (!XQueryTree(dpy, parent_win, &root_win, &grandparent_win, &child_list,
+ &num_children)) {
+ UMMS_DEBUG("Can't query window(%lx)'s grandparent.", win);
+ return 0;
+ }
+ if (child_list) XFree((gchar *)child_list);
+ UMMS_DEBUG("root=(%lx),window(%lx)'s grandparent = (%lx)", root_win, win, grandparent_win);
+
+ if (grandparent_win == root_win) {
+ UMMS_DEBUG("Grandpa is root, so we got the app window(%lx)", win);
+ return win;
+ } else {
+ return get_app_win (self, parent_win);
+ }
+}
+
+static gboolean
+unset_xwindow_target (MediaPlayerControl *self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ if (!priv->xwin_initialized)
+ return TRUE;
+
+ destroy_xevent_handle_thread (self);
+ priv->xwin_initialized = FALSE;
+ return TRUE;
+}
+
+static void
+engine_generic_handle_xevents (MediaPlayerControl *control)
+{
+ XEvent e;
+ gint x, y, w, h, rx, ry;
+ EngineGenericPrivate *priv = GET_PRIVATE (control);
+
+ g_return_if_fail (control);
+
+ /* Handle Expose */
+ while (XCheckWindowEvent (priv->disp,
+ priv->app_win_id, StructureNotifyMask, &e)) {
+ switch (e.type) {
+ case ConfigureNotify:
+ get_video_rectangle (control, &x, &y, &w, &h, &rx, &ry);
+ cutout (control, rx, ry, w, h);
+ engine_generic_set_video_size (control, x, y, w, h);
+ UMMS_DEBUG ("Got ConfigureNotify, video window abs_x=%d,abs_y=%d,w=%d,y=%d", x, y, w, h);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static gpointer
+engine_generic_event_thread (MediaPlayerControl* control)
+{
+
+ EngineGenericPrivate *priv = GET_PRIVATE (control);
+
+ UMMS_DEBUG ("Begin");
+ while (priv->event_thread_running) {
+
+ if (priv->app_win_id) {
+ engine_generic_handle_xevents (control);
+ }
+ /* FIXME: do we want to align this with the framerate or anything else? */
+ g_usleep (G_USEC_PER_SEC / 20);
+
+ }
+
+ UMMS_DEBUG ("End");
+ return NULL;
+}
+
+static gboolean
+create_xevent_handle_thread (MediaPlayerControl *self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ UMMS_DEBUG ("Begin");
+ if (!priv->event_thread) {
+ /* Setup our event listening thread */
+ UMMS_DEBUG ("run xevent thread");
+ priv->event_thread_running = TRUE;
+ priv->event_thread = g_thread_create (
+ (GThreadFunc) engine_generic_event_thread, self, TRUE, NULL);
+ }
+ return TRUE;
+}
+
+static gboolean
+destroy_xevent_handle_thread (MediaPlayerControl *self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ UMMS_DEBUG ("Begin");
+ if (priv->event_thread) {
+ priv->event_thread_running = FALSE;
+ g_thread_join (priv->event_thread);
+ priv->event_thread = NULL;
+ }
+ UMMS_DEBUG ("End");
+ return TRUE;
+}
+
+//FIXME: very ugly
+#define IS_VIDREND_BIN(ele) \
+ ((g_object_class_find_property (G_OBJECT_GET_CLASS (ele), "scale-mode") != NULL) && (g_object_class_find_property (G_OBJECT_GET_CLASS (ele), "gdl-plane") != NULL))
+
+static gboolean setup_ismd_vbin(MediaPlayerControl *self, gchar *rect, gint plane)
+{
+ UMMS_DEBUG("NO.SMD\n");
+#if 0
+ GstElement *cur_vsink = NULL;
+ GstElement *new_vsink = NULL;
+ GstElement *vsink = NULL;
+ gboolean ret = TRUE;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ g_object_get (priv->pipeline, "video-sink", &cur_vsink, NULL);
+ if (cur_vsink)
+ UMMS_DEBUG ("playbin2 aready has video-sink: %p, name: %s", cur_vsink, GST_ELEMENT_NAME(cur_vsink));
+
+ if (!cur_vsink || !IS_VIDREND_BIN(cur_vsink)) {
+ new_vsink = gst_element_factory_make ("ismd_vidrend_bin", NULL);
+ if (!new_vsink) {
+ UMMS_DEBUG ("Failed to make ismd_vidrend_bin");
+ ret = FALSE;
+ goto OUT;
+ }
+ UMMS_DEBUG ("new ismd_vidrend_bin: %p, name: %s", new_vsink, GST_ELEMENT_NAME(new_vsink));
+ }
+
+ vsink = new_vsink ? new_vsink : cur_vsink;
+
+ if (rect)
+ g_object_set (vsink, "rectangle", rect, NULL);
+
+ if (plane != INVALID_PLANE_ID)
+ g_object_set (vsink, "gdl-plane", plane, NULL);
+
+ if (new_vsink) {
+ g_object_set (priv->pipeline, "video-sink", vsink, NULL);
+ UMMS_DEBUG ("Set ismd_vidrend_bin to playbin2");
+ }
+
+OUT:
+ if (cur_vsink) {
+ g_object_unref (cur_vsink);
+ }
+ return ret;
+#endif
+}
+
+
+#if 0
+static gboolean setup_gdl_plane_target (MediaPlayerControl *self, GHashTable *params)
+{
+ gchar *rect = NULL;
+ gint plane = INVALID_PLANE_ID;
+ GValue *val = NULL;
+
+ UMMS_DEBUG ("setting up gdl plane target");
+ val = g_hash_table_lookup (params, TARGET_PARAM_KEY_RECTANGLE);
+ if (val) {
+ rect = (gchar *)g_value_get_string (val);
+ UMMS_DEBUG ("rectangle = '%s'", rect);
+ }
+
+ val = g_hash_table_lookup (params, TARGET_PARAM_KEY_PlANE_ID);
+ if (val) {
+ plane = g_value_get_int (val);
+ UMMS_DEBUG ("gdl plane = '%d'", plane);
+ }
+
+ return setup_ismd_vbin (self, rect, plane);
+}
+#endif
+
+/*
+ * To get the top level window according to subwindow.
+ * Some prerequisites should be satisfied:
+ * 1. The X server uses 29 bits(i.e. bit1--bit29) to represents a window id.
+ * 2. The X server uses bit22--bit29 to represents a connection/client, it means X server supports 256 connections/clients at maximum.
+ * 3. The top-level window and subwindow is requested from the same connection.
+ * 1 and 2 are the case of xorg server.
+ * 3 is always satisfied, unless subwindow is requested from a process which is not the same process hosting the top-level window.
+*/
+#if 0
+static Window get_top_level_win (MediaPlayerControl *self, Window sub_win)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ Display *disp = priv->disp;
+ Window root_win, parent_win, cur_win;
+ unsigned int num_children;
+ Window *child_list = NULL;
+ Window top_win = 0;
+ gboolean done = FALSE;
+
+ if (!disp)
+ return 0;
+
+ printf ("============%s:Begin, sub_win=%lx ==========\n", __FUNCTION__, sub_win);
+#define CLIENT_MASK (0x1fe00000)
+#define FROM_THE_SAME_PROC(w1,w2) ((w1&CLIENT_MASK) == (w2&CLIENT_MASK))
+
+ cur_win = sub_win;
+ while (!done) {
+ if (!XQueryTree(disp, cur_win, &root_win, &parent_win, &child_list, &num_children)) {
+ UMMS_DEBUG ("Can't query window tree.");
+ return 0;
+ }
+
+ UMMS_DEBUG ("cur_win(%lx), parent_win(%lx)", cur_win, parent_win);
+ if (child_list) XFree((char *)child_list);
+
+ if (!FROM_THE_SAME_PROC(cur_win, parent_win)) {
+ UMMS_DEBUG ("Got the top-level window(%lx)", cur_win);
+ top_win = cur_win;
+ done = TRUE;
+ break;
+ };
+ cur_win = parent_win;
+ }
+ printf ("============%s:End==========\n", __FUNCTION__);
+ return top_win;
+}
+#endif
+
+#if 0
+static gboolean setup_datacopy_target (MediaPlayerControl *self, GHashTable *params)
+{
+ gchar *rect = NULL;
+ GValue *val = NULL;
+ GstElement *shmvbin = NULL;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+
+ UMMS_DEBUG ("setting up datacopy target");
+ shmvbin = gst_element_factory_make ("shmvidrendbin", NULL);
+ if (!shmvbin) {
+ UMMS_DEBUG ("Making \"shmvidrendbin\" failed");
+ return FALSE;
+ }
+
+ val = g_hash_table_lookup (params, TARGET_PARAM_KEY_RECTANGLE);
+ if (val) {
+ rect = (gchar *)g_value_get_string (val);
+ UMMS_DEBUG ("setting rectangle = '%s'", rect);
+ g_object_set (shmvbin, "rectangle", rect, NULL);
+ }
+
+ g_object_set (priv->pipeline, "video-sink", shmvbin, NULL);
+ UMMS_DEBUG ("Set \"shmvidrendbin\" to playbin2");
+ return TRUE;
+}
+
+static int x_print_error(
+ Display *dpy,
+ XErrorEvent *event,
+ FILE *fp)
+{
+ char buffer[BUFSIZ];
+ char mesg[BUFSIZ];
+ char number[32];
+ const char *mtype = "XlibMessage";
+ XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
+ XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
+ (void) fprintf(fp, "%s: %s\n ", mesg, buffer);
+ XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d",
+ mesg, BUFSIZ);
+ (void) fprintf(fp, mesg, event->request_code);
+ if (event->request_code < 128) {
+ sprintf(number, "%d", event->request_code);
+ XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
+ }
+
+ (void) fprintf(fp, " (%s)\n", buffer);
+ if (event->request_code >= 128) {
+ XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
+ mesg, BUFSIZ);
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->minor_code);
+
+ fputs("\n", fp);
+ }
+ if (event->error_code >= 128) {
+ strcpy(buffer, "Value");
+ XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ);
+ if (mesg[0]) {
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->resourceid);
+ fputs("\n", fp);
+ }
+
+ } else if ((event->error_code == BadWindow) ||
+ (event->error_code == BadPixmap) ||
+ (event->error_code == BadCursor) ||
+ (event->error_code == BadFont) ||
+ (event->error_code == BadDrawable) ||
+ (event->error_code == BadColor) ||
+ (event->error_code == BadGC) ||
+ (event->error_code == BadIDChoice) ||
+ (event->error_code == BadValue) ||
+ (event->error_code == BadAtom)) {
+ if (event->error_code == BadValue)
+ XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x",
+ mesg, BUFSIZ);
+ else if (event->error_code == BadAtom)
+ XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x",
+ mesg, BUFSIZ);
+ else
+ XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
+ mesg, BUFSIZ);
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->resourceid);
+ fputs("\n", fp);
+ }
+ XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d",
+ mesg, BUFSIZ);
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->serial);
+ XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
+ mesg, BUFSIZ);
+ fputs("\n ", fp);
+ if (event->error_code == BadImplementation) return 0;
+ return 1;
+}
+
+//Mostly the same as default handler, but not exit process.
+static int xerror_handler (
+ Display *dpy,
+ XErrorEvent *event)
+{
+ return x_print_error (dpy, event, stderr);
+}
+#endif
+
+static gboolean setup_xwindow_target (MediaPlayerControl *self, GHashTable *params)
+{
+#if 0
+ GValue *val;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ val = g_hash_table_lookup (params, "window-id");
+ if (!val) {
+ UMMS_DEBUG ("no window-id");
+ return FALSE;
+ }
+
+ priv->video_win_id = (Window)g_value_get_int (val);
+ priv->target_type = XWindow;
+#endif
+
+ return TRUE;
+}
+
+static gboolean
+unset_target (MediaPlayerControl *self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ UMMS_DEBUG("Not Supportted");
+
+#if 0
+ if (!priv->target_initialized)
+ return TRUE;
+
+ switch (priv->target_type) {
+ case XWindow:
+ unset_xwindow_target (self);
+ break;
+ case DataCopy:
+ case Socket:
+ case ReservedType0:
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ priv->target_type = TargetTypeInvalid;
+ priv->target_initialized = FALSE;
+#endif
+ return TRUE;
+}
+
+static gboolean
+engine_generic_set_target (MediaPlayerControl *self, gint type, GHashTable *params)
+{
+ gboolean ret = TRUE;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ UMMS_DEBUG("Not Supportted");
+
+#if 0
+ /*
+ * Set target can only happen at Null or Stopped. Two reasons:
+ * 1. Gstreamer don't support switching sink on the fly.
+ * 2. PlayerStateNull/PlayerStateStopped means all target related resources have been released.
+ * It is more convenience for resource management implementing.
+ */
+ if (priv->player_state != PlayerStateNull && priv->player_state != PlayerStateStopped) {
+ UMMS_DEBUG ("Ignored, can only set target at PlayerStateNull or PlayerStateStopped");
+ return FALSE;
+ }
+
+ if (!priv->pipeline) {
+ UMMS_DEBUG ("Engine not loaded, reason may be SetUri not invoked");
+ return FALSE;
+ }
+
+ switch (type) {
+ case XWindow:
+ ret = setup_xwindow_target (self, params);
+ break;
+ case DataCopy:
+ case Socket:
+ case ReservedType0:
+ default:
+ ret = FALSE;
+ break;
+ }
+
+ if (ret) {
+ priv->target_type = type;
+ }
+#endif
+ return ret;
+}
+
+static gboolean
+prepare_plane (MediaPlayerControl *self)
+{
+ GstElement *vsink_bin = NULL;
+ gint plane;
+ gboolean ret = TRUE;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ UMMS_DEBUG("Not Supportted");
+#if 0
+
+ g_object_get (G_OBJECT(priv->pipeline), "video-sink", &vsink_bin, NULL);
+
+ if (vsink_bin) {
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (vsink_bin), "gdl-plane") == NULL) {
+ UMMS_DEBUG ("vsink has no gdl-plane property, which means target type is not XWindow or ReservedType0");
+ goto OUT;
+ }
+
+ g_object_get (G_OBJECT(vsink_bin), "gdl-plane", &plane, NULL);
+
+ //request plane resource
+ ResourceRequest req = {ResourceTypePlane, plane};
+ Resource *res = NULL;
+
+ res = umms_resource_manager_request_resource (priv->res_mngr, &req);
+
+ if (!res) {
+ UMMS_DEBUG ("Failed");
+ ret = FALSE;
+ } else if (plane != res->handle) {
+ g_object_set (G_OBJECT(vsink_bin), "gdl-plane", res->handle, NULL);
+ UMMS_DEBUG ("Plane changed '%d'==>'%d'", plane, res->handle);
+ } else {
+ //Do nothing;
+ }
+
+ priv->res_list = g_list_append (priv->res_list, res);
+ }
+
+OUT:
+ if (vsink_bin)
+ gst_object_unref (vsink_bin);
+#endif
+
+ return ret;
+}
+#if 0
+
+//both Xwindow and ReservedType0 target use ismd_vidrend_sink, so that need clock.
+#define NEED_CLOCK(target_type) \
+ ((target_type == XWindow || target_type == ReservedType0)?TRUE:FALSE)
+
+#define REQUEST_RES(self, t, p, e_msg) \
+ do{ \
+ EngineGenericPrivate *priv = GET_PRIVATE (self); \
+ ResourceRequest req = {0,}; \
+ Resource *res = NULL; \
+ req.type = t; \
+ req.preference = p; \
+ res = umms_resource_manager_request_resource (priv->res_mngr, &req); \
+ if (!res) { \
+ release_resource(self); \
+ media_player_control_emit_error (self, \
+ UMMS_RESOURCE_ERROR_NO_RESOURCE, \
+ e_msg); \
+ return FALSE; \
+ } \
+ priv->res_list = g_list_append (priv->res_list, res); \
+ }while(0)
+
+#endif
+
+static gboolean
+request_resource (MediaPlayerControl *self)
+{
+ gint i;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ UMMS_DEBUG("Not Supportted");
+
+ g_return_val_if_fail (priv->uri_parsed, FALSE);//uri should already be parsed.
+#if 0
+
+ if (priv->resource_prepared)
+ return TRUE;
+
+ /*
+ * For live source, we create and set clock to pipeline manually,
+ * ismd audio/video sink will not create and provide a clock.
+ * So, just need one clock.
+ */
+ if (priv->is_live) {
+ REQUEST_RES(self, ResourceTypeHwClock, INVALID_RES_HANDLE, "No HW clock resource");
+ } else {
+ if (priv->has_video && NEED_CLOCK(priv->target_type)) {
+ REQUEST_RES(self, ResourceTypeHwClock, INVALID_RES_HANDLE, "No HW clock resource");
+ }
+ if (priv->has_audio) {
+ REQUEST_RES(self, ResourceTypeHwClock, INVALID_RES_HANDLE, "No HW clock resource");
+ }
+ }
+
+ for (i = 0; i < priv->hw_viddec; i++) {
+ REQUEST_RES(self, ResourceTypeHwViddec, INVALID_RES_HANDLE, "No HW video decoder resource");
+ }
+
+ /*
+ for (i=0; i<priv->hw_auddec; i++) {
+ REQUEST_RES(self, ResourceTypeHwAuddec, INVALID_RES_HANDLE, "No HW video decoder resource");
+ }
+ */
+ priv->resource_prepared = TRUE;
+#endif
+ return TRUE;
+}
+
+static void
+release_resource (MediaPlayerControl *self)
+{
+ GList *g;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ UMMS_DEBUG("Not Supportted");
+
+#if 0
+ for (g = priv->res_list; g; g = g->next) {
+ Resource *res = (Resource *) (g->data);
+ umms_resource_manager_release_resource (priv->res_mngr, res);
+ }
+ g_list_free (priv->res_list);
+ priv->res_list = NULL;
+ priv->resource_prepared = FALSE;
+#endif
+
+ return;
+}
+
+#if 0
+//Unref returned clock after usage
+static GstClock *
+get_hw_clock(void)
+{
+ GstClock* clock = NULL;
+ GstElement *vsink = NULL;
+
+ UMMS_DEBUG ("Begin");
+ vsink = gst_element_factory_make ("ismd_vidrend_sink", NULL);
+ if (!vsink)
+ return NULL;
+
+ clock = gst_element_provide_clock (vsink);
+
+ if (clock)
+ g_object_ref (clock);
+
+ g_object_unref (vsink);
+ UMMS_DEBUG ("End");
+
+ return clock;
+}
+#endif
+
+static gboolean
+activate_engine (MediaPlayerControl *self, GstState target_state)
+{
+ gboolean ret;
+ PlayerState old_pending;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ g_return_val_if_fail (priv->uri, FALSE);
+ g_return_val_if_fail (target_state == GST_STATE_PAUSED || target_state == GST_STATE_PLAYING, FALSE);
+
+ old_pending = priv->pending_state;
+ priv->pending_state = ((target_state == GST_STATE_PAUSED) ? PlayerStatePaused : PlayerStatePlaying);
+
+ if (gst_element_set_state(priv->pipeline, target_state) == GST_STATE_CHANGE_FAILURE) {
+ UMMS_DEBUG ("set pipeline to %d failed", target_state);
+ ret = FALSE;
+ goto OUT;
+ }
+
+OUT:
+ if (!ret) {
+ priv->pending_state = old_pending;
+ }
+ return ret;
+}
+
+static gboolean
+engine_generic_pause (MediaPlayerControl *self)
+{
+ return activate_engine (self, GST_STATE_PAUSED);
+}
+
+static gboolean
+engine_generic_play (MediaPlayerControl *self)
+{
+ return activate_engine (self, GST_STATE_PLAYING);
+}
+
+static gboolean
+_stop_pipe (MediaPlayerControl *control)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (control);
+
+ if (gst_element_set_state(priv->pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE) {
+ UMMS_DEBUG ("Unable to set NULL state");
+ return FALSE;
+ }
+
+ UMMS_DEBUG ("gstreamer engine-generic is stopped");
+ return TRUE;
+}
+
+static gboolean
+engine_generic_stop (MediaPlayerControl *self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ PlayerState old_state;
+
+ if (!_stop_pipe (self))
+ return FALSE;
+
+ old_state = priv->player_state;
+ priv->player_state = PlayerStateStopped;
+ priv->suspended = FALSE;
+
+ if (old_state != priv->player_state) {
+ media_player_control_emit_player_state_changed (self, old_state, priv->player_state);
+ }
+ media_player_control_emit_stopped (self);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_set_video_size (MediaPlayerControl *self,
+ guint x, guint y, guint w, guint h)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ GstElement *pipe = priv->pipeline;
+ gboolean ret = FALSE;
+ GstElement *vsink_bin = NULL;
+ GstElement *tsink_bin = NULL;
+
+ g_return_val_if_fail (pipe, FALSE);
+ UMMS_DEBUG ("invoked");
+
+ //We use ismd_vidrend_bin as video-sink, so we can set rectangle property.
+ g_object_get (G_OBJECT(pipe), "video-sink", &vsink_bin, NULL);
+ if (vsink_bin) {
+ gchar *rectangle_des = NULL;
+
+ UMMS_DEBUG ("video sink: %p, name: %s", vsink_bin, GST_ELEMENT_NAME(vsink_bin));
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (vsink_bin), "rectangle")) {
+ rectangle_des = g_strdup_printf ("%u,%u,%u,%u", x, y, w, h);
+ UMMS_DEBUG ("set rectangle damension :'%s'", rectangle_des);
+ g_object_set (G_OBJECT(vsink_bin), "rectangle", rectangle_des, NULL);
+ g_free (rectangle_des);
+ ret = TRUE;
+ } else {
+ UMMS_DEBUG ("video sink: %s has no 'rectangle' property", GST_ELEMENT_NAME(vsink_bin));
+ goto OUT;
+ }
+ } else {
+ UMMS_DEBUG ("Get video-sink failed");
+ goto OUT;
+ }
+
+ gint tsvalue;
+ g_object_get (G_OBJECT(pipe), "text-sink", &tsink_bin, NULL);
+ if (tsink_bin) {
+ //Position Setting
+ tsvalue = w;
+ g_object_set (G_OBJECT(tsink_bin), "tsub-widthpad", tsvalue, NULL);
+
+ tsvalue = h;
+ g_object_set (G_OBJECT(tsink_bin), "tsub-heightpad", tsvalue, NULL);
+
+ tsvalue = x;
+ g_object_set (G_OBJECT(tsink_bin), "pstart-x", tsvalue, NULL);
+
+ tsvalue = y;
+ g_object_set (G_OBJECT(tsink_bin), "pstart-y", tsvalue, NULL);
+
+ //Font Setting
+#define SUBTITLE_FONT_CUSTOM (0)
+ if (SUBTITLE_FONT_CUSTOM) {
+ tsvalue = SUBTITLE_FONT_CUSTOM;
+ } else if (w <= 320 && h <= 240) {
+ tsvalue = 6;
+ } else if (w <= 640 && h <= 480) {
+ tsvalue = 10;
+ } else if (w <= 720 && h <= 576) {
+ tsvalue = 12;
+ } else if (w <= 1024 && h <= 720) {
+ tsvalue = 16;
+ } else if (w <= 1280 && h <= 800) {
+ tsvalue = 20;
+ } else if (w <= 1920 && h <= 1280) {
+ tsvalue = 26;
+ } else if (w <= 2880 && h <= 1920) {
+ tsvalue = 36;
+ } else {
+ tsvalue = 12;
+ }
+
+ g_object_set (G_OBJECT(tsink_bin), "tsub-fontsize", tsvalue, NULL);
+
+ ret = TRUE;
+ }
+
+OUT:
+ if (vsink_bin)
+ gst_object_unref (vsink_bin);
+
+ if (tsink_bin)
+ gst_object_unref (vsink_bin);
+
+ return ret;
+}
+
+static gboolean
+engine_generic_get_video_size (MediaPlayerControl *self,
+ guint *w, guint *h)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ GstElement *pipe = priv->pipeline;
+ guint x[1], y[1];
+ gboolean ret;
+ GstElement *vsink_bin = NULL;
+
+ g_return_val_if_fail (pipe, FALSE);
+ UMMS_DEBUG ("invoked");
+ g_object_get (G_OBJECT(pipe), "video-sink", &vsink_bin, NULL);
+ if (vsink_bin) {
+ gchar *rectangle_des = NULL;
+ UMMS_DEBUG ("ismd_vidrend_bin: %p, name: %s", vsink_bin, GST_ELEMENT_NAME(vsink_bin));
+ g_object_get (G_OBJECT(vsink_bin), "rectangle", &rectangle_des, NULL);
+ sscanf (rectangle_des, "%u,%u,%u,%u", x, y, w, h);
+ UMMS_DEBUG ("got rectangle damension :'%u,%u,%u,%u'", *x, *y, *w, *h);
+ ret = TRUE;
+ } else {
+ UMMS_DEBUG ("Get video-sink failed");
+ ret = FALSE;
+ }
+
+ if (vsink_bin)
+ gst_object_unref (vsink_bin);
+ return ret;
+}
+
+static gboolean
+engine_generic_is_seekable (MediaPlayerControl *self, gboolean *seekable)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gboolean res = FALSE;
+ gint old_seekable;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (seekable != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+
+ if (priv->uri == NULL)
+ return FALSE;
+
+ old_seekable = priv->seekable;
+
+ if (priv->seekable == -1) {
+ GstQuery *query;
+
+ query = gst_query_new_seeking (GST_FORMAT_TIME);
+ if (gst_element_query (pipe, query)) {
+ gst_query_parse_seeking (query, NULL, &res, NULL, NULL);
+ UMMS_DEBUG ("seeking query says the stream is%s seekable", (res) ? "" : " not");
+ priv->seekable = (res) ? 1 : 0;
+ } else {
+ UMMS_DEBUG ("seeking query failed, set seekable according to is_live flag");
+ priv->seekable = priv->is_live ? FALSE : TRUE;
+ }
+ gst_query_unref (query);
+ }
+
+ if (priv->seekable != -1) {
+ *seekable = (priv->seekable != 0);
+ }
+
+ UMMS_DEBUG ("stream is%s seekable", (*seekable) ? "" : " not");
+ return TRUE;
+}
+
+static gboolean
+engine_generic_set_position (MediaPlayerControl *self, gint64 in_pos)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gboolean ret;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+
+ ret = gst_element_seek (pipe, 1.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, in_pos * GST_MSECOND,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ UMMS_DEBUG ("Seeking to %" GST_TIME_FORMAT " %s", GST_TIME_ARGS (in_pos * GST_MSECOND), ret ? "succeeded" : "failed");
+ if (ret)
+ media_player_control_emit_seeked (self);
+ return ret;
+}
+
+static gboolean
+engine_generic_get_position (MediaPlayerControl *self, gint64 *cur_pos)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ GstFormat fmt;
+ gint64 cur = 0;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (cur_pos != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ fmt = GST_FORMAT_TIME;
+ if (gst_element_query_position (pipe, &fmt, &cur)) {
+ UMMS_DEBUG ("current position = %lld (ms)", *cur_pos = cur / GST_MSECOND);
+ } else {
+ UMMS_DEBUG ("Failed to query position");
+ ret = FALSE;
+ }
+ return ret;
+}
+
+static gboolean
+engine_generic_set_playback_rate (MediaPlayerControl *self, gdouble in_rate)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("set playback rate to %f ", in_rate);
+ return gst_element_seek (pipe, in_rate,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+}
+
+static gboolean
+engine_generic_get_playback_rate (MediaPlayerControl *self, gdouble *out_rate)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ GstQuery *query;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+ query = gst_query_new_segment (GST_FORMAT_TIME);
+
+ if (gst_element_query (pipe, query)) {
+ gst_query_parse_segment (query, out_rate, NULL, NULL, NULL);
+ UMMS_DEBUG ("current rate = %f", *out_rate);
+ } else {
+ UMMS_DEBUG ("Failed to query segment");
+ }
+ gst_query_unref (query);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_set_volume (MediaPlayerControl *self, gint vol)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gdouble volume;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ volume = CLAMP ((((gdouble)vol) / 100), 0.0, 1.0);
+ UMMS_DEBUG ("set volume to = %f", volume);
+ gst_stream_volume_set_volume (GST_STREAM_VOLUME (pipe),
+ GST_STREAM_VOLUME_FORMAT_CUBIC,
+ volume);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_volume (MediaPlayerControl *self, gint *volume)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gdouble vol;
+
+ *volume = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ vol = gst_stream_volume_get_volume (GST_STREAM_VOLUME (pipe),
+ GST_STREAM_VOLUME_FORMAT_CUBIC);
+
+ *volume = vol * 100;
+ UMMS_DEBUG ("cur volume=%f(double), %d(int)", vol, *volume);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_media_size_time (MediaPlayerControl *self, gint64 *media_size_time)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gint64 duration;
+ gboolean ret = TRUE;
+ GstFormat fmt = GST_FORMAT_TIME;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ if (gst_element_query_duration (pipe, &fmt, &duration)) {
+ *media_size_time = duration / GST_MSECOND;
+ UMMS_DEBUG ("media size = %lld (ms)", *media_size_time);
+ } else {
+ UMMS_DEBUG ("query media_size_time failed");
+ *media_size_time = -1;
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+
+static gboolean
+engine_generic_get_media_size_bytes (MediaPlayerControl *self, gint64 *media_size_bytes)
+{
+ GstElement *source;
+ EngineGenericPrivate *priv;
+ gint64 length = 0;
+ GstFormat fmt = GST_FORMAT_BYTES;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ source = priv->source;
+ g_return_val_if_fail (GST_IS_ELEMENT (source), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ if (!gst_element_query_duration (source, &fmt, &length)) {
+
+ // Fall back to querying the source pads manually.
+ // See also https://bugzilla.gnome.org/show_bug.cgi?id=638749
+ GstIterator* iter = gst_element_iterate_src_pads(source);
+ gboolean done = FALSE;
+ length = 0;
+ while (!done) {
+ gpointer data;
+
+ switch (gst_iterator_next(iter, &data)) {
+ case GST_ITERATOR_OK: {
+ GstPad* pad = GST_PAD_CAST(data);
+ gint64 padLength = 0;
+ if (gst_pad_query_duration(pad, &fmt, &padLength)
+ && padLength > length)
+ length = padLength;
+ gst_object_unref(pad);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync(iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ // Fall through.
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ gst_iterator_free(iter);
+ }
+
+ *media_size_bytes = length;
+ UMMS_DEBUG ("Total bytes = %lld", length);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_has_video (MediaPlayerControl *self, gboolean *has_video)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gint n_video;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ g_object_get (G_OBJECT (pipe), "n-video", &n_video, NULL);
+ UMMS_DEBUG ("'%d' videos in stream", n_video);
+ *has_video = (n_video > 0) ? (TRUE) : (FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_has_audio (MediaPlayerControl *self, gboolean *has_audio)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gint n_audio;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ g_object_get (G_OBJECT (pipe), "n-audio", &n_audio, NULL);
+ UMMS_DEBUG ("'%d' audio tracks in stream", n_audio);
+ *has_audio = (n_audio > 0) ? (TRUE) : (FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_support_fullscreen (MediaPlayerControl *self, gboolean *support_fullscreen)
+{
+ //We are using ismd_vidrend_bin, so this function always return TRUE.
+ *support_fullscreen = TRUE;
+ return TRUE;
+}
+
+static gboolean
+engine_generic_is_streaming (MediaPlayerControl *self, gboolean *is_streaming)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("invoked");
+
+ g_return_val_if_fail (priv->uri, FALSE);
+ /*For now, we consider live source to be streaming source , hence unseekable.*/
+ *is_streaming = priv->is_live;
+ UMMS_DEBUG ("uri:'%s' is %s streaming source", priv->uri, (*is_streaming) ? "" : "not");
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_player_state (MediaPlayerControl *self,
+ gint *state)
+{
+ EngineGenericPrivate *priv;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (state != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+
+ *state = priv->player_state;
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_buffered_bytes (MediaPlayerControl *self,
+ gint64 *buffered_bytes)
+{
+ gint64 total_bytes;
+ gdouble percent;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ if (!_query_buffering_percent(priv->pipeline, &percent)) {
+ return FALSE;
+ }
+
+ if (priv->total_bytes == -1) {
+ engine_generic_get_media_size_bytes (self, &total_bytes);
+ priv->total_bytes = total_bytes;
+ }
+
+ *buffered_bytes = (priv->total_bytes * percent) / 100;
+
+ UMMS_DEBUG ("Buffered bytes = %lld", *buffered_bytes);
+
+ return TRUE;
+}
+
+static gboolean
+_query_buffering_percent (GstElement *pipe, gdouble *percent)
+{
+ GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT);
+
+ if (!gst_element_query(pipe, query)) {
+ gst_query_unref(query);
+ UMMS_DEBUG ("failed");
+ return FALSE;
+ }
+
+ gint64 start, stop;
+ gdouble fillStatus = 100.0;
+
+ gst_query_parse_buffering_range(query, 0, &start, &stop, 0);
+ gst_query_unref(query);
+
+ if (stop != -1) {
+ fillStatus = 100.0 * stop / GST_FORMAT_PERCENT_MAX;
+ }
+
+ UMMS_DEBUG ("[Buffering] Download buffer filled up to %f%%", fillStatus);
+ *percent = fillStatus;
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_buffered_time (MediaPlayerControl *self, gint64 *buffered_time)
+{
+ gint64 duration;
+ gdouble percent;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ g_return_val_if_fail (self != NULL, FALSE);
+
+ if (!_query_buffering_percent(priv->pipeline, &percent)) {
+ return FALSE;
+ }
+
+ if (priv->duration == -1) {
+ engine_generic_get_media_size_time (self, &duration);
+ priv->duration = duration;
+ }
+
+ *buffered_time = (priv->duration * percent) / 100;
+ UMMS_DEBUG ("duration=%lld, buffered_time=%lld", priv->duration, *buffered_time);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_current_video (MediaPlayerControl *self, gint *cur_video)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint c_video = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "current-video", &c_video, NULL);
+ UMMS_DEBUG ("the current video stream is %d", c_video);
+
+ *cur_video = c_video;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_current_audio (MediaPlayerControl *self, gint *cur_audio)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint c_audio = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "current-audio", &c_audio, NULL);
+ UMMS_DEBUG ("the current audio stream is %d", c_audio);
+
+ *cur_audio = c_audio;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_current_video (MediaPlayerControl *self, gint cur_video)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint n_video = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ /* Because the playbin2 set_property func do no check the return value,
+ we need to get the total number and check valid for cur_video ourselves.*/
+ g_object_get (G_OBJECT (pipe), "n-video", &n_video, NULL);
+ UMMS_DEBUG ("The total video numeber is %d, we want to set to %d", n_video, cur_video);
+ if ((cur_video < 0) || (cur_video >= n_video)) {
+ UMMS_DEBUG ("The video we want to set is %d, invalid one.", cur_video);
+ return FALSE;
+ }
+
+ g_object_set (G_OBJECT (pipe), "current-video", cur_video, NULL);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_current_audio (MediaPlayerControl *self, gint cur_audio)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint n_audio = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ /* Because the playbin2 set_property func do no check the return value,
+ we need to get the total number and check valid for cur_audio ourselves.*/
+ g_object_get (G_OBJECT (pipe), "n-audio", &n_audio, NULL);
+ UMMS_DEBUG ("The total audio numeber is %d, we want to set to %d", n_audio, cur_audio);
+ if ((cur_audio < 0) || (cur_audio >= n_audio)) {
+ UMMS_DEBUG ("The audio we want to set is %d, invalid one.", cur_audio);
+ return FALSE;
+ }
+
+ g_object_set (G_OBJECT (pipe), "current-audio", cur_audio, NULL);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_video_num (MediaPlayerControl *self, gint *video_num)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint n_video = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "n-video", &n_video, NULL);
+ UMMS_DEBUG ("the video number of the stream is %d", n_video);
+
+ *video_num = n_video;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_audio_num (MediaPlayerControl *self, gint *audio_num)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint n_audio = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "n-audio", &n_audio, NULL);
+ UMMS_DEBUG ("the audio number of the stream is %d", n_audio);
+
+ *audio_num = n_audio;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_subtitle_uri (MediaPlayerControl *self, gchar *sub_uri)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ GstElement *sub_sink = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ /* It seems that the subtitle URI need to set before activate the group, and
+ can not dynamic change it of current group when playing.
+ So calling this API when stream is playing may have no effect. */
+ g_object_set (G_OBJECT (pipe), "suburi", sub_uri, NULL);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_subtitle_num (MediaPlayerControl *self, gint *sub_num)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint n_sub = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "n-text", &n_sub, NULL);
+ UMMS_DEBUG ("the subtitle number of the stream is %d", n_sub);
+
+ *sub_num = n_sub;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_current_subtitle (MediaPlayerControl *self, gint *cur_sub)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint c_sub = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "current-text", &c_sub, NULL);
+ UMMS_DEBUG ("the current subtitle stream is %d", c_sub);
+
+ *cur_sub = c_sub;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_current_subtitle (MediaPlayerControl *self, gint cur_sub)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint n_sub = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ /* Because the playbin2 set_property func do no check the return value,
+ we need to get the total number and check valid for cur_sub ourselves.*/
+ g_object_get (G_OBJECT (pipe), "n-text", &n_sub, NULL);
+ UMMS_DEBUG ("The total subtitle numeber is %d, we want to set to %d", n_sub, cur_sub);
+ if ((cur_sub < 0) || (cur_sub >= n_sub)) {
+ UMMS_DEBUG ("The subtitle we want to set is %d, invalid one.", cur_sub);
+ return FALSE;
+ }
+
+ g_object_set (G_OBJECT (pipe), "current-text", cur_sub, NULL);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_proxy (MediaPlayerControl *self, GHashTable *params)
+{
+ EngineGenericPrivate *priv = NULL;
+ GValue *val = NULL;
+
+ g_return_val_if_fail ((self != NULL) && (params != NULL), FALSE);
+ priv = GET_PRIVATE (self);
+
+ if (g_hash_table_lookup_extended (params, "proxy-uri", NULL, (gpointer)&val)) {
+ RESET_STR (priv->proxy_uri);
+ priv->proxy_uri = g_value_dup_string (val);
+ }
+
+ if (g_hash_table_lookup_extended (params, "proxy-id", NULL, (gpointer)&val)) {
+ RESET_STR (priv->proxy_id);
+ priv->proxy_id = g_value_dup_string (val);
+ }
+
+ if (g_hash_table_lookup_extended (params, "proxy-pw", NULL, (gpointer)&val)) {
+ RESET_STR (priv->proxy_pw)
+ priv->proxy_pw = g_value_dup_string (val);
+ }
+
+ UMMS_DEBUG ("proxy=%s, id=%s, pw=%s", priv->proxy_uri, priv->proxy_id, priv->proxy_pw);
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_buffer_depth (MediaPlayerControl *self, gint format, gint64 buf_val)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ if (buf_val < 0) {
+ UMMS_DEBUG("The buffer depth value is %lld, invalid one", buf_val);
+ return FALSE;
+ }
+
+ if (format == BufferFormatByTime) {
+ g_object_set (G_OBJECT (pipe), "buffer-duration", buf_val, NULL);
+ UMMS_DEBUG("Set the buffer-duration to %lld", buf_val);
+ } else if (format == BufferFormatByBytes) {
+ g_object_set (G_OBJECT (pipe), "buffer-size", buf_val, NULL);
+ UMMS_DEBUG("Set the buffer-size to %lld", buf_val);
+ } else {
+ UMMS_DEBUG("Pass the wrong format:%d to buffer depth setting", format);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_buffer_depth (MediaPlayerControl *self, gint format, gint64 *buf_val)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gint64 val;
+
+ *buf_val = -1;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ if (format == BufferFormatByTime) {
+ g_object_get (G_OBJECT (pipe), "buffer-duration", &val, NULL);
+ UMMS_DEBUG("Get the buffer-duration: %lld", val);
+ *buf_val = val;
+ } else if (format == BufferFormatByBytes) {
+ g_object_get (G_OBJECT (pipe), "buffer-size", &val, NULL);
+ UMMS_DEBUG("Get the buffer-size: %lld", val);
+ *buf_val = val;
+ } else {
+ UMMS_DEBUG("Pass the wrong format:%d to buffer depth setting", format);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_mute (MediaPlayerControl *self, gint mute)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ UMMS_DEBUG ("set mute to = %d", mute);
+ gst_stream_volume_set_mute (GST_STREAM_VOLUME (pipe), mute);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_is_mute (MediaPlayerControl *self, gint *mute)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ gboolean is_mute;
+
+ *mute = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ is_mute = gst_stream_volume_get_mute (GST_STREAM_VOLUME (pipe));
+ UMMS_DEBUG("Get the mute %d", is_mute);
+ *mute = is_mute;
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_set_scale_mode (MediaPlayerControl *self, gint scale_mode)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ GstElement *vsink_bin;
+ GParamSpec *pspec = NULL;
+ GEnumClass *eclass = NULL;
+ gboolean ret = TRUE;
+ GValue val = { 0, };
+ GEnumValue *eval;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ /* We assume that the video-sink is just ismd_vidrend_bin, because if not
+ the scale mode is not supported yet in gst sink bins. */
+ g_object_get (G_OBJECT(pipe), "video-sink", &vsink_bin, NULL);
+ if (vsink_bin) {
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (vsink_bin), "scale-mode");
+ if (pspec == NULL) {
+ ret = FALSE;
+ UMMS_DEBUG("can not get the scale-mode feature");
+ goto OUT;
+ }
+
+ g_value_init (&val, pspec->value_type);
+ g_object_get_property (G_OBJECT (vsink_bin), "scale-mode", &val);
+ eclass = G_ENUM_CLASS (g_type_class_peek (G_VALUE_TYPE (&val)));
+ if (eclass == NULL) {
+ ret = FALSE;
+ goto OUT;
+ }
+
+ switch (scale_mode) {
+ case ScaleModeNoScale:
+ eval = g_enum_get_value_by_nick (eclass, "none");
+ break;
+ case ScaleModeFill:
+ eval = g_enum_get_value_by_nick (eclass, "scale2fit");
+ break;
+ case ScaleModeKeepAspectRatio:
+ eval = g_enum_get_value_by_nick (eclass, "zoom2fit");
+ break;
+ case ScaleModeFillKeepAspectRatio:
+ eval = g_enum_get_value_by_nick (eclass, "zoom2fill");
+ break;
+ default:
+ UMMS_DEBUG("Invalid scale mode: %d", scale_mode);
+ ret = FALSE;
+ goto OUT;
+ }
+
+ if (eval == NULL) {
+ ret = FALSE;
+ goto OUT;
+ }
+
+ g_value_set_enum (&val, eval->value);
+ g_object_set_property (G_OBJECT (vsink_bin), "scale-mode", &val);
+ g_value_unset (&val);
+ } else {
+ UMMS_DEBUG("No a vidrend_bin set, scale not support now!");
+ ret = FALSE;
+ }
+
+OUT:
+ if (vsink_bin)
+ gst_object_unref (vsink_bin);
+ return ret;
+}
+
+
+static gboolean
+engine_generic_get_scale_mode (MediaPlayerControl *self, gint *scale_mode)
+{
+ GstElement *pipe;
+ EngineGenericPrivate *priv;
+ GstElement *vsink_bin;
+ gboolean ret = TRUE;
+ GValue val = { 0, };
+ GEnumValue *eval;
+ GParamSpec *pspec = NULL;
+ GEnumClass *eclass = NULL;
+
+ *scale_mode = ScaleModeInvalid;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_return_val_if_fail (GST_IS_ELEMENT (pipe), FALSE);
+
+ /* We assume that the video-sink is just ismd_vidrend_bin, because if not
+ the scale mode is not supported yet in gst sink bins. */
+ g_object_get (G_OBJECT(pipe), "video-sink", &vsink_bin, NULL);
+ if (vsink_bin) {
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (vsink_bin), "scale-mode");
+ if (pspec == NULL) {
+ ret = FALSE;
+ UMMS_DEBUG("can not get the scale-mode feature");
+ goto OUT;
+ }
+
+ g_value_init (&val, pspec->value_type);
+ g_object_get_property (G_OBJECT (vsink_bin), "scale-mode", &val);
+ eclass = G_ENUM_CLASS (g_type_class_peek (G_VALUE_TYPE (&val)));
+ if (eclass == NULL) {
+ ret = FALSE;
+ goto OUT;
+ }
+
+ eval = g_enum_get_value (eclass, g_value_get_enum(&val));
+ if (eval == NULL) {
+ ret = FALSE;
+ goto OUT;
+ }
+
+ if (strcmp(eval->value_nick, "none")) {
+ *scale_mode = ScaleModeNoScale;
+ goto OUT;
+ } else if (strcmp(eval->value_nick, "scale2fit")) {
+ *scale_mode = ScaleModeFill;
+ goto OUT;
+ } else if (strcmp(eval->value_nick, "zoom2fit")) {
+ *scale_mode = ScaleModeKeepAspectRatio;
+ goto OUT;
+ } else if (strcmp(eval->value_nick, "zoom2fill")) {
+ *scale_mode = ScaleModeFillKeepAspectRatio;
+ goto OUT;
+ } else {
+ UMMS_DEBUG("Error scale mode");
+ ret = FALSE;
+ }
+ } else {
+ UMMS_DEBUG("No a vidrend_bin set, scale not support now!");
+ ret = FALSE;
+ }
+
+OUT:
+ if (vsink_bin)
+ gst_object_unref (vsink_bin);
+ return ret;
+}
+
+static gboolean
+engine_generic_suspend (MediaPlayerControl *self)
+{
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ if (priv->suspended)
+ return TRUE;
+
+ if (priv->player_state == PlayerStatePaused || priv->player_state == PlayerStatePlaying) {
+ engine_generic_get_position (self, &priv->pos);
+ engine_generic_stop (self);
+ } else if (priv->player_state == PlayerStateStopped) {
+ priv->pos = 0;
+ }
+ priv->suspended = TRUE;
+ UMMS_DEBUG ("media_player_control_emit_suspended");
+ media_player_control_emit_suspended (self);
+ return TRUE;
+}
+
+//restore asynchronously.
+//Set to pause here, and do actual retoring operation in bus_message_state_change_cb().
+static gboolean
+engine_generic_restore (MediaPlayerControl *self)
+{
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ if (priv->player_state != PlayerStateStopped || !priv->suspended) {
+ return FALSE;
+ }
+
+ return engine_generic_pause (self);
+}
+
+
+static gboolean
+engine_generic_get_video_codec (MediaPlayerControl *self, gint channel, gchar ** video_codec)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstTagList * tag_list = NULL;
+ gint size = 0;
+ gchar * codec_name = NULL;
+ int i;
+
+ *video_codec = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+
+ g_object_get (G_OBJECT (pipe), "n-video", &tol_channel, NULL);
+ UMMS_DEBUG ("the video number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-video-tags", channel, &tag_list);
+ if (tag_list == NULL) {
+ UMMS_DEBUG ("No tags about stream: %d", channel);
+ return TRUE;
+ }
+
+ if ((size = gst_tag_list_get_tag_size(tag_list, GST_TAG_VIDEO_CODEC)) > 0) {
+ gchar *st = NULL;
+
+ for (i = 0; i < size; ++i) {
+ if (gst_tag_list_get_string_index (tag_list, GST_TAG_VIDEO_CODEC, i, &st) && st) {
+ UMMS_DEBUG("Channel: %d provide the video codec named: %s", channel, st);
+ if (codec_name) {
+ codec_name = g_strconcat(codec_name, st, NULL);
+ } else {
+ codec_name = g_strdup(st);
+ }
+ g_free (st);
+ }
+ }
+
+ UMMS_DEBUG("%s", codec_name);
+ }
+
+ if (codec_name)
+ *video_codec = codec_name;
+
+ if (tag_list)
+ gst_tag_list_free (tag_list);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_audio_codec (MediaPlayerControl *self, gint channel, gchar ** audio_codec)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstTagList * tag_list = NULL;
+ gint size = 0;
+ gchar * codec_name = NULL;
+ int i;
+
+ *audio_codec = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+
+ g_object_get (G_OBJECT (pipe), "n-audio", &tol_channel, NULL);
+ UMMS_DEBUG ("the audio number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-audio-tags", channel, &tag_list);
+ if (tag_list == NULL) {
+ UMMS_DEBUG ("No tags about stream: %d", channel);
+ return TRUE;
+ }
+
+ if ((size = gst_tag_list_get_tag_size(tag_list, GST_TAG_AUDIO_CODEC)) > 0) {
+ gchar *st = NULL;
+
+ for (i = 0; i < size; ++i) {
+ if (gst_tag_list_get_string_index (tag_list, GST_TAG_AUDIO_CODEC, i, &st) && st) {
+ UMMS_DEBUG("Channel: %d provide the audio codec named: %s", channel, st);
+ if (codec_name) {
+ codec_name = g_strconcat(codec_name, st, NULL);
+ } else {
+ codec_name = g_strdup(st);
+ }
+ g_free (st);
+ }
+ }
+
+ UMMS_DEBUG("%s", codec_name);
+ }
+
+ if (codec_name)
+ *audio_codec = codec_name;
+
+ if (tag_list)
+ gst_tag_list_free (tag_list);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_video_bitrate (MediaPlayerControl *self, gint channel, gint *video_rate)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstTagList * tag_list = NULL;
+ guint32 bit_rate = 0;
+
+ *video_rate = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+
+ g_object_get (G_OBJECT (pipe), "n-video", &tol_channel, NULL);
+ UMMS_DEBUG ("the video number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-video-tags", channel, &tag_list);
+ if (tag_list == NULL) {
+ UMMS_DEBUG ("No tags about stream: %d", channel);
+ return TRUE;
+ }
+
+ if (gst_tag_list_get_uint(tag_list, GST_TAG_BITRATE, &bit_rate) && bit_rate > 0) {
+ UMMS_DEBUG ("bit rate for channel: %d is %d", channel, bit_rate);
+ *video_rate = bit_rate / 1000;
+ } else if (gst_tag_list_get_uint(tag_list, GST_TAG_NOMINAL_BITRATE, &bit_rate) && bit_rate > 0) {
+ UMMS_DEBUG ("nominal bit rate for channel: %d is %d", channel, bit_rate);
+ *video_rate = bit_rate / 1000;
+ } else {
+ UMMS_DEBUG ("No bit rate for channel: %d", channel);
+ }
+
+ if (tag_list)
+ gst_tag_list_free (tag_list);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_audio_bitrate (MediaPlayerControl *self, gint channel, gint *audio_rate)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstTagList * tag_list = NULL;
+ guint32 bit_rate = 0;
+
+ *audio_rate = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+
+ g_object_get (G_OBJECT (pipe), "n-audio", &tol_channel, NULL);
+ UMMS_DEBUG ("the audio number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-audio-tags", channel, &tag_list);
+ if (tag_list == NULL) {
+ UMMS_DEBUG ("No tags about stream: %d", channel);
+ return TRUE;
+ }
+
+ if (gst_tag_list_get_uint(tag_list, GST_TAG_BITRATE, &bit_rate) && bit_rate > 0) {
+ UMMS_DEBUG ("bit rate for channel: %d is %d", channel, bit_rate);
+ *audio_rate = bit_rate / 1000;
+ } else if (gst_tag_list_get_uint(tag_list, GST_TAG_NOMINAL_BITRATE, &bit_rate) && bit_rate > 0) {
+ UMMS_DEBUG ("nominal bit rate for channel: %d is %d", channel, bit_rate);
+ *audio_rate = bit_rate / 1000;
+ } else {
+ UMMS_DEBUG ("No bit rate for channel: %d", channel);
+ }
+
+ if (tag_list)
+ gst_tag_list_free (tag_list);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_encapsulation(MediaPlayerControl *self, gchar ** encapsulation)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gchar *enca_name = NULL;
+
+ *encapsulation = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+
+ if (priv->tag_list) {
+ gst_tag_list_get_string (priv->tag_list, GST_TAG_CONTAINER_FORMAT, &enca_name);
+ if (enca_name) {
+ UMMS_DEBUG("get the container name: %s", enca_name);
+ *encapsulation = enca_name;
+ } else {
+ UMMS_DEBUG("no infomation about the container.");
+ }
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_audio_samplerate(MediaPlayerControl *self, gint channel, gint * sample_rate)
+{
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstCaps *caps = NULL;
+ GstPad *pad = NULL;
+ GstStructure *s = NULL;
+ gboolean ret = TRUE;
+
+ *sample_rate = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ /* We get this kind of infomation from the caps of inputselector. */
+
+ g_object_get (G_OBJECT (pipe), "n-audio", &tol_channel, NULL);
+ UMMS_DEBUG ("the audio number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-audio-pad", channel, &pad);
+ if (pad == NULL) {
+ UMMS_DEBUG ("No pad of stream: %d", channel);
+ return FALSE;
+ }
+
+ caps = gst_pad_get_negotiated_caps (pad);
+ if (caps) {
+ s = gst_caps_get_structure (caps, 0);
+ ret = gst_structure_get_int (s, "rate", sample_rate);
+ gst_caps_unref (caps);
+ }
+
+ if (pad)
+ gst_object_unref (pad);
+
+ return ret;
+}
+
+
+static gboolean
+engine_generic_get_video_framerate(MediaPlayerControl *self, gint channel,
+ gint * frame_rate_num, gint * frame_rate_denom)
+{
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstCaps *caps = NULL;
+ GstPad *pad = NULL;
+ GstStructure *s = NULL;
+ gboolean ret = TRUE;
+
+ *frame_rate_num = 0;
+ *frame_rate_denom = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ /* We get this kind of infomation from the caps of inputselector. */
+
+ g_object_get (G_OBJECT (pipe), "n-video", &tol_channel, NULL);
+ UMMS_DEBUG ("the video number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-video-pad", channel, &pad);
+ if (pad == NULL) {
+ UMMS_DEBUG ("No pad of stream: %d", channel);
+ return FALSE;
+ }
+
+ caps = gst_pad_get_negotiated_caps (pad);
+ if (caps) {
+ s = gst_caps_get_structure (caps, 0);
+ ret = gst_structure_get_fraction(s, "framerate", frame_rate_num, frame_rate_denom);
+ gst_caps_unref (caps);
+ }
+
+ if (pad)
+ gst_object_unref (pad);
+
+ return ret;
+}
+
+
+static gboolean
+engine_generic_get_video_resolution(MediaPlayerControl *self, gint channel, gint * width, gint * height)
+{
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstCaps *caps = NULL;
+ GstPad *pad = NULL;
+ GstStructure *s = NULL;
+
+ *width = 0;
+ *height = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ /* We get this kind of infomation from the caps of inputselector. */
+
+ g_object_get (G_OBJECT (pipe), "n-video", &tol_channel, NULL);
+ UMMS_DEBUG ("the video number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-video-pad", channel, &pad);
+ if (pad == NULL) {
+ UMMS_DEBUG ("No pad of stream: %d", channel);
+ return FALSE;
+ }
+
+ caps = gst_pad_get_negotiated_caps (pad);
+ if (caps) {
+ s = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (s, "width", width);
+ gst_structure_get_int (s, "height", height);
+ gst_caps_unref (caps);
+ }
+
+ if (pad)
+ gst_object_unref (pad);
+
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_video_aspect_ratio(MediaPlayerControl *self, gint channel,
+ gint * ratio_num, gint * ratio_denom)
+{
+ GstElement *pipe = NULL;
+ int tol_channel;
+ GstCaps *caps = NULL;
+ GstPad *pad = NULL;
+ GstStructure *s = NULL;
+ gboolean ret = TRUE;
+
+ *ratio_num = 0;
+ *ratio_denom = 0;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ /* We get this kind of infomation from the caps of inputselector. */
+
+ g_object_get (G_OBJECT (pipe), "n-video", &tol_channel, NULL);
+ UMMS_DEBUG ("the video number of the stream is %d, want to get: %d",
+ tol_channel, channel);
+
+ if (channel >= tol_channel || channel < 0) {
+ UMMS_DEBUG ("Invalid Channel: %d", channel);
+ return FALSE;
+ }
+
+ g_signal_emit_by_name (pipe, "get-video-pad", channel, &pad);
+ if (pad == NULL) {
+ UMMS_DEBUG ("No pad of stream: %d", channel);
+ return FALSE;
+ }
+
+ caps = gst_pad_get_negotiated_caps (pad);
+ if (caps) {
+ s = gst_caps_get_structure (caps, 0);
+ ret = gst_structure_get_fraction(s, "pixel-aspect-ratio", ratio_num, ratio_denom);
+ gst_caps_unref (caps);
+ }
+
+ if (pad)
+ gst_object_unref (pad);
+
+ return ret;
+}
+
+
+static gboolean
+engine_generic_get_protocol_name(MediaPlayerControl *self, gchar ** prot_name)
+{
+ GstElement *pipe = NULL;
+ gchar * uri = NULL;
+
+ *prot_name = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ g_object_get (G_OBJECT (pipe), "uri", &uri, NULL);
+
+ if (!uri) {
+ UMMS_DEBUG("Pipe %"GST_PTR_FORMAT" has no uri now!", pipe);
+ return FALSE;
+ }
+
+ if (!gst_uri_is_valid(uri)) {
+ UMMS_DEBUG("uri: %s is invalid", uri);
+ g_free(uri);
+ return FALSE;
+ }
+
+ UMMS_DEBUG("Pipe %"GST_PTR_FORMAT" has no uri is %s", pipe, uri);
+
+ *prot_name = gst_uri_get_protocol(uri);
+ UMMS_DEBUG("Get the protocol name is %s", *prot_name);
+
+ g_free(uri);
+ return TRUE;
+}
+
+
+static gboolean
+engine_generic_get_current_uri(MediaPlayerControl *self, gchar ** uri)
+{
+ EngineGenericPrivate *priv = NULL;
+ GstElement *pipe = NULL;
+ gchar * s_uri = NULL;
+
+ *uri = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ pipe = priv->pipeline;
+ g_object_get (G_OBJECT (pipe), "uri", &s_uri, NULL);
+
+ if (!s_uri) {
+ UMMS_DEBUG("Pipe %"GST_PTR_FORMAT" has no uri now!", pipe);
+ return FALSE;
+ }
+
+ if (!gst_uri_is_valid(s_uri)) {
+ UMMS_DEBUG("uri: %s is invalid", s_uri);
+ g_free(s_uri);
+ return FALSE;
+ }
+
+ *uri = s_uri;
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_title(MediaPlayerControl *self, gchar ** title)
+{
+ EngineGenericPrivate *priv = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ *title = g_strdup (priv->title);
+ UMMS_DEBUG ("title = %s", *title);
+
+ return TRUE;
+}
+
+static gboolean
+engine_generic_get_artist(MediaPlayerControl *self, gchar ** artist)
+{
+ EngineGenericPrivate *priv = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+
+ priv = GET_PRIVATE (self);
+ *artist = g_strdup (priv->artist);
+ UMMS_DEBUG ("artist = %s", *artist);
+ return TRUE;
+}
+
+static void
+media_player_control_init (MediaPlayerControl *iface)
+{
+ MediaPlayerControlClass *klass = (MediaPlayerControlClass *)iface;
+
+ media_player_control_implement_set_uri (klass,
+ engine_generic_set_uri);
+ media_player_control_implement_set_target (klass,
+ engine_generic_set_target);
+ media_player_control_implement_play (klass,
+ engine_generic_play);
+ media_player_control_implement_pause (klass,
+ engine_generic_pause);
+ media_player_control_implement_stop (klass,
+ engine_generic_stop);
+// media_player_control_implement_set_video_size (klass,
+// engine_generic_set_video_size);
+// media_player_control_implement_get_video_size (klass,
+// engine_generic_get_video_size);
+ media_player_control_implement_is_seekable (klass,
+ engine_generic_is_seekable);
+ media_player_control_implement_set_position (klass,
+ engine_generic_set_position);
+ media_player_control_implement_get_position (klass,
+ engine_generic_get_position);
+ media_player_control_implement_set_playback_rate (klass,
+ engine_generic_set_playback_rate);
+ media_player_control_implement_get_playback_rate (klass,
+ engine_generic_get_playback_rate);
+ media_player_control_implement_set_volume (klass,
+ engine_generic_set_volume);
+ media_player_control_implement_get_volume (klass,
+ engine_generic_get_volume);
+ media_player_control_implement_get_media_size_time (klass,
+ engine_generic_get_media_size_time);
+ media_player_control_implement_get_media_size_bytes (klass,
+ engine_generic_get_media_size_bytes);
+ media_player_control_implement_has_video (klass,
+ engine_generic_has_video);
+ media_player_control_implement_has_audio (klass,
+ engine_generic_has_audio);
+ media_player_control_implement_support_fullscreen (klass,
+ engine_generic_support_fullscreen);
+ media_player_control_implement_is_streaming (klass,
+ engine_generic_is_streaming);
+ media_player_control_implement_get_player_state (klass,
+ engine_generic_get_player_state);
+ media_player_control_implement_get_buffered_bytes (klass,
+ engine_generic_get_buffered_bytes);
+ media_player_control_implement_get_buffered_time (klass,
+ engine_generic_get_buffered_time);
+ media_player_control_implement_get_current_video (klass,
+ engine_generic_get_current_video);
+ media_player_control_implement_get_current_audio (klass,
+ engine_generic_get_current_audio);
+ media_player_control_implement_set_current_video (klass,
+ engine_generic_set_current_video);
+ media_player_control_implement_set_current_audio (klass,
+ engine_generic_set_current_audio);
+ media_player_control_implement_get_video_num (klass,
+ engine_generic_get_video_num);
+ media_player_control_implement_get_audio_num (klass,
+ engine_generic_get_audio_num);
+ media_player_control_implement_set_proxy (klass,
+ engine_generic_set_proxy);
+ media_player_control_implement_set_subtitle_uri (klass,
+ engine_generic_set_subtitle_uri);
+ media_player_control_implement_get_subtitle_num (klass,
+ engine_generic_get_subtitle_num);
+ media_player_control_implement_set_current_subtitle (klass,
+ engine_generic_set_current_subtitle);
+ media_player_control_implement_get_current_subtitle (klass,
+ engine_generic_get_current_subtitle);
+ media_player_control_implement_set_buffer_depth (klass,
+ engine_generic_set_buffer_depth);
+ media_player_control_implement_get_buffer_depth (klass,
+ engine_generic_get_buffer_depth);
+ media_player_control_implement_set_mute (klass,
+ engine_generic_set_mute);
+ media_player_control_implement_is_mute (klass,
+ engine_generic_is_mute);
+ media_player_control_implement_suspend (klass,
+ engine_generic_suspend);
+ media_player_control_implement_restore (klass,
+ engine_generic_restore);
+// media_player_control_implement_set_scale_mode (klass,
+// engine_generic_set_scale_mode);
+// media_player_control_implement_get_scale_mode (klass,
+// engine_generic_get_scale_mode);
+ media_player_control_implement_get_video_codec (klass,
+ engine_generic_get_video_codec);
+ media_player_control_implement_get_audio_codec (klass,
+ engine_generic_get_audio_codec);
+ media_player_control_implement_get_video_bitrate (klass,
+ engine_generic_get_video_bitrate);
+ media_player_control_implement_get_audio_bitrate (klass,
+ engine_generic_get_audio_bitrate);
+ media_player_control_implement_get_encapsulation (klass,
+ engine_generic_get_encapsulation);
+ media_player_control_implement_get_audio_samplerate (klass,
+ engine_generic_get_audio_samplerate);
+ media_player_control_implement_get_video_framerate (klass,
+ engine_generic_get_video_framerate);
+ media_player_control_implement_get_video_resolution (klass,
+ engine_generic_get_video_resolution);
+ media_player_control_implement_get_video_aspect_ratio (klass,
+ engine_generic_get_video_aspect_ratio);
+ media_player_control_implement_get_protocol_name (klass,
+ engine_generic_get_protocol_name);
+ media_player_control_implement_get_current_uri (klass,
+ engine_generic_get_current_uri);
+ media_player_control_implement_get_title (klass,
+ engine_generic_get_title);
+ media_player_control_implement_get_artist (klass,
+ engine_generic_get_artist);
+}
+
+static void
+engine_generic_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+engine_generic_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+engine_generic_dispose (GObject *object)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (object);
+ int i;
+
+ _stop_pipe ((MediaPlayerControl *)object);
+
+ TEARDOWN_ELEMENT (priv->source);
+ TEARDOWN_ELEMENT (priv->pipeline);
+
+ if (priv->tag_list)
+ gst_tag_list_free(priv->tag_list);
+ priv->tag_list = NULL;
+
+ G_OBJECT_CLASS (engine_generic_parent_class)->dispose (object);
+}
+
+static void
+engine_generic_finalize (GObject *object)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (object);
+
+ RESET_STR(priv->uri);
+ RESET_STR(priv->title);
+ RESET_STR(priv->artist);
+ RESET_STR(priv->proxy_uri);
+ RESET_STR(priv->proxy_id);
+ RESET_STR(priv->proxy_pw);
+
+ G_OBJECT_CLASS (engine_generic_parent_class)->finalize (object);
+}
+
+static void
+engine_generic_class_init (EngineGenericClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (EngineGenericPrivate));
+
+ object_class->get_property = engine_generic_get_property;
+ object_class->set_property = engine_generic_set_property;
+ object_class->dispose = engine_generic_dispose;
+ object_class->finalize = engine_generic_finalize;
+}
+
+static void
+bus_message_state_change_cb (GstBus *bus,
+ GstMessage *message,
+ EngineGeneric *self)
+{
+
+ GstState old_state, new_state;
+ PlayerState old_player_state;
+ gpointer src;
+ gboolean seekable;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ src = GST_MESSAGE_SRC (message);
+ if (src != priv->pipeline)
+ return;
+
+ gst_message_parse_state_changed (message, &old_state, &new_state, NULL);
+
+ UMMS_DEBUG ("state-changed: old='%s', new='%s'", gst_state[old_state], gst_state[new_state]);
+
+ old_player_state = priv->player_state;
+ if (new_state == GST_STATE_PAUSED) {
+ priv->player_state = PlayerStatePaused;
+ if (old_player_state == PlayerStateStopped && priv->suspended) {
+ UMMS_DEBUG ("restoring suspended execution, pos = %lld", priv->pos);
+ engine_generic_is_seekable (MEDIA_PLAYER_CONTROL(self), &seekable);
+ if (seekable) {
+ engine_generic_set_position (MEDIA_PLAYER_CONTROL(self), priv->pos);
+ }
+ engine_generic_play(MEDIA_PLAYER_CONTROL(self));
+ priv->suspended = FALSE;
+ UMMS_DEBUG ("media_player_control_emit_restored");
+ media_player_control_emit_restored (self);
+ }
+ } else if (new_state == GST_STATE_PLAYING) {
+ priv->player_state = PlayerStatePlaying;
+ } else {
+ if (new_state < old_state)//down state change to GST_STATE_READY
+ priv->player_state = PlayerStateStopped;
+ }
+
+ if (priv->pending_state == priv->player_state)
+ priv->pending_state = PlayerStateNull;
+
+ if (priv->player_state != old_player_state) {
+ UMMS_DEBUG ("emit state changed, old=%d, new=%d", old_player_state, priv->player_state);
+ media_player_control_emit_player_state_changed (self, old_player_state, priv->player_state);
+ }
+}
+
+static void
+bus_message_get_tag_cb (GstBus *bus, GstMessage *message, EngineGeneric *self)
+{
+ gpointer src;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ GstPad * src_pad = NULL;
+ GstTagList * tag_list = NULL;
+ gchar * pad_name = NULL;
+ gchar * element_name = NULL;
+ gchar * title = NULL;
+ gchar * artist = NULL;
+ gboolean metadata_changed = FALSE;
+
+ src = GST_MESSAGE_SRC (message);
+
+ if (message->type != GST_MESSAGE_TAG) {
+ UMMS_DEBUG("not a tag message in a registered tag signal, strange");
+ return;
+ }
+
+ gst_message_parse_tag_full (message, &src_pad, &tag_list);
+ if (src_pad) {
+ pad_name = g_strdup (GST_PAD_NAME (src_pad));
+ UMMS_DEBUG("The pad name is %s", pad_name);
+ }
+
+ if (message->src) {
+ element_name = g_strdup (GST_ELEMENT_NAME (message->src));
+ UMMS_DEBUG("The element name is %s", element_name);
+ }
+
+ priv->tag_list =
+ gst_tag_list_merge(priv->tag_list, tag_list, GST_TAG_MERGE_REPLACE);
+
+ //cache the title
+ if (gst_tag_list_get_string_index (tag_list, GST_TAG_TITLE, 0, &title)) {
+ UMMS_DEBUG("Element: %s, provide the title: %s", element_name, title);
+ RESET_STR(priv->title);
+ priv->title = title;
+ metadata_changed = TRUE;
+ }
+
+ //cache the artist
+ if (gst_tag_list_get_string_index (tag_list, GST_TAG_ARTIST, 0, &artist)) {
+ UMMS_DEBUG("Element: %s, provide the artist: %s", element_name, artist);
+ RESET_STR(priv->artist);
+ priv->artist = artist;
+ metadata_changed = TRUE;
+ }
+
+ //only care about artist and title
+ if (metadata_changed) {
+ media_player_control_emit_metadata_changed (self);
+ }
+
+#if 0
+ gint size, i;
+ gchar * video_codec = NULL;
+ gchar * audio_codec = NULL;
+ int out_of_channel = 0;
+
+ /* This logic may be used when the inputselector is not included.
+ Now we just get the video and audio codec from inputselector's pad. */
+
+ /* We are now interest in the codec, container format and bit rate. */
+ if (size = gst_tag_list_get_tag_size(tag_list, GST_TAG_VIDEO_CODEC) > 0) {
+ video_codec = g_strdup_printf("%s-->%s Video Codec: ",
+ element_name ? element_name : "NULL", pad_name ? pad_name : "NULL");
+
+ for (i = 0; i < size; ++i) {
+ gchar *st = NULL;
+
+ if (gst_tag_list_get_string_index (tag_list, GST_TAG_VIDEO_CODEC, i, &st) && st) {
+ UMMS_DEBUG("Element: %s, Pad: %s provide the video codec named: %s", element_name, pad_name, st);
+ video_codec = g_strconcat(video_codec, st);
+ g_free (st);
+ }
+ }
+
+ /* store the name for later use. */
+ g_strlcpy(priv->video_codec, video_codec, ENGINE_GST_MAX_VIDEOCODEC_SIZE);
+ UMMS_DEBUG("%s", video_codec);
+ }
+
+ if (size = gst_tag_list_get_tag_size(tag_list, GST_TAG_AUDIO_CODEC) > 0) {
+ audio_codec = g_strdup_printf("%s-->%s Audio Codec: ",
+ element_name ? element_name : "NULL", pad_name ? pad_name : "NULL");
+
+ for (i = 0; i < size; ++i) {
+ gchar *st = NULL;
+
+ if (gst_tag_list_get_string_index (tag_list, GST_TAG_AUDIO_CODEC, i, &st) && st) {
+ UMMS_DEBUG("Element: %s, Pad: %s provide the audio codec named: %s", element_name, pad_name, st);
+ audio_codec = g_strconcat(audio_codec, st);
+ g_free (st);
+ }
+ }
+
+ UMMS_DEBUG("%s", audio_codec);
+
+ /* need to consider the multi-channel audio case. The demux and decoder
+ * will both send this message. We prefer codec info from decoder now. Need to improve */
+ if (element_name && (g_strstr_len(element_name, strlen(element_name), "demux") ||
+ g_strstr_len(element_name, strlen(element_name), "Demux") ||
+ g_strstr_len(element_name, strlen(element_name), "DEMUX"))) {
+ if (priv->audio_codec_used < ENGINE_GST_MAX_AUDIO_STREAM) {
+ g_strlcpy(priv->audio_codec[priv->audio_codec_used], audio_codec, ENGINE_GST_MAX_AUDIOCODEC_SIZE);
+ priv->audio_codec_used++;
+ } else {
+ UMMS_DEBUG("audio_codec need to discard because too many steams");
+ out_of_channel = 1;
+ }
+ } else {
+ UMMS_DEBUG("audio_codec need to discard because it not come from demux");
+ }
+ }
+
+ if (gst_tag_list_get_uint(tag_list, GST_TAG_BITRATE, &bit_rate) && bit_rate > 0) {
+ /* Again, the bitrate info may come from demux and audio decoder, we use demux now. */
+ UMMS_DEBUG("Element: %s, Pad: %s provide the bitrate: %d", element_name, pad_name, bit_rate);
+ if (element_name && (g_strstr_len(element_name, strlen(element_name), "demux") ||
+ g_strstr_len(element_name, strlen(element_name), "Demux") ||
+ g_strstr_len(element_name, strlen(element_name), "DEMUX"))) {
+ gchar * codec = NULL;
+ int have_found = 0;
+
+ /* first we check whether it is the bitrate of video. */
+ if (video_codec) { /* the bitrate sent with the video codec, easy one. */
+ have_found = 1;
+ priv->video_bitrate = bit_rate;
+ UMMS_DEBUG("we set the bitrate: %u for video", bit_rate);
+ }
+
+ if (!have_found) { /* try to compare the element and pad name. */
+ codec = g_strdup_printf("%s-->%s Video Codec: ",
+ element_name ? element_name : "NULL", pad_name ? pad_name : "NULL");
+ if (g_strncasecmp(priv->video_codec, codec, strlen(codec))) {
+ have_found = 1;
+ priv->video_bitrate = bit_rate;
+ UMMS_DEBUG("we set the bitrate: %u for video", bit_rate);
+ }
+
+ g_free(codec);
+ }
+
+ /* find it in the audio codec stream. */
+ if (!have_found) {
+ if (audio_codec) {
+ /* the bitrate sent with the audio codec, easy one. */
+ have_found = 1;
+ if (!out_of_channel) {
+ priv->audio_bitrate[priv->audio_codec_used -1] = bit_rate;
+ UMMS_DEBUG("we set the bitrate: %u for audio stream: %d", bit_rate, priv->audio_codec_used - 1);
+ } else {
+ UMMS_DEBUG("audio bitrate need to discard because too many steams");
+ }
+ }
+
+ if (!have_found) { /* last try, use audio element and pad to index. */
+ codec = g_strdup_printf("%s-->%s Audio Codec: ",
+ element_name ? element_name : "NULL", pad_name ? pad_name : "NULL");
+
+ for (i = 0; i < priv->audio_codec_used; i++) {
+ if (g_strncasecmp(priv->audio_codec[i], codec, strlen(codec)))
+ break;
+ }
+
+ have_found = 1; /* if not find, we use audio channel as defaule, so always find. */
+ if (i < priv->audio_codec_used) {
+ priv->audio_bitrate[i] = bit_rate;
+ UMMS_DEBUG("we set the bitrate: %u for audio stream: %d", bit_rate, i);
+ } else {
+ UMMS_DEBUG("we can not find the stream for this bitrate: %u, set to the fist stream", bit_rate);
+ priv->audio_bitrate[0] = bit_rate;
+ }
+
+ g_free(codec);
+ }
+ }
+ }
+ }
+
+ if (video_codec)
+ g_free(video_codec);
+ if (audio_codec)
+ g_free(audio_codec);
+#endif
+
+ if (src_pad)
+ g_object_unref(src_pad);
+ gst_tag_list_free (tag_list);
+ if (pad_name)
+ g_free(pad_name);
+ if (element_name)
+ g_free(element_name);
+
+}
+
+
+static void
+bus_message_eos_cb (GstBus *bus,
+ GstMessage *message,
+ EngineGeneric *self)
+{
+ UMMS_DEBUG ("message::eos received on bus");
+
+ media_player_control_emit_eof (self);
+ engine_generic_stop ((MediaPlayerControl *)self);
+}
+
+
+static void
+bus_message_error_cb (GstBus *bus,
+ GstMessage *message,
+ EngineGeneric *self)
+{
+ GError *error = NULL;
+
+ UMMS_DEBUG ("message::error received on bus");
+
+ gst_message_parse_error (message, &error, NULL);
+
+ UMMS_DEBUG ("Error emitted with message = %s", error->message);
+
+ _stop_pipe (MEDIA_PLAYER_CONTROL(self));
+
+ media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
+
+
+ g_clear_error (&error);
+}
+
+static void
+bus_message_buffering_cb (GstBus *bus,
+ GstMessage *message,
+ EngineGeneric *self)
+{
+ const GstStructure *str;
+ gboolean res;
+ gint buffer_percent;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+ str = gst_message_get_structure (message);
+ if (!str)
+ return;
+
+ res = gst_structure_get_int (str, "buffer-percent", &buffer_percent);
+ if (!(buffer_percent % 25))
+ UMMS_DEBUG ("buffering...%d%% ", buffer_percent);
+
+ if (res) {
+ priv->buffer_percent = buffer_percent;
+
+ if (priv->buffer_percent == 100) {
+
+ UMMS_DEBUG ("Done buffering");
+ priv->buffering = FALSE;
+
+ if (priv->pending_state == PlayerStatePlaying)
+ gst_element_set_state (priv->pipeline, GST_STATE_PLAYING);
+
+ media_player_control_emit_buffered (self);
+ } else if (!priv->buffering && priv->pending_state == PlayerStatePlaying) {
+ priv->buffering = TRUE;
+ UMMS_DEBUG ("Set pipeline to paused for buffering data");
+
+ if (!priv->is_live)
+ gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
+
+ media_player_control_emit_buffering (self);
+ }
+ }
+}
+
+static GstBusSyncReply
+bus_sync_handler (GstBus *bus,
+ GstMessage *message,
+ EngineGeneric *engine)
+{
+ EngineGenericPrivate *priv;
+ GstElement *vsink;
+ GError *err = NULL;
+ GstMessage *msg = NULL;
+
+ if ( GST_MESSAGE_TYPE( message ) != GST_MESSAGE_ELEMENT )
+ return( GST_BUS_PASS );
+
+ if (!gst_structure_has_name( message->structure, "prepare-xwindow-id"))
+ return( GST_BUS_PASS );
+
+ g_return_val_if_fail (engine, GST_BUS_PASS);
+ g_return_val_if_fail (ENGINE_IS_GENERIC (engine), GST_BUS_PASS);
+ priv = GET_PRIVATE (engine);
+
+#if 0
+ NO.SMD
+ UMMS_DEBUG ("sync-handler received on bus: prepare-xwindow-id, source: %s", GST_ELEMENT_NAME(vsink));
+ vsink = GST_ELEMENT(GST_MESSAGE_SRC (message));
+ if (vsink && GST_IS_X_OVERLAY (vsink)) {
+ if (priv->video_win_id != 0)
+ gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (vsink), priv->video_win_id);
+ }
+#endif
+
+ if (message)
+ gst_message_unref (message);
+ return( GST_BUS_DROP );
+}
+
+static void
+video_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data) /* Used as tag change monitor. */
+{
+ EngineGeneric * priv = (EngineGeneric *) user_data;
+ media_player_control_emit_video_tag_changed(priv, stream_id);
+}
+
+static void
+audio_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data) /* Used as tag change monitor. */
+{
+ EngineGeneric * priv = (EngineGeneric *) user_data;
+ media_player_control_emit_audio_tag_changed(priv, stream_id);
+}
+
+static void
+text_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data) /* Used as tag change monitor. */
+{
+ EngineGeneric * priv = (EngineGeneric *) user_data;
+ media_player_control_emit_text_tag_changed(priv, stream_id);
+}
+
+/* GstPlayFlags flags from playbin2 */
+typedef enum {
+ GST_PLAY_FLAG_VIDEO = (1 << 0),
+ GST_PLAY_FLAG_AUDIO = (1 << 1),
+ GST_PLAY_FLAG_TEXT = (1 << 2),
+ GST_PLAY_FLAG_VIS = (1 << 3),
+ GST_PLAY_FLAG_SOFT_VOLUME = (1 << 4),
+ GST_PLAY_FLAG_NATIVE_AUDIO = (1 << 5),
+ GST_PLAY_FLAG_NATIVE_VIDEO = (1 << 6),
+ GST_PLAY_FLAG_DOWNLOAD = (1 << 7),
+ GST_PLAY_FLAG_BUFFERING = (1 << 8),
+ GST_PLAY_FLAG_DEINTERLACE = (1 << 9)
+} GstPlayFlags;
+
+static void
+engine_generic_init (EngineGeneric *self)
+{
+ EngineGenericPrivate *priv;
+ GstBus *bus;
+ GstPlayFlags flags;
+
+ self->priv = PLAYER_PRIVATE (self);
+ priv = self->priv;
+
+ priv->pipeline = gst_element_factory_make ("playbin2", "pipeline");
+
+ g_signal_connect(priv->pipeline, "notify::source", G_CALLBACK(_source_changed_cb), self);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (priv->pipeline));
+
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect_object (bus, "message::error",
+ G_CALLBACK (bus_message_error_cb),
+ self,
+ 0);
+
+ g_signal_connect_object (bus, "message::buffering",
+ G_CALLBACK (bus_message_buffering_cb),
+ self,
+ 0);
+
+ g_signal_connect_object (bus, "message::eos",
+ G_CALLBACK (bus_message_eos_cb),
+ self,
+ 0);
+
+ g_signal_connect_object (bus,
+ "message::state-changed",
+ G_CALLBACK (bus_message_state_change_cb),
+ self,
+ 0);
+
+ g_signal_connect_object (bus,
+ "message::tag",
+ G_CALLBACK (bus_message_get_tag_cb),
+ self,
+ 0);
+
+ gst_bus_set_sync_handler(bus, (GstBusSyncHandler) bus_sync_handler,
+ self);
+
+ gst_object_unref (GST_OBJECT (bus));
+
+ g_signal_connect (priv->pipeline,
+ "video-tags-changed", G_CALLBACK (video_tags_changed_cb), self);
+
+ g_signal_connect (priv->pipeline,
+ "audio-tags-changed", G_CALLBACK (audio_tags_changed_cb), self);
+
+ g_signal_connect (priv->pipeline,
+ "text-tags-changed", G_CALLBACK (text_tags_changed_cb), self);
+
+ /*
+ *Use GST_PLAY_FLAG_DOWNLOAD flag to enable Gstreamer Download buffer mode,
+ *so that we can query the buffered time/bytes, and further the time rangs.
+ */
+
+ g_object_get (priv->pipeline, "flags", &flags, NULL);
+ flags |= GST_PLAY_FLAG_DOWNLOAD;
+ g_object_set (priv->pipeline, "flags", flags, NULL);
+
+ priv->player_state = PlayerStateNull;
+ priv->suspended = FALSE;
+ priv->pos = 0;
+ priv->res_mngr = umms_resource_manager_new ();
+ priv->res_list = NULL;
+
+ priv->tag_list = NULL;
+
+ //Setup default target.
+#define FULL_SCREEN_RECT "0,0,0,0"
+ setup_ismd_vbin (MEDIA_PLAYER_CONTROL(self), FULL_SCREEN_RECT, UPP_A);
+ priv->target_type = ReservedType0;
+ priv->target_initialized = TRUE;
+}
+
+EngineGeneric *
+engine_generic_new (void)
+{
+ return g_object_new (ENGINE_TYPE_GENERIC, NULL);
+}
+
+static void
+_set_proxy (MediaPlayerControl *self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ g_return_if_fail (priv->source);
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (priv->source), "proxy") == NULL)
+ return;
+
+ UMMS_DEBUG ("Setting proxy. proxy=%s, id=%s, pw=%s", priv->proxy_uri, priv->proxy_id, priv->proxy_pw);
+ g_object_set (priv->source, "proxy", priv->proxy_uri,
+ "proxy-id", priv->proxy_id,
+ "proxy-pw", priv->proxy_pw, NULL);
+}
+
+static void
+_source_changed_cb (GObject *object, GParamSpec *pspec, gpointer data)
+{
+ GstElement *source;
+ EngineGenericPrivate *priv = GET_PRIVATE (data);
+
+ g_object_get(priv->pipeline, "source", &source, NULL);
+ gst_object_replace((GstObject**) &priv->source, (GstObject*) source);
+ UMMS_DEBUG ("source changed");
+ _set_proxy ((MediaPlayerControl *)data);
+
+ return;
+}
+
+
+#define HW_FORMAT_NUM 4
+#define HW_H264_CAPS \
+ "video/h264, " \
+ " format = (fourcc) H264, " \
+ " width = (int) [16,1920], " \
+ " height = (int) [16,1088]; " \
+ "video/x-h264, " \
+ " format = (fourcc) X264, " \
+ " width = (int) [16,1920], " \
+ " height = (int) [16,1088]; "
+
+
+#define HW_MPEG2_CAPS \
+ "video/mpeg, " \
+ " format = (fourcc) {MPEG, MP2V}, " \
+ " width = (int) [16,1920], " \
+ " height = (int) [16,1088], " \
+ " mpegversion = (int) [1, 2], " \
+ " systemstream = (boolean) false, " \
+ " ispacketized = (boolean) false; "
+
+#define HW_MPEG4_CAPS \
+ "video/mpeg, " \
+ " mpegversion = (int) 4, " \
+ " systemstream = (boolean) false; " \
+ "video/x-xvid;" \
+ "video/x-divx, " \
+ " format = (fourcc) {MPEG, MP4V}, " \
+ " width = (int) [16,1920], " \
+ " height = (int) [16,1088], " \
+ " divxversion = (int) [4, 5] "
+
+#define HW_VC1_CAPS \
+ "video/x-wmv, " \
+ " wmvversion = (int)3, " \
+ " format = (fourcc) { WMV3, WVC1 }"
+
+static GstStaticCaps hw_h264_static_caps = GST_STATIC_CAPS (HW_H264_CAPS);
+static GstStaticCaps hw_mpeg2_static_caps = GST_STATIC_CAPS (HW_MPEG2_CAPS);
+static GstStaticCaps hw_mpeg4_static_caps = GST_STATIC_CAPS (HW_MPEG4_CAPS);
+static GstStaticCaps hw_vc1_static_caps = GST_STATIC_CAPS (HW_VC1_CAPS);
+
+static GstStaticCaps *hw_static_caps[HW_FORMAT_NUM] = {&hw_h264_static_caps,
+ &hw_mpeg2_static_caps,
+ &hw_mpeg4_static_caps,
+ &hw_vc1_static_caps
+ };
+
+static gboolean
+autoplug_continue_cb (GstElement * element, GstPad * pad, GstCaps * caps,
+ MediaPlayerControl *control)
+{
+ gint i;
+ const gchar *name = NULL;
+ GstStructure *s = NULL;
+ GstCaps *hw_caps = NULL;
+ gboolean is_hw_vcaps = FALSE;
+ gboolean ret = TRUE;
+ EngineGenericPrivate *priv = GET_PRIVATE (control);
+
+ UMMS_DEBUG ( "pad caps : %" GST_PTR_FORMAT,
+ caps);
+
+ //check software a/v caps.
+ s = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (s);
+
+ if (!strncmp (name, "video", 5)) {
+ priv->has_video = TRUE;
+ //check HW video caps
+ for (i = 0; i < HW_FORMAT_NUM; i++) {
+ hw_caps = gst_static_caps_get (hw_static_caps[i]);
+
+ if (gst_caps_can_intersect (hw_caps, caps)) {
+ is_hw_vcaps = TRUE;
+ priv->hw_viddec++;
+
+ /*
+ * Don't continue to autoplug this pad,
+ * which avoids the failure of creating and plugin HW video decoder, and hence guarantees "no-more-pads"
+ * signal will be emitted.
+ *
+ */
+ ret = FALSE;
+ }
+
+ gst_caps_unref (hw_caps);
+
+ if (is_hw_vcaps)
+ goto hw_video_caps;
+ }
+ } else if (!strncmp (name, "audio", 5)) {
+ priv->has_audio = TRUE;
+ ret = FALSE;//Exposes this pad, and hence guarantees "no-more-pads" signal will be emitted.
+ //FIXME: check the HW audio caps.
+ } else if (!strncmp (name, "text", 4)) {
+ priv->has_sub = TRUE;
+ } else {
+ //nothing
+ }
+
+ return ret;
+
+hw_video_caps:
+ UMMS_DEBUG ("new stream with caps(%" GST_PTR_FORMAT ") needs HW video decoder resource", caps);
+ return ret;
+}
+
+static gboolean
+uri_parsing_finished_cb (MediaPlayerControl * self)
+{
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+ GstState target;
+
+ UMMS_DEBUG("Begin");
+
+ TEARDOWN_ELEMENT (priv->uri_parse_pipe);
+ priv->uri_parsed = TRUE;
+
+ UMMS_DEBUG("End, has_video=%d, num of hw_viddec=%d, has_audio=%d, num of hw_auddec=%d",
+ priv->has_video, priv->hw_viddec, priv->has_audio, priv->hw_auddec);
+
+ if (priv->pending_state >= PlayerStatePaused) {
+ target = (priv->pending_state == PlayerStatePaused) ? (GST_STATE_PAUSED) : (GST_STATE_PLAYING);
+ activate_engine (self, target);
+ }
+
+ return FALSE;
+}
+
+static void no_more_pads_cb (GstElement * uridecodebin, MediaPlayerControl * self)
+{
+ UMMS_DEBUG("Begin");
+ g_idle_add ((GSourceFunc)uri_parsing_finished_cb, self);
+ UMMS_DEBUG("End");
+}
+
+/*
+ * Parse the av asset spacified by the uri.
+ *
+ * Called when set state from PlayerStateNull/PlayerStateStopped to PlayerStatePaused/PlayerStatePlaying.
+ * Through this parsing, we can get the number of streams and their format, and can determine the
+ * resources(HW clock, HW a/v decoder) needed when playing this av asset.
+ *
+ * Return TRUE if successfully initializeithe parsing action.
+ * FALSE if not.
+ *
+ * Note: This is a asynchronous invoking, so, requesting resources and setting pipeline to Pause/Playing will be
+ * done in uri_parsing_finished_cb().
+ */
+static gboolean
+parse_uri_async (MediaPlayerControl *self, gchar *uri)
+{
+ GstElement *uridecodebin;
+ EngineGenericPrivate *priv = GET_PRIVATE (self);
+
+
+#if 0
+ g_return_val_if_fail (uri, FALSE);
+ g_return_val_if_fail ((!priv->uri_parse_pipe), TRUE);
+
+ priv->is_live = IS_LIVE_URI(priv->uri);
+
+ //use uridecodebin to automatically detect streams.
+ priv->uri_parse_pipe = uridecodebin = gst_element_factory_make ("uridecodebin", NULL);
+ if (!uridecodebin) {
+ return FALSE;
+ }
+
+ g_object_set (G_OBJECT(uridecodebin), "uri", priv->uri, NULL);
+
+ g_signal_connect (uridecodebin, "autoplug-continue",
+ G_CALLBACK (autoplug_continue_cb), self);
+
+ g_signal_connect (uridecodebin, "no-more-pads",
+ G_CALLBACK (no_more_pads_cb), self);
+
+ if (priv->is_live) {
+ if (gst_element_set_state (uridecodebin, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+ TEARDOWN_ELEMENT (priv->uri_parse_pipe);
+ return FALSE;
+ }
+ } else {
+ if (gst_element_set_state (uridecodebin, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) {
+ TEARDOWN_ELEMENT (priv->uri_parse_pipe);
+ return FALSE;
+ }
+ }
+#endif
+ return TRUE;
+}
--- src/engine-generic.h
+++ src/engine-generic.h
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _ENGINE_GENERIC_H
+#define _ENGINE_GENERIC_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define ENGINE_TYPE_GENERIC engine_generic_get_type()
+
+#define ENGINE_GENERIC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ ENGINE_TYPE_GENERIC, EngineGeneric))
+
+#define ENGINE_GENERIC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ ENGINE_TYPE_GENERIC, EngineGenericClass))
+
+#define ENGINE_IS_GENERIC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ ENGINE_TYPE_GENERIC))
+
+#define ENGINE_IS_GENERIC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ ENGINE_TYPE_GENERIC))
+
+#define ENGINE_GENERIC_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ ENGINE_TYPE_GENERIC, EngineGenericClass))
+
+typedef struct _EngineGeneric EngineGeneric;
+typedef struct _EngineGenericClass EngineGenericClass;
+typedef struct _EngineGenericPrivate EngineGenericPrivate;
+
+struct _EngineGeneric
+{
+ GObject parent;
+
+ EngineGenericPrivate *priv;
+};
+
+
+struct _EngineGenericClass
+{
+ GObjectClass parent_class;
+
+};
+
+GType engine_generic_get_type (void) G_GNUC_CONST;
+
+EngineGeneric *engine_generic_new (void);
+
+G_END_DECLS
+
+#endif /* _ENGINE_GENERIC_H */
--- src/engine-gst.c
+++ src/engine-gst.c
@@ -37,13 +37,13 @@
#include "umms-error.h"
#include "umms-resource-manager.h"
#include "engine-gst.h"
-#include "meego-media-player-control.h"
+#include "media-player-control.h"
#include "param-table.h"
-static void meego_media_player_control_init (MeegoMediaPlayerControl* iface);
+static void media_player_control_init (MediaPlayerControl* iface);
G_DEFINE_TYPE_WITH_CODE (EngineGst, engine_gst, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (MEEGO_TYPE_MEDIA_PLAYER_CONTROL, meego_media_player_control_init))
+ G_IMPLEMENT_INTERFACE (TYPE_MEDIA_PLAYER_CONTROL, media_player_control_init))
#define PLAYER_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), ENGINE_TYPE_GST, EngineGstPrivate))
@@ -157,16 +157,16 @@
static gboolean _query_buffering_percent (GstElement *pipe, gdouble *percent);
static void _source_changed_cb (GObject *object, GParamSpec *pspec, gpointer data);
-static gboolean _stop_pipe (MeegoMediaPlayerControl *control);
-static gboolean engine_gst_set_video_size (MeegoMediaPlayerControl *self, guint x, guint y, guint w, guint h);
-static gboolean create_xevent_handle_thread (MeegoMediaPlayerControl *self);
-static gboolean destroy_xevent_handle_thread (MeegoMediaPlayerControl *self);
-static gboolean parse_uri_async (MeegoMediaPlayerControl *self, gchar *uri);
-static void release_resource (MeegoMediaPlayerControl *self);
+static gboolean _stop_pipe (MediaPlayerControl *control);
+static gboolean engine_gst_set_video_size (MediaPlayerControl *self, guint x, guint y, guint w, guint h);
+static gboolean create_xevent_handle_thread (MediaPlayerControl *self);
+static gboolean destroy_xevent_handle_thread (MediaPlayerControl *self);
+static gboolean parse_uri_async (MediaPlayerControl *self, gchar *uri);
+static void release_resource (MediaPlayerControl *self);
static void uri_parser_bus_message_error_cb (GstBus *bus, GstMessage *message, EngineGst *self);
static gboolean
-engine_gst_set_uri (MeegoMediaPlayerControl *self,
+engine_gst_set_uri (MediaPlayerControl *self,
const gchar *uri)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -212,12 +212,12 @@
RESET_STR(priv->artist);
//URI is one of metadatas whose change should be notified.
- meego_media_player_control_emit_metadata_changed (self);
+ media_player_control_emit_metadata_changed (self);
return TRUE;
}
static gboolean
-get_video_rectangle (MeegoMediaPlayerControl *self, gint *ax, gint *ay, gint *w, gint *h, gint *rx, gint *ry)
+get_video_rectangle (MediaPlayerControl *self, gint *ax, gint *ay, gint *w, gint *h, gint *rx, gint *ry)
{
XWindowAttributes video_win_attr, app_win_attr;
gint app_x, app_y;
@@ -259,7 +259,7 @@
}
static gboolean
-cutout (MeegoMediaPlayerControl *self, gint x, gint y, gint w, gint h)
+cutout (MediaPlayerControl *self, gint x, gint y, gint w, gint h)
{
Atom property;
gchar data[256];
@@ -271,8 +271,8 @@
return FALSE;
}
- g_sprintf (data, "meego-tv-cutout-x=%d:meego-tv-cutout-y=%d:meego-tv-cutout-width=%d:"
- "meego-tv-cutout-height=%d:meego-tv-half-trans=0:meego-tv-full-window=0", x, y, w, h);
+ g_sprintf (data, "tv-cutout-x=%d:tv-cutout-y=%d:tv-cutout-width=%d:"
+ "tv-cutout-height=%d:tv-half-trans=0:tv-full-window=0", x, y, w, h);
UMMS_DEBUG ("Hints to mtv-mutter = \"%s\"", data);
@@ -282,7 +282,7 @@
}
static gboolean
-unset_xwindow_target (MeegoMediaPlayerControl *self)
+unset_xwindow_target (MediaPlayerControl *self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -295,7 +295,7 @@
}
static void
-engine_gst_handle_xevents (MeegoMediaPlayerControl *control)
+engine_gst_handle_xevents (MediaPlayerControl *control)
{
XEvent e;
gint x, y, w, h, rx, ry;
@@ -320,7 +320,7 @@
}
static gpointer
-engine_gst_event_thread (MeegoMediaPlayerControl* control)
+engine_gst_event_thread (MediaPlayerControl* control)
{
EngineGstPrivate *priv = GET_PRIVATE (control);
@@ -341,7 +341,7 @@
}
static gboolean
-create_xevent_handle_thread (MeegoMediaPlayerControl *self)
+create_xevent_handle_thread (MediaPlayerControl *self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -357,7 +357,7 @@
}
static gboolean
-destroy_xevent_handle_thread (MeegoMediaPlayerControl *self)
+destroy_xevent_handle_thread (MediaPlayerControl *self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -375,7 +375,7 @@
#define IS_VIDREND_BIN(ele) \
((g_object_class_find_property (G_OBJECT_GET_CLASS (ele), "scale-mode") != NULL) && (g_object_class_find_property (G_OBJECT_GET_CLASS (ele), "gdl-plane") != NULL))
-static gboolean setup_ismd_vbin(MeegoMediaPlayerControl *self, gchar *rect, gint plane)
+static gboolean setup_ismd_vbin(MediaPlayerControl *self, gchar *rect, gint plane)
{
GstElement *cur_vsink = NULL;
GstElement *new_vsink = NULL;
@@ -418,7 +418,7 @@
}
-static gboolean setup_gdl_plane_target (MeegoMediaPlayerControl *self, GHashTable *params)
+static gboolean setup_gdl_plane_target (MediaPlayerControl *self, GHashTable *params)
{
gchar *rect = NULL;
gint plane = INVALID_PLANE_ID;
@@ -449,7 +449,7 @@
* 1 and 2 are the case of xorg server.
* 3 is always satisfied, unless subwindow is requested from a process which is not the same process hosting the top-level window.
*/
-static Window get_top_level_win (MeegoMediaPlayerControl *self, Window sub_win)
+static Window get_top_level_win (MediaPlayerControl *self, Window sub_win)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
Display *disp = priv->disp;
@@ -488,7 +488,7 @@
return top_win;
}
-static gboolean setup_datacopy_target (MeegoMediaPlayerControl *self, GHashTable *params)
+static gboolean setup_datacopy_target (MediaPlayerControl *self, GHashTable *params)
{
gchar *rect = NULL;
GValue *val = NULL;
@@ -603,7 +603,7 @@
* 4. Create xevent handle thread.
*/
-static gboolean setup_xwindow_target (MeegoMediaPlayerControl *self, GHashTable *params)
+static gboolean setup_xwindow_target (MediaPlayerControl *self, GHashTable *params)
{
GValue *val;
gint x, y, w, h, rx, ry;
@@ -660,7 +660,7 @@
}
static gboolean
-unset_target (MeegoMediaPlayerControl *self)
+unset_target (MediaPlayerControl *self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -693,7 +693,7 @@
}
static gboolean
-engine_gst_set_target (MeegoMediaPlayerControl *self, gint type, GHashTable *params)
+engine_gst_set_target (MediaPlayerControl *self, gint type, GHashTable *params)
{
gboolean ret = TRUE;
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -748,7 +748,7 @@
}
static gboolean
-prepare_plane (MeegoMediaPlayerControl *self)
+prepare_plane (MediaPlayerControl *self)
{
GstElement *vsink_bin = NULL;
gint plane;
@@ -805,7 +805,7 @@
res = umms_resource_manager_request_resource (priv->res_mngr, &req); \
if (!res) { \
release_resource(self); \
- meego_media_player_control_emit_error (self, \
+ media_player_control_emit_error (self, \
UMMS_RESOURCE_ERROR_NO_RESOURCE, \
e_msg); \
return FALSE; \
@@ -815,7 +815,7 @@
static gboolean
-request_resource (MeegoMediaPlayerControl *self)
+request_resource (MediaPlayerControl *self)
{
gint i;
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -855,7 +855,7 @@
}
static void
-release_resource (MeegoMediaPlayerControl *self)
+release_resource (MediaPlayerControl *self)
{
GList *g;
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -895,7 +895,7 @@
}
static gboolean
-activate_engine (MeegoMediaPlayerControl *self, GstState target_state)
+activate_engine (MediaPlayerControl *self, GstState target_state)
{
gboolean ret;
PlayerState old_pending;
@@ -931,7 +931,7 @@
g_object_unref (clock);
} else {
UMMS_DEBUG ("Can't get HW clock");
- meego_media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, "Can't get HW clock for live source");
+ media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, "Can't get HW clock for live source");
ret = FALSE;
goto OUT;
}
@@ -959,19 +959,19 @@
}
static gboolean
-engine_gst_pause (MeegoMediaPlayerControl *self)
+engine_gst_pause (MediaPlayerControl *self)
{
return activate_engine (self, GST_STATE_PAUSED);
}
static gboolean
-engine_gst_play (MeegoMediaPlayerControl *self)
+engine_gst_play (MediaPlayerControl *self)
{
return activate_engine (self, GST_STATE_PLAYING);
}
static gboolean
-_stop_pipe (MeegoMediaPlayerControl *control)
+_stop_pipe (MediaPlayerControl *control)
{
EngineGstPrivate *priv = GET_PRIVATE (control);
@@ -988,7 +988,7 @@
}
static gboolean
-engine_gst_stop (MeegoMediaPlayerControl *self)
+engine_gst_stop (MediaPlayerControl *self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
PlayerState old_state;
@@ -1001,15 +1001,15 @@
priv->suspended = FALSE;
if (old_state != priv->player_state) {
- meego_media_player_control_emit_player_state_changed (self, old_state, priv->player_state);
+ media_player_control_emit_player_state_changed (self, old_state, priv->player_state);
}
- meego_media_player_control_emit_stopped (self);
+ media_player_control_emit_stopped (self);
return TRUE;
}
static gboolean
-engine_gst_set_video_size (MeegoMediaPlayerControl *self,
+engine_gst_set_video_size (MediaPlayerControl *self,
guint x, guint y, guint w, guint h)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -1096,7 +1096,7 @@
}
static gboolean
-engine_gst_get_video_size (MeegoMediaPlayerControl *self,
+engine_gst_get_video_size (MediaPlayerControl *self,
guint *w, guint *h)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -1126,7 +1126,7 @@
}
static gboolean
-engine_gst_is_seekable (MeegoMediaPlayerControl *self, gboolean *seekable)
+engine_gst_is_seekable (MediaPlayerControl *self, gboolean *seekable)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1135,7 +1135,7 @@
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (seekable != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1171,14 +1171,14 @@
}
static gboolean
-engine_gst_set_position (MeegoMediaPlayerControl *self, gint64 in_pos)
+engine_gst_set_position (MediaPlayerControl *self, gint64 in_pos)
{
GstElement *pipe;
EngineGstPrivate *priv;
gboolean ret;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1191,12 +1191,12 @@
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
UMMS_DEBUG ("Seeking to %" GST_TIME_FORMAT " %s", GST_TIME_ARGS (in_pos * GST_MSECOND), ret ? "succeeded" : "failed");
if (ret)
- meego_media_player_control_emit_seeked (self);
+ media_player_control_emit_seeked (self);
return ret;
}
static gboolean
-engine_gst_get_position (MeegoMediaPlayerControl *self, gint64 *cur_pos)
+engine_gst_get_position (MediaPlayerControl *self, gint64 *cur_pos)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1206,7 +1206,7 @@
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (cur_pos != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1223,14 +1223,14 @@
}
static gboolean
-engine_gst_set_playback_rate (MeegoMediaPlayerControl *self, gdouble in_rate)
+engine_gst_set_playback_rate (MediaPlayerControl *self, gdouble in_rate)
{
GstElement *pipe;
EngineGstPrivate *priv;
gboolean ret = TRUE;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1243,18 +1243,18 @@
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
if (ret)
- meego_media_player_control_emit_seeked (self);
+ media_player_control_emit_seeked (self);
}
static gboolean
-engine_gst_get_playback_rate (MeegoMediaPlayerControl *self, gdouble *out_rate)
+engine_gst_get_playback_rate (MediaPlayerControl *self, gdouble *out_rate)
{
GstElement *pipe;
EngineGstPrivate *priv;
GstQuery *query;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1275,14 +1275,14 @@
}
static gboolean
-engine_gst_set_volume (MeegoMediaPlayerControl *self, gint vol)
+engine_gst_set_volume (MediaPlayerControl *self, gint vol)
{
GstElement *pipe;
EngineGstPrivate *priv;
gdouble volume;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1290,17 +1290,17 @@
UMMS_DEBUG ("invoked");
- volume = CLAMP ((((gdouble)vol) / 100), 0.0, 1.0);
+ volume = (gdouble)(CLAMP (vol, 0, 100))/100;
UMMS_DEBUG ("set volume to = %f", volume);
gst_stream_volume_set_volume (GST_STREAM_VOLUME (pipe),
- GST_STREAM_VOLUME_FORMAT_CUBIC,
+ GST_STREAM_VOLUME_FORMAT_LINEAR,
volume);
return TRUE;
}
static gboolean
-engine_gst_get_volume (MeegoMediaPlayerControl *self, gint *volume)
+engine_gst_get_volume (MediaPlayerControl *self, gint *volume)
{
GstElement *pipe;
EngineGstPrivate *priv;
@@ -1309,7 +1309,7 @@
*volume = -1;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1318,16 +1318,16 @@
UMMS_DEBUG ("invoked");
vol = gst_stream_volume_get_volume (GST_STREAM_VOLUME (pipe),
- GST_STREAM_VOLUME_FORMAT_CUBIC);
+ GST_STREAM_VOLUME_FORMAT_LINEAR);
- *volume = vol * 100;
+ *volume = (gint)(vol * 100 + 0.5);
UMMS_DEBUG ("cur volume=%f(double), %d(int)", vol, *volume);
return TRUE;
}
static gboolean
-engine_gst_get_media_size_time (MeegoMediaPlayerControl *self, gint64 *media_size_time)
+engine_gst_get_media_size_time (MediaPlayerControl *self, gint64 *media_size_time)
{
GstElement *pipe;
EngineGstPrivate *priv;
@@ -1336,7 +1336,7 @@
GstFormat fmt = GST_FORMAT_TIME;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1358,7 +1358,7 @@
static gboolean
-engine_gst_get_media_size_bytes (MeegoMediaPlayerControl *self, gint64 *media_size_bytes)
+engine_gst_get_media_size_bytes (MediaPlayerControl *self, gint64 *media_size_bytes)
{
GstElement *source;
EngineGstPrivate *priv;
@@ -1366,7 +1366,7 @@
GstFormat fmt = GST_FORMAT_BYTES;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
source = priv->source;
@@ -1414,14 +1414,14 @@
}
static gboolean
-engine_gst_has_video (MeegoMediaPlayerControl *self, gboolean *has_video)
+engine_gst_has_video (MediaPlayerControl *self, gboolean *has_video)
{
GstElement *pipe;
EngineGstPrivate *priv;
gint n_video;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1437,14 +1437,14 @@
}
static gboolean
-engine_gst_has_audio (MeegoMediaPlayerControl *self, gboolean *has_audio)
+engine_gst_has_audio (MediaPlayerControl *self, gboolean *has_audio)
{
GstElement *pipe;
EngineGstPrivate *priv;
gint n_audio;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1460,7 +1460,7 @@
}
static gboolean
-engine_gst_support_fullscreen (MeegoMediaPlayerControl *self, gboolean *support_fullscreen)
+engine_gst_support_fullscreen (MediaPlayerControl *self, gboolean *support_fullscreen)
{
//We are using ismd_vidrend_bin, so this function always return TRUE.
*support_fullscreen = TRUE;
@@ -1468,13 +1468,13 @@
}
static gboolean
-engine_gst_is_streaming (MeegoMediaPlayerControl *self, gboolean *is_streaming)
+engine_gst_is_streaming (MediaPlayerControl *self, gboolean *is_streaming)
{
GstElement *pipe;
EngineGstPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1490,14 +1490,14 @@
}
static gboolean
-engine_gst_get_player_state (MeegoMediaPlayerControl *self,
+engine_gst_get_player_state (MediaPlayerControl *self,
gint *state)
{
EngineGstPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (state != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
@@ -1506,7 +1506,7 @@
}
static gboolean
-engine_gst_get_buffered_bytes (MeegoMediaPlayerControl *self,
+engine_gst_get_buffered_bytes (MediaPlayerControl *self,
gint64 *buffered_bytes)
{
gint64 total_bytes;
@@ -1559,7 +1559,7 @@
}
static gboolean
-engine_gst_get_buffered_time (MeegoMediaPlayerControl *self, gint64 *buffered_time)
+engine_gst_get_buffered_time (MediaPlayerControl *self, gint64 *buffered_time)
{
gint64 duration;
gdouble percent;
@@ -1583,7 +1583,7 @@
}
static gboolean
-engine_gst_get_current_video (MeegoMediaPlayerControl *self, gint *cur_video)
+engine_gst_get_current_video (MediaPlayerControl *self, gint *cur_video)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1604,7 +1604,7 @@
static gboolean
-engine_gst_get_current_audio (MeegoMediaPlayerControl *self, gint *cur_audio)
+engine_gst_get_current_audio (MediaPlayerControl *self, gint *cur_audio)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1625,7 +1625,7 @@
static gboolean
-engine_gst_set_current_video (MeegoMediaPlayerControl *self, gint cur_video)
+engine_gst_set_current_video (MediaPlayerControl *self, gint cur_video)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1652,7 +1652,7 @@
static gboolean
-engine_gst_set_current_audio (MeegoMediaPlayerControl *self, gint cur_audio)
+engine_gst_set_current_audio (MediaPlayerControl *self, gint cur_audio)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1679,7 +1679,7 @@
static gboolean
-engine_gst_get_video_num (MeegoMediaPlayerControl *self, gint *video_num)
+engine_gst_get_video_num (MediaPlayerControl *self, gint *video_num)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1700,7 +1700,7 @@
static gboolean
-engine_gst_get_audio_num (MeegoMediaPlayerControl *self, gint *audio_num)
+engine_gst_get_audio_num (MediaPlayerControl *self, gint *audio_num)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1721,7 +1721,7 @@
static gboolean
-engine_gst_set_subtitle_uri (MeegoMediaPlayerControl *self, gchar *sub_uri)
+engine_gst_set_subtitle_uri (MediaPlayerControl *self, gchar *sub_uri)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1752,7 +1752,7 @@
static gboolean
-engine_gst_get_subtitle_num (MeegoMediaPlayerControl *self, gint *sub_num)
+engine_gst_get_subtitle_num (MediaPlayerControl *self, gint *sub_num)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1773,7 +1773,7 @@
static gboolean
-engine_gst_get_current_subtitle (MeegoMediaPlayerControl *self, gint *cur_sub)
+engine_gst_get_current_subtitle (MediaPlayerControl *self, gint *cur_sub)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1794,7 +1794,7 @@
static gboolean
-engine_gst_set_current_subtitle (MeegoMediaPlayerControl *self, gint cur_sub)
+engine_gst_set_current_subtitle (MediaPlayerControl *self, gint cur_sub)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1821,7 +1821,7 @@
static gboolean
-engine_gst_set_proxy (MeegoMediaPlayerControl *self, GHashTable *params)
+engine_gst_set_proxy (MediaPlayerControl *self, GHashTable *params)
{
EngineGstPrivate *priv = NULL;
GValue *val = NULL;
@@ -1850,7 +1850,7 @@
static gboolean
-engine_gst_set_buffer_depth (MeegoMediaPlayerControl *self, gint format, gint64 buf_val)
+engine_gst_set_buffer_depth (MediaPlayerControl *self, gint format, gint64 buf_val)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1881,7 +1881,7 @@
static gboolean
-engine_gst_get_buffer_depth (MeegoMediaPlayerControl *self, gint format, gint64 *buf_val)
+engine_gst_get_buffer_depth (MediaPlayerControl *self, gint format, gint64 *buf_val)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -1912,13 +1912,13 @@
static gboolean
-engine_gst_set_mute (MeegoMediaPlayerControl *self, gint mute)
+engine_gst_set_mute (MediaPlayerControl *self, gint mute)
{
GstElement *pipe;
EngineGstPrivate *priv;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1932,7 +1932,7 @@
static gboolean
-engine_gst_is_mute (MeegoMediaPlayerControl *self, gint *mute)
+engine_gst_is_mute (MediaPlayerControl *self, gint *mute)
{
GstElement *pipe;
EngineGstPrivate *priv;
@@ -1941,7 +1941,7 @@
*mute = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -1956,7 +1956,7 @@
static gboolean
-engine_gst_set_scale_mode (MeegoMediaPlayerControl *self, gint scale_mode)
+engine_gst_set_scale_mode (MediaPlayerControl *self, gint scale_mode)
{
GstElement *pipe;
EngineGstPrivate *priv;
@@ -1968,7 +1968,7 @@
GEnumValue *eval;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2033,7 +2033,7 @@
static gboolean
-engine_gst_get_scale_mode (MeegoMediaPlayerControl *self, gint *scale_mode)
+engine_gst_get_scale_mode (MediaPlayerControl *self, gint *scale_mode)
{
GstElement *pipe;
EngineGstPrivate *priv;
@@ -2047,7 +2047,7 @@
*scale_mode = ScaleModeInvalid;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2106,10 +2106,10 @@
}
static gboolean
-engine_gst_suspend (MeegoMediaPlayerControl *self)
+engine_gst_suspend (MediaPlayerControl *self)
{
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -2123,18 +2123,18 @@
priv->pos = 0;
}
priv->suspended = TRUE;
- UMMS_DEBUG ("meego_media_player_control_emit_suspended");
- meego_media_player_control_emit_suspended (self);
+ UMMS_DEBUG ("media_player_control_emit_suspended");
+ media_player_control_emit_suspended (self);
return TRUE;
}
//restore asynchronously.
//Set to pause here, and do actual retoring operation in bus_message_state_change_cb().
static gboolean
-engine_gst_restore (MeegoMediaPlayerControl *self)
+engine_gst_restore (MediaPlayerControl *self)
{
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
EngineGstPrivate *priv = GET_PRIVATE (self);
@@ -2147,7 +2147,7 @@
static gboolean
-engine_gst_get_video_codec (MeegoMediaPlayerControl *self, gint channel, gchar ** video_codec)
+engine_gst_get_video_codec (MediaPlayerControl *self, gint channel, gchar ** video_codec)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -2160,7 +2160,7 @@
*video_codec = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2209,7 +2209,7 @@
static gboolean
-engine_gst_get_audio_codec (MeegoMediaPlayerControl *self, gint channel, gchar ** audio_codec)
+engine_gst_get_audio_codec (MediaPlayerControl *self, gint channel, gchar ** audio_codec)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -2222,7 +2222,7 @@
*audio_codec = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2270,7 +2270,7 @@
}
static gboolean
-engine_gst_get_video_bitrate (MeegoMediaPlayerControl *self, gint channel, gint *video_rate)
+engine_gst_get_video_bitrate (MediaPlayerControl *self, gint channel, gint *video_rate)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -2281,7 +2281,7 @@
*video_rate = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2319,7 +2319,7 @@
static gboolean
-engine_gst_get_audio_bitrate (MeegoMediaPlayerControl *self, gint channel, gint *audio_rate)
+engine_gst_get_audio_bitrate (MediaPlayerControl *self, gint channel, gint *audio_rate)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -2330,7 +2330,7 @@
*audio_rate = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2368,7 +2368,7 @@
static gboolean
-engine_gst_get_encapsulation(MeegoMediaPlayerControl *self, gchar ** encapsulation)
+engine_gst_get_encapsulation(MediaPlayerControl *self, gchar ** encapsulation)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -2377,7 +2377,7 @@
*encapsulation = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2397,7 +2397,7 @@
static gboolean
-engine_gst_get_audio_samplerate(MeegoMediaPlayerControl *self, gint channel, gint * sample_rate)
+engine_gst_get_audio_samplerate(MediaPlayerControl *self, gint channel, gint * sample_rate)
{
GstElement *pipe = NULL;
EngineGstPrivate *priv = NULL;
@@ -2410,7 +2410,7 @@
*sample_rate = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
/* We get this kind of infomation from the caps of inputselector. */
priv = GET_PRIVATE (self);
@@ -2446,7 +2446,7 @@
static gboolean
-engine_gst_get_video_framerate(MeegoMediaPlayerControl *self, gint channel,
+engine_gst_get_video_framerate(MediaPlayerControl *self, gint channel,
gint * frame_rate_num, gint * frame_rate_denom)
{
GstElement *pipe = NULL;
@@ -2461,7 +2461,7 @@
*frame_rate_denom = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
/* We get this kind of infomation from the caps of inputselector. */
priv = GET_PRIVATE (self);
@@ -2497,7 +2497,7 @@
static gboolean
-engine_gst_get_video_resolution(MeegoMediaPlayerControl *self, gint channel, gint * width, gint * height)
+engine_gst_get_video_resolution(MediaPlayerControl *self, gint channel, gint * width, gint * height)
{
GstElement *pipe = NULL;
EngineGstPrivate *priv = NULL;
@@ -2510,7 +2510,7 @@
*height = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
/* We get this kind of infomation from the caps of inputselector. */
priv = GET_PRIVATE (self);
@@ -2547,7 +2547,7 @@
static gboolean
-engine_gst_get_video_aspect_ratio(MeegoMediaPlayerControl *self, gint channel,
+engine_gst_get_video_aspect_ratio(MediaPlayerControl *self, gint channel,
gint * ratio_num, gint * ratio_denom)
{
GstElement *pipe = NULL;
@@ -2562,7 +2562,7 @@
*ratio_denom = 0;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
/* We get this kind of infomation from the caps of inputselector. */
priv = GET_PRIVATE (self);
@@ -2598,7 +2598,7 @@
static gboolean
-engine_gst_get_protocol_name(MeegoMediaPlayerControl *self, gchar ** prot_name)
+engine_gst_get_protocol_name(MediaPlayerControl *self, gchar ** prot_name)
{
GstElement *pipe = NULL;
EngineGstPrivate *priv = NULL;
@@ -2607,7 +2607,7 @@
*prot_name = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2636,7 +2636,7 @@
static gboolean
-engine_gst_get_current_uri(MeegoMediaPlayerControl *self, gchar ** uri)
+engine_gst_get_current_uri(MediaPlayerControl *self, gchar ** uri)
{
EngineGstPrivate *priv = NULL;
GstElement *pipe = NULL;
@@ -2645,7 +2645,7 @@
*uri = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
pipe = priv->pipeline;
@@ -2667,12 +2667,12 @@
}
static gboolean
-engine_gst_get_title(MeegoMediaPlayerControl *self, gchar ** title)
+engine_gst_get_title(MediaPlayerControl *self, gchar ** title)
{
EngineGstPrivate *priv = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
*title = g_strdup (priv->title);
@@ -2682,12 +2682,12 @@
}
static gboolean
-engine_gst_get_artist(MeegoMediaPlayerControl *self, gchar ** artist)
+engine_gst_get_artist(MediaPlayerControl *self, gchar ** artist)
{
EngineGstPrivate *priv = NULL;
g_return_val_if_fail (self != NULL, FALSE);
- g_return_val_if_fail (MEEGO_IS_MEDIA_PLAYER_CONTROL(self), FALSE);
+ g_return_val_if_fail (IS_MEDIA_PLAYER_CONTROL(self), FALSE);
priv = GET_PRIVATE (self);
*artist = g_strdup (priv->artist);
@@ -2696,119 +2696,119 @@
}
static void
-meego_media_player_control_init (MeegoMediaPlayerControl *iface)
+media_player_control_init (MediaPlayerControl *iface)
{
- MeegoMediaPlayerControlClass *klass = (MeegoMediaPlayerControlClass *)iface;
+ MediaPlayerControlClass *klass = (MediaPlayerControlClass *)iface;
- meego_media_player_control_implement_set_uri (klass,
+ media_player_control_implement_set_uri (klass,
engine_gst_set_uri);
- meego_media_player_control_implement_set_target (klass,
+ media_player_control_implement_set_target (klass,
engine_gst_set_target);
- meego_media_player_control_implement_play (klass,
+ media_player_control_implement_play (klass,
engine_gst_play);
- meego_media_player_control_implement_pause (klass,
+ media_player_control_implement_pause (klass,
engine_gst_pause);
- meego_media_player_control_implement_stop (klass,
+ media_player_control_implement_stop (klass,
engine_gst_stop);
- meego_media_player_control_implement_set_video_size (klass,
+ media_player_control_implement_set_video_size (klass,
engine_gst_set_video_size);
- meego_media_player_control_implement_get_video_size (klass,
+ media_player_control_implement_get_video_size (klass,
engine_gst_get_video_size);
- meego_media_player_control_implement_is_seekable (klass,
+ media_player_control_implement_is_seekable (klass,
engine_gst_is_seekable);
- meego_media_player_control_implement_set_position (klass,
+ media_player_control_implement_set_position (klass,
engine_gst_set_position);
- meego_media_player_control_implement_get_position (klass,
+ media_player_control_implement_get_position (klass,
engine_gst_get_position);
- meego_media_player_control_implement_set_playback_rate (klass,
+ media_player_control_implement_set_playback_rate (klass,
engine_gst_set_playback_rate);
- meego_media_player_control_implement_get_playback_rate (klass,
+ media_player_control_implement_get_playback_rate (klass,
engine_gst_get_playback_rate);
- meego_media_player_control_implement_set_volume (klass,
+ media_player_control_implement_set_volume (klass,
engine_gst_set_volume);
- meego_media_player_control_implement_get_volume (klass,
+ media_player_control_implement_get_volume (klass,
engine_gst_get_volume);
- meego_media_player_control_implement_get_media_size_time (klass,
+ media_player_control_implement_get_media_size_time (klass,
engine_gst_get_media_size_time);
- meego_media_player_control_implement_get_media_size_bytes (klass,
+ media_player_control_implement_get_media_size_bytes (klass,
engine_gst_get_media_size_bytes);
- meego_media_player_control_implement_has_video (klass,
+ media_player_control_implement_has_video (klass,
engine_gst_has_video);
- meego_media_player_control_implement_has_audio (klass,
+ media_player_control_implement_has_audio (klass,
engine_gst_has_audio);
- meego_media_player_control_implement_support_fullscreen (klass,
+ media_player_control_implement_support_fullscreen (klass,
engine_gst_support_fullscreen);
- meego_media_player_control_implement_is_streaming (klass,
+ media_player_control_implement_is_streaming (klass,
engine_gst_is_streaming);
- meego_media_player_control_implement_get_player_state (klass,
+ media_player_control_implement_get_player_state (klass,
engine_gst_get_player_state);
- meego_media_player_control_implement_get_buffered_bytes (klass,
+ media_player_control_implement_get_buffered_bytes (klass,
engine_gst_get_buffered_bytes);
- meego_media_player_control_implement_get_buffered_time (klass,
+ media_player_control_implement_get_buffered_time (klass,
engine_gst_get_buffered_time);
- meego_media_player_control_implement_get_current_video (klass,
+ media_player_control_implement_get_current_video (klass,
engine_gst_get_current_video);
- meego_media_player_control_implement_get_current_audio (klass,
+ media_player_control_implement_get_current_audio (klass,
engine_gst_get_current_audio);
- meego_media_player_control_implement_set_current_video (klass,
+ media_player_control_implement_set_current_video (klass,
engine_gst_set_current_video);
- meego_media_player_control_implement_set_current_audio (klass,
+ media_player_control_implement_set_current_audio (klass,
engine_gst_set_current_audio);
- meego_media_player_control_implement_get_video_num (klass,
+ media_player_control_implement_get_video_num (klass,
engine_gst_get_video_num);
- meego_media_player_control_implement_get_audio_num (klass,
+ media_player_control_implement_get_audio_num (klass,
engine_gst_get_audio_num);
- meego_media_player_control_implement_set_proxy (klass,
+ media_player_control_implement_set_proxy (klass,
engine_gst_set_proxy);
- meego_media_player_control_implement_set_subtitle_uri (klass,
+ media_player_control_implement_set_subtitle_uri (klass,
engine_gst_set_subtitle_uri);
- meego_media_player_control_implement_get_subtitle_num (klass,
+ media_player_control_implement_get_subtitle_num (klass,
engine_gst_get_subtitle_num);
- meego_media_player_control_implement_set_current_subtitle (klass,
+ media_player_control_implement_set_current_subtitle (klass,
engine_gst_set_current_subtitle);
- meego_media_player_control_implement_get_current_subtitle (klass,
+ media_player_control_implement_get_current_subtitle (klass,
engine_gst_get_current_subtitle);
- meego_media_player_control_implement_set_buffer_depth (klass,
+ media_player_control_implement_set_buffer_depth (klass,
engine_gst_set_buffer_depth);
- meego_media_player_control_implement_get_buffer_depth (klass,
+ media_player_control_implement_get_buffer_depth (klass,
engine_gst_get_buffer_depth);
- meego_media_player_control_implement_set_mute (klass,
+ media_player_control_implement_set_mute (klass,
engine_gst_set_mute);
- meego_media_player_control_implement_is_mute (klass,
+ media_player_control_implement_is_mute (klass,
engine_gst_is_mute);
- meego_media_player_control_implement_suspend (klass,
+ media_player_control_implement_suspend (klass,
engine_gst_suspend);
- meego_media_player_control_implement_restore (klass,
+ media_player_control_implement_restore (klass,
engine_gst_restore);
- meego_media_player_control_implement_set_scale_mode (klass,
+ media_player_control_implement_set_scale_mode (klass,
engine_gst_set_scale_mode);
- meego_media_player_control_implement_get_scale_mode (klass,
+ media_player_control_implement_get_scale_mode (klass,
engine_gst_get_scale_mode);
- meego_media_player_control_implement_get_video_codec (klass,
+ media_player_control_implement_get_video_codec (klass,
engine_gst_get_video_codec);
- meego_media_player_control_implement_get_audio_codec (klass,
+ media_player_control_implement_get_audio_codec (klass,
engine_gst_get_audio_codec);
- meego_media_player_control_implement_get_video_bitrate (klass,
+ media_player_control_implement_get_video_bitrate (klass,
engine_gst_get_video_bitrate);
- meego_media_player_control_implement_get_audio_bitrate (klass,
+ media_player_control_implement_get_audio_bitrate (klass,
engine_gst_get_audio_bitrate);
- meego_media_player_control_implement_get_encapsulation (klass,
+ media_player_control_implement_get_encapsulation (klass,
engine_gst_get_encapsulation);
- meego_media_player_control_implement_get_audio_samplerate (klass,
+ media_player_control_implement_get_audio_samplerate (klass,
engine_gst_get_audio_samplerate);
- meego_media_player_control_implement_get_video_framerate (klass,
+ media_player_control_implement_get_video_framerate (klass,
engine_gst_get_video_framerate);
- meego_media_player_control_implement_get_video_resolution (klass,
+ media_player_control_implement_get_video_resolution (klass,
engine_gst_get_video_resolution);
- meego_media_player_control_implement_get_video_aspect_ratio (klass,
+ media_player_control_implement_get_video_aspect_ratio (klass,
engine_gst_get_video_aspect_ratio);
- meego_media_player_control_implement_get_protocol_name (klass,
+ media_player_control_implement_get_protocol_name (klass,
engine_gst_get_protocol_name);
- meego_media_player_control_implement_get_current_uri (klass,
+ media_player_control_implement_get_current_uri (klass,
engine_gst_get_current_uri);
- meego_media_player_control_implement_get_title (klass,
+ media_player_control_implement_get_title (klass,
engine_gst_get_title);
- meego_media_player_control_implement_get_artist (klass,
+ media_player_control_implement_get_artist (klass,
engine_gst_get_artist);
}
@@ -2842,14 +2842,14 @@
EngineGstPrivate *priv = GET_PRIVATE (object);
int i;
- _stop_pipe ((MeegoMediaPlayerControl *)object);
+ _stop_pipe ((MediaPlayerControl *)object);
TEARDOWN_ELEMENT (priv->source);
TEARDOWN_ELEMENT (priv->uri_parse_pipe);
TEARDOWN_ELEMENT (priv->pipeline);
if (priv->target_type == XWindow) {
- unset_xwindow_target ((MeegoMediaPlayerControl *)object);
+ unset_xwindow_target ((MediaPlayerControl *)object);
}
if (priv->disp) {
@@ -2917,14 +2917,14 @@
priv->player_state = PlayerStatePaused;
if (old_player_state == PlayerStateStopped && priv->suspended) {
UMMS_DEBUG ("restoring suspended execution, pos = %lld", priv->pos);
- engine_gst_is_seekable (MEEGO_MEDIA_PLAYER_CONTROL(self), &seekable);
+ engine_gst_is_seekable (MEDIA_PLAYER_CONTROL(self), &seekable);
if (seekable) {
- engine_gst_set_position (MEEGO_MEDIA_PLAYER_CONTROL(self), priv->pos);
+ engine_gst_set_position (MEDIA_PLAYER_CONTROL(self), priv->pos);
}
- engine_gst_play(MEEGO_MEDIA_PLAYER_CONTROL(self));
+ engine_gst_play(MEDIA_PLAYER_CONTROL(self));
priv->suspended = FALSE;
- UMMS_DEBUG ("meego_media_player_control_emit_restored");
- meego_media_player_control_emit_restored (self);
+ UMMS_DEBUG ("media_player_control_emit_restored");
+ media_player_control_emit_restored (self);
}
} else if (new_state == GST_STATE_PLAYING) {
priv->player_state = PlayerStatePlaying;
@@ -2938,7 +2938,7 @@
if (priv->player_state != old_player_state) {
UMMS_DEBUG ("emit state changed, old=%d, new=%d", old_player_state, priv->player_state);
- meego_media_player_control_emit_player_state_changed (self, old_player_state, priv->player_state);
+ media_player_control_emit_player_state_changed (self, old_player_state, priv->player_state);
}
}
@@ -2973,9 +2973,7 @@
UMMS_DEBUG("The element name is %s", element_name);
}
- priv->tag_list =
- gst_tag_list_merge(priv->tag_list, tag_list, GST_TAG_MERGE_REPLACE);
-
+
//cache the title
if (gst_tag_list_get_string_index (tag_list, GST_TAG_TITLE, 0, &title)) {
UMMS_DEBUG("Element: %s, provide the title: %s", element_name, title);
@@ -2994,9 +2992,13 @@
//only care about artist and title
if (metadata_changed) {
- meego_media_player_control_emit_metadata_changed (self);
+ media_player_control_emit_metadata_changed (self);
}
+ //tag_list will be freed in gst_tag_list_merge(), so we don't need to free it by ourself
+ priv->tag_list =
+ gst_tag_list_merge(priv->tag_list, tag_list, GST_TAG_MERGE_REPLACE);
+
#if 0
gint size, i;
gchar * video_codec = NULL;
@@ -3132,12 +3134,10 @@
if (src_pad)
g_object_unref(src_pad);
- gst_tag_list_free (tag_list);
if (pad_name)
g_free(pad_name);
if (element_name)
g_free(element_name);
-
}
@@ -3147,9 +3147,7 @@
EngineGst *self)
{
UMMS_DEBUG ("message::eos received on bus");
-
- meego_media_player_control_emit_eof (self);
- engine_gst_stop ((MeegoMediaPlayerControl *)self);
+ media_player_control_emit_eof (self);
}
@@ -3163,9 +3161,9 @@
UMMS_DEBUG ("message::error received on bus");
gst_message_parse_error (message, &error, NULL);
- _stop_pipe (MEEGO_MEDIA_PLAYER_CONTROL(self));
+ _stop_pipe (MEDIA_PLAYER_CONTROL(self));
- meego_media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
+ media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
UMMS_DEBUG ("Error emitted with message = %s", error->message);
@@ -3201,15 +3199,19 @@
if (priv->pending_state == PlayerStatePlaying)
gst_element_set_state (priv->pipeline, GST_STATE_PLAYING);
- meego_media_player_control_emit_buffered (self);
- } else if (!priv->buffering && priv->pending_state == PlayerStatePlaying) {
+ media_player_control_emit_buffered (self);
+ } else if (!priv->buffering) {
+
+ if (priv->player_state == PlayerStatePlaying) {
+ priv->pending_state = PlayerStatePlaying;//Use this to restore playing when buffering done.
+ }
priv->buffering = TRUE;
UMMS_DEBUG ("Set pipeline to paused for buffering data");
if (!priv->is_live)
gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
- meego_media_player_control_emit_buffering (self);
+ media_player_control_emit_buffering (self);
}
}
}
@@ -3237,7 +3239,7 @@
vsink = GST_ELEMENT(GST_MESSAGE_SRC (message));
UMMS_DEBUG ("sync-handler received on bus: prepare-gdl-plane, source: %s", GST_ELEMENT_NAME(vsink));
- if (!prepare_plane ((MeegoMediaPlayerControl *)engine)) {
+ if (!prepare_plane ((MediaPlayerControl *)engine)) {
//Since we are in streame thread, let the vsink to post the error message. Handle it in bus_message_error_cb().
err = g_error_new_literal (UMMS_RESOURCE_ERROR, UMMS_RESOURCE_ERROR_NO_RESOURCE, "Plane unavailable");
msg = gst_message_new_error (GST_OBJECT_CAST(priv->pipeline), err, "No resource");
@@ -3245,7 +3247,7 @@
g_error_free (err);
}
-// meego_media_player_control_emit_request_window (engine);
+// media_player_control_emit_request_window (engine);
if (message)
gst_message_unref (message);
@@ -3256,21 +3258,21 @@
video_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data) /* Used as tag change monitor. */
{
EngineGst * priv = (EngineGst *) user_data;
- meego_media_player_control_emit_video_tag_changed(priv, stream_id);
+ media_player_control_emit_video_tag_changed(priv, stream_id);
}
static void
audio_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data) /* Used as tag change monitor. */
{
EngineGst * priv = (EngineGst *) user_data;
- meego_media_player_control_emit_audio_tag_changed(priv, stream_id);
+ media_player_control_emit_audio_tag_changed(priv, stream_id);
}
static void
text_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data) /* Used as tag change monitor. */
{
EngineGst * priv = (EngineGst *) user_data;
- meego_media_player_control_emit_text_tag_changed(priv, stream_id);
+ media_player_control_emit_text_tag_changed(priv, stream_id);
}
/* GstPlayFlags flags from playbin2 */
@@ -3366,7 +3368,7 @@
//Setup default target.
#define FULL_SCREEN_RECT "0,0,0,0"
- setup_ismd_vbin (MEEGO_MEDIA_PLAYER_CONTROL(self), FULL_SCREEN_RECT, UPP_A);
+ setup_ismd_vbin (MEDIA_PLAYER_CONTROL(self), FULL_SCREEN_RECT, UPP_A);
priv->target_type = ReservedType0;
priv->target_initialized = TRUE;
}
@@ -3378,7 +3380,7 @@
}
static void
-_set_proxy (MeegoMediaPlayerControl *self)
+_set_proxy (MediaPlayerControl *self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
g_return_if_fail (priv->source);
@@ -3400,7 +3402,7 @@
g_object_get(priv->uridecodebin, "source", &source, NULL);
gst_object_replace((GstObject**) &priv->source, (GstObject*) source);
UMMS_DEBUG ("source changed");
- _set_proxy ((MeegoMediaPlayerControl *)data);
+ _set_proxy ((MediaPlayerControl *)data);
return;
}
@@ -3414,7 +3416,7 @@
g_object_get(priv->pipeline, "source", &source, NULL);
gst_object_replace((GstObject**) &priv->source, (GstObject*) source);
UMMS_DEBUG ("source changed");
- _set_proxy ((MeegoMediaPlayerControl *)data);
+ _set_proxy ((MediaPlayerControl *)data);
return;
}
@@ -3470,7 +3472,7 @@
static gboolean
autoplug_continue_cb (GstElement * element, GstPad * pad, GstCaps * caps,
- MeegoMediaPlayerControl *control)
+ MediaPlayerControl *control)
{
gint i;
const gchar *name = NULL;
@@ -3529,7 +3531,7 @@
}
static gboolean
-uri_parsing_finished_cb (MeegoMediaPlayerControl * self)
+uri_parsing_finished_cb (MediaPlayerControl * self)
{
EngineGstPrivate *priv = GET_PRIVATE (self);
GstState target;
@@ -3550,7 +3552,7 @@
return FALSE;
}
-static void no_more_pads_cb (GstElement * uridecodebin, MeegoMediaPlayerControl * self)
+static void no_more_pads_cb (GstElement * uridecodebin, MediaPlayerControl * self)
{
UMMS_DEBUG("Begin");
g_idle_add ((GSourceFunc)uri_parsing_finished_cb, self);
@@ -3571,7 +3573,7 @@
* done in uri_parsing_finished_cb().
*/
static gboolean
-parse_uri_async (MeegoMediaPlayerControl *self, gchar *uri)
+parse_uri_async (MediaPlayerControl *self, gchar *uri)
{
GstElement *uridecodebin = NULL;
GstElement *uri_parse_pipe = NULL;
@@ -3647,7 +3649,7 @@
gst_message_parse_error (message, &error, NULL);
TEARDOWN_ELEMENT (priv->uri_parse_pipe);
- meego_media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
+ media_player_control_emit_error (self, UMMS_ENGINE_ERROR_FAILED, error->message);
UMMS_DEBUG ("URI Parsing error emitted with message = %s", error->message);
--- src/engine-test.c
+++ src/engine-test.c
@@ -27,7 +27,7 @@
#include "umms-common.h"
#include "umms-debug.h"
-#include "meego-media-player-control.h"
+#include "media-player-control.h"
#include "engine-gst.h"
const gchar *error_type[] = {
@@ -45,7 +45,7 @@
#define N_UMMS_METHOD 23
GMainLoop *loop = NULL;
-static MeegoMediaPlayerControl *player = NULL;
+static MediaPlayerControl *player = NULL;
static gchar args[2][256];
char *method_name[N_UMMS_METHOD] = {
@@ -144,16 +144,16 @@
else
uri = args[1];
UMMS_DEBUG ("uri = '%s'", uri);
- meego_media_player_control_set_uri (player, uri);
+ media_player_control_set_uri (player, uri);
break;
case 1:
- meego_media_player_control_play (player);
+ media_player_control_play (player);
break;
case 2:
- meego_media_player_control_pause (player);
+ media_player_control_pause (player);
break;
case 3:
- meego_media_player_control_stop (player);
+ media_player_control_stop (player);
break;
case 4:
sscanf (args[1], "%lld", &pos);
@@ -225,48 +225,48 @@
return FALSE;
}
-void player_state_changed_cb(MeegoMediaPlayerControl *player, gint state, gpointer user_data)
+void player_state_changed_cb(MediaPlayerControl *player, gint state, gpointer user_data)
{
UMMS_DEBUG("State changed to '%s'", state_name[state]);
}
-void eof_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void eof_cb(MediaPlayerControl *player, gpointer user_data)
{
UMMS_DEBUG( "EOF....");
}
-void begin_buffering_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void begin_buffering_cb(MediaPlayerControl *player, gpointer user_data)
{
UMMS_DEBUG( "Begin buffering");
}
-void buffered_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void buffered_cb(MediaPlayerControl *player, gpointer user_data)
{
UMMS_DEBUG( "Buffering completed");
}
-void seeked_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void seeked_cb(MediaPlayerControl *player, gpointer user_data)
{
UMMS_DEBUG( "Seeking completed");
}
-void stopped_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void stopped_cb(MediaPlayerControl *player, gpointer user_data)
{
UMMS_DEBUG( "Player stopped");
}
-void error_cb(MeegoMediaPlayerControl *player, guint err_id, gchar *msg, gpointer user_data)
+void error_cb(MediaPlayerControl *player, guint err_id, gchar *msg, gpointer user_data)
{
UMMS_DEBUG( "Error Domain:'%s', msg='%s'", error_type[err_id], msg);
}
-void request_window_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void request_window_cb(MediaPlayerControl *player, gpointer user_data)
{
UMMS_DEBUG( "Player engine request a X window");
}
static void
-connect_sigs(MeegoMediaPlayerControl *player)
+connect_sigs(MediaPlayerControl *player)
{
UMMS_DEBUG ("called");
g_signal_connect_object (player, "request-window",
@@ -353,7 +353,7 @@
g_type_init ();
gst_init (&argc, &argv);
- player = (MeegoMediaPlayerControl*)engine_gst_new();
+ player = (MediaPlayerControl*)engine_gst_new();
connect_sigs (player);
loop = g_main_loop_new (NULL, TRUE);
--- src/media-player-control.c
+++ src/media-player-control.c
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <dbus/dbus-glib.h>
+#include "umms-marshals.h"
+#include "media-player-control.h"
+
+struct _MediaPlayerControlClass {
+ GTypeInterface parent_class;
+ media_player_control_set_uri_impl set_uri;
+ media_player_control_set_target_impl set_target;
+ media_player_control_play_impl play;
+ media_player_control_pause_impl pause;
+ media_player_control_stop_impl stop;
+ media_player_control_set_position_impl set_position;
+ media_player_control_get_position_impl get_position;
+ media_player_control_set_playback_rate_impl set_playback_rate;
+ media_player_control_get_playback_rate_impl get_playback_rate;
+ media_player_control_set_volume_impl set_volume;
+ media_player_control_get_volume_impl get_volume;
+ media_player_control_set_window_id_impl set_window_id;
+ media_player_control_set_video_size_impl set_video_size;
+ media_player_control_get_video_size_impl get_video_size;
+ media_player_control_get_buffered_time_impl get_buffered_time;
+ media_player_control_get_buffered_bytes_impl get_buffered_bytes;
+ media_player_control_get_media_size_time_impl get_media_size_time;
+ media_player_control_get_media_size_bytes_impl get_media_size_bytes;
+ media_player_control_has_video_impl has_video;
+ media_player_control_has_audio_impl has_audio;
+ media_player_control_is_streaming_impl is_streaming;
+ media_player_control_is_seekable_impl is_seekable;
+ media_player_control_support_fullscreen_impl support_fullscreen;
+ media_player_control_get_player_state_impl get_player_state;
+ media_player_control_get_current_video_impl get_current_video;
+ media_player_control_get_current_audio_impl get_current_audio;
+ media_player_control_set_current_video_impl set_current_video;
+ media_player_control_set_current_audio_impl set_current_audio;
+ media_player_control_get_video_num_impl get_video_num;
+ media_player_control_get_audio_num_impl get_audio_num;
+ media_player_control_set_proxy_impl set_proxy;
+ media_player_control_set_subtitle_uri_impl set_subtitle_uri;
+ media_player_control_get_audio_num_impl get_subtitle_num;
+ media_player_control_get_current_subtitle_impl get_current_subtitle;
+ media_player_control_set_current_subtitle_impl set_current_subtitle;
+ media_player_control_set_buffer_depth_impl set_buffer_depth;
+ media_player_control_get_buffer_depth_impl get_buffer_depth;
+ media_player_control_set_mute_impl set_mute;
+ media_player_control_is_mute_impl is_mute;
+ media_player_control_set_scale_mode_impl set_scale_mode;
+ media_player_control_get_scale_mode_impl get_scale_mode;
+ media_player_control_suspend_impl suspend;
+ media_player_control_restore_impl restore;
+ media_player_control_get_video_codec_impl get_video_codec;
+ media_player_control_get_audio_codec_impl get_audio_codec;
+ media_player_control_get_video_bitrate_impl get_video_bitrate;
+ media_player_control_get_audio_bitrate_impl get_audio_bitrate;
+ media_player_control_get_encapsulation_impl get_encapsulation;
+ media_player_control_get_audio_samplerate_impl get_audio_samplerate;
+ media_player_control_get_video_framerate_impl get_video_framerate;
+ media_player_control_get_video_resolution_impl get_video_resolution;
+ media_player_control_get_video_aspect_ratio_impl get_video_aspect_ratio;
+ media_player_control_get_protocol_name_impl get_protocol_name;
+ media_player_control_get_current_uri_impl get_current_uri;
+ media_player_control_get_title_impl get_title;
+ media_player_control_get_artist_impl get_artist;
+ media_player_control_record_impl record;
+ media_player_control_get_pat_impl get_pat;
+ media_player_control_get_pmt_impl get_pmt;
+ media_player_control_get_associated_data_channel_impl get_associated_data_channel;
+};
+
+enum {
+ SIGNAL_MEDIA_PLAYER_CONTROL_Initialized,
+ SIGNAL_MEDIA_PLAYER_CONTROL_EOF,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Error,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Seeked,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Stopped,
+ SIGNAL_MEDIA_PLAYER_CONTROL_RequestWindow,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Buffering,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Buffered,
+ SIGNAL_MEDIA_PLAYER_CONTROL_PlayerStateChanged,
+ SIGNAL_MEDIA_PLAYER_CONTROL_TargetReady,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Suspended,
+ SIGNAL_MEDIA_PLAYER_CONTROL_Restored,
+ SIGNAL_MEDIA_PLAYER_CONTROL_VideoTagChanged,
+ SIGNAL_MEDIA_PLAYER_CONTROL_AudioTagChanged,
+ SIGNAL_MEDIA_PLAYER_CONTROL_TextTagChanged,
+ SIGNAL_MEDIA_PLAYER_CONTROL_MetadataChanged,
+ N_MEDIA_PLAYER_CONTROL_SIGNALS
+};
+static guint media_player_control_signals[N_MEDIA_PLAYER_CONTROL_SIGNALS] = {0};
+
+static void media_player_control_base_init (gpointer klass);
+
+GType
+media_player_control_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ static const GTypeInfo info = {
+ sizeof (MediaPlayerControlClass),
+ media_player_control_base_init, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0,
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+
+ type = g_type_register_static (G_TYPE_INTERFACE,
+ "MediaPlayerControl", &info, 0);
+ }
+
+ return type;
+}
+
+gboolean
+media_player_control_set_uri (MediaPlayerControl *self,
+ const gchar *in_uri)
+{
+ media_player_control_set_uri_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_uri);
+
+ if (impl != NULL) {
+ (impl) (self,
+ in_uri);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_uri (MediaPlayerControlClass *klass,
+ media_player_control_set_uri_impl impl)
+{
+ klass->set_uri = impl;
+}
+
+gboolean
+media_player_control_set_target (MediaPlayerControl *self,
+ gint type, GHashTable *params)
+{
+ media_player_control_set_target_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_target);
+
+ if (impl != NULL) {
+ (impl) (self, type, params);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_target (MediaPlayerControlClass *klass,
+ media_player_control_set_target_impl impl)
+{
+ klass->set_target = impl;
+}
+
+
+
+gboolean
+media_player_control_play (MediaPlayerControl *self)
+{
+ media_player_control_play_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->play);
+
+ if (impl != NULL) {
+ (impl) (self);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_play (MediaPlayerControlClass *klass,
+ media_player_control_play_impl impl)
+{
+ klass->play = impl;
+}
+
+gboolean
+media_player_control_pause (MediaPlayerControl *self)
+{
+ media_player_control_pause_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->pause);
+
+ if (impl != NULL) {
+ (impl) (self);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_pause (MediaPlayerControlClass *klass,
+ media_player_control_pause_impl impl)
+{
+ klass->pause = impl;
+}
+
+gboolean
+media_player_control_stop (MediaPlayerControl *self)
+{
+ media_player_control_stop_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->stop);
+
+ if (impl != NULL) {
+ (impl) (self);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_stop (MediaPlayerControlClass *klass,
+ media_player_control_stop_impl impl)
+{
+ klass->stop = impl;
+}
+
+
+gboolean
+media_player_control_set_position (MediaPlayerControl *self,
+ gint64 in_pos)
+{
+ media_player_control_set_position_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_position);
+
+ if (impl != NULL) {
+ (impl) (self,
+ in_pos);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_position (MediaPlayerControlClass *klass,
+ media_player_control_set_position_impl impl)
+{
+ klass->set_position = impl;
+}
+
+gboolean
+media_player_control_get_position (MediaPlayerControl *self, gint64 *cur_time)
+{
+ gboolean ret = FALSE;
+ media_player_control_get_position_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_position);
+
+ if (impl != NULL) {
+ ret = (impl) (self, cur_time);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return ret;
+}
+
+
+void media_player_control_implement_get_position (MediaPlayerControlClass *klass,
+ media_player_control_get_position_impl impl)
+{
+ klass->get_position = impl;
+}
+
+
+gboolean
+media_player_control_set_playback_rate (MediaPlayerControl *self,
+ gdouble in_rate)
+{
+ media_player_control_set_playback_rate_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_playback_rate);
+
+ if (impl != NULL) {
+ return (impl) (self,
+ in_rate);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_playback_rate (MediaPlayerControlClass *klass,
+ media_player_control_set_playback_rate_impl impl)
+{
+ klass->set_playback_rate = impl;
+}
+
+gboolean
+media_player_control_get_playback_rate (MediaPlayerControl *self, gdouble *out_rate)
+{
+ media_player_control_get_playback_rate_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_playback_rate);
+
+ if (impl != NULL) {
+ (impl) (self, out_rate);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_playback_rate (MediaPlayerControlClass *klass,
+ media_player_control_get_playback_rate_impl impl)
+{
+ klass->get_playback_rate = impl;
+}
+
+
+gboolean
+media_player_control_set_volume (MediaPlayerControl *self,
+ gint in_volume)
+{
+ media_player_control_set_volume_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_volume);
+
+ if (impl != NULL) {
+ (impl) (self,
+ in_volume);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_volume (MediaPlayerControlClass *klass,
+ media_player_control_set_volume_impl impl)
+{
+ klass->set_volume = impl;
+}
+
+gboolean
+media_player_control_get_volume (MediaPlayerControl *self, gint *vol)
+{
+ media_player_control_get_volume_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_volume);
+
+ if (impl != NULL) {
+ (impl) (self, vol);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_volume (MediaPlayerControlClass *klass,
+ media_player_control_get_volume_impl impl)
+{
+ klass->get_volume = impl;
+}
+
+
+gboolean
+media_player_control_set_window_id (MediaPlayerControl *self,
+ gdouble in_win_id)
+{
+ media_player_control_set_window_id_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_window_id);
+
+ if (impl != NULL) {
+ (impl) (self,
+ in_win_id);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_window_id (MediaPlayerControlClass *klass,
+ media_player_control_set_window_id_impl impl)
+{
+ klass->set_window_id = impl;
+}
+
+
+
+
+
+gboolean
+media_player_control_set_video_size (MediaPlayerControl *self,
+ guint in_x,
+ guint in_y,
+ guint in_w,
+ guint in_h)
+{
+ media_player_control_set_video_size_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_video_size);
+
+ if (impl != NULL) {
+ (impl) (self,
+ in_x,
+ in_y,
+ in_w,
+ in_h);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_video_size (MediaPlayerControlClass *klass,
+ media_player_control_set_video_size_impl impl)
+{
+ klass->set_video_size = impl;
+}
+
+gboolean
+media_player_control_get_video_size (MediaPlayerControl *self, guint *w, guint *h)
+{
+ media_player_control_get_video_size_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_size);
+
+ if (impl != NULL) {
+ (impl) (self, w, h);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_video_size (MediaPlayerControlClass *klass,
+ media_player_control_get_video_size_impl impl)
+{
+ klass->get_video_size = impl;
+}
+
+gboolean
+media_player_control_get_buffered_time (MediaPlayerControl *self, gint64 *buffered_time)
+{
+ media_player_control_get_buffered_time_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_buffered_time);
+
+ if (impl != NULL) {
+ (impl) (self, buffered_time);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_buffered_time (MediaPlayerControlClass *klass,
+ media_player_control_get_buffered_time_impl impl)
+{
+ klass->get_buffered_time = impl;
+}
+
+gboolean
+media_player_control_get_buffered_bytes (MediaPlayerControl *self, gint64 *buffered_time)
+{
+ media_player_control_get_buffered_bytes_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_buffered_bytes);
+
+ if (impl != NULL) {
+ (impl) (self, buffered_time);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_buffered_bytes (MediaPlayerControlClass *klass,
+ media_player_control_get_buffered_bytes_impl impl)
+{
+ klass->get_buffered_bytes = impl;
+}
+
+gboolean
+media_player_control_get_media_size_time (MediaPlayerControl *self, gint64 *media_size_time)
+{
+ media_player_control_get_media_size_time_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_media_size_time);
+
+ if (impl != NULL) {
+ (impl) (self, media_size_time);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_media_size_time (MediaPlayerControlClass *klass,
+ media_player_control_get_media_size_time_impl impl)
+{
+ klass->get_media_size_time = impl;
+}
+
+gboolean
+media_player_control_get_media_size_bytes (MediaPlayerControl *self, gint64 *media_size_bytes)
+{
+ media_player_control_get_media_size_bytes_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_media_size_bytes);
+
+ if (impl != NULL) {
+ (impl) (self, media_size_bytes);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_media_size_bytes (MediaPlayerControlClass *klass,
+ media_player_control_get_media_size_bytes_impl impl)
+{
+ klass->get_media_size_bytes = impl;
+}
+
+gboolean
+media_player_control_has_video (MediaPlayerControl *self, gboolean *has_video)
+{
+ media_player_control_has_video_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->has_video);
+
+ if (impl != NULL) {
+ (impl) (self, has_video);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_has_video (MediaPlayerControlClass *klass,
+ media_player_control_has_video_impl impl)
+{
+ klass->has_video = impl;
+}
+
+gboolean
+media_player_control_has_audio (MediaPlayerControl *self, gboolean *has_audio)
+{
+ media_player_control_has_audio_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->has_audio);
+
+ if (impl != NULL) {
+ (impl) (self, has_audio);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_has_audio (MediaPlayerControlClass *klass,
+ media_player_control_has_audio_impl impl)
+{
+ klass->has_audio = impl;
+}
+
+gboolean
+media_player_control_is_streaming (MediaPlayerControl *self, gboolean *is_streaming)
+{
+ media_player_control_is_streaming_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->is_streaming);
+
+ if (impl != NULL) {
+ (impl) (self, is_streaming);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_is_streaming (MediaPlayerControlClass *klass,
+ media_player_control_is_streaming_impl impl)
+{
+ klass->is_streaming = impl;
+}
+
+gboolean
+media_player_control_is_seekable (MediaPlayerControl *self, gboolean *seekable)
+{
+ media_player_control_is_seekable_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->is_seekable);
+
+ if (impl != NULL) {
+ (impl) (self, seekable);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_is_seekable (MediaPlayerControlClass *klass,
+ media_player_control_is_seekable_impl impl)
+{
+ klass->is_seekable = impl;
+}
+
+gboolean
+media_player_control_support_fullscreen (MediaPlayerControl *self, gboolean *support_fullscreen)
+{
+ media_player_control_support_fullscreen_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->support_fullscreen);
+
+ if (impl != NULL) {
+ (impl) (self, support_fullscreen);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_support_fullscreen (MediaPlayerControlClass *klass,
+ media_player_control_support_fullscreen_impl impl)
+{
+ klass->support_fullscreen = impl;
+}
+
+gboolean
+media_player_control_get_player_state (MediaPlayerControl *self, gint *state)
+{
+ media_player_control_get_player_state_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_player_state);
+
+ if (impl != NULL) {
+ (impl) (self, state);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_player_state (MediaPlayerControlClass *klass,
+ media_player_control_get_player_state_impl impl)
+{
+ klass->get_player_state = impl;
+}
+
+
+gboolean
+media_player_control_get_current_video (MediaPlayerControl *self, gint *cur_video)
+{
+ media_player_control_get_current_video_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_current_video);
+
+ if (impl != NULL) {
+ (impl) (self, cur_video);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_current_video (MediaPlayerControlClass *klass,
+ media_player_control_get_current_video_impl impl)
+{
+ klass->get_current_video = impl;
+}
+
+
+gboolean
+media_player_control_get_current_audio (MediaPlayerControl *self, gint *cur_audio)
+{
+ media_player_control_get_current_audio_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_current_audio);
+
+ if (impl != NULL) {
+ (impl) (self, cur_audio);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_current_audio (MediaPlayerControlClass *klass,
+ media_player_control_get_current_audio_impl impl)
+{
+ klass->get_current_audio = impl;
+}
+
+
+gboolean
+media_player_control_set_current_video (MediaPlayerControl *self, gint cur_video)
+{
+ media_player_control_set_current_video_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_current_video);
+
+ if (impl != NULL) {
+ (impl) (self, cur_video);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_current_video (MediaPlayerControlClass *klass,
+ media_player_control_set_current_video_impl impl)
+{
+ klass->set_current_video = impl;
+}
+
+
+gboolean
+media_player_control_set_current_audio (MediaPlayerControl *self, gint cur_audio)
+{
+ media_player_control_set_current_audio_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_current_audio);
+
+ if (impl != NULL) {
+ (impl) (self, cur_audio);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_set_current_audio (MediaPlayerControlClass *klass,
+ media_player_control_set_current_audio_impl impl)
+{
+ klass->set_current_audio = impl;
+}
+
+
+gboolean
+media_player_control_get_video_num (MediaPlayerControl *self, gint *video_num)
+{
+ media_player_control_get_video_num_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_num);
+
+ if (impl != NULL) {
+ (impl) (self, video_num);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_video_num (MediaPlayerControlClass *klass,
+ media_player_control_get_video_num_impl impl)
+{
+ klass->get_video_num = impl;
+}
+
+
+gboolean
+media_player_control_get_audio_num (MediaPlayerControl *self, gint *audio_num)
+{
+ media_player_control_get_audio_num_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_audio_num);
+
+ if (impl != NULL) {
+ (impl) (self, audio_num);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+
+void media_player_control_implement_get_audio_num (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_num_impl impl)
+{
+ klass->get_audio_num = impl;
+}
+
+gboolean
+media_player_control_set_proxy (MediaPlayerControl *self,
+ GHashTable *params)
+{
+ media_player_control_set_proxy_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_proxy);
+
+ if (impl != NULL) {
+ (impl) (self, params);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_proxy (MediaPlayerControlClass *klass,
+ media_player_control_set_proxy_impl impl)
+{
+ klass->set_proxy = impl;
+}
+
+gboolean
+media_player_control_set_subtitle_uri (MediaPlayerControl *self, gchar *sub_uri)
+{
+ media_player_control_set_subtitle_uri_impl impl = (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_subtitle_uri);
+
+ if (impl != NULL) {
+ (impl) (self, sub_uri);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_subtitle_uri (MediaPlayerControlClass *klass,
+ media_player_control_set_subtitle_uri_impl impl)
+{
+ klass->set_subtitle_uri = impl;
+}
+
+gboolean
+media_player_control_get_subtitle_num (MediaPlayerControl *self, gint *sub_num)
+{
+ media_player_control_get_subtitle_num_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_subtitle_num);
+
+ if (impl != NULL) {
+ (impl) (self, sub_num);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_subtitle_num (MediaPlayerControlClass *klass,
+ media_player_control_get_subtitle_num_impl impl)
+{
+ klass->get_subtitle_num = impl;
+}
+
+gboolean
+media_player_control_get_current_subtitle (MediaPlayerControl *self, gint *cur_sub)
+{
+ media_player_control_get_current_subtitle_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_current_subtitle);
+
+ if (impl != NULL) {
+ (impl) (self, cur_sub);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_current_subtitle (MediaPlayerControlClass *klass,
+ media_player_control_get_current_subtitle_impl impl)
+{
+ klass->get_current_subtitle = impl;
+}
+
+gboolean
+media_player_control_set_current_subtitle (MediaPlayerControl *self, gint cur_sub)
+{
+ media_player_control_set_current_subtitle_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_current_subtitle);
+
+ if (impl != NULL) {
+ (impl) (self, cur_sub);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_current_subtitle (MediaPlayerControlClass *klass,
+ media_player_control_set_current_subtitle_impl impl)
+{
+ klass->set_current_subtitle = impl;
+}
+
+gboolean
+media_player_control_set_buffer_depth (MediaPlayerControl *self, gint format, gint64 buf_val)
+{
+ media_player_control_set_buffer_depth_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_buffer_depth);
+
+ if (impl != NULL) {
+ (impl) (self, format, buf_val);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_buffer_depth (MediaPlayerControlClass *klass,
+ media_player_control_set_buffer_depth_impl impl)
+{
+ klass->set_buffer_depth = impl;
+}
+
+gboolean
+media_player_control_get_buffer_depth (MediaPlayerControl *self, gint format, gint64 *buf_val)
+{
+ media_player_control_get_buffer_depth_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_buffer_depth);
+
+ if (impl != NULL) {
+ (impl) (self, format, buf_val);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_buffer_depth (MediaPlayerControlClass *klass,
+ media_player_control_get_buffer_depth_impl impl)
+{
+ klass->get_buffer_depth = impl;
+}
+
+gboolean
+media_player_control_set_mute (MediaPlayerControl *self, gint mute)
+{
+ media_player_control_set_mute_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_mute);
+
+ if (impl != NULL) {
+ (impl) (self, mute);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_mute (MediaPlayerControlClass *klass,
+ media_player_control_set_mute_impl impl)
+{
+ klass->set_mute = impl;
+}
+
+gboolean
+media_player_control_is_mute (MediaPlayerControl *self, gint *mute)
+{
+ media_player_control_is_mute_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->is_mute);
+
+ if (impl != NULL) {
+ (impl) (self, mute);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_is_mute (MediaPlayerControlClass *klass,
+ media_player_control_is_mute_impl impl)
+{
+ klass->is_mute = impl;
+}
+
+gboolean media_player_control_set_scale_mode (MediaPlayerControl *self, gint scale_mode)
+{
+ media_player_control_set_scale_mode_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->set_scale_mode);
+
+ if (impl != NULL) {
+ (impl) (self, scale_mode);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_set_scale_mode (MediaPlayerControlClass *klass,
+ media_player_control_set_scale_mode_impl impl)
+{
+ klass->set_scale_mode = impl;
+}
+
+gboolean media_player_control_get_scale_mode (MediaPlayerControl *self, gint *scale_mode)
+{
+ media_player_control_get_scale_mode_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_scale_mode);
+
+ if (impl != NULL) {
+ (impl) (self, scale_mode);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_scale_mode (MediaPlayerControlClass *klass,
+ media_player_control_get_scale_mode_impl impl)
+{
+ klass->get_scale_mode = impl;
+}
+
+gboolean media_player_control_suspend (MediaPlayerControl *self)
+{
+ media_player_control_suspend_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->suspend);
+
+ if (impl != NULL) {
+ (impl) (self);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_suspend (MediaPlayerControlClass *klass,
+ media_player_control_suspend_impl impl)
+{
+ klass->suspend = impl;
+}
+
+gboolean media_player_control_restore (MediaPlayerControl *self)
+{
+ media_player_control_restore_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->restore);
+
+ if (impl != NULL) {
+ (impl) (self);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_restore (MediaPlayerControlClass *klass,
+ media_player_control_restore_impl impl)
+{
+ klass->restore = impl;
+}
+
+gboolean media_player_control_get_video_codec (MediaPlayerControl *self,
+ gint channel,
+ gchar **video_codec)
+{
+ media_player_control_get_video_codec_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_codec);
+
+ if (impl != NULL) {
+ (impl) (self, channel, video_codec);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_video_codec (MediaPlayerControlClass *klass,
+ media_player_control_get_video_codec_impl impl)
+{
+ klass->get_video_codec = impl;
+}
+
+gboolean media_player_control_get_audio_codec (MediaPlayerControl *self,
+ gint channel,
+ gchar **audio_codec)
+{
+ media_player_control_get_audio_codec_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_audio_codec);
+
+ if (impl != NULL) {
+ (impl) (self, channel, audio_codec);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_audio_codec (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_codec_impl impl)
+{
+ klass->get_audio_codec = impl;
+}
+
+gboolean media_player_control_get_video_bitrate (MediaPlayerControl *self, gint channel, gint *bit_rate)
+{
+ media_player_control_get_video_bitrate_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_bitrate);
+
+ if (impl != NULL) {
+ (impl) (self, channel, bit_rate);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_video_bitrate (MediaPlayerControlClass *klass,
+ media_player_control_get_video_bitrate_impl impl)
+{
+ klass->get_video_bitrate = impl;
+}
+
+gboolean media_player_control_get_audio_bitrate (MediaPlayerControl *self, gint channel, gint *bit_rate)
+{
+ media_player_control_get_audio_bitrate_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_audio_bitrate);
+
+ if (impl != NULL) {
+ (impl) (self, channel, bit_rate);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_audio_bitrate (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_bitrate_impl impl)
+{
+ klass->get_audio_bitrate = impl;
+}
+
+gboolean media_player_control_get_encapsulation(MediaPlayerControl *self, gchar ** encapsulation)
+{
+ media_player_control_get_encapsulation_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_encapsulation);
+
+ if (impl != NULL) {
+ (impl) (self, encapsulation);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_encapsulation (MediaPlayerControlClass *klass,
+ media_player_control_get_encapsulation_impl impl)
+{
+ klass->get_encapsulation = impl;
+}
+
+gboolean media_player_control_get_audio_samplerate(MediaPlayerControl *self, gint channel,
+ gint * sample_rate)
+{
+ media_player_control_get_audio_samplerate_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_audio_samplerate);
+
+ if (impl != NULL) {
+ (impl) (self, channel, sample_rate);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_audio_samplerate (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_samplerate_impl impl)
+{
+ klass->get_audio_samplerate = impl;
+}
+
+gboolean media_player_control_get_video_framerate(MediaPlayerControl *self, gint channel,
+ gint * frame_rate_num, gint * frame_rate_denom)
+{
+ media_player_control_get_video_framerate_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_framerate);
+
+ if (impl != NULL) {
+ (impl) (self, channel, frame_rate_num, frame_rate_denom);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_video_framerate (MediaPlayerControlClass *klass,
+ media_player_control_get_video_framerate_impl impl)
+{
+ klass->get_video_framerate = impl;
+}
+
+gboolean media_player_control_get_video_resolution(MediaPlayerControl *self, gint channel,
+ gint * width, gint * height)
+{
+ media_player_control_get_video_resolution_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_resolution);
+
+ if (impl != NULL) {
+ (impl) (self, channel, width, height);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_video_resolution(MediaPlayerControlClass *klass,
+ media_player_control_get_video_resolution_impl impl)
+{
+ klass->get_video_resolution = impl;
+}
+
+
+gboolean media_player_control_get_video_aspect_ratio(MediaPlayerControl *self,
+ gint channel, gint * ratio_num, gint * ratio_denom)
+{
+ media_player_control_get_video_aspect_ratio_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_video_aspect_ratio);
+
+ if (impl != NULL) {
+ (impl) (self, channel, ratio_num, ratio_denom);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_video_aspect_ratio(MediaPlayerControlClass *klass,
+ media_player_control_get_video_aspect_ratio_impl impl)
+{
+ klass->get_video_aspect_ratio = impl;
+}
+
+gboolean media_player_control_get_protocol_name(MediaPlayerControl *self, gchar ** prot_name)
+{
+ media_player_control_get_protocol_name_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_protocol_name);
+
+ if (impl != NULL) {
+ (impl) (self, prot_name);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_protocol_name(MediaPlayerControlClass *klass,
+ media_player_control_get_protocol_name_impl impl)
+{
+ klass->get_protocol_name = impl;
+}
+
+gboolean media_player_control_get_current_uri(MediaPlayerControl *self, gchar ** uri)
+{
+ media_player_control_get_current_uri_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_current_uri);
+
+ if (impl != NULL) {
+ (impl) (self, uri);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_current_uri(MediaPlayerControlClass *klass,
+ media_player_control_get_current_uri_impl impl)
+{
+ klass->get_current_uri = impl;
+}
+
+gboolean media_player_control_get_title (MediaPlayerControl *self, gchar ** title)
+{
+ media_player_control_get_title_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_title);
+
+ if (impl != NULL) {
+ (impl) (self, title);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_title(MediaPlayerControlClass *klass,
+ media_player_control_get_title_impl impl)
+{
+ klass->get_title = impl;
+}
+
+gboolean media_player_control_get_artist(MediaPlayerControl *self, gchar ** artist)
+{
+ media_player_control_get_artist_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_artist);
+
+ if (impl != NULL) {
+ (impl) (self, artist);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_artist(MediaPlayerControlClass *klass,
+ media_player_control_get_artist_impl impl)
+{
+ klass->get_artist = impl;
+}
+
+gboolean media_player_control_record (MediaPlayerControl *self, gboolean to_record, gchar *location)
+{
+ gboolean ret = FALSE;
+ media_player_control_record_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->record);
+
+ if (impl != NULL) {
+ ret = (impl) (self, to_record, location);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return ret;
+}
+
+void media_player_control_implement_record (MediaPlayerControlClass *klass,
+ media_player_control_record_impl impl)
+{
+ klass->record = impl;
+}
+
+gboolean media_player_control_get_pat (MediaPlayerControl *self, GPtrArray **pat)
+{
+ media_player_control_get_pat_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_pat);
+
+ if (impl != NULL) {
+ (impl) (self, pat);
+ } else {
+ g_warning ("%s: Method not implemented\n", __FUNCTION__);
+ *pat = g_ptr_array_new ();
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_pat(MediaPlayerControlClass *klass,
+ media_player_control_get_pat_impl impl)
+{
+ klass->get_pat = impl;
+}
+
+gboolean media_player_control_get_pmt (MediaPlayerControl *self, guint *program_num, guint *pcr_pid,
+ GPtrArray **stream_info)
+{
+ media_player_control_get_pmt_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_pmt);
+
+ if (impl != NULL) {
+ (impl) (self, program_num, pcr_pid, stream_info);
+ } else {
+ g_warning ("Method not implemented\n");
+ *stream_info = g_ptr_array_new ();
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_pmt(MediaPlayerControlClass *klass,
+ media_player_control_get_pmt_impl impl)
+{
+ klass->get_pmt = impl;
+}
+
+gboolean
+media_player_control_get_associated_data_channel (MediaPlayerControl *self, gchar **ip, gint *port)
+{
+ media_player_control_get_associated_data_channel_impl impl =
+ (MEDIA_PLAYER_CONTROL_GET_CLASS (self)->get_associated_data_channel);
+
+ if (impl != NULL) {
+ (impl) (self, ip, port);
+ } else {
+ g_warning ("Method not implemented\n");
+ }
+ return TRUE;
+}
+
+void media_player_control_implement_get_associated_data_channel (MediaPlayerControlClass *klass,
+ media_player_control_get_associated_data_channel_impl impl)
+{
+ klass->get_associated_data_channel = impl;
+}
+
+void
+media_player_control_emit_initialized (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Initialized],
+ 0);
+}
+void
+media_player_control_emit_eof (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_EOF],
+ 0);
+}
+
+void
+media_player_control_emit_error (gpointer instance,
+ guint error_num, gchar *error_des)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Error],
+ 0,
+ error_num, error_des);
+}
+
+void
+media_player_control_emit_buffered (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Buffered],
+ 0);
+}
+void
+media_player_control_emit_buffering (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Buffering],
+ 0);
+}
+
+void
+media_player_control_emit_player_state_changed (gpointer instance, gint old_state, gint new_state)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_PlayerStateChanged],
+ 0, old_state, new_state);
+}
+
+void
+media_player_control_emit_target_ready (gpointer instance, GHashTable *infos)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_TargetReady],
+ 0, infos);
+}
+void
+media_player_control_emit_seeked (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Seeked],
+ 0);
+}
+void
+media_player_control_emit_stopped (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Stopped],
+ 0);
+}
+
+void
+media_player_control_emit_request_window (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_RequestWindow],
+ 0);
+}
+
+void
+media_player_control_emit_suspended (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Suspended],
+ 0);
+}
+
+void
+media_player_control_emit_restored (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Restored],
+ 0);
+}
+
+void
+media_player_control_emit_video_tag_changed (gpointer instance, gint channel)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_VideoTagChanged],
+ 0, channel);
+}
+
+void
+media_player_control_emit_audio_tag_changed (gpointer instance, gint channel)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_AudioTagChanged],
+ 0, channel);
+}
+
+void
+media_player_control_emit_text_tag_changed (gpointer instance, gint channel)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_TextTagChanged],
+ 0, channel);
+}
+
+void
+media_player_control_emit_metadata_changed (gpointer instance)
+{
+ g_assert (instance != NULL);
+ g_assert (G_TYPE_CHECK_INSTANCE_TYPE (instance, TYPE_MEDIA_PLAYER_CONTROL));
+ g_signal_emit (instance,
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_MetadataChanged],
+ 0);
+}
+
+static inline void
+media_player_control_base_init_once (gpointer klass G_GNUC_UNUSED)
+{
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Initialized] =
+ g_signal_new ("initialized",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_EOF] =
+ g_signal_new ("eof",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Error] =
+ g_signal_new ("error",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ umms_marshal_VOID__UINT_STRING,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_UINT,
+ G_TYPE_STRING);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Seeked] =
+ g_signal_new ("seeked",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Stopped] =
+ g_signal_new ("stopped",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_RequestWindow] =
+ g_signal_new ("request-window",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Buffering] =
+ g_signal_new ("buffering",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Buffered] =
+ g_signal_new ("buffered",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_PlayerStateChanged] =
+ g_signal_new ("player-state-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ umms_marshal_VOID__INT_INT,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_INT,
+ G_TYPE_INT);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_TargetReady] =
+ g_signal_new ("target-ready",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED,
+ G_TYPE_NONE,
+ 1, dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE));
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Suspended] =
+ g_signal_new ("suspended",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_Restored] =
+ g_signal_new ("restored",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_VideoTagChanged] =
+ g_signal_new ("video-tag-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_AudioTagChanged] =
+ g_signal_new ("audio-tag-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_TextTagChanged] =
+ g_signal_new ("text-tag-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+ media_player_control_signals[SIGNAL_MEDIA_PLAYER_CONTROL_MetadataChanged] =
+ g_signal_new ("metadata-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+}
+
+static void
+media_player_control_base_init (gpointer klass)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ initialized = TRUE;
+ media_player_control_base_init_once (klass);
+ }
+}
--- src/media-player-control.h
+++ src/media-player-control.h
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __MEDIA_PLAYER_CONTROL_H__
+#define __MEDIA_PLAYER_CONTROL_H__
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/**
+ * MediaPlayerControl:
+ *
+ * Dummy typedef representing any implementation of this interface.
+ */
+typedef struct _MediaPlayerControl MediaPlayerControl;
+
+/**
+ * MediaPlayerControlClass:
+ *
+ * The class of MediaPlayerControl.
+ */
+typedef struct _MediaPlayerControlClass MediaPlayerControlClass;
+
+GType media_player_control_get_type (void);
+#define TYPE_MEDIA_PLAYER_CONTROL \
+ (media_player_control_get_type ())
+#define MEDIA_PLAYER_CONTROL(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), TYPE_MEDIA_PLAYER_CONTROL, MediaPlayerControl))
+#define IS_MEDIA_PLAYER_CONTROL(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), TYPE_MEDIA_PLAYER_CONTROL))
+#define MEDIA_PLAYER_CONTROL_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_INTERFACE((obj), TYPE_MEDIA_PLAYER_CONTROL, MediaPlayerControlClass))
+
+
+typedef gboolean (*media_player_control_set_uri_impl) (MediaPlayerControl *self, const gchar *in_uri);
+void media_player_control_implement_set_uri (MediaPlayerControlClass *klass,
+ media_player_control_set_uri_impl impl);
+
+typedef gboolean (*media_player_control_set_target_impl) (MediaPlayerControl *self,
+ gint type, GHashTable *params);
+void media_player_control_implement_set_target (MediaPlayerControlClass *klass,
+ media_player_control_set_target_impl impl);
+
+typedef gboolean (*media_player_control_play_impl) (MediaPlayerControl *self);
+void media_player_control_implement_play (MediaPlayerControlClass *klass,
+ media_player_control_play_impl impl);
+
+typedef gboolean (*media_player_control_pause_impl) (MediaPlayerControl *self);
+void media_player_control_implement_pause (MediaPlayerControlClass *klass,
+ media_player_control_pause_impl impl);
+
+typedef gboolean (*media_player_control_stop_impl) (MediaPlayerControl *self);
+void media_player_control_implement_stop (MediaPlayerControlClass *klass,
+ media_player_control_stop_impl impl);
+
+typedef gboolean (*media_player_control_set_position_impl) (MediaPlayerControl *self, gint64 in_pos);
+void media_player_control_implement_set_position (MediaPlayerControlClass *klass,
+ media_player_control_set_position_impl impl);
+
+typedef gboolean (*media_player_control_get_position_impl) (MediaPlayerControl *self, gint64 *cur_time);
+void media_player_control_implement_get_position (MediaPlayerControlClass *klass,
+ media_player_control_get_position_impl impl);
+
+typedef gboolean (*media_player_control_set_playback_rate_impl) (MediaPlayerControl *self, gdouble in_rate);
+void media_player_control_implement_set_playback_rate (MediaPlayerControlClass *klass,
+ media_player_control_set_playback_rate_impl impl);
+
+typedef gboolean (*media_player_control_get_playback_rate_impl) (MediaPlayerControl *self, gdouble *out_rate);
+void media_player_control_implement_get_playback_rate (MediaPlayerControlClass *klass,
+ media_player_control_get_playback_rate_impl impl);
+
+typedef gboolean (*media_player_control_set_volume_impl) (MediaPlayerControl *self, gint in_volume);
+void media_player_control_implement_set_volume (MediaPlayerControlClass *klass,
+ media_player_control_set_volume_impl impl);
+
+typedef gboolean (*media_player_control_get_volume_impl) (MediaPlayerControl *self, gint *vol);
+void media_player_control_implement_get_volume (MediaPlayerControlClass *klass,
+ media_player_control_get_volume_impl impl);
+
+typedef gboolean (*media_player_control_set_window_id_impl) (MediaPlayerControl *self, gdouble in_win_id);
+void media_player_control_implement_set_window_id (MediaPlayerControlClass *klass,
+ media_player_control_set_window_id_impl impl);
+
+typedef gboolean (*media_player_control_set_video_size_impl) (MediaPlayerControl *self,
+ guint in_x,
+ guint in_y,
+ guint in_w,
+ guint in_h);
+void media_player_control_implement_set_video_size (MediaPlayerControlClass *klass,
+ media_player_control_set_video_size_impl impl);
+
+typedef gboolean (*media_player_control_get_video_size_impl) (MediaPlayerControl *self, guint *w, guint *h);
+void media_player_control_implement_get_video_size (MediaPlayerControlClass *klass,
+ media_player_control_get_video_size_impl impl);
+
+typedef gboolean (*media_player_control_get_buffered_bytes_impl) (MediaPlayerControl *self, gint64 *depth);
+void media_player_control_implement_get_buffered_bytes (MediaPlayerControlClass *klass,
+ media_player_control_get_buffered_bytes_impl impl);
+
+typedef gboolean (*media_player_control_get_buffered_time_impl) (MediaPlayerControl *self, gint64 *depth);
+void media_player_control_implement_get_buffered_time (MediaPlayerControlClass *klass,
+ media_player_control_get_buffered_time_impl impl);
+
+typedef gboolean (*media_player_control_get_media_size_time_impl) (MediaPlayerControl *self, gint64 *media_size_time);
+void media_player_control_implement_get_media_size_time (MediaPlayerControlClass *klass,
+ media_player_control_get_media_size_time_impl impl);
+
+typedef gboolean (*media_player_control_get_media_size_bytes_impl) (MediaPlayerControl *self, gint64 *media_size_bytes);
+void media_player_control_implement_get_media_size_bytes (MediaPlayerControlClass *klass,
+ media_player_control_get_media_size_bytes_impl impl);
+
+typedef gboolean (*media_player_control_has_audio_impl) (MediaPlayerControl *self, gboolean *has_audio);
+void media_player_control_implement_has_audio (MediaPlayerControlClass *klass,
+ media_player_control_has_audio_impl impl);
+
+typedef gboolean (*media_player_control_has_video_impl) (MediaPlayerControl *self, gboolean *has_video);
+void media_player_control_implement_has_video (MediaPlayerControlClass *klass,
+ media_player_control_has_video_impl impl);
+
+typedef gboolean (*media_player_control_is_streaming_impl) (MediaPlayerControl *self, gboolean *is_streaming);
+void media_player_control_implement_is_streaming (MediaPlayerControlClass *klass,
+ media_player_control_is_streaming_impl impl);
+
+typedef gboolean (*media_player_control_is_seekable_impl) (MediaPlayerControl *self, gboolean *seekable);
+void media_player_control_implement_is_seekable (MediaPlayerControlClass *klass,
+ media_player_control_is_seekable_impl impl);
+
+typedef gboolean (*media_player_control_support_fullscreen_impl) (MediaPlayerControl *self, gboolean *support_fullscreen);
+void media_player_control_implement_support_fullscreen (MediaPlayerControlClass *klass,
+ media_player_control_support_fullscreen_impl impl);
+
+typedef gboolean (*media_player_control_get_player_state_impl) (MediaPlayerControl *self, gint *state);
+void media_player_control_implement_get_player_state (MediaPlayerControlClass *klass,
+ media_player_control_get_player_state_impl impl);
+
+typedef gboolean (*media_player_control_get_current_video_impl) (MediaPlayerControl *self, gint *cur_video);
+void media_player_control_implement_get_current_video (MediaPlayerControlClass *klass,
+ media_player_control_get_current_video_impl impl);
+
+typedef gboolean (*media_player_control_get_current_audio_impl) (MediaPlayerControl *self, gint *cur_audio);
+void media_player_control_implement_get_current_audio (MediaPlayerControlClass *klass,
+ media_player_control_get_current_audio_impl impl);
+
+typedef gboolean (*media_player_control_set_current_video_impl) (MediaPlayerControl *self, gint cur_video);
+void media_player_control_implement_set_current_video (MediaPlayerControlClass *klass,
+ media_player_control_set_current_video_impl impl);
+
+typedef gboolean (*media_player_control_set_current_audio_impl) (MediaPlayerControl *self, gint cur_audio);
+void media_player_control_implement_set_current_audio (MediaPlayerControlClass *klass,
+ media_player_control_set_current_audio_impl impl);
+
+typedef gboolean (*media_player_control_get_video_num_impl) (MediaPlayerControl *self, gint *video_num);
+void media_player_control_implement_get_video_num (MediaPlayerControlClass *klass,
+ media_player_control_get_video_num_impl impl);
+
+typedef gboolean (*media_player_control_get_audio_num_impl) (MediaPlayerControl *self, gint *audio_num);
+void media_player_control_implement_get_audio_num (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_num_impl impl);
+
+typedef gboolean (*media_player_control_set_proxy_impl) (MediaPlayerControl *self,
+ GHashTable *params);
+void media_player_control_implement_set_proxy (MediaPlayerControlClass *klass,
+ media_player_control_set_proxy_impl impl);
+
+typedef gboolean (*media_player_control_set_subtitle_uri_impl) (MediaPlayerControl *self,
+ gchar *sub_uri);
+void media_player_control_implement_set_subtitle_uri (MediaPlayerControlClass *klass,
+ media_player_control_set_subtitle_uri_impl impl);
+
+typedef gboolean (*media_player_control_get_subtitle_num_impl) (MediaPlayerControl *self, gint *subtitle_num);
+void media_player_control_implement_get_subtitle_num (MediaPlayerControlClass *klass,
+ media_player_control_get_subtitle_num_impl impl);
+
+typedef gboolean (*media_player_control_get_current_subtitle_impl) (MediaPlayerControl *self, gint *cur_sub);
+void media_player_control_implement_get_current_subtitle (MediaPlayerControlClass *klass,
+ media_player_control_get_current_subtitle_impl impl);
+
+typedef gboolean (*media_player_control_set_current_subtitle_impl) (MediaPlayerControl *self, gint cur_sub);
+void media_player_control_implement_set_current_subtitle (MediaPlayerControlClass *klass,
+ media_player_control_set_current_subtitle_impl impl);
+
+typedef gboolean (*media_player_control_set_buffer_depth_impl) (MediaPlayerControl *self,
+ gint format, gint64 buf_val);
+void media_player_control_implement_set_buffer_depth (MediaPlayerControlClass *klass,
+ media_player_control_set_buffer_depth_impl impl);
+
+typedef gboolean (*media_player_control_get_buffer_depth_impl) (MediaPlayerControl *self,
+ gint format, gint64 *buf_val);
+void media_player_control_implement_get_buffer_depth (MediaPlayerControlClass *klass,
+ media_player_control_get_buffer_depth_impl impl);
+
+typedef gboolean (*media_player_control_set_mute_impl) (MediaPlayerControl *self, gint mute);
+void media_player_control_implement_set_mute (MediaPlayerControlClass *klass,
+ media_player_control_set_mute_impl impl);
+
+typedef gboolean (*media_player_control_is_mute_impl) (MediaPlayerControl *self, gint *mute);
+void media_player_control_implement_is_mute (MediaPlayerControlClass *klass,
+ media_player_control_is_mute_impl impl);
+
+typedef gboolean (*media_player_control_set_scale_mode_impl) (MediaPlayerControl *self, gint scale_mode);
+void media_player_control_implement_set_scale_mode (MediaPlayerControlClass *klass,
+ media_player_control_set_scale_mode_impl impl);
+
+typedef gboolean (*media_player_control_get_scale_mode_impl) (MediaPlayerControl *self, gint *scale_mode);
+void media_player_control_implement_get_scale_mode (MediaPlayerControlClass *klass,
+ media_player_control_get_scale_mode_impl impl);
+
+typedef gboolean (*media_player_control_suspend_impl) (MediaPlayerControl *self);
+void media_player_control_implement_suspend (MediaPlayerControlClass *klass,
+ media_player_control_suspend_impl impl);
+
+typedef gboolean (*media_player_control_restore_impl) (MediaPlayerControl *self);
+void media_player_control_implement_restore (MediaPlayerControlClass *klass,
+ media_player_control_restore_impl impl);
+
+typedef gboolean (*media_player_control_get_video_codec_impl) (MediaPlayerControl *self,
+ gint channel, gchar ** video_codec);
+void media_player_control_implement_get_video_codec (MediaPlayerControlClass *klass,
+ media_player_control_get_video_codec_impl impl);
+
+typedef gboolean (*media_player_control_get_audio_codec_impl) (MediaPlayerControl *self,
+ gint channel, gchar ** audio_codec);
+void media_player_control_implement_get_audio_codec (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_codec_impl impl);
+
+typedef gboolean (*media_player_control_get_video_bitrate_impl) (MediaPlayerControl *self, gint channel, gint *bit_rate);
+void media_player_control_implement_get_video_bitrate (MediaPlayerControlClass *klass,
+ media_player_control_get_video_bitrate_impl impl);
+
+typedef gboolean (*media_player_control_get_audio_bitrate_impl) (MediaPlayerControl *self, gint channel, gint *bit_rate);
+void media_player_control_implement_get_audio_bitrate (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_bitrate_impl impl);
+
+typedef gboolean (*media_player_control_get_encapsulation_impl) (MediaPlayerControl *self,
+ gchar ** encapsulation);
+void media_player_control_implement_get_encapsulation (MediaPlayerControlClass *klass,
+ media_player_control_get_encapsulation_impl impl);
+
+typedef gboolean (*media_player_control_get_audio_samplerate_impl) (MediaPlayerControl *self,
+ gint channel, gint * sample_rate);
+void media_player_control_implement_get_audio_samplerate (MediaPlayerControlClass *klass,
+ media_player_control_get_audio_samplerate_impl impl);
+
+typedef gboolean (*media_player_control_get_video_framerate_impl) (MediaPlayerControl *self,
+ gint channel, gint * frame_rate_num, gint * frame_rate_denom);
+void media_player_control_implement_get_video_framerate (MediaPlayerControlClass *klass,
+ media_player_control_get_video_framerate_impl impl);
+
+typedef gboolean (*media_player_control_get_video_resolution_impl) (MediaPlayerControl *self,
+ gint channel, gint * width, gint * height);
+void media_player_control_implement_get_video_resolution(MediaPlayerControlClass *klass,
+ media_player_control_get_video_resolution_impl impl);
+
+typedef gboolean (*media_player_control_get_video_aspect_ratio_impl) (MediaPlayerControl *self,
+ gint channel, gint * ratio_num, gint * ratio_denom);
+void media_player_control_implement_get_video_aspect_ratio(MediaPlayerControlClass *klass,
+ media_player_control_get_video_aspect_ratio_impl impl);
+
+typedef gboolean (*media_player_control_get_protocol_name_impl) (MediaPlayerControl *self, gchar ** prot_name);
+void media_player_control_implement_get_protocol_name(MediaPlayerControlClass *klass,
+ media_player_control_get_protocol_name_impl impl);
+
+typedef gboolean (*media_player_control_get_current_uri_impl) (MediaPlayerControl *self, gchar ** uri);
+void media_player_control_implement_get_current_uri(MediaPlayerControlClass *klass,
+ media_player_control_get_current_uri_impl impl);
+
+typedef gboolean (*media_player_control_get_title_impl) (MediaPlayerControl *self, gchar ** uri);
+void media_player_control_implement_get_title(MediaPlayerControlClass *klass,
+ media_player_control_get_title_impl impl);
+
+typedef gboolean (*media_player_control_get_artist_impl) (MediaPlayerControl *self, gchar ** uri);
+void media_player_control_implement_get_artist(MediaPlayerControlClass *klass,
+ media_player_control_get_artist_impl impl);
+
+typedef gboolean (*media_player_control_record_impl) (MediaPlayerControl *self, gboolean to_record, gchar *location);
+void media_player_control_implement_record (MediaPlayerControlClass *klass,
+ media_player_control_record_impl impl);
+typedef gboolean (*media_player_control_get_pat_impl) (MediaPlayerControl *self, GPtrArray **pat);
+void media_player_control_implement_get_pat (MediaPlayerControlClass *klass,
+ media_player_control_get_pat_impl impl);
+typedef gboolean (*media_player_control_get_pmt_impl) (MediaPlayerControl *self,
+ guint *program_num, guint *pcr_pid, GPtrArray **stream_info);
+void media_player_control_implement_get_pmt (MediaPlayerControlClass *klass,
+ media_player_control_get_pmt_impl impl);
+
+typedef gboolean (*media_player_control_get_associated_data_channel_impl) (MediaPlayerControl *self, gchar **ip, gint *port);
+void media_player_control_implement_get_associated_data_channel (MediaPlayerControlClass *klass,
+ media_player_control_get_associated_data_channel_impl impl);
+
+
+/*virtual function wrappers*/
+gboolean media_player_control_set_uri (MediaPlayerControl *self, const gchar *in_uri);
+gboolean media_player_control_set_target (MediaPlayerControl *self, gint type, GHashTable *params);
+gboolean media_player_control_play (MediaPlayerControl *self);
+gboolean media_player_control_pause (MediaPlayerControl *self);
+gboolean media_player_control_stop (MediaPlayerControl *self);
+gboolean media_player_control_set_position (MediaPlayerControl *self, gint64 in_pos);
+gboolean media_player_control_get_position (MediaPlayerControl *self, gint64 *cur_time);
+gboolean media_player_control_set_playback_rate (MediaPlayerControl *self, gdouble in_rate);
+gboolean media_player_control_get_playback_rate (MediaPlayerControl *self, gdouble *out_rate);
+gboolean media_player_control_set_volume (MediaPlayerControl *self, gint in_volume);
+gboolean media_player_control_get_volume (MediaPlayerControl *self, gint *vol);
+gboolean media_player_control_set_window_id (MediaPlayerControl *self, gdouble in_win_id);
+gboolean media_player_control_set_video_size (MediaPlayerControl *self, guint in_x, guint in_y, guint in_w, guint in_h);
+gboolean media_player_control_get_video_size (MediaPlayerControl *self, guint *w, guint *h);
+gboolean media_player_control_get_buffered_bytes (MediaPlayerControl *self, gint64 *buffered_bytes);
+gboolean media_player_control_get_buffered_time (MediaPlayerControl *self, gint64 *buffered_time);
+gboolean media_player_control_get_media_size_time (MediaPlayerControl *self, gint64 *media_size_time);
+gboolean media_player_control_get_media_size_bytes (MediaPlayerControl *self, gint64 *media_size_bytes);
+gboolean media_player_control_has_audio (MediaPlayerControl *self, gboolean *hav_audio);
+gboolean media_player_control_has_video (MediaPlayerControl *self, gboolean *has_video);
+gboolean media_player_control_is_streaming (MediaPlayerControl *self, gboolean *is_streaming);
+gboolean media_player_control_is_seekable (MediaPlayerControl *self, gboolean *seekable);
+gboolean media_player_control_support_fullscreen (MediaPlayerControl *self, gboolean *support_fullscreen);
+gboolean media_player_control_get_player_state (MediaPlayerControl *self, gint *state);
+gboolean media_player_control_get_current_video (MediaPlayerControl *self, gint *cur_video);
+gboolean media_player_control_get_current_audio (MediaPlayerControl *self, gint *cur_audio);
+gboolean media_player_control_set_current_video (MediaPlayerControl *self, gint cur_video);
+gboolean media_player_control_set_current_audio (MediaPlayerControl *self, gint cur_audio);
+gboolean media_player_control_get_video_num (MediaPlayerControl *self, gint *video_num);
+gboolean media_player_control_get_audio_num (MediaPlayerControl *self, gint *audio_num);
+gboolean media_player_control_set_proxy (MediaPlayerControl *self, GHashTable *params);
+gboolean media_player_control_set_subtitle_uri (MediaPlayerControl *self, gchar *sub_uri);
+gboolean media_player_control_get_subtitle_num (MediaPlayerControl *self, gint *sub_num);
+gboolean media_player_control_get_current_subtitle (MediaPlayerControl *self, gint *cur_sub);
+gboolean media_player_control_set_current_subtitle (MediaPlayerControl *self, gint cur_sub);
+gboolean media_player_control_set_buffer_depth (MediaPlayerControl *self, gint format, gint64 buf_val);
+gboolean media_player_control_get_buffer_depth (MediaPlayerControl *self, gint format, gint64 *buf_val);
+gboolean media_player_control_set_mute (MediaPlayerControl *self, gint mute);
+gboolean media_player_control_is_mute (MediaPlayerControl *self, gint *mute);
+gboolean media_player_control_set_scale_mode (MediaPlayerControl *self, gint scale_mode);
+gboolean media_player_control_get_scale_mode (MediaPlayerControl *self, gint *scale_mode);
+gboolean media_player_control_suspend (MediaPlayerControl *self);
+gboolean media_player_control_restore (MediaPlayerControl *self);
+gboolean media_player_control_get_video_codec (MediaPlayerControl *self, gint channel, gchar **video_codec);
+gboolean media_player_control_get_audio_codec (MediaPlayerControl *self, gint channel, gchar **audio_codec);
+gboolean media_player_control_get_video_bitrate (MediaPlayerControl *self, gint channel, gint *bit_rate);
+gboolean media_player_control_get_audio_bitrate (MediaPlayerControl *self, gint channel, gint *bit_rate);
+gboolean media_player_control_get_encapsulation(MediaPlayerControl *self, gchar ** encapsulation);
+gboolean media_player_control_get_audio_samplerate(MediaPlayerControl *self, gint channel, gint * sample_rate);
+gboolean media_player_control_get_video_framerate(MediaPlayerControl *self, gint channel,
+ gint * frame_rate_num, gint * frame_rate_denom);
+gboolean media_player_control_get_video_resolution(MediaPlayerControl *self, gint channel,
+ gint * width, gint * height);
+gboolean media_player_control_get_video_aspect_ratio(MediaPlayerControl *self,
+ gint channel, gint * ratio_num, gint * ratio_denom);
+gboolean media_player_control_get_protocol_name(MediaPlayerControl *self, gchar ** prot_name);
+gboolean media_player_control_get_current_uri (MediaPlayerControl *self, gchar ** uri);
+gboolean media_player_control_get_title(MediaPlayerControl *self, gchar ** title);
+gboolean media_player_control_get_artist(MediaPlayerControl *self, gchar ** artist);
+gboolean media_player_control_record (MediaPlayerControl *self, gboolean to_record, gchar *location);
+gboolean media_player_control_get_pat (MediaPlayerControl *self, GPtrArray **pat);
+gboolean media_player_control_get_pmt (MediaPlayerControl *self,
+ guint *program_num, guint *pcr_pid, GPtrArray **stream_info);
+gboolean media_player_control_get_associated_data_channel (MediaPlayerControl *self, gchar **ip, gint *port);
+
+
+
+/*signal emitter*/
+void media_player_control_emit_initialized (gpointer instance);
+void media_player_control_emit_eof (gpointer instance);
+void media_player_control_emit_error (gpointer instance, guint error_num, gchar *error_des);
+void media_player_control_emit_seeked (gpointer instance);
+void media_player_control_emit_stopped (gpointer instance);
+void media_player_control_emit_request_window (gpointer instance);
+void media_player_control_emit_buffering (gpointer instance);
+void media_player_control_emit_buffered (gpointer instance);
+void media_player_control_emit_player_state_changed (gpointer instance, gint old_state, gint cur_state);
+void media_player_control_emit_target_ready(gpointer instance, GHashTable *infos);
+void media_player_control_emit_video_tag_changed (gpointer instance, gint channel);
+void media_player_control_emit_audio_tag_changed (gpointer instance, gint channel);
+void media_player_control_emit_text_tag_changed (gpointer instance, gint channel);
+void media_player_control_emit_metadata_changed(gpointer instance);
+void media_player_control_emit_suspended (gpointer instance);
+void media_player_control_emit_restored (gpointer instance);
+
+G_END_DECLS
+#endif
--- src/media-player-factory.c
+++ src/media-player-factory.c
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "umms-debug.h"
+#include "umms-common.h"
+#include "media-player-factory.h"
+#include "media-player-control.h"
+#include "engine-gst.h"
+#include "engine-generic.h"
+#include "dvb-player.h"
+
+
+G_DEFINE_TYPE (MediaPlayerFactory, media_player_factory, TYPE_MEDIA_PLAYER)
+#define PLAYER_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_MEDIA_PLAYER_FACTORY, MediaPlayerFactoryPrivate))
+
+#define GET_PRIVATE(o) ((MediaPlayerFactory *)o)->priv
+
+enum EngineType {
+ MEDIA_PLAYER_FACTORY_ENGINE_TYPE_INVALID,
+ MEDIA_PLAYER_FACTORY_ENGINE_TYPE_NORMAL,
+ MEDIA_PLAYER_FACTORY_ENGINE_TYPE_DVB,
+ N_MEDIA_PLAYER_FACTORY_ENGINE_TYPE
+};
+
+struct _MediaPlayerFactoryPrivate {
+ enum EngineType engine_type;
+ PlatformType platform_type;
+};
+
+//implement load_engine vmethod
+#define TV_PREFIX "dvb:"
+
+/*property for object manager*/
+enum PROPTYPE{
+ PROP_0,
+ PROP_PLATFORM,
+ PROP_LAST
+};
+
+/*
+ * fake engine
+ *
+ */
+MediaPlayerControl* engine_fake_new(void)
+{
+
+ UMMS_DEBUG("fake engine error, is not supportted\n");
+ return NULL;
+}
+
+/* [platform][engine]
+ *
+ * platform: 0-> CETV
+ * 1-> NETBOOK
+ *
+ * engine : 1-> Normal
+ * 2-> DVB
+ *
+ */
+
+MediaPlayerControl* (*engine_factory[PLATFORM_INVALID][N_MEDIA_PLAYER_FACTORY_ENGINE_TYPE])(void) =
+{
+/*00*/engine_fake_new,
+/*01: CETV-Normal*/ engine_gst_new,
+/*02: CETV-DVB*/dvb_player_new,
+/*10: */NULL,
+/*11: Netbook->Normal*/engine_generic_new,
+/*12: Netbook->DVB*/engine_fake_new
+};
+
+MediaPlayerControl *
+create_engine (gint engine_type, PlatformType platform)
+{
+ MediaPlayerControl *engine = NULL;
+ UMMS_DEBUG ("Trying to create engine type (%d) on platform (%d)", engine_type, platform);
+
+ g_return_val_if_fail((engine_type < N_MEDIA_PLAYER_FACTORY_ENGINE_TYPE), NULL);
+ g_return_val_if_fail((platform < PLATFORM_INVALID), NULL);
+ g_return_val_if_fail(( engine_factory[platform][engine_type] != NULL), NULL);
+
+ engine = engine_factory[platform][engine_type]();
+
+ g_return_val_if_fail((engine != NULL), NULL);
+
+#if 0
+ g_print("addr of engien: %x\n", engine_factory[platform][engine_type]);
+ if (engine_type == MEDIA_PLAYER_FACTORY_ENGINE_TYPE_DVB)
+ engine = dvb_player_new();
+ else if (engine_type == MEDIA_PLAYER_FACTORY_ENGINE_TYPE_NORMAL)
+ engine = engine_gst_new();
+ else {
+ UMMS_DEBUG ("Unknown engine type (%d)", engine_type);
+ }
+#endif
+
+ return engine;
+}
+
+/* extend API to support multi-platform and multi-engine
+ *
+ */
+
+static gboolean media_player_factory_load_engine (MediaPlayer *player, const char *uri, gboolean *new_engine)
+{
+ gboolean ret;
+ gboolean updated;
+ gint type;
+ MediaPlayerFactoryPrivate *priv;
+
+ g_return_val_if_fail (IS_MEDIA_PLAYER_FACTORY(player), FALSE);
+ g_return_val_if_fail (uri, FALSE);
+
+ priv = GET_PRIVATE(player);
+ type = (g_str_has_prefix (uri, TV_PREFIX)) ? (MEDIA_PLAYER_FACTORY_ENGINE_TYPE_DVB): (MEDIA_PLAYER_FACTORY_ENGINE_TYPE_NORMAL);
+
+ if (!player->player_control) {
+ UMMS_DEBUG ("We have no engine loaded, to load one(type = %d)", type);
+ player->player_control = create_engine (type,priv->platform_type);
+ updated = TRUE;
+ } else {
+ if (priv->engine_type == type) {
+ UMMS_DEBUG ("Already loaded engine(type = %d), no need to load again", type);
+ updated = FALSE;
+ } else {
+ UMMS_DEBUG ("Changing engine from type(%d) to type(%d)", priv->engine_type, type);
+ g_object_unref (player->player_control);
+ player->player_control = create_engine (type, priv->platform_type);
+ updated = TRUE;
+ }
+ }
+
+ if (player->player_control) {
+ priv->engine_type = type;
+ *new_engine = updated;
+ ret = TRUE;
+ } else {
+ UMMS_DEBUG ("Loading engine failed");
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+
+static void
+media_player_factory_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MediaPlayerFactoryPrivate *priv = GET_PRIVATE (object);
+ switch (property_id) {
+ case PROP_PLATFORM:
+ g_value_set_int(value, priv->platform_type);
+ UMMS_DEBUG("platform type: %d", priv->platform_type);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+media_player_factory_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MediaPlayerFactoryPrivate *priv = GET_PRIVATE (object);
+ gint tmp;
+ switch (property_id) {
+ case PROP_PLATFORM:
+ tmp = g_value_get_int(value);
+ priv->platform_type = tmp;
+ UMMS_DEBUG("platform type: %d", tmp);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+media_player_factory_dispose (GObject *object)
+{
+ //MediaPlayerFactoryPrivate *priv = GET_PRIVATE (object);
+
+ G_OBJECT_CLASS (media_player_factory_parent_class)->dispose (object);
+}
+
+static void
+media_player_factory_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (media_player_factory_parent_class)->finalize (object);
+}
+
+static void
+media_player_factory_class_init (MediaPlayerFactoryClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MediaPlayerClass *p_class = MEDIA_PLAYER_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (MediaPlayerFactoryPrivate));
+
+ object_class->get_property = media_player_factory_get_property;
+ object_class->set_property = media_player_factory_set_property;
+ object_class->dispose = media_player_factory_dispose;
+ object_class->finalize = media_player_factory_finalize;
+
+ p_class->load_engine = media_player_factory_load_engine;
+
+ g_object_class_install_property (object_class, PROP_PLATFORM,
+ g_param_spec_int ("platform", "platform type", "indication for platform type: Tv, netbook, etc",0,PLATFORM_INVALID,
+ CETV, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+}
+
+static void
+media_player_factory_init (MediaPlayerFactory *self)
+{
+ MediaPlayerFactoryPrivate *priv;
+
+ self->priv = PLAYER_PRIVATE (self);
+ priv = self->priv;
+
+ priv->engine_type = MEDIA_PLAYER_FACTORY_ENGINE_TYPE_INVALID;
+}
+
+MediaPlayerFactory *
+media_player_factory_new (void)
+{
+ return g_object_new (TYPE_MEDIA_PLAYER_FACTORY, NULL);
+}
+
+
+
--- src/media-player-factory.h
+++ src/media-player-factory.h
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _MEDIA_PLAYER_FACTORY_H
+#define _MEDIA_PLAYER_FACTORY_H
+
+#include <glib-object.h>
+#include <media-player.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_MEDIA_PLAYER_FACTORY media_player_factory_get_type()
+
+#define MEDIA_PLAYER_FACTORY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ TYPE_MEDIA_PLAYER_FACTORY, MediaPlayerFactory))
+
+#define MEDIA_PLAYER_FACTORY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ TYPE_MEDIA_PLAYER_FACTORY, MediaPlayerFactoryClass))
+
+#define IS_MEDIA_PLAYER_FACTORY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ TYPE_MEDIA_PLAYER_FACTORY))
+
+#define IS_MEDIA_PLAYER_FACTORY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ TYPE_MEDIA_PLAYER_FACTORY))
+
+#define MEDIA_PLAYER_FACTORY_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ TYPE_MEDIA_PLAYER_FACTORY, MediaPlayerFactoryClass))
+
+typedef struct _MediaPlayerFactory MediaPlayerFactory;
+typedef struct _MediaPlayerFactoryClass MediaPlayerFactoryClass;
+typedef struct _MediaPlayerFactoryPrivate MediaPlayerFactoryPrivate;
+
+struct _MediaPlayerFactory
+{
+ MediaPlayer parent;
+
+ MediaPlayerFactoryPrivate *priv;
+};
+
+
+struct _MediaPlayerFactoryClass
+{
+ MediaPlayerClass parent_class;
+
+};
+
+GType media_player_factory_get_type (void) G_GNUC_CONST;
+
+MediaPlayerFactory *media_player_factory_new (void);
+
+G_END_DECLS
+
+#endif /* _MEDIA_PLAYER_FACTORY_H */
--- src/media-player.c
+++ src/media-player.c
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <gst/gst.h>
+#include <gst/interfaces/xoverlay.h>
+#include <dbus/dbus-glib.h>
+
+#include "umms-debug.h"
+#include "umms-common.h"
+#include "umms-error.h"
+#include "umms-marshals.h"
+#include "media-player.h"
+#include "media-player-control.h"
+
+G_DEFINE_TYPE (MediaPlayer, media_player, G_TYPE_OBJECT)
+
+#define PLAYER_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_MEDIA_PLAYER, MediaPlayerPrivate))
+
+#define GET_PRIVATE(o) ((MediaPlayer *)o)->priv
+
+#define GET_CONTROL_IFACE(media_player) (((MediaPlayer *)(media_player))->player_control)
+
+#define CHECK_ENGINE(engine, ret_val, e) \
+ do {\
+ if (engine == NULL) {\
+ g_return_val_if_fail (e == NULL || *e == NULL, ret_val);\
+ if (e != NULL) {\
+ g_set_error (e, UMMS_ENGINE_ERROR, UMMS_ENGINE_ERROR_NOT_LOADED, \
+ "Pipeline engine not loaded, possible reason is SetUri failed or not be invoked.");\
+ } \
+ return ret_val;\
+ }\
+ }while(0)
+
+#define DEFAULT_SCALE_MODE ScaleModeKeepAspectRatio
+#define DEFAULT_VOLUME 50
+#define DEFAULT_MUTE FALSE
+#define DEFAULT_X 0
+#define DEFAULT_Y 0
+#define DEFAULT_WIDTH 720
+#define DEFAULT_HIGHT 576
+
+
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_ATTENDED,
+ PROP_LAST
+};
+
+enum {
+ SIGNAL_MEDIA_PLAYER_Initialized,
+ SIGNAL_MEDIA_PLAYER_Eof,
+ SIGNAL_MEDIA_PLAYER_Error,
+ SIGNAL_MEDIA_PLAYER_Buffering,
+ SIGNAL_MEDIA_PLAYER_Buffered,
+ SIGNAL_MEDIA_PLAYER_RequestWindow,
+ SIGNAL_MEDIA_PLAYER_Seeked,
+ SIGNAL_MEDIA_PLAYER_Stopped,
+ SIGNAL_MEDIA_PLAYER_PlayerStateChanged,
+ SIGNAL_MEDIA_PLAYER_NeedReply,
+ SIGNAL_MEDIA_PLAYER_ClientNoReply,
+ SIGNAL_MEDIA_PLAYER_TargetReady,
+ SIGNAL_MEDIA_PLAYER_Suspended,
+ SIGNAL_MEDIA_PLAYER_Restored,
+ SIGNAL_MEDIA_PLAYER_NoResource,
+ SIGNAL_MEDIA_PLAYER_VideoTagChanged,
+ SIGNAL_MEDIA_PLAYER_AudioTagChanged,
+ SIGNAL_MEDIA_PLAYER_TextTagChanged,
+ SIGNAL_MEDIA_PLAYER_MetadataChanged,
+ N_MEDIA_PLAYER_SIGNALS
+};
+
+static guint media_player_signals[N_MEDIA_PLAYER_SIGNALS] = {0};
+
+struct _MediaPlayerPrivate {
+ gchar *name;
+ gboolean attended;
+
+ /*Parameters need to be cached due to the unavailable of underlying player.*/
+ gchar *uri;
+ gchar *sub_uri;
+
+ gint volume;
+ gint mute;
+ gint scale_mode;
+ gint x;
+ gint y;
+ guint w;
+ guint h;
+ gint target_type;
+ GHashTable *target_params;
+ GHashTable *http_proxy_params;
+
+ //For client existence checking.
+ guint no_reply_time;
+ guint timeout_id;
+
+ //Media player "snapshot", for suspend/restore operation.
+ gint64 position;
+
+ };
+
+static void
+connect_signals(MediaPlayer *player, MediaPlayerControl *control);
+
+static void
+request_window_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_RequestWindow], 0);
+
+}
+
+static void
+eof_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Eof], 0);
+}
+static void
+error_cb (MediaPlayerControl *iface, guint error_num, gchar *error_des, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Error], 0, error_num, error_des);
+}
+
+static void
+buffering_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Buffering], 0);
+}
+
+static void
+buffered_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Buffered], 0);
+}
+
+static void
+player_state_changed_cb (MediaPlayerControl *iface, gint old_state, gint new_state, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_PlayerStateChanged], 0, old_state, new_state);
+}
+
+static void
+target_ready_cb (MediaPlayerControl *iface, GHashTable *infos, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_TargetReady], 0, infos);
+}
+
+static void
+seeked_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Seeked], 0);
+}
+static void
+stopped_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Stopped], 0);
+}
+
+static void
+suspended_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Suspended], 0);
+}
+
+static void
+restored_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Restored], 0);
+}
+
+static void
+video_tag_changed_cb (MediaPlayerControl *iface, gint channel, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_VideoTagChanged], 0, channel);
+}
+
+static void
+audio_tag_changed_cb (MediaPlayerControl *iface, gint channel, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_AudioTagChanged], 0, channel);
+}
+
+static void
+text_tag_changed_cb (MediaPlayerControl *iface, gint channel, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_TextTagChanged], 0, channel);
+}
+
+static void
+metadata_changed_cb (MediaPlayerControl *iface, MediaPlayer *player)
+{
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_MetadataChanged], 0);
+}
+
+static gboolean
+client_existence_check (MediaPlayer *player)
+{
+ gboolean ret = TRUE;
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+#define CHECK_INTERVAL (500)
+#define CLI_REPLY_TIMEOUT (2500)
+
+ if (priv->no_reply_time > CLI_REPLY_TIMEOUT) {
+ UMMS_DEBUG ("Client didn't response for '%u' ms, stop this AV execution", priv->no_reply_time);
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_ClientNoReply], 0);
+ ret = FALSE;
+ } else {
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_NeedReply], 0);
+ priv->no_reply_time += CHECK_INTERVAL;
+ }
+ return ret;
+}
+
+gboolean
+media_player_reply (MediaPlayer *player, GError **err)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+ priv->no_reply_time = 0;
+
+ return TRUE;
+}
+
+/* Create inner player engine which can handle this uri, and set all the cached properties*/
+gboolean media_player_load_engine (MediaPlayer *player, const gchar *uri, gboolean *new_engine)
+{
+ MediaPlayerClass *kclass = MEDIA_PLAYER_GET_CLASS (player);
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ if (!kclass->load_engine) {
+ UMMS_DEBUG ("virtual method \"load_engine\" not implemented");
+ return FALSE;
+ }
+
+ if (!kclass->load_engine (player, uri, new_engine)) {
+ UMMS_DEBUG ("loading pipeline engine failed");
+ return FALSE;
+ }
+
+ if (*new_engine) {
+ connect_signals (player, player->player_control);
+ }
+
+ /* Set all the cached property. */
+ media_player_control_set_uri (player->player_control, priv->uri);
+ media_player_control_set_volume (player->player_control, priv->volume);
+ media_player_control_set_mute (player->player_control, priv->mute);
+ media_player_control_set_scale_mode (player->player_control, priv->scale_mode);
+ if (priv->http_proxy_params)
+ media_player_control_set_proxy (player->player_control, priv->http_proxy_params);
+ if (priv->target_params)
+ media_player_control_set_target (player->player_control, priv->target_type, priv->target_params);
+ if (priv->sub_uri)
+ media_player_control_set_subtitle_uri (GET_CONTROL_IFACE (player), priv->sub_uri);
+
+ UMMS_DEBUG ("new: %d", *new_engine);
+ g_signal_emit (player, media_player_signals[SIGNAL_MEDIA_PLAYER_Initialized], 0);
+ return TRUE;
+}
+
+gboolean
+media_player_set_uri (MediaPlayer *player,
+ const gchar *uri,
+ GError **err)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ if (!uri || uri[0] == '\0') {
+ UMMS_DEBUG ("Invalid URI");
+ g_set_error (err, UMMS_GENERIC_ERROR, UMMS_GENERIC_ERROR_INVALID_PARAM, "Invalid URI");
+ return FALSE;
+ }
+
+ if (priv->uri) {
+ media_player_stop (player, NULL);
+ g_free (priv->uri);
+ }
+
+ priv->uri = g_strdup (uri);
+ UMMS_DEBUG ("URI: %s", uri);
+ return TRUE;
+}
+
+//For convenience's sake, we don't cache the target info if player backend is not ready.
+gboolean
+media_player_set_target (MediaPlayer *player, gint type, GHashTable *params,
+ GError **err)
+{
+ gboolean ret = TRUE;
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ if (player->player_control) {
+ ret = media_player_control_set_target (GET_CONTROL_IFACE (player), type, params);
+ } else {
+ priv->target_type = type;
+ if (priv->target_params)
+ g_hash_table_unref (priv->target_params);
+ priv->target_params = g_hash_table_ref (params);
+ }
+
+ return ret;
+}
+
+gboolean media_player_activate (MediaPlayer *player, PlayerState state)
+{
+
+ gboolean ret = TRUE;
+ gboolean new_engine = FALSE;
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ if (!priv->uri) {
+ UMMS_DEBUG ("No URI specified");
+ return FALSE;
+ }
+
+ if (!player->player_control) {
+ if (!media_player_load_engine (player, priv->uri, &new_engine)) {
+ return FALSE;
+ }
+ }
+
+ switch (state) {
+ case PlayerStatePaused:
+ ret = media_player_control_pause (player->player_control);
+ break;
+ case PlayerStatePlaying:
+ ret = media_player_control_play (player->player_control);
+ break;
+ default:
+ UMMS_DEBUG ("Invalid target state: %d", state);
+ ret = FALSE;
+ break;
+ }
+
+ UMMS_DEBUG ("setting engine to state: %d ", state);
+ return ret;
+}
+
+gboolean
+media_player_play (MediaPlayer *player,
+ GError **err)
+{
+ return media_player_activate (player, PlayerStatePlaying);
+}
+
+gboolean
+media_player_pause(MediaPlayer *player,
+ GError **err)
+{
+ return media_player_activate (player, PlayerStatePaused);
+}
+
+gboolean
+media_player_stop (MediaPlayer *player,
+ GError **err)
+{
+ if (player->player_control) {
+ media_player_control_stop (player->player_control);
+ g_object_unref (player->player_control);
+ player->player_control = NULL;
+ }
+ return TRUE;
+}
+
+gboolean
+media_player_set_window_id (MediaPlayer *player,
+ gdouble window_id,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_set_window_id (GET_CONTROL_IFACE (player), window_id);
+ return TRUE;
+}
+
+gboolean
+media_player_set_video_size(MediaPlayer *player,
+ guint in_x,
+ guint in_y,
+ guint in_w,
+ guint in_h,
+ GError **err)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+ MediaPlayerControl *player_control = GET_CONTROL_IFACE (player);
+
+ UMMS_DEBUG ("rectangle=\"%u,%u,%u,%u\"", in_x, in_y, in_w, in_h );
+
+ if (player_control) {
+ media_player_control_set_video_size (GET_CONTROL_IFACE (player), in_x, in_y, in_w, in_h);
+ } else {
+ UMMS_DEBUG ("Cache the video size parameters since pipe engine has not been loaded");
+ priv->x = in_x;
+ priv->y = in_y;
+ priv->w = in_w;
+ priv->h = in_h;
+ }
+ return TRUE;
+}
+
+
+gboolean
+media_player_get_video_size(MediaPlayer *player, guint *w, guint *h,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_size (GET_CONTROL_IFACE (player), w, h);
+ return TRUE;
+}
+
+
+gboolean
+media_player_is_seekable(MediaPlayer *player, gboolean *is_seekable, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_is_seekable (GET_CONTROL_IFACE (player), is_seekable);
+ return TRUE;
+}
+
+gboolean
+media_player_set_position(MediaPlayer *player,
+ gint64 in_pos,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_set_position (GET_CONTROL_IFACE (player), in_pos);
+ return TRUE;
+}
+
+gboolean
+media_player_get_position(MediaPlayer *player, gint64 *pos,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ return media_player_control_get_position (GET_CONTROL_IFACE (player), pos);
+}
+
+gboolean
+media_player_set_playback_rate (MediaPlayer *player,
+ gdouble in_rate,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ return media_player_control_set_playback_rate (GET_CONTROL_IFACE (player), in_rate);
+}
+
+gboolean
+media_player_get_playback_rate (MediaPlayer *player,
+ gdouble *rate,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_playback_rate (GET_CONTROL_IFACE (player), rate);
+ UMMS_DEBUG ("current rate = %f", *rate);
+ return TRUE;
+}
+
+gboolean
+media_player_set_volume (MediaPlayer *player,
+ gint volume,
+ GError **err)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+ MediaPlayerControl *player_control = GET_CONTROL_IFACE (player);
+
+ UMMS_DEBUG ("set volume to %d", volume);
+
+ if (player_control) {
+ media_player_control_set_volume (player_control, volume);
+ } else {
+ UMMS_DEBUG ("MediaPlayer not ready, cache the volume.");
+ priv->volume = volume;
+ }
+
+ return TRUE;
+}
+
+gboolean
+media_player_get_volume (MediaPlayer *player,
+ gint *vol,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_volume (GET_CONTROL_IFACE (player), vol);
+ UMMS_DEBUG ("current volume= %d", *vol);
+ return TRUE;
+}
+
+gboolean
+media_player_get_media_size_time (MediaPlayer *player,
+ gint64 *duration,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_media_size_time(GET_CONTROL_IFACE (player), duration);
+ UMMS_DEBUG ("duration = %lld", *duration);
+ return TRUE;
+}
+
+gboolean
+media_player_get_media_size_bytes (MediaPlayer *player,
+ gint64 *size_bytes,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_media_size_bytes (GET_CONTROL_IFACE (player), size_bytes);
+ UMMS_DEBUG ("media size = %lld", *size_bytes);
+ return TRUE;
+}
+
+gboolean
+media_player_has_video (MediaPlayer *player,
+ gboolean *has_video,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_has_video (GET_CONTROL_IFACE (player), has_video);
+ UMMS_DEBUG ("has_video = %d", *has_video);
+ return TRUE;
+}
+
+gboolean
+media_player_has_audio (MediaPlayer *player,
+ gboolean *has_audio,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_has_audio (GET_CONTROL_IFACE (player), has_audio);
+ UMMS_DEBUG ("has_audio= %d", *has_audio);
+ return TRUE;
+}
+
+gboolean
+media_player_support_fullscreen (MediaPlayer *player,
+ gboolean *support_fullscreen,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_support_fullscreen (GET_CONTROL_IFACE (player), support_fullscreen);
+ UMMS_DEBUG ("support_fullscreen = %d", *support_fullscreen);
+ return TRUE;
+}
+
+gboolean
+media_player_is_streaming (MediaPlayer *player,
+ gboolean *is_streaming,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_is_streaming (GET_CONTROL_IFACE (player), is_streaming);
+ UMMS_DEBUG ("is_streaming = %d", *is_streaming);
+ return TRUE;
+}
+
+gboolean
+media_player_get_player_state(MediaPlayer *player, gint *state, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_player_state (GET_CONTROL_IFACE (player), state);
+ UMMS_DEBUG ("player state = %d", *state);
+ return TRUE;
+}
+
+gboolean
+media_player_get_buffered_bytes (MediaPlayer *player, gint64 *bytes, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_buffered_bytes (GET_CONTROL_IFACE (player), bytes);
+ UMMS_DEBUG ("buffered bytes = %lld", *bytes);
+ return TRUE;
+}
+
+gboolean
+media_player_get_buffered_time (MediaPlayer *player, gint64 *size_time, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_buffered_time (GET_CONTROL_IFACE (player), size_time);
+ UMMS_DEBUG ("buffered time = %lld", *size_time);
+ return TRUE;
+}
+
+gboolean
+media_player_get_current_video (MediaPlayer *player, gint *cur_video, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_current_video(GET_CONTROL_IFACE (player), cur_video);
+ UMMS_DEBUG ("get the current video is %d", *cur_video);
+ return TRUE;
+}
+
+gboolean
+media_player_get_current_audio (MediaPlayer *player, gint *cur_audio, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_current_audio(GET_CONTROL_IFACE (player), cur_audio);
+ UMMS_DEBUG ("get the current audio is %d", *cur_audio);
+ return TRUE;
+}
+
+gboolean
+media_player_set_current_video (MediaPlayer *player, gint cur_video, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_set_current_video(GET_CONTROL_IFACE (player), cur_video);
+ UMMS_DEBUG ("set the current video to %d", cur_video);
+ return TRUE;
+}
+
+gboolean
+media_player_set_current_audio (MediaPlayer *player, gint cur_audio, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_set_current_audio(GET_CONTROL_IFACE (player), cur_audio);
+ UMMS_DEBUG ("set the current audio to %d", cur_audio);
+ return TRUE;
+}
+
+gboolean
+media_player_get_video_num (MediaPlayer *player, gint *video_num, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_num(GET_CONTROL_IFACE (player), video_num);
+ UMMS_DEBUG ("the total video number is %d", *video_num);
+ return TRUE;
+}
+
+gboolean
+media_player_get_audio_num (MediaPlayer *player, gint *audio_num, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_audio_num(GET_CONTROL_IFACE (player), audio_num);
+ UMMS_DEBUG ("the total audio number is %d", *audio_num);
+ return TRUE;
+}
+
+gboolean
+media_player_set_proxy (MediaPlayer *player,
+ GHashTable *params,
+ GError **err)
+{
+ gboolean ret = TRUE;
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ if (player->player_control) {
+ media_player_control_set_proxy (GET_CONTROL_IFACE (player), params);
+ } else {
+ if (priv->http_proxy_params)
+ g_hash_table_unref (priv->http_proxy_params);
+ priv->http_proxy_params = g_hash_table_ref (params);
+ }
+
+ return ret;
+}
+
+//Stop player, so that all resources occupied will be released.
+gboolean
+media_player_suspend(MediaPlayer *player,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_suspend (GET_CONTROL_IFACE (player));
+ return TRUE;
+}
+
+gboolean
+media_player_set_subtitle_uri (MediaPlayer *player, gchar *sub_uri, GError **err)
+{
+ gboolean ret = TRUE;
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ UMMS_DEBUG ("Want to set the suburi to %s", sub_uri);
+ if (player->player_control) {
+ ret = media_player_control_set_subtitle_uri (GET_CONTROL_IFACE (player), sub_uri);
+ } else {
+ RESET_STR (priv->sub_uri);
+ UMMS_DEBUG ("cache the suburi %s", sub_uri);
+ priv->sub_uri = g_strdup (sub_uri);
+ }
+
+ return ret;
+}
+
+gboolean
+media_player_restore (MediaPlayer *player,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_restore (GET_CONTROL_IFACE (player));
+ return TRUE;
+}
+
+gboolean
+media_player_get_subtitle_num (MediaPlayer *player, gint *sub_num, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_subtitle_num(GET_CONTROL_IFACE (player), sub_num);
+ UMMS_DEBUG ("the total subtitle number is %d", *sub_num);
+ return TRUE;
+}
+
+gboolean
+media_player_get_current_subtitle (MediaPlayer *player, gint *cur_sub, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_current_subtitle(GET_CONTROL_IFACE (player), cur_sub);
+ UMMS_DEBUG ("get the current subtitle is %d", *cur_sub);
+ return TRUE;
+}
+
+gboolean
+media_player_set_current_subtitle (MediaPlayer *player, gint cur_sub, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_set_current_subtitle(GET_CONTROL_IFACE (player), cur_sub);
+ UMMS_DEBUG ("set the current subtitle to %d", cur_sub);
+ return TRUE;
+}
+
+gboolean
+media_player_set_buffer_depth (MediaPlayer *player, gint format, gint64 buf_val, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_set_buffer_depth(GET_CONTROL_IFACE (player), format, buf_val);
+ UMMS_DEBUG ("set the format to %d, buffer to %lld", format, buf_val);
+ return TRUE;
+}
+
+gboolean
+media_player_get_buffer_depth (MediaPlayer *player, gint format, gint64 *buf_val, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_buffer_depth(GET_CONTROL_IFACE (player), format, buf_val);
+ UMMS_DEBUG ("set the format to %d, buffer to %lld", format, *buf_val);
+ return TRUE;
+}
+
+gboolean
+media_player_set_mute (MediaPlayer *player, gint mute, GError **err)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+ MediaPlayerControl *player_control = GET_CONTROL_IFACE (player);
+
+ UMMS_DEBUG ("will set mute to %d", mute);
+
+ if (player_control) {
+ media_player_control_set_mute(GET_CONTROL_IFACE (player), mute);
+ } else {
+ UMMS_DEBUG ("MediaPlayer not ready, cache the mute.");
+ priv->mute = mute;
+ }
+ return TRUE;
+}
+
+gboolean
+media_player_is_mute (MediaPlayer *player, gint *mute, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+
+ media_player_control_is_mute (GET_CONTROL_IFACE (player), mute);
+ UMMS_DEBUG ("current mute is %d", *mute);
+ return TRUE;
+}
+
+gboolean
+media_player_set_scale_mode (MediaPlayer *player, gint scale_mode, GError **err)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+ MediaPlayerControl *player_control = GET_CONTROL_IFACE (player);
+
+ UMMS_DEBUG ("will set scale mode to %d", scale_mode);
+
+ if (player_control) {
+ media_player_control_set_scale_mode (GET_CONTROL_IFACE (player), scale_mode);
+ } else {
+ UMMS_DEBUG ("MediaPlayer not ready, cache the scale mode.");
+ priv->scale_mode = scale_mode;
+ }
+ return TRUE;
+}
+
+gboolean
+media_player_get_scale_mode (MediaPlayer *player, gint *scale_mode, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_scale_mode(GET_CONTROL_IFACE (player), scale_mode);
+ UMMS_DEBUG ("get the current scale mode is %d", *scale_mode);
+ return TRUE;
+}
+
+gboolean
+media_player_get_video_codec (MediaPlayer *player, gint channel, gchar **video_codec, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_codec(GET_CONTROL_IFACE (player), channel, video_codec);
+ UMMS_DEBUG ("We get the video codec: %s", *video_codec);
+ return TRUE;
+}
+
+gboolean
+media_player_get_audio_codec (MediaPlayer *player, gint channel, gchar **audio_codec, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_audio_codec(GET_CONTROL_IFACE (player), channel, audio_codec);
+ UMMS_DEBUG ("We get the audio codec: %s", *audio_codec);
+ return TRUE;
+}
+
+gboolean
+media_player_get_video_bitrate (MediaPlayer *player, gint channel, gint *bit_rate, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_bitrate(GET_CONTROL_IFACE (player), channel, bit_rate);
+ UMMS_DEBUG ("We get the video bitrate: %d", *bit_rate);
+ return TRUE;
+}
+
+gboolean
+media_player_get_audio_bitrate (MediaPlayer *player, gint channel, gint *bit_rate, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_audio_bitrate(GET_CONTROL_IFACE (player), channel, bit_rate);
+ UMMS_DEBUG ("We get the audio:%d bitrate: %d", channel, *bit_rate);
+ return TRUE;
+}
+
+gboolean
+media_player_get_encapsulation (MediaPlayer *player, gchar **encapsulation, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_encapsulation(GET_CONTROL_IFACE (player), encapsulation);
+ UMMS_DEBUG ("We get the encapsulation: %s", *encapsulation);
+ return TRUE;
+}
+
+gboolean
+media_player_get_audio_samplerate (MediaPlayer *player, gint channel, gint *sample_rate, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_audio_samplerate(GET_CONTROL_IFACE (player), channel, sample_rate);
+ UMMS_DEBUG ("We get the sample rate: %d", *sample_rate);
+ return TRUE;
+}
+
+gboolean
+media_player_get_video_framerate (MediaPlayer *player, gint channel,
+ gint * frame_rate_num, gint * frame_rate_denom, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_framerate(GET_CONTROL_IFACE (player),
+ channel, frame_rate_num, frame_rate_denom);
+ UMMS_DEBUG ("We get the sample rate: %f", *(gdouble*)frame_rate_num / *(gdouble*)frame_rate_denom);
+ return TRUE;
+}
+
+gboolean
+media_player_get_video_resolution (MediaPlayer *player, gint channel,
+ gint * width, gint * height, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_resolution(GET_CONTROL_IFACE (player), channel, width, height);
+ UMMS_DEBUG ("We get the video resolution: %d X %d", *width, *height);
+ return TRUE;
+}
+
+gboolean
+media_player_get_video_aspect_ratio (MediaPlayer *player, gint channel,
+ gint * ratio_num, gint * ratio_denom, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_video_aspect_ratio(GET_CONTROL_IFACE (player),
+ channel, ratio_num, ratio_denom);
+ UMMS_DEBUG ("We get the video aspect ratio: %d : %d", *ratio_num, *ratio_denom);
+ return TRUE;
+}
+
+gboolean
+media_player_get_protocol_name (MediaPlayer *player, gchar **protocol_name, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_protocol_name(GET_CONTROL_IFACE (player), protocol_name);
+ UMMS_DEBUG ("We get the protocol name: %s", *protocol_name);
+ return TRUE;
+}
+
+gboolean
+media_player_get_current_uri (MediaPlayer *player, gchar **uri, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_current_uri(GET_CONTROL_IFACE (player), uri);
+ UMMS_DEBUG ("We get the uri: %s", *uri);
+ return TRUE;
+}
+
+gboolean
+media_player_get_title (MediaPlayer *player, gchar **title, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_title(GET_CONTROL_IFACE (player), title);
+ return TRUE;
+}
+
+gboolean
+media_player_get_artist (MediaPlayer *player, gchar **artist, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_artist(GET_CONTROL_IFACE (player), artist);
+ return TRUE;
+}
+static void
+media_player_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (object);
+
+ switch (property_id) {
+ case PROP_NAME:
+ g_value_set_string (value, priv->name);
+ break;
+ case PROP_ATTENDED:
+ g_value_set_boolean (value, priv->attended);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+media_player_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (object);
+ const gchar *tmp;
+
+ switch (property_id) {
+ case PROP_NAME:
+ tmp = g_value_get_string (value);
+ UMMS_DEBUG ("name= %s'", tmp);
+ priv->name = g_value_dup_string (value);
+ break;
+ case PROP_ATTENDED:
+ priv->attended = g_value_get_boolean (value);
+ UMMS_DEBUG ("attended=%d", priv->attended);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+media_player_dispose (GObject *object)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (object);
+ MediaPlayerControl *player_control = GET_CONTROL_IFACE (object);
+
+ if (player_control) {
+ media_player_control_stop (player_control);
+ g_object_unref (player_control);
+ }
+
+ if (priv->http_proxy_params)
+ g_hash_table_unref (priv->http_proxy_params);
+
+ if (priv->target_params)
+ g_hash_table_unref (priv->target_params);
+
+ RESET_STR (priv->uri);
+ RESET_STR (priv->sub_uri);
+ RESET_STR (priv->name);
+
+ if (priv->attended && priv->timeout_id > 0) {
+ g_source_remove (priv->timeout_id);
+ }
+
+ G_OBJECT_CLASS (media_player_parent_class)->dispose (object);
+}
+
+static void
+media_player_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (media_player_parent_class)->finalize (object);
+}
+
+static void
+media_player_constructed (GObject *player)
+{
+ MediaPlayerPrivate *priv;
+
+ priv = GET_PRIVATE (player);
+
+ UMMS_DEBUG ("enter");
+ //For client existence checking
+ if (priv->attended) {
+ UMMS_DEBUG ("Attended execution, add client checking");
+ priv->timeout_id = g_timeout_add (CHECK_INTERVAL, (GSourceFunc)client_existence_check, player);
+ }
+}
+
+static void
+media_player_class_init (MediaPlayerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (MediaPlayerPrivate));
+
+ object_class->get_property = media_player_get_property;
+ object_class->set_property = media_player_set_property;
+ object_class->constructed = media_player_constructed;
+ object_class->dispose = media_player_dispose;
+ object_class->finalize = media_player_finalize;
+
+ g_object_class_install_property (object_class, PROP_NAME,
+ g_param_spec_string ("name", "Name", "Name of the mediaplayer",
+ NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class, PROP_ATTENDED,
+ g_param_spec_boolean ("attended", "Attended", "Flag to indicate whether this execution is attended",
+ TRUE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Initialized] =
+ g_signal_new ("initialized",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Eof] =
+ g_signal_new ("eof",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Error] =
+ g_signal_new ("error",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ umms_marshal_VOID__UINT_STRING,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_UINT,
+ G_TYPE_STRING);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Buffering] =
+ g_signal_new ("buffering",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Buffered] =
+ g_signal_new ("buffered",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_RequestWindow] =
+ g_signal_new ("request-window",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Seeked] =
+ g_signal_new ("seeked",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Stopped] =
+ g_signal_new ("stopped",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_PlayerStateChanged] =
+ g_signal_new ("player-state-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ umms_marshal_VOID__INT_INT,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_INT,
+ G_TYPE_INT);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_NeedReply] =
+ g_signal_new ("need-reply",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_ClientNoReply] =
+ g_signal_new ("client-no-reply",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_TargetReady] =
+ g_signal_new ("target-ready",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED,
+ G_TYPE_NONE,
+ 1, dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE));
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Suspended] =
+ g_signal_new ("suspended",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_Restored] =
+ g_signal_new ("restored",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_NoResource] =
+ g_signal_new ("no-resource",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_VideoTagChanged] =
+ g_signal_new ("video-tag-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_AudioTagChanged] =
+ g_signal_new ("audio-tag-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_TextTagChanged] =
+ g_signal_new ("text-tag-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+ media_player_signals[SIGNAL_MEDIA_PLAYER_MetadataChanged] =
+ g_signal_new ("metadata-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+}
+
+static void
+media_player_set_default_params (MediaPlayer *player)
+{
+ MediaPlayerPrivate *priv = GET_PRIVATE (player);
+
+ priv->scale_mode = DEFAULT_SCALE_MODE;
+ priv->volume = DEFAULT_VOLUME;
+ priv->mute = DEFAULT_MUTE;
+ priv->x = DEFAULT_X;
+ priv->y = DEFAULT_Y;
+ priv->w = DEFAULT_WIDTH;
+ priv->h = DEFAULT_HIGHT;
+}
+
+static void
+media_player_init (MediaPlayer *player)
+{
+ MediaPlayerPrivate *priv;
+ priv = player->priv = PLAYER_PRIVATE (player);
+
+ player->player_control = NULL;
+ priv->uri = NULL;
+ priv->sub_uri = NULL;
+ priv->target_params = NULL;
+ media_player_set_default_params (player);
+}
+
+MediaPlayer *
+media_player_new (void)
+{
+ return g_object_new (TYPE_MEDIA_PLAYER, NULL);
+}
+
+static void
+connect_signals(MediaPlayer *player, MediaPlayerControl *control)
+{
+ g_signal_connect_object (control, "request-window",
+ G_CALLBACK (request_window_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "eof",
+ G_CALLBACK (eof_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "error",
+ G_CALLBACK (error_cb),
+ player,
+ 0);
+
+ g_signal_connect_object (control, "seeked",
+ G_CALLBACK (seeked_cb),
+ player,
+ 0);
+
+ g_signal_connect_object (control, "stopped",
+ G_CALLBACK (stopped_cb),
+ player,
+ 0);
+
+ g_signal_connect_object (control, "buffering",
+ G_CALLBACK (buffering_cb),
+ player,
+ 0);
+
+ g_signal_connect_object (control, "buffered",
+ G_CALLBACK (buffered_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "player-state-changed",
+ G_CALLBACK (player_state_changed_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "target-ready",
+ G_CALLBACK (target_ready_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "suspended",
+ G_CALLBACK (suspended_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "restored",
+ G_CALLBACK (restored_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "video-tag-changed",
+ G_CALLBACK (video_tag_changed_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "audio-tag-changed",
+ G_CALLBACK (audio_tag_changed_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "text-tag-changed",
+ G_CALLBACK (text_tag_changed_cb),
+ player,
+ 0);
+ g_signal_connect_object (control, "metadata-changed",
+ G_CALLBACK (metadata_changed_cb),
+ player,
+ 0);
+}
+
+gboolean
+media_player_record (MediaPlayer *player, gboolean to_record, gchar *location, GError **err)
+{
+ gboolean ret;
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ ret = media_player_control_record (GET_CONTROL_IFACE (player), to_record, location);
+ if (!ret) {
+ g_set_error (err, UMMS_ENGINE_ERROR, UMMS_ENGINE_ERROR_FAILED, "Record failed");
+ }
+ return ret;
+}
+
+gboolean
+media_player_get_pat (MediaPlayer *player, GPtrArray **pat, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_pat (GET_CONTROL_IFACE (player), pat);
+ return TRUE;
+}
+
+gboolean
+media_player_get_pmt (MediaPlayer *player, guint *program_num, guint *pcr_pid, GPtrArray **stream_info,
+ GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_pmt (GET_CONTROL_IFACE (player), program_num, pcr_pid, stream_info);
+ return TRUE;
+}
+
+gboolean
+media_player_get_associated_data_channel (MediaPlayer *player, gchar **ip, gint *port, GError **err)
+{
+ CHECK_ENGINE(GET_CONTROL_IFACE (player), FALSE, err);
+ media_player_control_get_associated_data_channel (GET_CONTROL_IFACE (player), ip, port);
+ return TRUE;
+}
--- src/media-player.h
+++ src/media-player.h
+/*
+ * UMMS (Unified Multi Media Service) provides a set of DBus APIs to support
+ * playing Audio and Video as well as DVB playback.
+ *
+ * Authored by Zhiwen Wu <zhiwen.wu at intel.com>
+ * Junyan He <junyan.he at intel.com>
+ * Copyright (c) 2011 Intel Corp.
+ *
+ * UMMS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * UMMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with UMMS; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _MEDIA_PLAYER_H
+#define _MEDIA_PLAYER_H
+
+#include <glib-object.h>
+#include "media-player-control.h"
+
+G_BEGIN_DECLS
+
+#define TYPE_MEDIA_PLAYER media_player_get_type()
+
+#define MEDIA_PLAYER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ TYPE_MEDIA_PLAYER, MediaPlayer))
+
+#define MEDIA_PLAYER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ TYPE_MEDIA_PLAYER, MediaPlayerClass))
+
+#define IS_MEDIA_PLAYER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ TYPE_MEDIA_PLAYER))
+
+#define IS_MEDIA_PLAYER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ TYPE_MEDIA_PLAYER))
+
+#define MEDIA_PLAYER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ TYPE_MEDIA_PLAYER, MediaPlayerClass))
+
+typedef struct _MediaPlayer MediaPlayer;
+typedef struct _MediaPlayerClass MediaPlayerClass;
+typedef struct _MediaPlayerPrivate MediaPlayerPrivate;
+
+struct _MediaPlayer
+{
+ GObject parent;
+ MediaPlayerControl *player_control;
+
+ MediaPlayerPrivate *priv;
+};
+
+
+struct _MediaPlayerClass
+{
+ GObjectClass parent_class;
+
+ /*
+ *
+ * self: A MediaPlayer
+ * uri: Uri to play
+ * new_engine[out]: TRUE if loaded a new engine and destroyed old engine
+ * FALSE if not
+ *
+ * Returns: TRUE if successful
+ * FALSE if not
+ *
+ * Load engine according to uri prefix which indicates the source type, and store it in MediaPlayer::player_control.
+ * Subclass should implement this vmethod to customize the procedure of backend engine loading.
+ *
+ */
+ gboolean (*load_engine) (MediaPlayer *self, const char *uri, gboolean *new_engine);
+
+};
+
+GType media_player_get_type (void) G_GNUC_CONST;
+
+MediaPlayer *media_player_new (void);
+
+gboolean media_player_set_uri (MediaPlayer *self, const gchar *uri, GError **error);
+gboolean media_player_set_target (MediaPlayer *self, gint type, GHashTable *params, GError **error);
+gboolean media_player_play(MediaPlayer *self, GError **error);
+gboolean media_player_pause(MediaPlayer *self, GError **error);
+gboolean media_player_stop(MediaPlayer *self, GError **error);
+gboolean media_player_set_position(MediaPlayer *self, gint64 pos, GError **error);
+gboolean media_player_get_position(MediaPlayer *self, gint64 *pos, GError **error);
+gboolean media_player_set_playback_rate(MediaPlayer *self, gdouble rate, GError **error);
+gboolean media_player_get_playback_rate(MediaPlayer *self, gdouble *rate, GError **error);
+gboolean media_player_set_volume(MediaPlayer *self, gint vol, GError **error);
+gboolean media_player_get_volume(MediaPlayer *self, gint *vol, GError **error);
+gboolean media_player_set_window_id(MediaPlayer *self, gdouble id, GError **error);
+gboolean media_player_set_video_size(MediaPlayer *self, guint x, guint y, guint w, guint h, GError **error);
+gboolean media_player_get_video_size(MediaPlayer *self, guint *w, guint *h, GError **error);
+gboolean media_player_get_buffered_time(MediaPlayer *self, gint64 *buffered_time, GError **error);
+gboolean media_player_get_buffered_bytes(MediaPlayer *self, gint64 *buffered_bytes, GError **error);
+gboolean media_player_get_media_size_time(MediaPlayer *self, gint64 *size_time, GError **error);
+gboolean media_player_get_media_size_bytes(MediaPlayer *self, gint64 *size_bytes, GError **error);
+gboolean media_player_has_video(MediaPlayer *self, gboolean *has_video, GError **error);
+gboolean media_player_has_audio(MediaPlayer *self, gboolean *has_audio, GError **error);
+gboolean media_player_is_streaming(MediaPlayer *self, gboolean *is_streaming, GError **error);
+gboolean media_player_is_seekable(MediaPlayer *self, gboolean *is_seekable, GError **error);
+gboolean media_player_support_fullscreen(MediaPlayer *self, gboolean *support_fullscreen, GError **error);
+gboolean media_player_get_player_state(MediaPlayer *self, gint *state, GError **error);
+gboolean media_player_reply(MediaPlayer *self, GError **error);
+gboolean media_player_set_proxy (MediaPlayer *self, GHashTable *params, GError **error);
+gboolean media_player_suspend (MediaPlayer *self, GError **error);
+gboolean media_player_restore (MediaPlayer *self, GError **error);
+gboolean media_player_get_current_video (MediaPlayer *player, gint *cur_video, GError **err);
+gboolean media_player_get_current_audio (MediaPlayer *player, gint *cur_audio, GError **err);
+gboolean media_player_set_current_video (MediaPlayer *player, gint cur_video, GError **err);
+gboolean media_player_set_current_audio (MediaPlayer *player, gint cur_audio, GError **err);
+gboolean media_player_get_video_num (MediaPlayer *player, gint *video_num, GError **err);
+gboolean media_player_get_audio_num (MediaPlayer *player, gint *audio_num, GError **err);
+gboolean media_player_set_subtitle_uri (MediaPlayer *player, gchar *sub_uri, GError **err);
+gboolean media_player_get_subtitle_num (MediaPlayer *player, gint *sub_num, GError **err);
+gboolean media_player_get_current_subtitle (MediaPlayer *player, gint *cur_sub, GError **err);
+gboolean media_player_set_current_subtitle (MediaPlayer *player, gint cur_sub, GError **err);
+gboolean media_player_set_buffer_depth (MediaPlayer *player, gint format, gint64 buf_val, GError **err);
+gboolean media_player_get_buffer_depth (MediaPlayer *player, gint format, gint64 *buf_val, GError **err);
+gboolean media_player_set_mute (MediaPlayer *player, gint mute, GError **err);
+gboolean media_player_is_mute (MediaPlayer *player, gint *mute, GError **err);
+gboolean media_player_set_scale_mode (MediaPlayer *player, gint scale_mode, GError **err);
+gboolean media_player_get_scale_mode (MediaPlayer *player, gint *scale_mode, GError **err);
+gboolean media_player_get_video_codec (MediaPlayer *player, gint channel, gchar **video_codec, GError **err);
+gboolean media_player_get_audio_codec (MediaPlayer *player, gint channel, gchar **audio_codec, GError **err);
+gboolean media_player_get_video_bitrate (MediaPlayer *player, gint channel, gint *bit_rate, GError **err);
+gboolean media_player_get_audio_bitrate (MediaPlayer *player, gint channel, gint *bit_rate, GError **err);
+gboolean media_player_get_encapsulation (MediaPlayer *player, gchar **encapsulation, GError **err);
+gboolean media_player_get_audio_samplerate (MediaPlayer *player, gint channel, gint *sample_rate, GError **err);
+gboolean media_player_get_video_framerate (MediaPlayer *player, gint channel,
+ gint * frame_rate_num, gint * frame_rate_denom, GError **err);
+gboolean media_player_get_video_resolution (MediaPlayer *player, gint channel,
+ gint * width, gint * height, GError **err);
+gboolean media_player_get_video_aspect_ratio (MediaPlayer *player, gint channel,
+ gint * ratio_num, gint * ratio_denom, GError **err);
+gboolean media_player_get_protocol_name (MediaPlayer *player, gchar **protocol_name, GError **err);
+gboolean media_player_get_current_uri (MediaPlayer *player, gchar **uri, GError **err);
+gboolean media_player_get_title (MediaPlayer *player, gchar **title, GError **err);
+gboolean media_player_get_artist (MediaPlayer *player, gchar **artist, GError **err);
+gboolean media_player_record (MediaPlayer *player, gboolean to_record, gchar *location, GError **err);
+gboolean media_player_get_pat (MediaPlayer *player, GPtrArray **pat, GError **err);
+gboolean media_player_get_pmt (MediaPlayer *player, guint *program_num, guint *pcr_pid, GPtrArray **stream_info,
+ GError **err);
+gboolean media_player_get_associated_data_channel (MediaPlayer *player, gchar **ip, gint *port, GError **err);
+
+G_END_DECLS
+
+#endif /* _MEDIA_PLAYER_H */
--- src/umms-audio-manager.c
+++ src/umms-audio-manager.c
@@ -39,6 +39,14 @@
struct _UmmsAudioManagerPrivate {
AudioManagerInterface *audio_mngr_if;
+ PlatformType platform_type;
+};
+
+/*property for audio manager*/
+enum PROPTYPE{
+ PROP_0,
+ PROP_PLATFORM,
+ PROP_LAST
};
static void
@@ -59,7 +67,14 @@
const GValue *value,
GParamSpec *pspec)
{
+ UmmsAudioManagerPrivate *priv = GET_PRIVATE (object);
+ gint tmp;
switch (property_id) {
+ case PROP_PLATFORM:
+ tmp = g_value_get_int(value);
+ priv->platform_type = tmp;
+ UMMS_DEBUG("platform type: %d", tmp);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -80,9 +95,45 @@
G_OBJECT_CLASS (umms_audio_manager_parent_class)->finalize (object);
}
+static UmmsAudioManager *the_only = NULL;
+
+/* define constructor to imple:
+ * Some people sometimes need to construct their object but only after the
+ * construction properties have been set. This is possible through the use
+ * of the constructor class method
+ * Ori: ClassInit -> Init ->SetProperty
+ * New: ClassInit -> Constructor -> ParentConstructor-> Init->SetProperty->DoSomethingYourSelf
+ */
+static GObject*
+umms_audio_manager_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ UMMS_DEBUG (" ");
+ GObject *obj;
+ if (the_only){
+ obj = g_object_ref (the_only);
+ }else{
+ obj = G_OBJECT_CLASS (umms_audio_manager_parent_class)->constructor (type, n_construct_properties, construct_properties);
+ }
+
+ /*do something based on property setting.*/
+ /*construct obj based on property*/
+ UmmsAudioManagerPrivate *priv = GET_PRIVATE (obj);
+
+ if(priv->platform_type == NETBOOK){
+ UMMS_DEBUG("NetBook:NO Audio Set");
+ //player->priv->audio_mngr_if = AUDIO_MANAGER_INTERFACE(audio_manager_engine_new ());//TODO:create audio manager interface instance here.
+ }else{
+ priv->audio_mngr_if = AUDIO_MANAGER_INTERFACE(audio_manager_engine_new ());//TODO:create audio manager interface instance here.
+ }
+ return obj;
+}
+
static void
umms_audio_manager_class_init (UmmsAudioManagerClass *klass)
{
+ UMMS_DEBUG (" ");
GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (UmmsAudioManagerPrivate));
@@ -91,19 +142,36 @@
object_class->set_property = umms_audio_manager_set_property;
object_class->dispose = umms_audio_manager_dispose;
object_class->finalize = umms_audio_manager_finalize;
+ object_class->constructor = umms_audio_manager_constructor;
+
+ /*set property : platform type*/
+ g_object_class_install_property (object_class, PROP_PLATFORM,
+ g_param_spec_int ("platform", "platform type", "indication for platform type: Tv, netbook, etc",0,PLATFORM_INVALID,
+ CETV, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static void
umms_audio_manager_init (UmmsAudioManager *player)
{
+ UMMS_DEBUG (" ");
+ g_assert (the_only == NULL);
+ the_only = player;
player->priv = PLAYER_PRIVATE (player);
- player->priv->audio_mngr_if = AUDIO_MANAGER_INTERFACE(audio_manager_engine_new ());//TODO:create audio manager interface instance here.
+#if 0
+ UMMS_DEBUG ("Type : %d", player->priv->platform_type);
+ if(player->priv->platform_type == NETBOOK){
+ UMMS_DEBUG("Do not Init Audio Sink On NetBook");
+ //player->priv->audio_mngr_if = AUDIO_MANAGER_INTERFACE(audio_manager_engine_new ());//TODO:create audio manager interface instance here.
+ }else{
+ player->priv->audio_mngr_if = AUDIO_MANAGER_INTERFACE(audio_manager_engine_new ());//TODO:create audio manager interface instance here.
+ }
+#endif
}
UmmsAudioManager *
-umms_audio_manager_new (void)
+umms_audio_manager_new (gint platform)
{
- return g_object_new (UMMS_TYPE_AUDIO_MANAGER, NULL);
+ return g_object_new (UMMS_TYPE_AUDIO_MANAGER, "platform", platform,NULL);
}
gboolean umms_audio_manager_set_volume(UmmsAudioManager *self, gint type, gint vol, GError **err)
--- src/umms-audio-manager.h
+++ src/umms-audio-manager.h
@@ -70,7 +70,7 @@
GType umms_audio_manager_get_type (void) G_GNUC_CONST;
-UmmsAudioManager *umms_audio_manager_new (void);
+UmmsAudioManager *umms_audio_manager_new (gint platform);
gboolean umms_audio_manager_set_volume(UmmsAudioManager *self, gint type, gint vol, GError **error);
gboolean umms_audio_manager_get_volume(UmmsAudioManager *self, gint type, gint *vol, GError **error);
gboolean umms_audio_manager_set_state(UmmsAudioManager *self, gint type, gint state, GError **error);
--- src/umms-common.h
+++ src/umms-common.h
@@ -24,16 +24,16 @@
#ifndef _UMMS_COMMON_H
#define _UMMS_COMMON_H
-#define UMMS_SERVICE_NAME "com.meego.UMMS"
-#define UMMS_OBJECT_MANAGER_OBJECT_PATH "/com/meego/UMMS/ObjectManager"
-#define UMMS_OBJECT_MANAGER_INTERFACE_NAME "com.meego.UMMS.ObjectManager.iface"
-#define MEDIA_PLAYER_INTERFACE_NAME "com.meego.UMMS.MediaPlayer"
+#define UMMS_SERVICE_NAME "com.UMMS"
+#define UMMS_OBJECT_MANAGER_OBJECT_PATH "/com/UMMS/ObjectManager"
+#define UMMS_OBJECT_MANAGER_INTERFACE_NAME "com.UMMS.ObjectManager.iface"
+#define MEDIA_PLAYER_INTERFACE_NAME "com.UMMS.MediaPlayer"
-#define UMMS_PLAYING_CONTENT_METADATA_VIEWER_OBJECT_PATH "/com/meego/UMMS/PlayingContentMetadataViewer"
-#define UMMS_PLAYING_CONTENT_METADATA_VIEWER_INTERFACE_NAME "com.meego.UMMS.PlayingContentMetadataViewer"
+#define UMMS_PLAYING_CONTENT_METADATA_VIEWER_OBJECT_PATH "/com/UMMS/PlayingContentMetadataViewer"
+#define UMMS_PLAYING_CONTENT_METADATA_VIEWER_INTERFACE_NAME "com.UMMS.PlayingContentMetadataViewer"
-#define UMMS_AUDIO_MANAGER_OBJECT_PATH "/com/meego/UMMS/AudioManager"
-#define UMMS_AUDIO_MANAGER_INTERFACE_NAME "com.meego.UMMS.AudioManger"
+#define UMMS_AUDIO_MANAGER_OBJECT_PATH "/com/UMMS/AudioManager"
+#define UMMS_AUDIO_MANAGER_INTERFACE_NAME "com.UMMS.AudioManger"
#define RESET_STR(str) \
@@ -98,5 +98,12 @@
AUDIO_OUTPUT_STATE_NUM
}AudioOutputState;
+/*platform type */
+typedef enum {
+ CETV,
+ NETBOOK,
+ PLATFORM_INVALID
+}PlatformType;
+
#endif /* _UMMS_COMMON_H */
--- src/umms-object-manager.c
+++ src/umms-object-manager.c
@@ -21,15 +21,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
-
-
#include <dbus/dbus-glib-lowlevel.h>
#include <dbus/dbus-glib.h>
#include "umms-debug.h"
+#include "umms-common.h"
#include "umms-object-manager.h"
-#include "meego-media-player-gstreamer.h"
+#include "media-player-factory.h"
#include "./glue/umms-media-player-glue.h"
@@ -40,26 +38,34 @@
#define GET_PRIVATE(o) ((UmmsObjectManager *)o)->priv
-#define OBJ_NAME_PREFIX "/com/meego/UMMS/MediaPlayer"
+#define OBJ_NAME_PREFIX "/com/UMMS/MediaPlayer"
static void _player_list_free (GList *player_list);
static gint _find_player_by_name (gconstpointer player_in, gconstpointer name);
static gboolean _stop_execution(gpointer data);
static void _dump_player (gpointer a, gpointer b);
static void _dump_player_list (GList *players);
-static MeegoMediaPlayer *_gen_media_player (UmmsObjectManager *mngr, gboolean attended);
-static gboolean _remove_media_player (MeegoMediaPlayer *player);
+static MediaPlayer *_gen_media_player (UmmsObjectManager *mngr, gboolean attended);
+static gboolean _remove_media_player (MediaPlayer *player);
enum {
SIGNAL_PLAYER_ADDED,
N_SIGNALS
};
+/*property for object manager*/
+enum PROPTYPE{
+ PROP_0,
+ PROP_PLATFORM,
+ PROP_LAST
+};
+
static guint signals[N_SIGNALS] = {0};
struct _UmmsObjectManagerPrivate {
GList *player_list;
gint cur_player_id;
+ PlatformType platform_type;
};
static void
@@ -80,7 +86,16 @@
const GValue *value,
GParamSpec *pspec)
{
+ UmmsObjectManagerPrivate *priv = GET_PRIVATE (object);
+ gint tmp;
+
switch (property_id) {
+ case PROP_PLATFORM:
+ tmp = g_value_get_int(value);
+ priv->platform_type = tmp;
+ UMMS_DEBUG("platform type: %d", tmp);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -123,7 +138,13 @@
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
- 1, MEEGO_TYPE_MEDIA_PLAYER);
+ 1, TYPE_MEDIA_PLAYER);
+
+
+ g_object_class_install_property (object_class, PROP_PLATFORM,
+ g_param_spec_int ("platform", "platform type", "indication for platform type: Tv, netbook, etc",0,PLATFORM_INVALID,
+ CETV, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
}
static void
@@ -140,15 +161,15 @@
static UmmsObjectManager *mngr_global = NULL;
UmmsObjectManager *
-umms_object_manager_new (void)
+umms_object_manager_new (gint platform)
{
if (!mngr_global) {
- mngr_global = g_object_new (UMMS_TYPE_OBJECT_MANAGER, NULL);
+ mngr_global = g_object_new (UMMS_TYPE_OBJECT_MANAGER, "platform", platform,NULL);
}
return mngr_global;
}
-static void client_no_reply_cb (MeegoMediaPlayer *player, gpointer user_data)
+static void client_no_reply_cb (MediaPlayer *player, gpointer user_data)
{
UMMS_DEBUG ("called");
_remove_media_player (player);
@@ -158,7 +179,7 @@
gboolean
umms_object_manager_request_media_player(UmmsObjectManager *self, gchar **object_path, GError **error)
{
- MeegoMediaPlayer *player;
+ MediaPlayer *player;
UMMS_DEBUG("request attended media player");
@@ -172,7 +193,7 @@
_dump_player_list (self->priv->player_list);
- //FIXME:do something to munipulate MeegoMediaPlayer
+ //FIXME:do something to munipulate MediaPlayer
return TRUE;
}
@@ -186,7 +207,7 @@
gchar **object_path,
GError **error)
{
- MeegoMediaPlayer *player;
+ MediaPlayer *player;
UMMS_DEBUG("request unattened media player, time_to_execution = '%lf' seconds", time_to_execution);
@@ -217,7 +238,7 @@
priv = self->priv;
ele = g_list_find_custom (priv->player_list, object_path, _find_player_by_name);
g_return_val_if_fail (ele, FALSE);
- _remove_media_player ((MeegoMediaPlayer *)(ele->data));
+ _remove_media_player ((MediaPlayer *)(ele->data));
return TRUE;
}
@@ -227,7 +248,7 @@
GList *g;
for (g = player_list; g; g = g->next) {
- MeegoMediaPlayer *player = (MeegoMediaPlayer *) (g->data);
+ MediaPlayer *player = (MediaPlayer *) (g->data);
g_object_unref (player);
}
g_list_free (player_list);
@@ -240,13 +261,13 @@
{
gchar *src, *dest;
gint res;
- MeegoMediaPlayer *player;
+ MediaPlayer *player;
g_return_val_if_fail (player_in, 1);
g_return_val_if_fail (name, 1);
dest = (gchar *)name;
- player = (MeegoMediaPlayer *)player_in;
+ player = (MediaPlayer *)player_in;
g_object_get (G_OBJECT(player), "name", &src, NULL);
res = g_strcmp0 (src, dest);
@@ -257,7 +278,7 @@
static gboolean _stop_execution(gpointer data)
{
- MeegoMediaPlayer *player = (MeegoMediaPlayer *)data;
+ MediaPlayer *player = (MediaPlayer *)data;
UMMS_DEBUG ("Stop unattended execution!");
@@ -268,13 +289,14 @@
static void _dump_player (gpointer a, gpointer b)
{
- MeegoMediaPlayer *player = (MeegoMediaPlayer *)a;
+ MediaPlayer *player = (MediaPlayer *)a;
gchar *name;
gboolean attended;
+ gint type;
- g_object_get (G_OBJECT (player), "name", &name, "attended", &attended, NULL);
+ g_object_get (G_OBJECT (player), "name", &name, "attended", &attended, "platform", &type, NULL);
- UMMS_DEBUG ("player=%p, name=%s, attended=%d", player, name, attended);
+ UMMS_DEBUG ("player=%p, name=%s, attended=%d, platform_type=%d", player, name, attended, type);
g_free (name);
return;
}
@@ -288,12 +310,12 @@
g_list_foreach (players, _dump_player, NULL);
}
-static MeegoMediaPlayer *
+static MediaPlayer *
_gen_media_player (UmmsObjectManager *mngr, gboolean attended)
{
DBusGConnection *connection;
- MeegoMediaPlayer *player;
+ MediaPlayer *player;
gchar *object_path;
gint id;
UmmsObjectManagerPrivate *priv;
@@ -306,11 +328,12 @@
UMMS_DEBUG("object_path='%s' ", object_path);
- dbus_g_object_type_install_info (MEEGO_TYPE_MEDIA_PLAYER, &dbus_glib_meego_media_player_object_info);
+ dbus_g_object_type_install_info (TYPE_MEDIA_PLAYER, &dbus_glib_media_player_object_info);
- player = (MeegoMediaPlayer *)g_object_new (MEEGO_TYPE_MEDIA_PLAYER_GSTREAMER,
+ player = (MediaPlayer *)g_object_new (TYPE_MEDIA_PLAYER_FACTORY,
"name", object_path,
"attended", attended,
+ "platform", priv->platform_type,
NULL);
priv->player_list = g_list_append (priv->player_list, player);
@@ -338,7 +361,7 @@
}
static gboolean
-_remove_media_player (MeegoMediaPlayer *player)
+_remove_media_player (MediaPlayer *player)
{
DBusGConnection *connection;
UmmsObjectManagerPrivate *priv;
--- src/umms-object-manager.h
+++ src/umms-object-manager.h
@@ -68,7 +68,7 @@
GType umms_object_manager_get_type (void) G_GNUC_CONST;
-UmmsObjectManager *umms_object_manager_new (void);
+UmmsObjectManager *umms_object_manager_new (gint platform);
gboolean umms_object_manager_request_media_player(UmmsObjectManager *self, gchar **object_path, GError **error);
gboolean umms_object_manager_request_media_player_unattended(UmmsObjectManager *self, gdouble time_to_execution,
gchar **token, gchar **object_path, GError **error);
--- src/umms-playing-content-metadata-viewer.c
+++ src/umms-playing-content-metadata-viewer.c
@@ -27,7 +27,7 @@
#include "umms-error.h"
#include "umms-playing-content-metadata-viewer.h"
#include "umms-object-manager.h"
-#include "meego-media-player.h"
+#include "media-player.h"
G_DEFINE_TYPE (UmmsPlayingContentMetadataViewer, umms_playing_content_metadata_viewer, G_TYPE_OBJECT)
@@ -65,7 +65,7 @@
}
static void
-player_state_changed_cb(MeegoMediaPlayer *player, gint old_state, gint new_state, UmmsPlayingContentMetadataViewer *viewer)
+player_state_changed_cb(MediaPlayer *player, gint old_state, gint new_state, UmmsPlayingContentMetadataViewer *viewer)
{
GPtrArray *metadata;
@@ -81,7 +81,7 @@
}
static void
-player_metadata_changed_cb(MeegoMediaPlayer *player, UmmsPlayingContentMetadataViewer *viewer)
+player_metadata_changed_cb(MediaPlayer *player, UmmsPlayingContentMetadataViewer *viewer)
{
GPtrArray *metadata;
@@ -95,7 +95,7 @@
}
static void
-player_added_cb(UmmsObjectManager *obj_mngr, MeegoMediaPlayer *player, UmmsPlayingContentMetadataViewer *viewer)
+player_added_cb(UmmsObjectManager *obj_mngr, MediaPlayer *player, UmmsPlayingContentMetadataViewer *viewer)
{
g_signal_connect (player, "player-state-changed", G_CALLBACK(player_state_changed_cb), viewer);
g_signal_connect (player, "metadata-changed", G_CALLBACK(player_metadata_changed_cb), viewer);
@@ -194,7 +194,7 @@
GValue *val;
gint i, state;
GList *players, *item;
- MeegoMediaPlayer *player;
+ MediaPlayer *player;
gchar *uri = NULL;
gchar *title = NULL;
gchar *artist = NULL;
@@ -212,17 +212,17 @@
for (i = 0; i < g_list_length(players); i++) {
item = g_list_nth (players, i);
- player = MEEGO_MEDIA_PLAYER (item->data);
- meego_media_player_get_player_state (player, &state, NULL);
+ player = MEDIA_PLAYER (item->data);
+ media_player_get_player_state (player, &state, NULL);
if (state == PlayerStatePlaying || state == PlayerStatePaused) {
/*
* 1. get tags of URI, Title, Artist.
* 2. Fill the metadata.
*/
- meego_media_player_get_current_uri (player, &uri, NULL);
- meego_media_player_get_title (player, &title, NULL);
- meego_media_player_get_artist (player, &artist, NULL);
+ media_player_get_current_uri (player, &uri, NULL);
+ media_player_get_title (player, &title, NULL);
+ media_player_get_artist (player, &artist, NULL);
ht = g_hash_table_new (NULL, NULL);
--- src/umms-server-main.c
+++ src/umms-server-main.c
@@ -41,6 +41,7 @@
static GMainLoop *loop = NULL;
+#define PLATFORM_CONFIG "/etc/system-release"
static gboolean
request_name (void)
@@ -75,6 +76,60 @@
return request_status == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER;
}
+const gchar* platform_release[] = {
+ "intel-cetv",
+ "netbook-ia32",
+ "NULL"
+};
+
+/*
+ * probe system platform information to check
+ * if specific gst capability are supported.
+ */
+gint system_probe(void)
+{
+ gchar *filename = PLATFORM_CONFIG;
+ FILE* fd = 0;
+ gchar *contents;
+ gsize len;
+ GError *error = NULL;
+ gint ret = CETV;
+
+ /*if the file is exist*/
+ if(g_file_test(filename, G_FILE_TEST_EXISTS )){
+
+ /*reading data here*/
+ g_assert (g_file_test (filename, G_FILE_TEST_EXISTS));
+ //g_assert (g_file_test (filename, G_FILE_TEST_IS_REGULAR));
+
+ if (! g_file_get_contents (filename, &contents, &len, &error))
+ g_error ("g_file_get_contents() failed: %s", error->message);
+
+ if(strstr(contents, platform_release[CETV])){
+ UMMS_DEBUG("is %s", platform_release[CETV]);
+ ret = CETV;
+ }else if(strstr(contents, platform_release[NETBOOK])){
+ UMMS_DEBUG("is %s", platform_release[NETBOOK]);
+ ret = NETBOOK;
+ }else {
+ g_warning ("unknown platform, try generic config\n");
+ ret = NETBOOK;
+ }
+
+ g_free (contents);
+
+ }else{
+ /**/
+ UMMS_DEBUG("file %s is NOT exist\n", filename);
+ g_warning ("unknown platform, try generic config\n");
+ ret = NETBOOK;
+ }
+
+ return ret;
+
+}
+
+
//#define FAKE_UMMS_SIGNAL
#ifdef FAKE_UMMS_SIGNAL
#include <glib/giochannel.h>
@@ -119,7 +174,7 @@
}
#if 0
-static void emit_signal (MeegoMediaPlayer *obj, int sig_id)
+static void emit_signal (MediaPlayer *obj, int sig_id)
{
switch (sig_id) {
case SIGNAL_MEDIA_PLAYER_IFACE_Initialized:
@@ -230,19 +285,22 @@
#ifdef FAKE_UMMS_SIGNAL
GIOChannel *chan;
#endif
+ gint platform_type = CETV;
g_thread_init (NULL);
gst_init (&argc, &argv);
-
if (!request_name ()) {
UMMS_DEBUG("UMMS service already running");
exit (1);
}
+ /*system probe*/
+ platform_type = system_probe();
+
UmmsObjectManager *umms_object_manager = NULL;
dbus_g_object_type_install_info (UMMS_TYPE_OBJECT_MANAGER, &dbus_glib_umms_object_manager_object_info);
- umms_object_manager = umms_object_manager_new ();
+ umms_object_manager = umms_object_manager_new (platform_type);
UmmsPlayingContentMetadataViewer *metadata_viewer = NULL;
dbus_g_object_type_install_info (UMMS_TYPE_PLAYING_CONTENT_METADATA_VIEWER, &dbus_glib_umms_playing_content_metadata_viewer_object_info);
@@ -250,7 +308,7 @@
UmmsAudioManager *audio_manager = NULL;
dbus_g_object_type_install_info (UMMS_TYPE_AUDIO_MANAGER, &dbus_glib_umms_audio_manager_object_info);
- audio_manager = umms_audio_manager_new();
+ audio_manager = umms_audio_manager_new(platform_type);
connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
--- test/Makefile.am
+++ test/Makefile.am
@@ -8,7 +8,7 @@
engine_test_CFLAGS = $(UMMS_CFLAGS)
engine_test_LDADD = $(UMMS_LIBS)
-engine_test_SOURCES = test-common.c test-common.h ../src/meego-media-player-control.c ../src/meego-media-player-control.h \
+engine_test_SOURCES = test-common.c test-common.h ../src/media-player-control.c ../src/media-player-control.h \
../src/engine-gst.c ../src/engine-gst.h \
../src/param-table.c ../src/param-table.h \
../src/umms-marshals.c ../src/umms-marshals.h \
--- test/client-test.py
+++ test/client-test.py
@@ -402,7 +402,7 @@
self.player.SetSubtitleUri(uri)
elif mid == SetCurrentSubtitle:
- sub == raw_input("Input your expect subtitle, '%d'\n")
+ sub = int(raw_input("Input your expect subtitle: \n"))
self.player.SetCurrentSubtitle(sub);
elif mid == GetCurrentSubtitle:
--- test/engine-test.c
+++ test/engine-test.c
@@ -29,12 +29,12 @@
#include "test-common.h"
#include "../src/umms-debug.h"
-#include "../src/meego-media-player-control.h"
+#include "../src/media-player-control.h"
#include "../src/engine-gst.h"
extern gboolean to_continue;
GMainLoop *loop = NULL;
-static MeegoMediaPlayerControl *player = NULL;
+static MediaPlayerControl *player = NULL;
gboolean method_call (gpointer data)
{
gchar *uri;
@@ -67,16 +67,16 @@
else
uri = args[1];
TESTER_DEBUG ("uri = '%s'", uri);
- meego_media_player_control_set_uri (player, uri);
+ media_player_control_set_uri (player, uri);
break;
case Play:
- meego_media_player_control_play (player);
+ media_player_control_play (player);
break;
case Pause:
- meego_media_player_control_pause (player);
+ media_player_control_pause (player);
break;
case Stop:
- meego_media_player_control_stop (player);
+ media_player_control_stop (player);
break;
case SetPosition:
sscanf (args[1], "%lld", &pos);
@@ -143,7 +143,7 @@
break;
case SetTarget:
//TESTER_DEBUG ("target_type=%d", ReservedType0);
- //meego_media_player_control_set_target (player, ReservedType0, 0);
+ //media_player_control_set_target (player, ReservedType0, 0);
break;
default:
TESTER_DEBUG ("Unknown method id: %d\n", method_id);
@@ -152,48 +152,48 @@
return FALSE;
}
-void player_state_changed_cb(MeegoMediaPlayerControl *player, gint state, gpointer user_data)
+void player_state_changed_cb(MediaPlayerControl *player, gint state, gpointer user_data)
{
TESTER_DEBUG("State changed to '%s'", state_name[state]);
}
-void eof_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void eof_cb(MediaPlayerControl *player, gpointer user_data)
{
TESTER_DEBUG( "EOF....");
}
-void begin_buffering_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void begin_buffering_cb(MediaPlayerControl *player, gpointer user_data)
{
TESTER_DEBUG( "Begin buffering");
}
-void buffered_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void buffered_cb(MediaPlayerControl *player, gpointer user_data)
{
TESTER_DEBUG( "Buffering completed");
}
-void seeked_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void seeked_cb(MediaPlayerControl *player, gpointer user_data)
{
TESTER_DEBUG( "Seeking completed");
}
-void stopped_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void stopped_cb(MediaPlayerControl *player, gpointer user_data)
{
TESTER_DEBUG( "Player stopped");
}
-void error_cb(MeegoMediaPlayerControl *player, guint err_id, gchar *msg, gpointer user_data)
+void error_cb(MediaPlayerControl *player, guint err_id, gchar *msg, gpointer user_data)
{
TESTER_DEBUG( "Error: Domain='Engine', Type='%s', msg='%s'", engine_error_str[err_id], msg);
}
-void request_window_cb(MeegoMediaPlayerControl *player, gpointer user_data)
+void request_window_cb(MediaPlayerControl *player, gpointer user_data)
{
TESTER_DEBUG( "Player engine request a X window");
}
static void
-connect_sigs(MeegoMediaPlayerControl *player)
+connect_sigs(MediaPlayerControl *player)
{
TESTER_DEBUG ("called");
g_signal_connect_object (player, "request-window",
@@ -241,7 +241,7 @@
g_type_init ();
gst_init (&argc, &argv);
- player = (MeegoMediaPlayerControl*)engine_gst_new();
+ player = (MediaPlayerControl*)engine_gst_new();
connect_sigs (player);
loop = g_main_loop_new (NULL, TRUE);
--- test/ui/gtk-backend-umms.c
+++ test/ui/gtk-backend-umms.c
@@ -139,6 +139,17 @@
ui_callbacks_for_reason(UI_CALLBACK_TEXT_TAG_CHANGED, (void *)stream_id, NULL);
}
+static void __reply_cb(DBusGProxy *player, guint stream_id, gpointer user_data)
+{
+ /* reply to keep alive. */
+ GError *error = NULL;
+
+ if (!dbus_g_proxy_call (player, "Reply", &error,
+ G_TYPE_INVALID, G_TYPE_INVALID)) {
+ UMMS_GERROR ("Failed to Reply", error);
+ }
+}
+
static void
connect_sigs(DBusGProxy *player)
{
@@ -202,6 +213,11 @@
"TextTagChanged",
G_CALLBACK(__text_tag_changed_cb),
NULL, NULL);
+
+ dbus_g_proxy_connect_signal (player,
+ "NeedReply",
+ G_CALLBACK(__reply_cb),
+ NULL, NULL);
}
++++++ umms.yaml
--- umms.yaml
+++ umms.yaml
@@ -24,5 +24,5 @@
Builder: make
Files:
- "%{_libexecdir}/umms-server"
- - "%{_datadir}/dbus-1/system-services/com.meego.UMMS.service"
- - "/etc/dbus-1/system.d/com.meego.UMMS.conf"
+ - "%{_datadir}/dbus-1/system-services/com.UMMS.service"
+ - "/etc/dbus-1/system.d/com.UMMS.conf"
More information about the MeeGo-commits
mailing list