Added qmafw-gst-subtitles-renderer-0.0.55 for Meego Harmattan 1.2
[mafwsubrenderer] / qmafw-gst-subtitles-renderer / inc / mafw-gst-renderer-worker.h
diff --git a/qmafw-gst-subtitles-renderer/inc/mafw-gst-renderer-worker.h b/qmafw-gst-subtitles-renderer/inc/mafw-gst-renderer-worker.h
new file mode 100644 (file)
index 0000000..592b67f
--- /dev/null
@@ -0,0 +1,382 @@
+/*
+ * 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 MAFW_GST_RENDERER_WORKER_H
+#define MAFW_GST_RENDERER_WORKER_H
+
+#include <glib.h>
+G_BEGIN_DECLS
+#include <X11/Xdefs.h>
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include "mafw-gst-renderer-seeker.h"
+
+#define MAFW_GST_RENDERER_WORKER_READY_TIMEOUT 3
+#define MAFW_GST_RENDERER_MAX_TMP_FILES 5
+
+enum {
+    WORKER_ERROR_PLAYBACK,
+    WORKER_ERROR_VIDEO_CODEC_NOT_FOUND,
+    WORKER_ERROR_AUDIO_CODEC_NOT_FOUND,
+    WORKER_ERROR_CODEC_NOT_FOUND,
+    WORKER_ERROR_UNSUPPORTED_TYPE,
+    WORKER_ERROR_UNABLE_TO_PERFORM,
+    WORKER_ERROR_CANNOT_SET_POSITION,
+    WORKER_ERROR_PLAYLIST_PARSING,
+    WORKER_ERROR_DRM_NO_LICENSE,
+    WORKER_ERROR_DRM_NOT_ALLOWED,
+    WORKER_ERROR_DRM_CLOCK_NOT_SET,
+    WORKER_ERROR_DRM_OTHER,
+    WORKER_ERROR_STREAM_DISCONNECTED,
+    WORKER_ERROR_INVALID_URI,
+    WORKER_ERROR_MEDIA_NOT_FOUND,
+    WORKER_ERROR_CORRUPTED_FILE,
+    WORKER_ERROR_TYPE_NOT_AVAILABLE,
+    WORKER_ERROR_UNKOWN,
+    WORKER_ERROR_POSSIBLY_PLAYLIST_TYPE = 1000,
+};
+
+enum {
+    WORKER_METADATA_KEY_TITLE = 1, /* 1st must be non-zero! */
+    WORKER_METADATA_KEY_ARTIST,
+    WORKER_METADATA_KEY_AUDIO_CODEC,
+    WORKER_METADATA_KEY_VIDEO_CODEC,
+    WORKER_METADATA_KEY_BITRATE,
+    WORKER_METADATA_KEY_ENCODING,
+    WORKER_METADATA_KEY_ALBUM,
+    WORKER_METADATA_KEY_GENRE,
+    WORKER_METADATA_KEY_TRACK,
+    WORKER_METADATA_KEY_ORGANIZATION,
+    WORKER_METADATA_KEY_RENDERER_ART_URI,
+    WORKER_METADATA_KEY_RES_X,
+    WORKER_METADATA_KEY_RES_Y,
+    WORKER_METADATA_KEY_VIDEO_FRAMERATE,
+    WORKER_METADATA_KEY_DURATION,
+    WORKER_METADATA_KEY_IS_SEEKABLE,
+    WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI,
+    WORKER_METADATA_KEY_URI
+};
+
+enum {
+    WORKER_PROPERTY_VOLUME,
+    WORKER_PROPERTY_MUTE,
+    WORKER_PROPERTY_AUTOPAINT,
+    WORKER_PROPERTY_COLORKEY,
+    WORKER_PROPERTY_XID,
+    WORKER_PROPERTY_RENDER_RECTANGLE,
+    WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE,
+    WORKER_PROPERTY_PLAYBACK_SPEED,
+    WORKER_PROPERTY_FORCE_ASPECT_RATIO
+};
+
+enum {
+    WORKER_OUTPUT_NULL,
+    WORKER_OUTPUT_BUILTIN_SPEAKERS,
+    WORKER_OUTPUT_FM_RADIO,
+    WORKER_OUTPUT_BLUETOOTH_AUDIO,
+    WORKER_OUTPUT_HEADPHONE_JACK,
+    WORKER_OUTPUT_BUILTIN_DISPLAY,
+    WORKER_OUTPUT_TVOUT
+};
+
+typedef struct _MafwGstRendererWorker MafwGstRendererWorker;
+
+typedef void (*MafwGstRendererWorkerNotifySeekCb)(MafwGstRendererWorker *worker, gpointer owner);
+typedef void (*MafwGstRendererWorkerNotifyPauseCb)(MafwGstRendererWorker *worker, gpointer owner);
+typedef void (*MafwGstRendererWorkerNotifyPlayCb)(MafwGstRendererWorker *worker, gpointer owner);
+typedef void (*MafwGstRendererWorkerNotifyReadyStateCb)(MafwGstRendererWorker *worker, gpointer owner);
+typedef void (*MafwGstRendererWorkerNotifyBufferStatusCb)(MafwGstRendererWorker *worker, gpointer owner, gdouble percent);
+typedef void (*MafwGstRendererWorkerNotifyEOSCb)(MafwGstRendererWorker *worker, gpointer owner);
+typedef void (*MafwGstRendererWorkerNotifyMetadataCb)(MafwGstRendererWorker *worker, gpointer owner, gint key, GType type, gpointer value);
+typedef void (*MafwGstRendererWorkerNotifyErrorCb)(MafwGstRendererWorker *worker, gpointer owner, const GError *error);
+typedef void (*MafwGstRendererWorkerNotifyPropertyCb)(MafwGstRendererWorker *worker, gpointer owner, gint id, GValue *value);
+typedef void (*MafwGstRendererWorkerBlankingControlCb)(MafwGstRendererWorker *worker, gpointer owner, gboolean prohibit);
+typedef void (*MafwGstRendererWorkerScreenshotCb)(MafwGstRendererWorker *worker, gpointer owner, GstBuffer *buffer, const char *filename, gboolean cancel);
+
+typedef enum {
+    SEEKABILITY_UNKNOWN = -1,
+    SEEKABILITY_NO_SEEKABLE,
+    SEEKABILITY_SEEKABLE,
+} SeekabilityType;
+
+typedef enum {
+    DURATION_UNQUERIED = -2,
+    DURATION_INDEFINITE = -1
+    /* other values are actual */
+} Duration;
+
+typedef struct {
+    gint x;
+    gint y;
+    gint width;
+    gint height;
+} render_rectangle;
+
+/* This struct contains all configurable settings
+   update this and the conf file synchronously, plz
+ */
+typedef struct {
+    /* pipeline */
+    gchar *asink;
+    gchar *vsink;
+    gint flags;
+    gint64 buffer_time;
+    gint64 latency_time;
+    gboolean autoload_subtitles;
+    gchar *subtitle_encoding;
+    gchar *subtitle_font;
+
+    /* timers */
+    guint milliseconds_to_pause_frame;
+    guint seconds_to_pause_to_ready;
+
+    /* dhmmixer */
+    gboolean use_dhmmixer;
+    struct {
+        guint state;
+        gint room;
+        gint color;
+    } mobile_surround_music;
+    struct {
+        guint state;
+        gint room;
+        gint color;
+    } mobile_surround_video;
+} configuration;
+
+/*
+ * media:        Information about currently selected media.
+ *   location:           Current media location
+ *   length_nanos:       Length of the media, in nanoseconds
+ *   has_visual_content: the clip contains some visual content (video)
+ *   video_width:        If media contains video, this tells the video width
+ *   video_height:       If media contains video, this tells the video height
+ *   seekable:           Tells whether the media can be seeked
+ *   par_n:              Video pixel aspect ratio numerator
+ *   par_d:              Video pixel aspect ratio denominator
+ * owner:        Owner of the worker; usually a MafwGstRenderer (FIXME USUALLY?)
+ * pipeline:     Playback pipeline
+ * bus:          Message bus
+ * state:        Current playback pipeline state
+ * is_stream:    Is currently playing media a stream
+ * muted:        Is the audio muted
+ * eos:          Has playback reached EOS already
+ * is_error:     Has there been an error situation
+ * buffering:    Indicates the buffering state
+ * prerolling:   Indicates the prerolling state (NULL -> PAUSED)
+ * report_statechanges: Report state change bus messages
+ * current_volume:      Current audio volume [0.0 .. 1.0], see playbin:volume
+ * async_bus_id:        ID handle for GstBus
+ * buffer_probe_id:     ID of the video renderer buffer probe
+ * seek_position:       Indicates the pos where to seek, in seconds
+ * vsink:               Video sink element of the pipeline
+ * asink:               Audio sink element of the pipeline
+ * tsink:               Text sink element of the pipeline
+ * xid:                 XID for video playback
+ * current_frame_on_pause: whether to emit current frame when pausing
+ */
+struct _MafwGstRendererWorker {
+    struct {
+        gchar *location;
+        gint64 length_nanos;
+        gboolean has_visual_content;
+        gint video_width;
+        gint video_height;
+        gdouble fps;
+        SeekabilityType seekable;
+        gint par_n;
+        gint par_d;
+    } media;
+    gpointer owner;
+    GstElement *pipeline;
+
+    // Audio bin for Dolby Headphones Mobile plugin
+    GstElement *audiobin;
+
+    GstBus *bus;
+    /* GStreamer state we are considering right now */
+    GstState state;
+    gboolean is_stream;
+    gboolean muted;
+    /* we are handing eos or we did */
+    gboolean eos;
+    /* if we are handling (or handled) and error */
+    gboolean is_error;
+    /* pipeline is buffering */
+    gboolean buffering;
+    /* pipeline is prerolling */
+    gboolean prerolling;
+    /* stream is live and doesn't need prerolling */
+    gboolean is_live;
+    /* if we have to stay in paused though a do_play was
+     * requested. Usually used when pausing in transitioning */
+    gboolean stay_paused;
+    /* this variable should be FALSE while we are hiding state
+     * changed to the UI. This is that GStreamer can perform
+     * state_changes without us requiring it, for example, then
+     * seeking, buffering and so on and we have to hide those
+     * changes */
+    gboolean report_statechanges;
+    guint async_bus_id;
+    gint seek_position;
+    guint ready_timeout;
+    guint duration_seek_timeout;
+    guint duration_seek_timeout_loop_count;
+    /* TRUE when a transition to GST_STATE_READY has been
+     * requested or we are actually in GST_STATE_READY (requested
+     * by us) */
+    gboolean in_ready;
+    /* Flag indicating whether taking image from pause frame has succeed after pause. */
+    gboolean pause_frame_taken;
+    guint pause_frame_timeout;
+    GstBuffer *pause_frame_buffer;
+    GstElement *vsink;
+    GstElement *asink;
+    GstElement *tsink;
+
+    // Dolby Headphones Mobile mixer
+    GstElement *amixer;
+
+    XID xid;
+    render_rectangle x_overlay_rectangle;
+    gboolean autopaint;
+    gfloat playback_speed;
+    gboolean force_aspect_ratio;
+    gint colorkey;
+    GPtrArray *tag_list;
+    GHashTable *current_metadata;
+    gpointer context_nowplaying;
+
+    gboolean current_frame_on_pause;
+    gboolean taking_screenshot;
+    gchar *tmp_files_pool[MAFW_GST_RENDERER_MAX_TMP_FILES];
+    guint8 tmp_files_pool_index;
+
+    GSList *destinations;
+
+    GstElement *queue;
+
+    configuration *config;
+
+    MafwGstRendererSeeker *seeker;
+
+    /* Handlers for notifications */
+    MafwGstRendererWorkerNotifySeekCb notify_seek_handler;
+    MafwGstRendererWorkerNotifyPauseCb notify_pause_handler;
+    MafwGstRendererWorkerNotifyPlayCb notify_play_handler;
+    MafwGstRendererWorkerNotifyBufferStatusCb notify_buffer_status_handler;
+    MafwGstRendererWorkerNotifyEOSCb notify_eos_handler;
+    MafwGstRendererWorkerNotifyReadyStateCb notify_ready_state_handler;
+    MafwGstRendererWorkerNotifyMetadataCb notify_metadata_handler;
+    MafwGstRendererWorkerNotifyErrorCb notify_error_handler;
+    MafwGstRendererWorkerNotifyPropertyCb notify_property_handler;
+
+    MafwGstRendererWorkerBlankingControlCb blanking__control_handler;
+    MafwGstRendererWorkerScreenshotCb screenshot_handler;
+};
+
+
+MafwGstRendererWorker *mafw_gst_renderer_worker_new(gpointer owner);
+
+void mafw_gst_renderer_worker_exit(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_set_current_frame_on_pause(
+    MafwGstRendererWorker *worker,
+    gboolean current_frame_on_pause);
+
+void mafw_gst_renderer_worker_set_ready_timeout(MafwGstRendererWorker *worker,
+                                                guint seconds);
+
+gboolean mafw_gst_renderer_worker_get_current_frame_on_pause(
+    MafwGstRendererWorker *worker);
+
+configuration* mafw_gst_renderer_worker_create_default_configuration(MafwGstRendererWorker *worker);
+void mafw_gst_renderer_worker_set_configuration(MafwGstRendererWorker *worker,
+                                                configuration *config);
+
+void mafw_gst_renderer_worker_set_position(MafwGstRendererWorker *worker,
+                                           GstSeekType seek_type,
+                                           gint position,
+                                           GError **error);
+
+gint mafw_gst_renderer_worker_get_position(MafwGstRendererWorker *worker);
+
+gint64 mafw_gst_renderer_worker_get_last_known_duration(MafwGstRendererWorker *worker);
+gint64 mafw_gst_renderer_worker_get_duration(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_set_xid(MafwGstRendererWorker *worker, XID xid);
+
+XID mafw_gst_renderer_worker_get_xid(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_set_render_rectangle(MafwGstRendererWorker *worker, render_rectangle *rect);
+const render_rectangle* mafw_gst_renderer_worker_get_render_rectangle(MafwGstRendererWorker *worker);
+
+gboolean mafw_gst_renderer_worker_get_autopaint(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_set_autopaint(MafwGstRendererWorker *worker,
+                                            gboolean autopaint);
+
+gboolean mafw_gst_renderer_worker_set_playback_speed(MafwGstRendererWorker *worker, gfloat speed);
+
+gfloat mafw_gst_renderer_worker_get_playback_speed(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_set_force_aspect_ratio(MafwGstRendererWorker *worker, gboolean force);
+
+gboolean mafw_gst_renderer_worker_get_force_aspect_ratio(MafwGstRendererWorker *worker);
+
+gint mafw_gst_renderer_worker_get_colorkey(MafwGstRendererWorker *worker);
+
+gboolean mafw_gst_renderer_worker_get_seekable(MafwGstRendererWorker *worker);
+
+gboolean mafw_gst_renderer_worker_get_streaming(MafwGstRendererWorker *worker);
+
+const char* mafw_gst_renderer_worker_get_uri(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_stop(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_pause(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_resume(MafwGstRendererWorker *worker);
+
+void mafw_gst_renderer_worker_pause_at(MafwGstRendererWorker *worker, guint position);
+
+guint check_dolby_audioroute(MafwGstRendererWorker *worker, guint prop);
+
+void set_dolby_music_property(MafwGstRendererWorker *worker, guint prop);
+void set_dolby_music_sound_property(MafwGstRendererWorker *worker, gint prop, gboolean isRoomProperty);
+
+void set_dolby_video_property(MafwGstRendererWorker *worker, guint prop);
+void set_dolby_video_sound_property(MafwGstRendererWorker *worker, gint prop, gboolean isRoomProperty);
+
+void mafw_gst_renderer_worker_notify_media_destination(MafwGstRendererWorker *worker,
+                                                       GSList *destinations);
+
+G_END_DECLS
+#endif