[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