# Copyright (C) 2007, 2008, 2009 Nokia. All rights reserved.
AC_PREREQ([2.53])
-AC_INIT([mafw-gst-subtitles-renderer], [0.1.2009.47-1])
+AC_INIT([mafw-gst-subtitles-renderer], [0.2.2010.07-2])
AC_CONFIG_SRCDIR([libmafw-gst-renderer/mafw-gst-renderer.h])
AC_CONFIG_HEADERS([config.h])
totem-plparser
gconf-2.0 >= 2.0
gnome-vfs-2.0
+ mce
+ dbus-1
)
dnl Check for GdkPixbuf, needed for dumping current frame
+mafw-gst-subtitles-renderer (0.2.2010.07-2+0m5-1) unstable; urgency=low
+
+ * Added Hungarian translation by Gyorgy Lakatos.
+ * Package updated to version mafw-gst-renderer-0.2.2010.07-2+0m5-1.
+
+ -- Roman Moravcik <roman.moravcik@gmail.com> Mon, 18 Jan 2010 22:39:17 +0100
+
+mafw-gst-renderer (0.2.2010.07-2+0m5) unstable; urgency=low
+
+ * This entry has been added by BIFH queue processor
+ Suffix +0m5 added to package revision
+
+ -- mika tapojarvi <ext-mika.tapojarvi@nokia.com> Fri, 19 Feb 2010 10:11:34 +0200
+
+mafw-gst-renderer (0.2.2010.07-2) unstable; urgency=low
+
+ * Fixes: NB#156757 - Volume settings can't be changed via Volume key, Media player is playing, Tklock is On.
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Wed, 17 Feb 2010 10:09:38 +0200
+
+mafw-gst-renderer (0.2.2010.06-1) unstable; urgency=low
+
+ * Fixes: NB#150064 - NP-Video:Frames not changing while performing seek operation when the video is in paused state
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Wed, 10 Feb 2010 21:43:22 +0200
+
+mafw-gst-renderer (0.2.2010.01-1) unstable; urgency=low
+
+ * Version number increased in trunk.
+ * A forbidden word removed from debian/changelog.
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Thu, 07 Jan 2010 19:36:53 +0200
+
+mafw-gst-renderer (0.2.2009.52-2) unstable; urgency=low
+
+ * Version number increased.
+
+ -- Tuomas Kamarainen <tuomas.kamarainen@nokia.com> Wed, 23 Dec 2009 12:40:45 +0200
+
+mafw-gst-renderer (0.2.2009.52-1) unstable; urgency=low
+
+ * Fixes: NB#149945 - mafw-gst-renderer leaks some GStreamer messages
+ * Thanks to Mueller Tim for the patch.
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Sun, 20 Dec 2009 22:43:29 +0200
+
+mafw-gst-renderer (0.2.2009.50-2) unstable; urgency=low
+
+ * Fixes: NB#148080 - Device UI becomes very slow after long time usage of Media Player
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Thu, 10 Dec 2009 19:07:45 +0200
+
+mafw-gst-renderer (0.2.2009.50-1) unstable; urgency=low
+
+ * Version and changelog updated for pre-release 0.2009.50-1
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Tue, 08 Dec 2009 09:21:47 +0200
+
+mafw-gst-renderer (0.2.2009.49-1) unstable; urgency=low
+
+ * Rebuild for 2009.49-1.
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Tue, 01 Dec 2009 19:27:31 +0200
+
+mafw-gst-renderer (0.2.2009.48-2) unstable; urgency=low
+
+ * Pre-release PR 1.2 2009.48-2 tag.
+
+ -- Tuomas Kämäräinen <tuomas.kamarainen@nokia.com> Fri, 27 Nov 2009 11:56:14 +0200
+
+mafw-gst-renderer (0.2.2009.48-1) unstable; urgency=low
+
+ * Pre-release PR 1.2 2009.48-1 tag.
+
+ -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Tue, 24 Nov 2009 21:57:59 +0200
+
+mafw-gst-renderer (0.1.2009.47-2) unstable; urgency=low
+
+ * Version increased.
+
+ -- Tuomas Kamarainen <tuomas.kamarainen@nokia.com> Fri, 20 Nov 2009 13:26:19 +0300
+
mafw-gst-subtitles-renderer (0.1.2009.47-1+0m5-5) unstable; urgency=low
* Added Danish translation by Joe Hansen.
-- Roman Moravcik <roman.moravcik@gmail.com> Mon, 18 Jan 2010 22:09:11 +0100
-mafw-gst-renderer (0.1.2009.47-1+0m5) unstable; urgency=low
-
- * This entry has been added by BIFH queue processor
- Suffix +0m5 added to package revision
-
- -- mika tapojarvi <ext-mika.tapojarvi@nokia.com> Thu, 26 Nov 2009 11:40:45 +0200
-
-mafw-gst-renderer (0.1.2009.47-1) unstable; urgency=low
-
- * Fixes: NB#141508 - Specific video file (mjpeg) makes Mediaplayer unusable
-
- -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Fri, 20 Nov 2009 04:18:15 +0200
-
-mafw-gst-renderer (0.1.2009.44-1) unstable; urgency=low
-
- * Fixes: NB#143299 - mafw_renderer_get_current_metadata don't give correct duration.
-
- -- Mika Tapojärvi <mika.tapojarvi@sse.fi> Wed, 28 Oct 2009 23:48:22 +0200
-
mafw-gst-renderer (0.1.2009.42-2) unstable; urgency=low
* Version increased.
Section: misc
Priority: optional
Maintainer: Roman Moravcik <roman.moravcik@gmail.com>
-XSBC-Original-Maintainer: Juha Kellokoski <veitikka6@gmail.com>
+XSBC-Original-Maintainer: Mika Tapojarvi <mika.tapojarvi@sse.fi>
Build-Depends: debhelper (>= 4.0.0), libglib2.0-dev,
libgstreamer0.10-dev (>= 0.10.20-0maemo3),
libgstreamer-plugins-base0.10-dev (>= 0.10.20-0maemo5),
checkmore, gstreamer0.10-plugins-base,
gstreamer0.10-plugins-good,
libhal-dev, libtotem-plparser-dev, libpulse-dev (>= 0.9.15-1),
- libgconf2-dev, libosso-gnomevfs2-dev, hildon-control-panel-dev
+ libgconf2-dev, libosso-gnomevfs2-dev, mce-dev,
+ libdbus-1-dev, hildon-control-panel-dev
Standards-Version: 3.7.2
Homepage: http://mafwsubrenderer.garage.maemo.org/
Vcs-Browser: https://garage.maemo.org/plugins/ggit/browse.php/?p=mafwsubrenderer
Package: mafw-gst-subtitles-renderer
Section: libs
Architecture: any
-Depends: gconf2, ${shlibs:Depends}, ${misc:Depends}, gstreamer0.10-plugins-base-subtitles (= 0.10.25-0maemo7+0m5)
+Depends: gconf2, ${shlibs:Depends}, ${misc:Depends}, gstreamer0.10-plugins-base-subtitles (= 0.10.25-0maemo14+0m5-1)
Replaces: mafw-gst-renderer
Provides: mafw-gst-renderer
Description: MAFW gst renderer plugin with subtitles support
Package: mafw-gst-subtitles-applet
Section: user/multimedia
Architecture: any
-Depends: gconf2, ${shlibs:Depends}, ${misc:Depends}, mafw-gst-subtitles-renderer (= ${binary:Version})
+Depends: gconf2, ${shlibs:Depends}, ${misc:Depends}, mafw-gst-subtitles-renderer
Description: External subtitles support for Media Player
Subtitles font and encoding can be change via 'Settings: Subtitles'
control panel applet.
--- /dev/null
+usr/lib/mafw-plugin
+etc/X11/Xsession.post
\ No newline at end of file
--- /dev/null
+#!/bin/sh
+
+if test -x /usr/sbin/dsmetool; then
+ sudo /usr/bin/mafw.sh start mafw-gst-subtitles-renderer -7
+fi
#DEBHELPER#
-test -x /usr/bin/mafw.sh && /usr/bin/mafw.sh start mafw-gst-renderer -7 \
+test -x /usr/bin/mafw.sh && /usr/bin/mafw.sh start mafw-gst-subtitles-renderer -7 \
|| true;
+++ /dev/null
-#!/bin/sh
-
-if [ -f /usr/lib/mafw-plugin/mafw-gst-renderer.so.removed ]; then
- if [ ! -f /usr/lib/mafw-plugin/mafw-gst-renderer.so ]; then
- # Restore original MAFW GST renderer
- mv -f /usr/lib/mafw-plugin/mafw-gst-renderer.so.removed /usr/lib/mafw-plugin/mafw-gst-renderer.so
-
- # Restart MAFW, uninstalation of mafw-gst-subtitles-renderer
- if [ -x /usr/bin/mafw.sh ]; then
- /usr/bin/mafw.sh stop mafw-gst-renderer
- sleep 1
- /usr/bin/mafw.sh start mafw-gst-renderer
- fi
- fi
-fi
+++ /dev/null
-#!/bin/sh
-
-if [ ! -f /usr/lib/mafw-plugin/mafw-gst-renderer.so.removed ]; then
- # Backup original MAFW GST renderer
- mv -f /usr/lib/mafw-plugin/mafw-gst-renderer.so /usr/lib/mafw-plugin/mafw-gst-renderer.so.removed
-
- # Stop MAFW, instalation of mafw-gst-subtitles-renderer
- if [ -x /usr/bin/mafw.sh ]; then
- /usr/bin/mafw.sh stop mafw-gst-renderer
- sleep 1
- fi
-fi
#DEBHELPER#
-test -x /usr/bin/mafw.sh && /usr/bin/mafw.sh stop mafw-gst-renderer \
+test -x /usr/bin/mafw.sh && /usr/bin/mafw.sh stop mafw-gst-subtitles-renderer \
|| true;
dh_installchangelogs ChangeLog
dh_installdocs
dh_install --sourcedir=debian/tmp -v
+ install debian/mafw-gst-subtitles-renderer.mafw.xsession \
+ debian/mafw-gst-subtitles-renderer/etc/X11/Xsession.post/31mafw-gst-subtitles-renderer
dh_link
dh_strip --dbg-package=mafw-gst-subtitles-renderer
dh_compress
.PHONY: build clean binary-indep binary-arch binary install distcheck vg
-
#
# Copyright (C) 2007, 2008, 2009 Nokia. All rights reserved.
-plugin_LTLIBRARIES = mafw-gst-renderer.la
+plugin_LTLIBRARIES = mafw-gst-subtitles-renderer.la
BUILT_SOURCES = mafw-gst-renderer-marshal.c \
mafw-gst-renderer-marshal.h
-mafw_gst_renderer_la_SOURCES = $(BUILT_SOURCES) \
- blanking.c blanking.h \
- mafw-gst-renderer.c mafw-gst-renderer.h \
- mafw-gst-renderer-utils.c mafw-gst-renderer-utils.h \
- mafw-gst-renderer-worker.c mafw-gst-renderer-worker.h \
- mafw-gst-renderer-worker-volume.c mafw-gst-renderer-worker-volume.h \
- mafw-gst-renderer-state.c mafw-gst-renderer-state.h \
- mafw-gst-renderer-state-playing.c mafw-gst-renderer-state-playing.h \
- mafw-gst-renderer-state-paused.c mafw-gst-renderer-state-paused.h \
- mafw-gst-renderer-state-stopped.c mafw-gst-renderer-state-stopped.h \
- mafw-gst-renderer-state-transitioning.c mafw-gst-renderer-state-transitioning.h \
- mafw-playlist-iterator.c mafw-playlist-iterator.h
-
-mafw_gst_renderer_la_CPPFLAGS = $(DEPS_CFLAGS) $(VOLUME_CFLAGS) \
+mafw_gst_subtitles_renderer_la_SOURCES = $(BUILT_SOURCES) \
+ keypad.c keypad.h \
+ blanking.c blanking.h \
+ mafw-gst-renderer.c mafw-gst-renderer.h \
+ mafw-gst-renderer-utils.c mafw-gst-renderer-utils.h \
+ mafw-gst-renderer-worker.c mafw-gst-renderer-worker.h \
+ mafw-gst-renderer-worker-volume.c mafw-gst-renderer-worker-volume.h \
+ mafw-gst-renderer-state.c mafw-gst-renderer-state.h \
+ mafw-gst-renderer-state-playing.c mafw-gst-renderer-state-playing.h \
+ mafw-gst-renderer-state-paused.c mafw-gst-renderer-state-paused.h \
+ mafw-gst-renderer-state-stopped.c mafw-gst-renderer-state-stopped.h \
+ mafw-gst-renderer-state-transitioning.c mafw-gst-renderer-state-transitioning.h \
+ mafw-playlist-iterator.c mafw-playlist-iterator.h
+
+mafw_gst_subtitles_renderer_la_CPPFLAGS = $(DEPS_CFLAGS) $(VOLUME_CFLAGS) \
-DPREFIX=\"$(prefix)\" $(_CFLAGS)
-mafw_gst_renderer_la_LDFLAGS = -avoid-version -module $(_LDFLAGS)
-mafw_gst_renderer_la_LIBADD = $(DEPS_LIBS) $(VOLUME_LIBS) \
+mafw_gst_subtitles_renderer_la_LDFLAGS = -avoid-version -module $(_LDFLAGS)
+mafw_gst_subtitles_renderer_la_LIBADD = $(DEPS_LIBS) $(VOLUME_LIBS) \
-lgstinterfaces-0.10 -lgstpbutils-0.10
if HAVE_GDKPIXBUF
-mafw_gst_renderer_la_SOURCES += gstscreenshot.c gstscreenshot.h
-mafw_gst_renderer_la_CPPFLAGS += $(GDKPIXBUF_CFLAGS)
-mafw_gst_renderer_la_LIBADD += $(GDKPIXBUF_LIBS)
+mafw_gst_subtitles_renderer_la_SOURCES += gstscreenshot.c gstscreenshot.h
+mafw_gst_subtitles_renderer_la_CPPFLAGS += $(GDKPIXBUF_CFLAGS)
+mafw_gst_subtitles_renderer_la_LIBADD += $(GDKPIXBUF_LIBS)
endif
if HAVE_CONIC
-mafw_gst_renderer_la_CPPFLAGS += $(CONIC_CFLAGS)
-mafw_gst_renderer_la_LIBADD += $(CONIC_LIBS)
+mafw_gst_subtitles_renderer_la_CPPFLAGS += $(CONIC_CFLAGS)
+mafw_gst_subtitles_renderer_la_LIBADD += $(CONIC_LIBS)
endif
mafw-gst-renderer-marshal.c: mafw-gst-renderer-marshal.list
--- /dev/null
+/*
+ * This file is a part of MAFW
+ *
+ * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
+ *
+ * Contact: Visa Smolander <visa.smolander@nokia.com>
+ *
+ * This library 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; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include <glib.h>
+#include <mce/dbus-names.h>
+#include <dbus/dbus.h>
+#include "keypad.h"
+
+
+#define KEYPAD_TIMER_INTERVAL 50
+
+static guint toutid;
+
+void keypadlocking_allow(void)
+{
+ if (toutid)
+ {
+ g_source_remove(toutid);
+ toutid = 0;
+ }
+}
+
+static gboolean no_keylock_timeout(gpointer udata)
+{
+ static DBusMessage *msg = NULL;
+ static DBusConnection *sysbus = NULL;
+
+ if (!sysbus)
+ {
+ DBusError err;
+
+ dbus_error_init(&err);
+ sysbus = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
+ g_assert(sysbus);
+ g_assert(!dbus_error_is_set(&err));
+ }
+ if (!msg)
+ {
+ msg = dbus_message_new_method_call(MCE_SERVICE,
+ MCE_REQUEST_PATH, MCE_REQUEST_IF,
+ MCE_PREVENT_KEYPAD_OFF_REQ);
+ g_assert(msg);
+ }
+ g_assert(dbus_connection_send(sysbus, msg,NULL));
+ dbus_connection_flush(sysbus);
+ return TRUE;
+}
+
+void keypadlocking_prohibit(void)
+{
+ if (!toutid)
+ {
+ toutid = g_timeout_add_seconds(KEYPAD_TIMER_INTERVAL,
+ no_keylock_timeout,
+ NULL);
+ no_keylock_timeout(NULL);
+ }
+}
--- /dev/null
+/*
+ * This file is a part of MAFW
+ *
+ * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
+ *
+ * Contact: Visa Smolander <visa.smolander@nokia.com>
+ *
+ * This library 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; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+#ifndef KEYPAD_H
+#define KEYPAD_H
+
+G_BEGIN_DECLS
+
+void keypadlocking_prohibit(void);
+void keypadlocking_allow(void);
+
+G_END_DECLS
+
+#endif
--- /dev/null
+#include "mafw-gst-renderer-marshal.h"
+
+#include <glib-object.h>
+
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v) g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v) g_value_get_int (v)
+#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
+#define g_marshal_value_peek_long(v) g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
+#define g_marshal_value_peek_float(v) g_value_get_float (v)
+#define g_marshal_value_peek_double(v) g_value_get_double (v)
+#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v) g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v) g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ * Do not access GValues directly in your code. Instead, use the
+ * g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
+#define g_marshal_value_peek_char(v) (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v) (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v) (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v) (v)->data[0].v_float
+#define g_marshal_value_peek_double(v) (v)->data[0].v_double
+#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* VOID:BOOLEAN,UINT,INT,STRING (mafw-gst-renderer-marshal.list:2) */
+void
+mafw_gst_renderer_marshal_VOID__BOOLEAN_UINT_INT_STRING (GClosure *closure,
+ GValue *return_value G_GNUC_UNUSED,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint G_GNUC_UNUSED,
+ gpointer marshal_data)
+{
+ typedef void (*GMarshalFunc_VOID__BOOLEAN_UINT_INT_STRING) (gpointer data1,
+ gboolean arg_1,
+ guint arg_2,
+ gint arg_3,
+ gpointer arg_4,
+ gpointer data2);
+ register GMarshalFunc_VOID__BOOLEAN_UINT_INT_STRING callback;
+ register GCClosure *cc = (GCClosure*) closure;
+ register gpointer data1, data2;
+
+ g_return_if_fail (n_param_values == 5);
+
+ if (G_CCLOSURE_SWAP_DATA (closure))
+ {
+ data1 = closure->data;
+ data2 = g_value_peek_pointer (param_values + 0);
+ }
+ else
+ {
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+ }
+ callback = (GMarshalFunc_VOID__BOOLEAN_UINT_INT_STRING) (marshal_data ? marshal_data : cc->callback);
+
+ callback (data1,
+ g_marshal_value_peek_boolean (param_values + 1),
+ g_marshal_value_peek_uint (param_values + 2),
+ g_marshal_value_peek_int (param_values + 3),
+ g_marshal_value_peek_string (param_values + 4),
+ data2);
+}
+
--- /dev/null
+
+#ifndef __mafw_gst_renderer_marshal_MARSHAL_H__
+#define __mafw_gst_renderer_marshal_MARSHAL_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* VOID:BOOLEAN,UINT,INT,STRING (mafw-gst-renderer-marshal.list:2) */
+extern void mafw_gst_renderer_marshal_VOID__BOOLEAN_UINT_INT_STRING (GClosure *closure,
+ GValue *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data);
+
+G_END_DECLS
+
+#endif /* __mafw_gst_renderer_marshal_MARSHAL_H__ */
+
GError **error)
{
g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
- self->renderer->worker->stay_paused = FALSE;
+ self->renderer->worker->stay_paused = TRUE;
mafw_gst_renderer_state_do_goto_index(self, index, error);
}
played if that's been suggested with renderer->resume_playlist */
mode = mafw_gst_renderer_get_playback_mode(self->renderer);
if (clip_changed && mode == MAFW_GST_RENDERER_MODE_PLAYLIST) {
+ self->renderer->worker->stay_paused = TRUE;
mafw_gst_renderer_state_do_play(self, error);
}
}
/* Play the available uri(s) */
if (nuris == 1) {
- mafw_gst_renderer_worker_play(renderer->worker, uri);
+ mafw_gst_renderer_worker_play(renderer->worker, uri, NULL);
} else {
mafw_gst_renderer_worker_play_alternatives(
renderer->worker, uris);
if (_pa_operation_running(wvolume) ||
(wvolume->pending_operation &&
- (wvolume->pending_operation_volume != volume ||
- wvolume->pending_operation_mute != mute))) {
+ (wvolume->pending_operation_volume != volume
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
+ || wvolume->pending_operation_mute != mute
+#endif
+ ))) {
g_debug("volume notification, but operation running, ignoring");
return;
}
wvolume->user_data);
}
}
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
if (!wvolume->pending_operation &&
wvolume->pulse_mute != wvolume->current_mute) {
wvolume->current_mute = wvolume->pulse_mute;
wvolume->mute_user_data);
}
}
+#endif
wvolume->pending_operation = FALSE;
}
if (wvolume->pending_operation) {
g_debug("setting volume ignored as there is still a pending "
"operation. Waiting till next iteration");
- } else if (wvolume->pulse_mute != wvolume->current_mute ||
- wvolume->pulse_volume != wvolume->current_volume) {
+ } else if (wvolume->pulse_volume != wvolume->current_volume
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
+ || wvolume->pulse_mute != wvolume->current_mute
+#endif
+ ) {
info.name = MAFW_GST_RENDERER_WORKER_VOLUME_ROLE_PREFIX
MAFW_GST_RENDERER_WORKER_VOLUME_ROLE;
#include "mafw-gst-renderer-worker.h"
#include "mafw-gst-renderer-utils.h"
#include "blanking.h"
+#include "keypad.h"
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "mafw-gst-renderer-worker"
GST_TIME_AS_SECONDS((ns)):\
GST_TIME_AS_SECONDS((ns))+1)
+#define _current_metadata_add(worker, key, type, value) \
+ do { \
+ if (!worker->current_metadata) \
+ worker->current_metadata = mafw_metadata_new(); \
+ /* At first remove old value */ \
+ g_hash_table_remove(worker->current_metadata, key); \
+ mafw_metadata_add_something(worker->current_metadata, \
+ key, type, 1, value); \
+ } while (0)
+
/* Private variables. */
/* Global reference to worker instance, needed for Xerror handler */
static MafwGstRendererWorker *Global_worker = NULL;
static void _emit_metadatas(MafwGstRendererWorker *worker);
-static void _current_metadata_add(MafwGstRendererWorker *worker,
- const gchar *key, GType type,
- const gpointer value);
+/* Playlist parsing */
+static void _on_pl_entry_parsed(TotemPlParser *parser, gchar *uri,
+ gpointer metadata, GSList **plitems)
+{
+ if (uri != NULL) {
+ *plitems = g_slist_append(*plitems, g_strdup(uri));
+ }
+}
+static GSList *_parse_playlist(const gchar *uri)
+{
+ static TotemPlParser *pl_parser = NULL;
+ GSList *plitems = NULL;
+ gulong handler_id;
+ /* Initialize the playlist parser */
+ if (!pl_parser)
+ {
+ pl_parser = totem_pl_parser_new ();
+ g_object_set(pl_parser, "recurse", TRUE, "disable-unsafe",
+ TRUE, NULL);
+ }
+ handler_id = g_signal_connect(G_OBJECT(pl_parser), "entry-parsed",
+ G_CALLBACK(_on_pl_entry_parsed), &plitems);
+ /* Parsing */
+ if (totem_pl_parser_parse(pl_parser, uri, FALSE) !=
+ TOTEM_PL_PARSER_RESULT_SUCCESS) {
+ /* An error happens while parsing */
+
+ }
+ g_signal_handler_disconnect(pl_parser, handler_id);
+ return plitems;
+}
+
/*
* Sends @error to MafwGstRenderer. Only call this from the glib main thread, or
* face the consequences. @err is free'd.
/* Add the info to the current metadata. */
_current_metadata_add(sgd->worker, sgd->metadata_key,
G_TYPE_STRING,
- (const gpointer) filename);
+ (gchar*)filename);
/* Emit the metadata. */
mafw_renderer_emit_metadata_string(sgd->worker->owner,
NULL, sgd);
}
}
+ g_object_unref(loader);
}
}
}
static void _remove_ready_timeout(MafwGstRendererWorker *worker)
{
- g_debug("removing timeout for READY");
if (worker->ready_timeout != 0) {
+ g_debug("removing timeout for READY");
g_source_remove(worker->ready_timeout);
worker->ready_timeout = 0;
}
worker->media.fps = fps;
/* Add the info to the current metadata. */
- gint *p_width = g_new0(gint, 1);
- gint *p_height = g_new0(gint, 1);
- gdouble *p_fps = g_new0(gdouble, 1);
+ gint p_width, p_height, p_fps;
- *p_width = width;* p_height = height; *p_fps = fps;
+ p_width = width;
+ p_height = height;
+ p_fps = fps;
_current_metadata_add(worker, MAFW_METADATA_KEY_RES_X, G_TYPE_INT,
- (const gpointer) p_width);
+ p_width);
_current_metadata_add(worker, MAFW_METADATA_KEY_RES_Y, G_TYPE_INT,
- (const gpointer) p_height);
+ p_height);
_current_metadata_add(worker, MAFW_METADATA_KEY_VIDEO_FRAMERATE,
G_TYPE_DOUBLE,
- (const gpointer) p_fps);
-
- g_free(p_width); g_free(p_height); g_free(p_fps);
+ p_fps);
/* Emit the metadata.*/
g_idle_add((GSourceFunc)_emit_video_info, worker);
MAFW_RENDERER_ERROR,
MAFW_RENDERER_ERROR_PLAYBACK,
"No video window XID set"));
+ gst_message_unref (msg);
return GST_BUS_DROP;
} else {
g_debug ("Video window to use is: %x",
mafw_gst_renderer_worker_set_autopaint(
worker,
worker->autopaint);
- g_object_get(worker->vsink,
- "colorkey", &worker->colorkey, NULL);
+ if (worker->colorkey == -1)
+ g_object_get(worker->vsink,
+ "colorkey", &worker->colorkey, NULL);
+ else
+ mafw_gst_renderer_worker_set_colorkey(
+ worker,
+ worker->colorkey);
/* Defer the signal emission to the thread running the
* mainloop. */
if (worker->colorkey != -1) {
GST_OBJECT(worker->vsink),
gst_structure_empty_new("ckey")));
}
+ gst_message_unref (msg);
return GST_BUS_DROP;
}
+ /* do not unref message when returning PASS */
return GST_BUS_PASS;
}
gint duration_seconds = NSECONDS_TO_SECONDS(value);
if (!_seconds_duration_equal(worker->media.length_nanos,
- value)) {
- gint64 *duration = g_new0(gint64, 1);
- *duration = duration_seconds;
-
+ value)) {
/* Add the duration to the current metadata. */
- _current_metadata_add(worker,
- MAFW_METADATA_KEY_DURATION,
- G_TYPE_INT64,
- (const gpointer) duration);
-
+ _current_metadata_add(worker, MAFW_METADATA_KEY_DURATION,
+ G_TYPE_INT64,
+ (gint64)duration_seconds);
/* Emit the duration. */
mafw_renderer_emit_metadata_int64(
worker->owner, MAFW_METADATA_KEY_DURATION,
- *duration);
- g_free(duration);
+ (gint64)duration_seconds);
}
/* We compare this duration we just got with the
* source one and update it in the source if needed */
- if (duration_seconds != renderer->media->duration) {
+ if (duration_seconds > 0 &&
+ duration_seconds != renderer->media->duration) {
mafw_gst_renderer_update_source_duration(
renderer,
duration_seconds);
}
if (worker->media.seekable != seekable) {
- gboolean *is_seekable = g_new0(gboolean, 1);
- *is_seekable = (seekable == SEEKABILITY_SEEKABLE) ? TRUE : FALSE;
+ gboolean is_seekable = (seekable == SEEKABILITY_SEEKABLE);
/* Add the seekability to the current metadata. */
_current_metadata_add(worker, MAFW_METADATA_KEY_IS_SEEKABLE,
- G_TYPE_BOOLEAN, (const gpointer) is_seekable);
+ G_TYPE_BOOLEAN, is_seekable);
/* Emit. */
mafw_renderer_emit_metadata_boolean(
worker->owner, MAFW_METADATA_KEY_IS_SEEKABLE,
- *is_seekable);
-
- g_free(is_seekable);
+ is_seekable);
}
g_debug("media seekable: %d", seekable);
if (worker->media.has_visual_content) {
blanking_prohibit();
}
+ keypadlocking_prohibit();
/* Remove the ready timeout if we are playing [again] */
_remove_ready_timeout(worker);
/* If mode is redundant we are trying to play one of several
}
#endif
-
-
-static void _current_metadata_add(MafwGstRendererWorker *worker,
- const gchar *key, GType type,
- const gpointer value)
-{
- g_return_if_fail(value != NULL);
-
- if (!worker->current_metadata)
- worker->current_metadata = mafw_metadata_new();
-
- mafw_metadata_add_something(worker->current_metadata, key, type, 1, value);
-}
-
static GHashTable* _build_tagmap(void)
{
GHashTable *hash_table = NULL;
g_value_init(&utf8gval, G_TYPE_STRING);
g_value_take_string(&utf8gval, utf8);
- _current_metadata_add(worker, mafwtag, G_TYPE_VALUE,
- (const gpointer) &utf8gval);
+ _current_metadata_add(worker, mafwtag, G_TYPE_STRING,
+ utf8);
g_value_array_append(values, &utf8gval);
g_value_unset(&utf8gval);
}
g_free(orig);
} else if (type == G_TYPE_UINT) {
GValue intgval = {0};
+ gint intval;
g_value_init(&intgval, G_TYPE_INT);
g_value_transform(v, &intgval);
- _current_metadata_add(worker, mafwtag, G_TYPE_VALUE,
- (const gpointer) &intgval);
+ intval = g_value_get_int(&intgval);
+ _current_metadata_add(worker, mafwtag, G_TYPE_INT,
+ intval);
g_value_array_append(values, &intgval);
g_value_unset(&intgval);
} else {
_current_metadata_add(worker, mafwtag, G_TYPE_VALUE,
- (const gpointer) v);
+ v);
g_value_array_append(values, v);
}
}
/* No state management needed for live pipelines */
if (!worker->is_live) {
worker->buffering = TRUE;
- if (worker->state == GST_STATE_PLAYING) {
+ if (percent < 100 && worker->state == GST_STATE_PLAYING) {
g_debug("setting pipeline to PAUSED not to wolf the "
"buffer down");
worker->report_statechanges = FALSE;
the state change, since in
_handle_state_changed we do not do anything
if we are buffering */
+
+ /* Set the pipeline to playing. This is an async
+ handler, it could be, that the reported state
+ is not the real-current state */
+ if (gst_element_set_state(
+ worker->pipeline,
+ GST_STATE_PLAYING) ==
+ GST_STATE_CHANGE_ASYNC)
+ {
+ /* XXX this blocks at most 2 seconds. */
+ gst_element_get_state(
+ worker->pipeline, NULL, NULL,
+ 2 * GST_SECOND);
+ }
if (worker->report_statechanges &&
worker->notify_play_handler) {
worker->notify_play_handler(
}
if (worker->mode == WORKER_MODE_SINGLE_PLAY) {
+ if (err->domain == GST_STREAM_ERROR &&
+ err->code == GST_STREAM_ERROR_WRONG_TYPE)
+ {/* Maybe it is a playlist? */
+ GSList *plitems = _parse_playlist(worker->media.location);
+
+ if (plitems)
+ {/* Yes, it is a plitem */
+ g_error_free(err);
+ mafw_gst_renderer_worker_play(worker, NULL, plitems);
+ break;
+ }
+
+
+ }
_send_error(worker, err);
}
}
&value);
}
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
+
static void _mute_cb(MafwGstRendererWorkerVolume *wvolume, gboolean mute,
gpointer data)
{
&value);
}
+#endif
+
/* TODO: I think it's not enought to act on error, we need to handle
* DestroyNotify on the given window ourselves, because for example helixbin
* does it and silently stops the decoder thread. But it doesn't notify
/* These need a modified version of playbin. */
g_object_set(G_OBJECT(worker->pipeline),
- "nw-queue", use_nw, NULL);
- g_object_set(G_OBJECT(worker->pipeline),
- "no-video-transform", TRUE, NULL);
+ "nw-queue", use_nw,
+ "no-video-transform", TRUE,
+ NULL);
}
}
G_CALLBACK(_stream_info_cb), worker);
#ifndef MAFW_GST_RENDERER_DISABLE_PULSE_VOLUME
- g_object_set(worker->pipeline, "flags", 103, NULL);
+
/* Set audio and video sinks ourselves. We create and configure
them only once. */
g_assert_not_reached();
}
gst_object_ref(worker->asink);
- g_object_set(worker->asink, "buffer-time",
- (gint64) MAFW_GST_BUFFER_TIME, NULL);
- g_object_set(worker->asink, "latency-time",
- (gint64) MAFW_GST_LATENCY_TIME, NULL);
+ g_object_set(worker->asink,
+ "buffer-time", (gint64) MAFW_GST_BUFFER_TIME,
+ "latency-time", (gint64) MAFW_GST_LATENCY_TIME,
+ NULL);
}
g_object_set(worker->pipeline, "audio-sink", worker->asink, NULL);
#endif
g_assert_not_reached();
}
gst_object_ref(worker->vsink);
- g_object_set(G_OBJECT(worker->vsink), "handle-events",
- TRUE, NULL);
- g_object_set(worker->vsink, "force-aspect-ratio",
- TRUE, NULL);
- }
- g_object_set(worker->pipeline, "video-sink", worker->vsink, NULL);
+ g_object_set(G_OBJECT(worker->vsink),
+ "handle-events", TRUE,
+ "force-aspect-ratio", TRUE,
+ NULL);
+ }
+ g_object_set(worker->pipeline,
+ "video-sink", worker->vsink,
+ "flags", 103,
+ NULL);
if (!worker->tsink) {
worker->tsink = gst_element_factory_make("textoverlay", NULL);
worker->autopaint = autopaint;
if (worker->vsink)
g_object_set(worker->vsink, "autopaint-colorkey",
- autopaint, NULL);
+ worker->autopaint, NULL);
}
gint mafw_gst_renderer_worker_get_colorkey(
return worker->colorkey;
}
+void mafw_gst_renderer_worker_set_colorkey(
+ MafwGstRendererWorker *worker, gint colorkey)
+{
+ worker->colorkey = colorkey;
+ if (worker->vsink)
+ g_object_set(worker->vsink, "colorkey",
+ worker->colorkey, NULL);
+}
+
gboolean mafw_gst_renderer_worker_get_seekable(MafwGstRendererWorker *worker)
{
return worker->media.seekable;
_start_play(worker);
}
-static void _on_pl_entry_parsed(TotemPlParser *parser, gchar *uri,
- gpointer metadata, gpointer user_data)
-{
- MafwGstRendererWorker *worker = user_data;
-
- if (uri != NULL) {
- worker->pl.items =
- g_slist_append(worker->pl.items, g_strdup(uri));
- }
-}
-
static void _do_play(MafwGstRendererWorker *worker)
{
g_assert(worker != NULL);
}
void mafw_gst_renderer_worker_play(MafwGstRendererWorker *worker,
- const gchar *uri)
+ const gchar *uri, GSList *plitems)
{
- g_assert(uri);
+ g_assert(uri || plitems);
mafw_gst_renderer_worker_stop(worker);
_reset_media_info(worker);
_reset_pl_info(worker);
/* Check if the item to play is a single item or a playlist. */
- if (uri_is_playlist(uri)){
+ if (plitems || uri_is_playlist(uri)){
+ gchar *item;
/* In case of a playlist we parse it and start playing the first
item of the playlist. */
- TotemPlParser *pl_parser;
- gchar *item;
-
- /* Initialize the playlist parser */
- pl_parser = totem_pl_parser_new ();
- g_object_set(pl_parser, "recurse", TRUE, "disable-unsafe",
- TRUE, NULL);
- g_signal_connect(G_OBJECT(pl_parser), "entry-parsed",
- G_CALLBACK(_on_pl_entry_parsed), worker);
-
- /* Parsing */
- if (totem_pl_parser_parse(pl_parser, uri, FALSE) !=
- TOTEM_PL_PARSER_RESULT_SUCCESS) {
- /* An error happens while parsing */
- _send_error(worker,
- g_error_new(MAFW_RENDERER_ERROR,
- MAFW_RENDERER_ERROR_PLAYLIST_PARSING,
- "Playlist parsing failed: %s",
- uri));
- return;
+ if (plitems)
+ {
+ worker->pl.items = plitems;
}
-
- if (!worker->pl.items) {
- /* The playlist is empty */
+ else
+ {
+ worker->pl.items = _parse_playlist(uri);
+ }
+ if (!worker->pl.items)
+ {
_send_error(worker,
- g_error_new(MAFW_RENDERER_ERROR,
- MAFW_RENDERER_ERROR_PLAYLIST_PARSING,
- "The playlist %s is empty.",
- uri));
+ g_error_new(MAFW_RENDERER_ERROR,
+ MAFW_RENDERER_ERROR_PLAYLIST_PARSING,
+ "Playlist parsing failed: %s",
+ uri));
return;
}
worker->pl.current = 0;
item = (gchar *) g_slist_nth_data(worker->pl.items, 0);
worker->media.location = g_strdup(item);
-
- /* Free the playlist parser */
- g_object_unref(pl_parser);
} else {
/* Single item. Set the playback mode according to that */
worker->mode = WORKER_MODE_SINGLE_PLAY;
/* We are not playing, so we can let the screen blank */
blanking_allow();
+ keypadlocking_allow();
/* And now get a fresh pipeline ready */
_construct_pipeline(worker);
2 * GST_SECOND);
}
blanking_allow();
+ keypadlocking_allow();
}
}
volume = mafw_gst_renderer_worker_volume_get(wvolume);
mute = mafw_gst_renderer_worker_volume_is_muted(wvolume);
_volume_cb(wvolume, volume, worker);
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
_mute_cb(wvolume, mute, worker);
+#endif
}
MafwGstRendererWorker *mafw_gst_renderer_worker_new(gpointer owner)
mafw_gst_renderer_worker_volume_init(main_context,
_volume_init_cb, worker,
_volume_cb, worker,
- _mute_cb, worker);
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
+ _mute_cb,
+#else
+ NULL,
+#endif
+ worker);
blanking_init();
_construct_pipeline(worker);
gboolean mafw_gst_renderer_worker_get_autopaint(MafwGstRendererWorker *worker);
void mafw_gst_renderer_worker_set_autopaint(MafwGstRendererWorker *worker, gboolean autopaint);
gint mafw_gst_renderer_worker_get_colorkey(MafwGstRendererWorker *worker);
+void mafw_gst_renderer_worker_set_colorkey(MafwGstRendererWorker *worker, gint autopaint);
gboolean mafw_gst_renderer_worker_get_seekable(MafwGstRendererWorker *worker);
GHashTable *mafw_gst_renderer_worker_get_current_metadata(MafwGstRendererWorker *worker);
-void mafw_gst_renderer_worker_play(MafwGstRendererWorker *worker, const gchar *uri);
+void mafw_gst_renderer_worker_play(MafwGstRendererWorker *worker, const gchar *uri, GSList *plitems);
void mafw_gst_renderer_worker_play_alternatives(MafwGstRendererWorker *worker, gchar **uris);
void mafw_gst_renderer_worker_stop(MafwGstRendererWorker *worker);
void mafw_gst_renderer_worker_pause(MafwGstRendererWorker *worker);
* Registers the plugin descriptor making this plugin available to the
* framework and applications
*/
-G_MODULE_EXPORT MafwPluginDescriptor mafw_gst_renderer_plugin_description = {
+G_MODULE_EXPORT MafwPluginDescriptor mafw_gst_subtitles_renderer_plugin_description = {
{ .name = MAFW_GST_RENDERER_PLUGIN_NAME },
.initialize = mafw_gst_renderer_initialize,
.deinitialize = mafw_gst_renderer_deinitialize,
GObjectClass *gclass = NULL;
MafwRendererClass *renderer_class = NULL;
const gchar *preloaded_plugins[] = {"playback", "uridecodebin",
- "coreelements", "typefindfunctions", "omx", "selector",
- "autodetect", "pulseaudio", "audioconvert", "audioresample",
- "xvimagesink", "ffmpegcolorspace", "videoscale", NULL};
+ "coreelements", "typefindfunctions", "dsp",
+ "pulseaudio", "xvimagesink", NULL};
gint i = 0;
GObject *plugin;
g_return_if_fail(renderer != NULL);
mafw_extension_add_property(MAFW_EXTENSION(self), "volume", G_TYPE_UINT);
+#ifdef MAFW_GST_RENDERER_ENABLE_MUTE
mafw_extension_add_property(MAFW_EXTENSION(self), "mute", G_TYPE_BOOLEAN);
+#endif
mafw_extension_add_property(MAFW_EXTENSION(self), "xid", G_TYPE_UINT);
mafw_extension_add_property(MAFW_EXTENSION(self), "error-policy", G_TYPE_UINT);
MAFW_EXTENSION_SUPPORTS_AUTOPAINT(self);
renderer->worker,
g_value_get_boolean(value));
}
+ else if (!strcmp(key, MAFW_PROPERTY_RENDERER_COLORKEY)) {
+ mafw_gst_renderer_worker_set_colorkey(
+ renderer->worker,
+ g_value_get_int(value));
+ }
#ifdef HAVE_GDKPIXBUF
else if (!strcmp(key,
MAFW_PROPERTY_GST_RENDERER_CURRENT_FRAME_ON_PAUSE)) {