2 * This file is a part of MAFW
4 * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
6 * Contact: Visa Smolander <visa.smolander@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 #ifndef MAFW_GST_RENDERER_WORKER_H
25 #define MAFW_GST_RENDERER_WORKER_H
29 #include <X11/Xdefs.h>
30 #include <glib-object.h>
33 #include "mafw-gst-renderer-seeker.h"
35 #define MAFW_GST_RENDERER_WORKER_READY_TIMEOUT 3
36 #define MAFW_GST_RENDERER_MAX_TMP_FILES 5
39 WORKER_ERROR_PLAYBACK,
40 WORKER_ERROR_VIDEO_CODEC_NOT_FOUND,
41 WORKER_ERROR_AUDIO_CODEC_NOT_FOUND,
42 WORKER_ERROR_CODEC_NOT_FOUND,
43 WORKER_ERROR_UNSUPPORTED_TYPE,
44 WORKER_ERROR_UNABLE_TO_PERFORM,
45 WORKER_ERROR_CANNOT_SET_POSITION,
46 WORKER_ERROR_PLAYLIST_PARSING,
47 WORKER_ERROR_DRM_NO_LICENSE,
48 WORKER_ERROR_DRM_NOT_ALLOWED,
49 WORKER_ERROR_DRM_CLOCK_NOT_SET,
50 WORKER_ERROR_DRM_OTHER,
51 WORKER_ERROR_STREAM_DISCONNECTED,
52 WORKER_ERROR_INVALID_URI,
53 WORKER_ERROR_MEDIA_NOT_FOUND,
54 WORKER_ERROR_CORRUPTED_FILE,
55 WORKER_ERROR_TYPE_NOT_AVAILABLE,
57 WORKER_ERROR_POSSIBLY_PLAYLIST_TYPE = 1000,
61 WORKER_METADATA_KEY_TITLE = 1, /* 1st must be non-zero! */
62 WORKER_METADATA_KEY_ARTIST,
63 WORKER_METADATA_KEY_AUDIO_CODEC,
64 WORKER_METADATA_KEY_VIDEO_CODEC,
65 WORKER_METADATA_KEY_BITRATE,
66 WORKER_METADATA_KEY_ENCODING,
67 WORKER_METADATA_KEY_ALBUM,
68 WORKER_METADATA_KEY_GENRE,
69 WORKER_METADATA_KEY_TRACK,
70 WORKER_METADATA_KEY_ORGANIZATION,
71 WORKER_METADATA_KEY_RENDERER_ART_URI,
72 WORKER_METADATA_KEY_RES_X,
73 WORKER_METADATA_KEY_RES_Y,
74 WORKER_METADATA_KEY_VIDEO_FRAMERATE,
75 WORKER_METADATA_KEY_DURATION,
76 WORKER_METADATA_KEY_IS_SEEKABLE,
77 WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI,
78 WORKER_METADATA_KEY_URI
82 WORKER_PROPERTY_VOLUME,
84 WORKER_PROPERTY_AUTOPAINT,
85 WORKER_PROPERTY_COLORKEY,
87 WORKER_PROPERTY_RENDER_RECTANGLE,
88 WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE,
89 WORKER_PROPERTY_PLAYBACK_SPEED,
90 WORKER_PROPERTY_FORCE_ASPECT_RATIO
95 WORKER_OUTPUT_BUILTIN_SPEAKERS,
96 WORKER_OUTPUT_FM_RADIO,
97 WORKER_OUTPUT_BLUETOOTH_AUDIO,
98 WORKER_OUTPUT_HEADPHONE_JACK,
99 WORKER_OUTPUT_BUILTIN_DISPLAY,
103 typedef struct _MafwGstRendererWorker MafwGstRendererWorker;
105 typedef void (*MafwGstRendererWorkerNotifySeekCb)(MafwGstRendererWorker *worker, gpointer owner);
106 typedef void (*MafwGstRendererWorkerNotifyPauseCb)(MafwGstRendererWorker *worker, gpointer owner);
107 typedef void (*MafwGstRendererWorkerNotifyPlayCb)(MafwGstRendererWorker *worker, gpointer owner);
108 typedef void (*MafwGstRendererWorkerNotifyReadyStateCb)(MafwGstRendererWorker *worker, gpointer owner);
109 typedef void (*MafwGstRendererWorkerNotifyBufferStatusCb)(MafwGstRendererWorker *worker, gpointer owner, gdouble percent);
110 typedef void (*MafwGstRendererWorkerNotifyEOSCb)(MafwGstRendererWorker *worker, gpointer owner);
111 typedef void (*MafwGstRendererWorkerNotifyMetadataCb)(MafwGstRendererWorker *worker, gpointer owner, gint key, GType type, gpointer value);
112 typedef void (*MafwGstRendererWorkerNotifyErrorCb)(MafwGstRendererWorker *worker, gpointer owner, const GError *error);
113 typedef void (*MafwGstRendererWorkerNotifyPropertyCb)(MafwGstRendererWorker *worker, gpointer owner, gint id, GValue *value);
114 typedef void (*MafwGstRendererWorkerBlankingControlCb)(MafwGstRendererWorker *worker, gpointer owner, gboolean prohibit);
115 typedef void (*MafwGstRendererWorkerScreenshotCb)(MafwGstRendererWorker *worker, gpointer owner, GstBuffer *buffer, const char *filename, gboolean cancel);
118 SEEKABILITY_UNKNOWN = -1,
119 SEEKABILITY_NO_SEEKABLE,
120 SEEKABILITY_SEEKABLE,
124 DURATION_UNQUERIED = -2,
125 DURATION_INDEFINITE = -1
126 /* other values are actual */
136 /* This struct contains all configurable settings
137 update this and the conf file synchronously, plz
146 gboolean autoload_subtitles;
147 gchar *subtitle_encoding;
148 gchar *subtitle_font;
151 guint milliseconds_to_pause_frame;
152 guint seconds_to_pause_to_ready;
155 gboolean use_dhmmixer;
160 } mobile_surround_music;
165 } mobile_surround_video;
169 * media: Information about currently selected media.
170 * location: Current media location
171 * length_nanos: Length of the media, in nanoseconds
172 * has_visual_content: the clip contains some visual content (video)
173 * video_width: If media contains video, this tells the video width
174 * video_height: If media contains video, this tells the video height
175 * seekable: Tells whether the media can be seeked
176 * par_n: Video pixel aspect ratio numerator
177 * par_d: Video pixel aspect ratio denominator
178 * owner: Owner of the worker; usually a MafwGstRenderer (FIXME USUALLY?)
179 * pipeline: Playback pipeline
181 * state: Current playback pipeline state
182 * is_stream: Is currently playing media a stream
183 * muted: Is the audio muted
184 * eos: Has playback reached EOS already
185 * is_error: Has there been an error situation
186 * buffering: Indicates the buffering state
187 * prerolling: Indicates the prerolling state (NULL -> PAUSED)
188 * report_statechanges: Report state change bus messages
189 * current_volume: Current audio volume [0.0 .. 1.0], see playbin:volume
190 * async_bus_id: ID handle for GstBus
191 * buffer_probe_id: ID of the video renderer buffer probe
192 * seek_position: Indicates the pos where to seek, in seconds
193 * vsink: Video sink element of the pipeline
194 * asink: Audio sink element of the pipeline
195 * tsink: Text sink element of the pipeline
196 * xid: XID for video playback
197 * current_frame_on_pause: whether to emit current frame when pausing
199 struct _MafwGstRendererWorker {
203 gboolean has_visual_content;
207 SeekabilityType seekable;
212 GstElement *pipeline;
214 // Audio bin for Dolby Headphones Mobile plugin
215 GstElement *audiobin;
218 /* GStreamer state we are considering right now */
222 /* we are handing eos or we did */
224 /* if we are handling (or handled) and error */
226 /* pipeline is buffering */
228 /* pipeline is prerolling */
230 /* stream is live and doesn't need prerolling */
232 /* if we have to stay in paused though a do_play was
233 * requested. Usually used when pausing in transitioning */
234 gboolean stay_paused;
235 /* this variable should be FALSE while we are hiding state
236 * changed to the UI. This is that GStreamer can perform
237 * state_changes without us requiring it, for example, then
238 * seeking, buffering and so on and we have to hide those
240 gboolean report_statechanges;
244 guint duration_seek_timeout;
245 guint duration_seek_timeout_loop_count;
246 /* TRUE when a transition to GST_STATE_READY has been
247 * requested or we are actually in GST_STATE_READY (requested
250 /* Flag indicating whether taking image from pause frame has succeed after pause. */
251 gboolean pause_frame_taken;
252 guint pause_frame_timeout;
253 GstBuffer *pause_frame_buffer;
258 // Dolby Headphones Mobile mixer
262 render_rectangle x_overlay_rectangle;
264 gfloat playback_speed;
265 gboolean force_aspect_ratio;
268 GHashTable *current_metadata;
269 gpointer context_nowplaying;
271 gboolean current_frame_on_pause;
272 gboolean taking_screenshot;
273 gchar *tmp_files_pool[MAFW_GST_RENDERER_MAX_TMP_FILES];
274 guint8 tmp_files_pool_index;
276 GSList *destinations;
280 configuration *config;
282 MafwGstRendererSeeker *seeker;
284 /* Handlers for notifications */
285 MafwGstRendererWorkerNotifySeekCb notify_seek_handler;
286 MafwGstRendererWorkerNotifyPauseCb notify_pause_handler;
287 MafwGstRendererWorkerNotifyPlayCb notify_play_handler;
288 MafwGstRendererWorkerNotifyBufferStatusCb notify_buffer_status_handler;
289 MafwGstRendererWorkerNotifyEOSCb notify_eos_handler;
290 MafwGstRendererWorkerNotifyReadyStateCb notify_ready_state_handler;
291 MafwGstRendererWorkerNotifyMetadataCb notify_metadata_handler;
292 MafwGstRendererWorkerNotifyErrorCb notify_error_handler;
293 MafwGstRendererWorkerNotifyPropertyCb notify_property_handler;
295 MafwGstRendererWorkerBlankingControlCb blanking__control_handler;
296 MafwGstRendererWorkerScreenshotCb screenshot_handler;
300 MafwGstRendererWorker *mafw_gst_renderer_worker_new(gpointer owner);
302 void mafw_gst_renderer_worker_exit(MafwGstRendererWorker *worker);
304 void mafw_gst_renderer_worker_set_current_frame_on_pause(
305 MafwGstRendererWorker *worker,
306 gboolean current_frame_on_pause);
308 void mafw_gst_renderer_worker_set_ready_timeout(MafwGstRendererWorker *worker,
311 gboolean mafw_gst_renderer_worker_get_current_frame_on_pause(
312 MafwGstRendererWorker *worker);
314 configuration* mafw_gst_renderer_worker_create_default_configuration(MafwGstRendererWorker *worker);
315 void mafw_gst_renderer_worker_set_configuration(MafwGstRendererWorker *worker,
316 configuration *config);
318 void mafw_gst_renderer_worker_set_position(MafwGstRendererWorker *worker,
319 GstSeekType seek_type,
323 gint mafw_gst_renderer_worker_get_position(MafwGstRendererWorker *worker);
325 gint64 mafw_gst_renderer_worker_get_last_known_duration(MafwGstRendererWorker *worker);
326 gint64 mafw_gst_renderer_worker_get_duration(MafwGstRendererWorker *worker);
328 void mafw_gst_renderer_worker_set_xid(MafwGstRendererWorker *worker, XID xid);
330 XID mafw_gst_renderer_worker_get_xid(MafwGstRendererWorker *worker);
332 void mafw_gst_renderer_worker_set_render_rectangle(MafwGstRendererWorker *worker, render_rectangle *rect);
333 const render_rectangle* mafw_gst_renderer_worker_get_render_rectangle(MafwGstRendererWorker *worker);
335 gboolean mafw_gst_renderer_worker_get_autopaint(MafwGstRendererWorker *worker);
337 void mafw_gst_renderer_worker_set_autopaint(MafwGstRendererWorker *worker,
340 gboolean mafw_gst_renderer_worker_set_playback_speed(MafwGstRendererWorker *worker, gfloat speed);
342 gfloat mafw_gst_renderer_worker_get_playback_speed(MafwGstRendererWorker *worker);
344 void mafw_gst_renderer_worker_set_force_aspect_ratio(MafwGstRendererWorker *worker, gboolean force);
346 gboolean mafw_gst_renderer_worker_get_force_aspect_ratio(MafwGstRendererWorker *worker);
348 gint mafw_gst_renderer_worker_get_colorkey(MafwGstRendererWorker *worker);
350 gboolean mafw_gst_renderer_worker_get_seekable(MafwGstRendererWorker *worker);
352 gboolean mafw_gst_renderer_worker_get_streaming(MafwGstRendererWorker *worker);
354 const char* mafw_gst_renderer_worker_get_uri(MafwGstRendererWorker *worker);
356 GHashTable *mafw_gst_renderer_worker_get_current_metadata(
357 MafwGstRendererWorker *worker);
359 void mafw_gst_renderer_worker_play(MafwGstRendererWorker *worker,
362 void mafw_gst_renderer_worker_stop(MafwGstRendererWorker *worker);
364 void mafw_gst_renderer_worker_pause(MafwGstRendererWorker *worker);
366 void mafw_gst_renderer_worker_resume(MafwGstRendererWorker *worker);
368 void mafw_gst_renderer_worker_pause_at(MafwGstRendererWorker *worker, guint position);
370 guint check_dolby_audioroute(MafwGstRendererWorker *worker, guint prop);
372 void set_dolby_music_property(MafwGstRendererWorker *worker, guint prop);
373 void set_dolby_music_sound_property(MafwGstRendererWorker *worker, gint prop, gboolean isRoomProperty);
375 void set_dolby_video_property(MafwGstRendererWorker *worker, guint prop);
376 void set_dolby_video_sound_property(MafwGstRendererWorker *worker, gint prop, gboolean isRoomProperty);
378 void mafw_gst_renderer_worker_notify_media_destination(MafwGstRendererWorker *worker,
379 GSList *destinations);