2 * This file is part of QMAFW
4 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights
7 * Contact: Visa Smolander <visa.smolander@nokia.com>
9 * This software, including documentation, is protected by copyright controlled
10 * by Nokia Corporation. All rights are reserved. Copying, including
11 * reproducing, storing, adapting or translating, any or all of this material
12 * requires the prior written consent of Nokia Corporation. This material also
13 * contains confidential information which may not be disclosed to others
14 * without the prior written consent of Nokia.
18 #include <string.h> //memset
19 #include "mafw-gst-renderer-worker.h"
20 #include "mafw-gst-renderer-utils.h"
22 GError* global_error = 0;
23 gint global_position = 0;
24 gint global_worker_audio_destination = -1;
25 gint global_worker_video_destination = -1;
26 gchar *global_worker_uri = 0;
27 gint global_worker_stop_called = 0;
28 gint global_worker_seek_request = 0;
29 GSList *global_worker_destinations = NULL;
30 guint global_ready_timeout = 99999;
34 gboolean m_current_frame_on_pause;
35 gboolean m_force_aspect_ratio;
36 gfloat m_playback_speed = 1;
39 render_rectangle m_render_rectangle;
40 configuration *current_worker_conf;
43 gboolean global_worker_playing = FALSE;
45 #define UNUSED(x) (void)(x)
47 void mafw_gst_renderer_worker_set_volume(MafwGstRendererWorker *worker,
54 guint mafw_gst_renderer_worker_get_volume(MafwGstRendererWorker *worker)
60 void mafw_gst_renderer_worker_set_mute(MafwGstRendererWorker *worker,
67 gboolean mafw_gst_renderer_worker_get_mute(MafwGstRendererWorker *worker)
73 gint64 mafw_gst_renderer_worker_get_last_known_duration(MafwGstRendererWorker *worker)
79 const char* mafw_gst_renderer_worker_get_uri(MafwGstRendererWorker *worker)
82 return global_worker_uri;
85 gboolean mafw_gst_renderer_worker_get_seekable(MafwGstRendererWorker *worker)
91 void _free_configuration(configuration *config)
100 g_free(config->asink);
104 g_free(config->vsink);
110 void mafw_gst_renderer_worker_set_current_frame_on_pause(
111 MafwGstRendererWorker *worker,
112 gboolean current_frame_on_pause)
115 m_current_frame_on_pause = current_frame_on_pause;
118 gboolean mafw_gst_renderer_worker_get_current_frame_on_pause(
119 MafwGstRendererWorker *worker)
122 return m_current_frame_on_pause;
125 void mafw_gst_renderer_worker_set_position(MafwGstRendererWorker *worker,
126 GstSeekType seek_type,
127 gint position, GError **error)
131 global_worker_seek_request = position;
132 *error = global_error;
135 gint mafw_gst_renderer_worker_get_position(MafwGstRendererWorker *worker)
138 return global_position;
141 void mafw_gst_renderer_worker_set_xid(MafwGstRendererWorker *worker, XID xid)
147 gboolean mafw_gst_renderer_worker_get_streaming(MafwGstRendererWorker *worker)
149 return uri_is_stream(global_worker_uri);
152 XID mafw_gst_renderer_worker_get_xid(MafwGstRendererWorker *worker)
159 void mafw_gst_renderer_worker_set_render_rectangle(MafwGstRendererWorker *worker, render_rectangle *rect)
162 m_render_rectangle.x = rect->x;
163 m_render_rectangle.y = rect->y;
164 m_render_rectangle.width = rect->width;
165 m_render_rectangle.height = rect->height;
168 const render_rectangle* mafw_gst_renderer_worker_get_render_rectangle(MafwGstRendererWorker *worker)
171 return &m_render_rectangle;
175 gboolean mafw_gst_renderer_worker_get_autopaint(MafwGstRendererWorker *worker)
181 void mafw_gst_renderer_worker_set_ready_timeout(MafwGstRendererWorker *worker,
185 global_ready_timeout = seconds;
188 void mafw_gst_renderer_worker_set_autopaint(MafwGstRendererWorker *worker,
195 gint mafw_gst_renderer_worker_get_colorkey(MafwGstRendererWorker *worker)
201 void mafw_gst_renderer_worker_play(MafwGstRendererWorker *worker,
206 global_worker_playing = TRUE;
207 g_free(global_worker_uri);
208 global_worker_uri = g_strdup(uri);
209 worker->notify_play_handler(worker, worker->owner);
212 void mafw_gst_renderer_worker_stop(MafwGstRendererWorker *worker)
215 global_worker_playing = FALSE;
216 ++global_worker_stop_called;
218 g_free(global_worker_uri);
219 global_worker_uri = NULL;
222 void mafw_gst_renderer_worker_pause(MafwGstRendererWorker *worker)
225 global_worker_playing = FALSE;
226 worker->notify_pause_handler(worker, worker->owner);
229 void mafw_gst_renderer_worker_pause_at(MafwGstRendererWorker *worker, guint position)
235 void mafw_gst_renderer_worker_resume(MafwGstRendererWorker *worker)
240 MafwGstRendererWorker *mafw_gst_renderer_worker_new(gpointer owner)
242 MafwGstRendererWorker *newWorker = g_new0(MafwGstRendererWorker, 1);
243 newWorker->owner = owner;
244 newWorker->config = g_new0(configuration, 1);
248 void mafw_gst_renderer_worker_exit(MafwGstRendererWorker *worker)
252 _free_configuration(worker->config);
253 worker->config = NULL;
257 gboolean mafw_gst_renderer_worker_set_playback_speed(MafwGstRendererWorker *worker, gfloat speed)
261 if(!global_worker_playing)
266 m_playback_speed = speed;
269 memset(&v, 0, sizeof(GValue));
270 g_value_init(&v, G_TYPE_FLOAT);
271 g_value_set_float(&v, m_playback_speed);
273 worker->notify_property_handler(worker, worker->owner, WORKER_PROPERTY_PLAYBACK_SPEED, &v);
279 gfloat mafw_gst_renderer_worker_get_playback_speed(MafwGstRendererWorker *worker)
282 return m_playback_speed;
285 void mafw_gst_renderer_worker_set_force_aspect_ratio(MafwGstRendererWorker *worker, gboolean force)
288 m_force_aspect_ratio = force;
291 gboolean mafw_gst_renderer_worker_get_force_aspect_ratio(MafwGstRendererWorker *worker)
294 return m_force_aspect_ratio;
297 void mafw_gst_renderer_worker_notify_media_destination(MafwGstRendererWorker *worker,
301 g_slist_free(global_worker_destinations);
302 global_worker_destinations = g_slist_copy(destination);
305 configuration* mafw_gst_renderer_worker_create_default_configuration(MafwGstRendererWorker *worker)
307 configuration *config = g_malloc0(sizeof(configuration));
308 config->asink = g_strdup("pulsesink");
309 config->vsink = g_strdup("omapxvsink");
311 config->buffer_time = 300000;
312 config->latency_time = 100000;
315 config->milliseconds_to_pause_frame = 1000;
316 config->seconds_to_pause_to_ready = 3;
319 config->use_dhmmixer = TRUE;
321 config->mobile_surround_music.state = 0;
322 config->mobile_surround_music.room = 2;
323 config->mobile_surround_music.color = 2;
324 config->mobile_surround_video.state = 0;
325 config->mobile_surround_video.room = 2;
326 config->mobile_surround_video.color = 2;
331 void mafw_gst_renderer_worker_set_configuration(MafwGstRendererWorker *worker, configuration *config)
335 _free_configuration(worker->config);
337 worker->config = config;
338 current_worker_conf = config;
341 void set_dolby_music_property(MafwGstRendererWorker *worker, guint prop)
343 worker->config->mobile_surround_music.state = prop;
346 void set_dolby_music_sound_property(MafwGstRendererWorker *worker, gint prop, gboolean isRoomProperty)
350 worker->config->mobile_surround_music.room = prop;
354 worker->config->mobile_surround_music.color = prop;
358 void set_dolby_video_property(MafwGstRendererWorker *worker, guint prop)
360 worker->config->mobile_surround_video.state = prop;
363 void set_dolby_video_sound_property(MafwGstRendererWorker *worker, gint prop, gboolean isRoomProperty)
367 worker->config->mobile_surround_video.room = prop;
371 worker->config->mobile_surround_video.color = prop;
375 gint64 mafw_gst_renderer_worker_get_duration(MafwGstRendererWorker *worker)