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.
24 #include <gst/tag/tag.h>
25 #include <context_provider.h>
27 #include "ut_MafwGstRendererWorker.h"
28 #include "mafw-gst-renderer-worker.h"
29 #include "mafw-gst-renderer-utils.h"
31 static QUrl AUDIO_URI(QDir::currentPath() + QDir::separator() +
32 QString("media") + QDir::separator() +
35 static QUrl VIDEO_URI(QDir::currentPath() + QDir::separator() +
36 QString("media") + QDir::separator() +
39 static QUrl IMAGE_URI(QDir::currentPath() + QDir::separator() +
40 QString("media") + QDir::separator() +
41 QString("testframe.png"));
43 static int WAIT_TIMEOUT = 3500;
44 static int EOS_TIMEOUT = 7000;
45 static int READY_DELAY = 65000;
47 static bool NEVER_HAPPENING_EVENT = false;
49 static int global_context_duration = 0;
51 static QStringList globalGstFactoryRequests;
52 static GstElement *globalGstPipeline;
55 const gchar* g_getenv(const gchar *variable)
61 gboolean convert_utf8(const gchar *src, gchar **dst)
67 gboolean uri_is_playlist(const gchar *uri)
73 gboolean uri_is_stream(const gchar *uri)
79 gint remap_gst_error_code(const GError *error)
84 void context_provider_set_map(const char* key, void* map, int free_map)
91 void *context_provider_map_new(void)
97 void context_provider_map_free(void* map)
102 void context_provider_map_set_integer(void* map, const char* key, int value)
106 if( strcmp( key, "duration" )==0 )
108 global_context_duration = value;
112 void context_provider_map_set_double(void* map, const char* key, double value)
119 void context_provider_map_set_boolean(void* map, const char* key, int value)
126 void context_provider_map_set_string(void* map, const char* key, const char* value)
133 void context_provider_map_set_map(void* map, const char* key, void* value)
140 void context_provider_set_null(const char* key)
145 gboolean context_provider_init(DBusBusType bus_type, const char* bus_name)
155 void context_provider_stop(void)
159 void context_provider_install_key(
161 gboolean clear_values_on_subscribe,
162 ContextProviderSubscriptionChangedCallback subscription_changed_cb,
163 void* subscription_changed_cb_target)
166 Q_UNUSED(clear_values_on_subscribe);
167 Q_UNUSED(subscription_changed_cb);
168 Q_UNUSED(subscription_changed_cb_target);
171 GstElement *gst_element_factory_make(const gchar *factoryname, const gchar *name)
173 GstElementFactory *factory;
175 const gchar *use_factoryname;
177 g_return_val_if_fail(factoryname != NULL, NULL);
179 globalGstFactoryRequests.append(factoryname);
181 /* For testing, use playbin instead of playbin2 */
182 if (g_str_equal(factoryname, "playbin2"))
184 use_factoryname = "playbin";
188 use_factoryname = factoryname;
191 GST_LOG("gstelementfactory: make \"%s\" \"%s\"",
192 use_factoryname, GST_STR_NULL (name));
194 factory = gst_element_factory_find(use_factoryname);
198 GST_INFO("no such element factory \"%s\"!", use_factoryname);
202 GST_LOG_OBJECT(factory, "found factory %p", factory);
203 if (g_str_equal(use_factoryname, "pulsesink"))
205 element = gst_element_factory_make("fakesink", "pulsesink");
206 g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
208 else if (g_str_equal(use_factoryname, "alsasink"))
210 element = gst_element_factory_make("fakesink", "alsasink");
211 g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
213 else if (g_str_equal(use_factoryname, "xvimagesink")
214 || g_str_equal(use_factoryname, "omapxvsink"))
216 element = gst_element_factory_make("fakesink", "xvimagesink");
217 g_object_set(G_OBJECT(element), "sync", TRUE, NULL);
221 element = gst_element_factory_create(factory, name);
222 if( !g_strcmp0(use_factoryname, "playbin") )
224 globalGstPipeline = element;
227 gst_object_unref(factory);
232 GST_INFO_OBJECT(factory, "couldn't create instance!");
236 GST_LOG("gstelementfactory: make \"%s\" \"%s\"",use_factoryname,
239 /* Playbin will use fake renderer */
240 if (g_str_equal(use_factoryname, "playbin"))
242 GstElement *audiorenderer = gst_element_factory_make("fakesink",
244 g_object_set(G_OBJECT(audiorenderer), "sync", TRUE, NULL);
245 g_object_set(G_OBJECT(element), "audio-sink", audiorenderer, NULL);
246 g_object_set(G_OBJECT(element), "video-sink", audiorenderer, NULL);
252 /* END OF STUB DEFINITIONS */
254 void ut_MafwGstRendererWorker::playCallback(MafwGstRendererWorker *worker,
260 qDebug() << __PRETTY_FUNCTION__;
262 ut_MafwGstRendererWorker* self =
263 static_cast<ut_MafwGstRendererWorker*>(owner);
264 self->m_gotPlayCallback = true;
268 void ut_MafwGstRendererWorker::pauseCallback(MafwGstRendererWorker *worker,
273 qDebug() << __PRETTY_FUNCTION__;
275 ut_MafwGstRendererWorker* self =
276 static_cast<ut_MafwGstRendererWorker*>(owner);
277 self->m_gotPauseCallback = true;
280 void ut_MafwGstRendererWorker::bufferingCallback(MafwGstRendererWorker *worker,
286 qDebug() << __PRETTY_FUNCTION__;
288 ut_MafwGstRendererWorker* self =
289 static_cast<ut_MafwGstRendererWorker*>(owner);
290 self->m_receivedBufferStatus = percent;
291 self->m_gotBufferStatusCallback = true;
294 void ut_MafwGstRendererWorker::eosCallback(MafwGstRendererWorker *worker,
300 qDebug() << __PRETTY_FUNCTION__;
302 ut_MafwGstRendererWorker* self =
303 static_cast<ut_MafwGstRendererWorker*>(owner);
304 self->m_gotEosCallback = true;
308 void ut_MafwGstRendererWorker::seekCallback(MafwGstRendererWorker *worker,
314 qDebug() << __PRETTY_FUNCTION__;
316 ut_MafwGstRendererWorker* self =
317 static_cast<ut_MafwGstRendererWorker*>(owner);
318 self->m_gotSeekCallback = true;
322 void ut_MafwGstRendererWorker::errorCallback(MafwGstRendererWorker *worker,
329 ut_MafwGstRendererWorker* self =
330 static_cast<ut_MafwGstRendererWorker*>(owner);
331 self->m_receivedErrorCode = error->code;
335 qCritical() << "error code: " << error->code << " message: " <<
338 self->m_gotErrorCallback = true;
342 void ut_MafwGstRendererWorker::propertyCallback(MafwGstRendererWorker *worker,
351 ut_MafwGstRendererWorker* self =
352 static_cast<ut_MafwGstRendererWorker*>(owner);
353 self->m_receivedPropertyId = id;
354 self->m_gotPropertyCallback = true;
358 void ut_MafwGstRendererWorker::metadataCallback(MafwGstRendererWorker *worker,
369 ut_MafwGstRendererWorker* self =
370 static_cast<ut_MafwGstRendererWorker*>(owner);
371 self->m_receivedMetadata.append(key);
372 self->m_gotMetadataCallback = true;
376 void ut_MafwGstRendererWorker::blankingControlCallback(MafwGstRendererWorker *worker,
377 gpointer owner, gboolean prohibit)
381 ut_MafwGstRendererWorker* self =
382 static_cast<ut_MafwGstRendererWorker*>(owner);
383 self->m_blankingProhibited = prohibit;
386 void ut_MafwGstRendererWorker::screenshotCallback(MafwGstRendererWorker *worker,
387 gpointer owner, GstBuffer *buffer,
388 const char *filename, gboolean cancel)
395 ut_MafwGstRendererWorker* self =
396 static_cast<ut_MafwGstRendererWorker*>(owner);
397 self->m_receivedMetadata.append(WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI);
398 self->m_gotMetadataCallback = true;
402 void ut_MafwGstRendererWorker::basicPlaybackTestCase()
405 m_worker->notify_play_handler = &playCallback;
406 m_worker->notify_error_handler = &errorCallback;
407 m_worker->blanking__control_handler = &blankingControlCallback;
408 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
410 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
412 QVERIFY(m_gotPlayCallback == true);
413 QVERIFY(m_gotErrorCallback == false);
414 QCOMPARE( global_context_duration, 3 ); // 2.5 seconds is duration of test.wav
415 QVERIFY(m_blankingProhibited == false);
417 //video-sink should not be created unless XID has been set
418 QVERIFY(!m_worker->vsink);
421 void ut_MafwGstRendererWorker::basicVideoPlaybackTestCase()
424 m_worker->notify_play_handler = &playCallback;
425 m_worker->notify_error_handler = &errorCallback;
426 m_worker->blanking__control_handler = &blankingControlCallback;
428 QVERIFY(!m_worker->vsink);
429 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
430 QVERIFY(m_worker->vsink);
432 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
433 m_worker->media.has_visual_content = true; // normally gst sets this but not in unittest for some reason
435 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
437 QVERIFY(m_gotPlayCallback == true);
438 QVERIFY(m_gotErrorCallback == false);
439 QVERIFY(m_blankingProhibited == true);
442 void ut_MafwGstRendererWorker::pauseFrameTestCase()
445 m_worker->notify_play_handler = &playCallback;
446 m_worker->notify_pause_handler = &pauseCallback;
447 m_worker->notify_metadata_handler = &metadataCallback;
448 m_worker->notify_property_handler = &propertyCallback;
449 m_worker->notify_error_handler = &errorCallback;
450 m_worker->blanking__control_handler = &blankingControlCallback;
451 m_worker->screenshot_handler = screenshotCallback;
453 mafw_gst_renderer_worker_set_current_frame_on_pause(m_worker, TRUE);
454 QVERIFY(mafw_gst_renderer_worker_get_current_frame_on_pause(m_worker) ==
456 QVERIFY(m_gotPropertyCallback == true);
457 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE);
459 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
460 QVERIFY(mafw_gst_renderer_worker_get_xid(m_worker) == 0xffff);
461 QVERIFY(m_gotPropertyCallback == true);
462 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_XID);
463 m_gotPropertyCallback = false;
464 m_receivedPropertyId = -1;
466 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
468 /* post xwindow-id on bus since we are using fakesink instead of
471 GstStructure *structure;
473 structure = gst_structure_new("prepare-xwindow-id", "width",
474 G_TYPE_INT, 64, "height", G_TYPE_INT, 32,
476 message = gst_message_new_element(NULL, structure);
478 gst_bus_post(bus, message);
479 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
481 mafw_gst_renderer_worker_pause(m_worker);
482 waitForEvent(WAIT_TIMEOUT, NEVER_HAPPENING_EVENT);
484 QVERIFY(m_gotPlayCallback == true);
485 QVERIFY(m_gotPauseCallback == true);
486 QVERIFY(m_gotMetadataCallback == true);
487 QVERIFY(m_gotErrorCallback == false);
488 QVERIFY(m_receivedMetadata.contains(WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI));
492 void ut_MafwGstRendererWorker::pauseFrameCancelTestCase()
494 m_worker->notify_play_handler = &playCallback;
495 m_worker->notify_pause_handler = &pauseCallback;
496 m_worker->notify_metadata_handler = &metadataCallback;
497 m_worker->notify_property_handler = &propertyCallback;
498 m_worker->notify_error_handler = &errorCallback;
499 m_worker->blanking__control_handler = &blankingControlCallback;
500 m_worker->screenshot_handler = screenshotCallback;
502 mafw_gst_renderer_worker_set_current_frame_on_pause(m_worker, TRUE);
503 QVERIFY(mafw_gst_renderer_worker_get_current_frame_on_pause(m_worker) ==
505 QVERIFY(m_gotPropertyCallback == true);
506 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE);
508 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
509 QVERIFY(mafw_gst_renderer_worker_get_xid(m_worker) == 0xffff);
510 QVERIFY(m_gotPropertyCallback == true);
511 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_XID);
512 m_gotPropertyCallback = false;
513 m_receivedPropertyId = -1;
515 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
517 /* post xwindow-id on bus since we are using fakesink instead of
520 GstStructure *structure;
522 structure = gst_structure_new("prepare-xwindow-id", "width",
523 G_TYPE_INT, 64, "height", G_TYPE_INT, 32,
525 message = gst_message_new_element(NULL, structure);
527 gst_bus_post(bus, message);
528 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
530 mafw_gst_renderer_worker_pause(m_worker);
531 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
532 mafw_gst_renderer_worker_resume(m_worker);
536 QVERIFY(m_gotPlayCallback == true);
537 QVERIFY(m_gotPauseCallback == true);
538 QVERIFY(m_gotMetadataCallback == true);
539 QVERIFY(m_gotErrorCallback == false);
540 QVERIFY(!m_receivedMetadata.contains(WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI));
545 void ut_MafwGstRendererWorker::redirectMessageTestCase()
547 m_worker->notify_play_handler = &playCallback;
548 m_worker->notify_error_handler = &errorCallback;
549 m_worker->blanking__control_handler = &blankingControlCallback;
551 /* We just give random uri to renderer, because we ignore the error */
552 /* We don't have to test with real RTSP stream, we just use local content */
553 char *control = qstrdup(VIDEO_URI.toString().toAscii());
555 GstStructure *structure;
557 structure = gst_structure_new("redirect", "new-location",
558 G_TYPE_STRING, control, NULL);
560 // reset and construct the pipeline
561 mafw_gst_renderer_worker_stop(m_worker);
563 // when worker receives "redirect" message, it should start playing the uri contained in the message.
564 message = gst_message_new_element(GST_OBJECT_CAST(m_worker->pipeline), structure);
565 gst_element_post_message(m_worker->pipeline, message);
568 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
570 QVERIFY(m_gotPlayCallback == true);
571 QVERIFY(strcmp(control, m_worker->media.location) == 0);
572 QVERIFY(m_gotErrorCallback == false);
577 void ut_MafwGstRendererWorker::slotTimeOut()
579 qDebug() << "TIMEOUT!";
582 void ut_MafwGstRendererWorker::waitForEvent(gint ms, bool &hasEventOccurred)
585 qDebug() << __PRETTY_FUNCTION__;
587 if (hasEventOccurred)
593 QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(slotTimeOut()));
594 timer.setSingleShot(true);
597 while (!hasEventOccurred && timer.isActive())
599 g_main_context_iteration(NULL, TRUE);
603 void ut_MafwGstRendererWorker::bufferingTestCase()
606 m_worker->notify_play_handler = &playCallback;
607 m_worker->notify_buffer_status_handler = &bufferingCallback;
608 m_worker->notify_error_handler = &errorCallback;
609 m_worker->blanking__control_handler = &blankingControlCallback;
611 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
612 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
614 /* post the buffering msg on bus */
616 GstMessage *message = 0;
618 message = gst_message_new_buffering(NULL, 50);
620 gst_bus_post(bus, message);
622 waitForEvent(WAIT_TIMEOUT, m_gotBufferStatusCallback);
624 QVERIFY(m_gotPlayCallback == true);
625 QVERIFY(m_receivedBufferStatus == 50);
626 QVERIFY(m_gotErrorCallback == false);
630 void ut_MafwGstRendererWorker::rendererArtTestCase()
633 m_worker->notify_play_handler = &playCallback;
634 m_worker->notify_pause_handler = &pauseCallback;
635 m_worker->notify_metadata_handler = &metadataCallback;
636 m_worker->notify_error_handler = &errorCallback;
637 m_worker->blanking__control_handler = &blankingControlCallback;
639 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
640 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
641 mafw_gst_renderer_worker_pause(m_worker);
642 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
644 /* post the renderer art tag on bus */
645 gsize image_length = 0;
648 GstBuffer *buffer = 0;
649 GstMessage *message = 0;
650 GstTagList *list = 0;
652 QVERIFY(g_file_get_contents(IMAGE_URI.toLocalFile().toAscii(),
656 buffer = gst_buffer_new();
657 gst_buffer_set_data(buffer, (guint8*)image, image_length);
658 caps = gst_caps_new_simple("image/png", "image-type",
659 GST_TYPE_TAG_IMAGE_TYPE,
660 GST_TAG_IMAGE_TYPE_FRONT_COVER, NULL);
661 gst_buffer_set_caps(buffer, caps);
663 list = gst_tag_list_new();
664 gst_tag_list_add(list, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, buffer, NULL);
666 message = gst_message_new_tag(NULL, list);
667 gst_bus_post(m_worker->bus, message);
668 mafw_gst_renderer_worker_resume(m_worker);
670 waitForEvent(WAIT_TIMEOUT, NEVER_HAPPENING_EVENT);
672 QVERIFY(m_gotPlayCallback == true);
673 QVERIFY(m_gotPauseCallback == true);
674 QVERIFY(m_gotMetadataCallback == true);
675 QVERIFY(m_gotErrorCallback == false);
676 QVERIFY(m_receivedMetadata.contains(WORKER_METADATA_KEY_RENDERER_ART_URI));
678 gst_buffer_unref(buffer);
679 gst_caps_unref(caps);
684 void ut_MafwGstRendererWorker::eosTestCase()
687 m_worker->notify_play_handler = &playCallback;
688 m_worker->notify_error_handler = &errorCallback;
689 m_worker->notify_eos_handler = &eosCallback;
690 m_worker->blanking__control_handler = &blankingControlCallback;
691 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
693 waitForEvent(EOS_TIMEOUT, m_gotEosCallback);
695 QVERIFY(m_gotPlayCallback == true);
696 QVERIFY(m_gotEosCallback == true);
697 QVERIFY(m_gotErrorCallback == false);
701 void ut_MafwGstRendererWorker::seekTestCase()
706 m_worker->notify_play_handler = &playCallback;
707 m_worker->notify_error_handler = &errorCallback;
708 m_worker->notify_seek_handler = &seekCallback;
709 m_worker->blanking__control_handler = &blankingControlCallback;
710 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
712 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
714 QVERIFY(m_gotPlayCallback == true);
715 QVERIFY(m_gotErrorCallback == false);
717 mafw_gst_renderer_worker_set_position(m_worker,
722 QVERIFY(m_gotPlayCallback == true);
723 QVERIFY(m_gotSeekCallback == true);
724 QVERIFY(m_gotErrorCallback == false);
726 QVERIFY(mafw_gst_renderer_worker_get_position(m_worker) == 1);
730 void ut_MafwGstRendererWorker::invalidUriTestCase()
733 m_worker->notify_play_handler = &playCallback;
734 m_worker->notify_error_handler = &errorCallback;
735 m_worker->blanking__control_handler = &blankingControlCallback;
736 mafw_gst_renderer_worker_play(m_worker, "vjmksbhdfghrejggv");
738 waitForEvent(WAIT_TIMEOUT, m_gotErrorCallback);
740 QVERIFY(m_gotPlayCallback == false);
741 QVERIFY(m_gotErrorCallback == true);
742 /* FIXME: new code for Gst errors? */
743 /*QVERIFY(m_receivedErrorCode == WORKER_ERROR_UNABLE_TO_PERFORM);*/
747 void ut_MafwGstRendererWorker::playAndStopTestCase()
750 m_worker->notify_play_handler = &playCallback;
751 m_worker->notify_error_handler = &errorCallback;
752 m_worker->blanking__control_handler = &blankingControlCallback;
753 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
755 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
756 QVERIFY(m_gotPlayCallback == true);
758 mafw_gst_renderer_worker_stop(m_worker);
760 QVERIFY(m_gotPlayCallback == true);
761 QVERIFY(m_gotErrorCallback == false);
765 void ut_MafwGstRendererWorker::playAndPauseTestCase()
768 m_worker->notify_play_handler = &playCallback;
769 m_worker->notify_error_handler = &errorCallback;
770 m_worker->notify_pause_handler = &pauseCallback;
771 m_worker->blanking__control_handler = &blankingControlCallback;
772 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
774 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
775 m_worker->media.has_visual_content = true; // normally gst sets this but not in unittest for some reason
777 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
778 QVERIFY(m_gotPlayCallback == true);
779 QVERIFY(m_gotPauseCallback == false);
780 QVERIFY(m_blankingProhibited == true);
782 mafw_gst_renderer_worker_pause(m_worker);
783 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
785 QVERIFY(m_gotPlayCallback == true);
786 QVERIFY(m_gotPauseCallback == true);
787 QVERIFY(m_gotErrorCallback == false);
788 QVERIFY(m_blankingProhibited == false);
791 void ut_MafwGstRendererWorker::pauseQuicklyAfterPlayTestCase()
793 m_worker->notify_play_handler = &playCallback;
794 m_worker->notify_error_handler = &errorCallback;
795 m_worker->notify_pause_handler = &pauseCallback;
796 m_worker->blanking__control_handler = &blankingControlCallback;
797 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
799 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
800 m_worker->media.has_visual_content = true; // normally gst sets this but not in unittest for some reason
801 mafw_gst_renderer_worker_pause(m_worker);
803 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
804 QVERIFY(m_gotPlayCallback == false);
805 QVERIFY(m_gotPauseCallback == true);
806 QVERIFY(m_blankingProhibited == false);
808 m_gotPlayCallback = false;
809 m_gotPauseCallback = false;
811 mafw_gst_renderer_worker_resume(m_worker);
812 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
813 waitForEvent(WAIT_TIMEOUT, m_blankingProhibited);
814 QCOMPARE(m_gotPlayCallback, true);
815 QCOMPARE(m_blankingProhibited, true);
818 void ut_MafwGstRendererWorker::pauseAtTestCase()
820 m_worker->notify_play_handler = &playCallback;
821 m_worker->notify_error_handler = &errorCallback;
822 m_worker->notify_pause_handler = &pauseCallback;
823 m_worker->blanking__control_handler = &blankingControlCallback;
824 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
826 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
827 m_worker->media.has_visual_content = true; // normally gst sets this but not in unittest for some reason
828 //the video is only two seconds long
829 mafw_gst_renderer_worker_pause_at(m_worker, 1);
831 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
832 QVERIFY(m_gotPlayCallback == false);
833 QVERIFY(m_gotPauseCallback == true);
834 QVERIFY(m_blankingProhibited == false);
836 QVERIFY(mafw_gst_renderer_worker_get_position(m_worker) == 1);
838 m_gotPlayCallback = false;
839 m_gotPauseCallback = false;
841 mafw_gst_renderer_worker_resume(m_worker);
842 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
843 waitForEvent(WAIT_TIMEOUT, m_blankingProhibited);
844 QCOMPARE(m_gotPlayCallback, true);
845 QCOMPARE(m_blankingProhibited, true);
848 void ut_MafwGstRendererWorker::playAndPauseAndResumeTestCase()
851 m_worker->notify_play_handler = &playCallback;
852 m_worker->notify_error_handler = &errorCallback;
853 m_worker->notify_pause_handler = &pauseCallback;
854 m_worker->blanking__control_handler = &blankingControlCallback;
855 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
857 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
858 QVERIFY(m_gotPlayCallback == true);
859 QVERIFY(m_gotPauseCallback == false);
861 mafw_gst_renderer_worker_pause(m_worker);
862 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
864 m_gotPlayCallback = false;
865 mafw_gst_renderer_worker_resume(m_worker);
866 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
868 QVERIFY(m_gotPlayCallback == true);
869 QVERIFY(m_gotPauseCallback == true);
870 QVERIFY(m_gotErrorCallback == false);
875 void ut_MafwGstRendererWorker::resumeDelayedTestCase()
878 m_worker->notify_play_handler = &playCallback;
879 m_worker->notify_error_handler = &errorCallback;
880 m_worker->notify_pause_handler = &pauseCallback;
881 m_worker->blanking__control_handler = &blankingControlCallback;
882 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
884 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
885 QVERIFY(m_gotPlayCallback == true);
886 QVERIFY(m_gotPauseCallback == false);
888 mafw_gst_renderer_worker_pause(m_worker);
889 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
890 /* pipeline goes to ready after 60 seconds */
891 waitForEvent(READY_DELAY, NEVER_HAPPENING_EVENT);
893 m_gotPlayCallback = false;
894 mafw_gst_renderer_worker_resume(m_worker);
895 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
897 QVERIFY(m_gotPlayCallback == true);
898 QVERIFY(m_gotPauseCallback == true);
899 QVERIFY(m_gotErrorCallback == false);
903 void ut_MafwGstRendererWorker::getCurrentMetadataTestCase()
906 GHashTable *metadata = 0;
908 m_worker->notify_play_handler = &playCallback;
909 m_worker->notify_error_handler = &errorCallback;
910 m_worker->notify_pause_handler = &pauseCallback;
911 m_worker->blanking__control_handler = &blankingControlCallback;
912 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
914 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
915 QVERIFY(m_gotPlayCallback == true);
916 QVERIFY(m_gotPauseCallback == false);
918 mafw_gst_renderer_worker_pause(m_worker);
919 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
921 metadata = mafw_gst_renderer_worker_get_current_metadata(m_worker);
923 QVERIFY(g_hash_table_size(metadata));
925 mafw_gst_renderer_worker_stop(m_worker);
926 metadata = mafw_gst_renderer_worker_get_current_metadata(m_worker);
929 QVERIFY(m_gotPlayCallback == true);
930 QVERIFY(m_gotPauseCallback == true);
931 QVERIFY(m_gotErrorCallback == false);
935 void ut_MafwGstRendererWorker::defaultConfigurationTestCase()
937 QVERIFY2(sizeof(configuration) == 64, "You've (or somebody else) most likely changed the configuration struct! Update the unittests also!");
939 configuration * current_worker_conf = mafw_gst_renderer_worker_create_default_configuration(m_worker);
941 QCOMPARE(current_worker_conf->asink, "pulsesink");
942 QCOMPARE(current_worker_conf->vsink, "omapxvsink");
943 QCOMPARE(current_worker_conf->buffer_time, 600000LL);
944 QCOMPARE(current_worker_conf->latency_time, 100000LL);
945 QCOMPARE(current_worker_conf->flags, 67);
947 QCOMPARE(current_worker_conf->mobile_surround_music.state, 0U);
948 QCOMPARE(current_worker_conf->mobile_surround_music.color, 2);
949 QCOMPARE(current_worker_conf->mobile_surround_music.room, 2);
950 QCOMPARE(current_worker_conf->mobile_surround_video.state, 0U);
951 QCOMPARE(current_worker_conf->mobile_surround_video.color, 2);
952 QCOMPARE(current_worker_conf->mobile_surround_video.room, 2);
954 QCOMPARE(current_worker_conf->milliseconds_to_pause_frame, 700U);
955 QCOMPARE(current_worker_conf->seconds_to_pause_to_ready, 3U);
956 QCOMPARE(current_worker_conf->use_dhmmixer, 1);
958 //this well make valgrind happy. i.e. worker will handle memory cleanupping
959 mafw_gst_renderer_worker_set_configuration(m_worker, current_worker_conf);
962 void ut_MafwGstRendererWorker::configurabilityTestCase()
964 MafwGstRendererWorker *configWorker = mafw_gst_renderer_worker_new(this);
966 configuration *config = mafw_gst_renderer_worker_create_default_configuration(configWorker);
968 g_free(config->asink);
969 config->asink = g_strdup("test-sink");
972 QVERIFY(!globalGstFactoryRequests.contains("test-sink"));
973 mafw_gst_renderer_worker_set_configuration(configWorker, config);
974 mafw_gst_renderer_worker_stop(configWorker);
975 QVERIFY(globalGstFactoryRequests.contains("test-sink"));
976 globalGstFactoryRequests.clear();
978 mafw_gst_renderer_worker_exit(configWorker);
979 g_free(configWorker);
983 configWorker = mafw_gst_renderer_worker_new(this);
984 config = mafw_gst_renderer_worker_create_default_configuration(configWorker);
985 g_free(config->vsink);
986 config->vsink = g_strdup("test-video-sink");
988 QVERIFY(!globalGstFactoryRequests.contains("test-video-sink"));
990 mafw_gst_renderer_worker_set_configuration(configWorker, config);
991 //video-sink is not created unless xid has been set
992 mafw_gst_renderer_worker_set_xid(configWorker, 0xffff);
994 mafw_gst_renderer_worker_stop(configWorker);
995 QVERIFY(globalGstFactoryRequests.contains("test-video-sink"));
997 globalGstFactoryRequests.clear();
998 mafw_gst_renderer_worker_exit(configWorker);
999 g_free(configWorker);
1003 configWorker = mafw_gst_renderer_worker_new(this);
1004 config = mafw_gst_renderer_worker_create_default_configuration(configWorker);
1005 config->use_dhmmixer = 0;
1007 QVERIFY(!globalGstFactoryRequests.contains("nokiadhmmix"));
1008 mafw_gst_renderer_worker_set_configuration(configWorker, config);
1009 mafw_gst_renderer_worker_stop(configWorker);
1010 QVERIFY(!globalGstFactoryRequests.contains("nokiadhmmix"));
1012 globalGstFactoryRequests.clear();
1013 mafw_gst_renderer_worker_exit(configWorker);
1014 g_free(configWorker);
1017 configWorker = mafw_gst_renderer_worker_new(this);
1018 config = mafw_gst_renderer_worker_create_default_configuration(configWorker);
1019 config->use_dhmmixer = 1;
1021 QVERIFY(!globalGstFactoryRequests.contains("nokiadhmmix"));
1022 mafw_gst_renderer_worker_set_configuration(configWorker, config);
1023 mafw_gst_renderer_worker_stop(configWorker);
1024 QVERIFY(globalGstFactoryRequests.contains("nokiadhmmix"));
1026 globalGstFactoryRequests.clear();
1027 mafw_gst_renderer_worker_exit(configWorker);
1028 g_free(configWorker);
1031 void ut_MafwGstRendererWorker::pauseFrameConfigurabilityTestCase()
1034 m_worker->notify_play_handler = &playCallback;
1035 m_worker->notify_pause_handler = &pauseCallback;
1036 m_worker->notify_metadata_handler = &metadataCallback;
1037 m_worker->notify_property_handler = &propertyCallback;
1038 m_worker->notify_error_handler = &errorCallback;
1039 m_worker->blanking__control_handler = &blankingControlCallback;
1040 m_worker->screenshot_handler = screenshotCallback;
1042 //let's change timeout values
1043 configuration *config = mafw_gst_renderer_worker_create_default_configuration(m_worker);
1044 config->milliseconds_to_pause_frame = 3000;
1045 config->seconds_to_pause_to_ready = 6;
1046 mafw_gst_renderer_worker_set_configuration(m_worker, config);
1049 mafw_gst_renderer_worker_set_current_frame_on_pause(m_worker, TRUE);
1050 QVERIFY(mafw_gst_renderer_worker_get_current_frame_on_pause(m_worker) ==
1052 QVERIFY(m_gotPropertyCallback == true);
1053 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE);
1055 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
1056 QVERIFY(mafw_gst_renderer_worker_get_xid(m_worker) == 0xffff);
1057 QVERIFY(m_gotPropertyCallback == true);
1058 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_XID);
1059 m_gotPropertyCallback = false;
1060 m_receivedPropertyId = -1;
1062 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
1064 /* post xwindow-id on bus since we are using fakesink instead of
1067 GstStructure *structure;
1068 GstMessage *message;
1069 structure = gst_structure_new("prepare-xwindow-id", "width",
1070 G_TYPE_INT, 64, "height", G_TYPE_INT, 32,
1072 message = gst_message_new_element(NULL, structure);
1073 bus = m_worker->bus;
1074 gst_bus_post(bus, message);
1075 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1077 mafw_gst_renderer_worker_pause(m_worker);
1080 //no pause frame yet, let's make sure
1081 QVERIFY(m_gotPlayCallback == true);
1082 QVERIFY(m_gotPauseCallback == true);
1083 QVERIFY(m_gotMetadataCallback == true);
1084 QVERIFY(m_gotErrorCallback == false);
1085 QVERIFY(!m_receivedMetadata.contains(WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI));
1087 waitForEvent(WAIT_TIMEOUT, NEVER_HAPPENING_EVENT);
1088 QVERIFY(m_receivedMetadata.contains(WORKER_METADATA_KEY_PAUSED_THUMBNAIL_URI));
1090 mafw_gst_renderer_worker_stop(m_worker);
1092 config = mafw_gst_renderer_worker_create_default_configuration(m_worker);
1093 mafw_gst_renderer_worker_set_configuration(m_worker, config);
1097 void ut_MafwGstRendererWorker::setAndGetPropertiesTestCase()
1100 m_worker->notify_error_handler = &errorCallback;
1101 m_worker->notify_property_handler = &propertyCallback;
1102 m_worker->notify_play_handler = &playCallback;
1103 m_worker->notify_pause_handler = &pauseCallback;
1104 m_worker->blanking__control_handler = &blankingControlCallback;
1106 m_gotPropertyCallback = false;
1107 m_receivedPropertyId = -1;
1108 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
1109 QVERIFY(mafw_gst_renderer_worker_get_xid(m_worker) == 0xffff);
1110 QVERIFY(m_gotPropertyCallback == true);
1111 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_XID);
1112 m_gotPropertyCallback = false;
1113 m_receivedPropertyId = -1;
1115 mafw_gst_renderer_worker_set_force_aspect_ratio(m_worker, FALSE);
1116 QVERIFY(mafw_gst_renderer_worker_get_force_aspect_ratio(m_worker) == FALSE);
1117 QVERIFY(m_gotPropertyCallback == true);
1118 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_FORCE_ASPECT_RATIO);
1119 m_gotPropertyCallback = false;
1120 m_receivedPropertyId = -1;
1121 mafw_gst_renderer_worker_set_force_aspect_ratio(m_worker, TRUE);
1122 QVERIFY(mafw_gst_renderer_worker_get_force_aspect_ratio(m_worker) == TRUE);
1123 QVERIFY(m_gotPropertyCallback == true);
1124 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_FORCE_ASPECT_RATIO);
1125 m_gotPropertyCallback = false;
1126 m_receivedPropertyId = -1;
1128 mafw_gst_renderer_worker_set_current_frame_on_pause(m_worker, TRUE);
1129 QVERIFY(mafw_gst_renderer_worker_get_current_frame_on_pause(m_worker) ==
1131 QVERIFY(m_gotPropertyCallback == true);
1132 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE);
1133 m_gotPropertyCallback = false;
1134 m_receivedPropertyId = -1;
1135 mafw_gst_renderer_worker_set_current_frame_on_pause(m_worker, FALSE);
1136 QVERIFY(mafw_gst_renderer_worker_get_current_frame_on_pause(m_worker) ==
1138 QVERIFY(m_gotPropertyCallback == true);
1139 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_CURRENT_FRAME_ON_PAUSE);
1140 m_gotPropertyCallback = false;
1141 m_receivedPropertyId = -1;
1143 mafw_gst_renderer_worker_set_autopaint(m_worker, TRUE);
1144 QVERIFY(mafw_gst_renderer_worker_get_autopaint(m_worker) == TRUE);
1145 QVERIFY(m_gotPropertyCallback == true);
1146 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_AUTOPAINT);
1147 m_gotPropertyCallback = false;
1148 m_receivedPropertyId = -1;
1149 mafw_gst_renderer_worker_set_autopaint(m_worker, FALSE);
1150 QVERIFY(mafw_gst_renderer_worker_get_autopaint(m_worker) == FALSE);
1151 QVERIFY(m_gotPropertyCallback == true);
1152 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_AUTOPAINT);
1154 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
1155 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1156 QVERIFY(m_gotPlayCallback == true);
1157 QVERIFY(m_gotPauseCallback == false);
1159 mafw_gst_renderer_worker_set_playback_speed(m_worker, 2);
1160 QVERIFY(mafw_gst_renderer_worker_get_playback_speed(m_worker) == 2);
1161 QVERIFY(m_gotPropertyCallback == true);
1162 QVERIFY(m_receivedPropertyId == WORKER_PROPERTY_PLAYBACK_SPEED);
1163 m_gotPropertyCallback = false;
1164 m_receivedPropertyId = -1;
1165 mafw_gst_renderer_worker_set_playback_speed(m_worker, float(-1));
1166 QCOMPARE(mafw_gst_renderer_worker_get_playback_speed(m_worker), float(-1));
1167 m_gotPropertyCallback = false;
1168 m_receivedPropertyId = -1;
1169 mafw_gst_renderer_worker_set_playback_speed(m_worker, float(2.5));
1170 QCOMPARE(mafw_gst_renderer_worker_get_playback_speed(m_worker), float(2.5));
1172 render_rectangle rect = {1,2,3,4};
1173 m_gotPropertyCallback = false;
1174 m_receivedPropertyId = -1;
1176 mafw_gst_renderer_worker_set_render_rectangle(m_worker, &rect);
1177 QVERIFY(m_gotPropertyCallback);
1178 QVERIFY(m_receivedPropertyId != -1);
1179 const render_rectangle *storedRect = mafw_gst_renderer_worker_get_render_rectangle(m_worker);
1180 //the pointer value should not be used, copy must be made
1181 QVERIFY(&rect != storedRect );
1182 QCOMPARE(rect.x, storedRect->x);
1183 QCOMPARE(rect.y, storedRect->y);
1184 QCOMPARE(rect.width, storedRect->width);
1185 QCOMPARE(rect.height, storedRect->height);
1187 m_gotPropertyCallback = false;
1188 m_receivedPropertyId = -1;
1190 QVERIFY(m_gotErrorCallback == false);
1193 void ut_MafwGstRendererWorker::gettersTestCase()
1196 m_worker->notify_error_handler = &errorCallback;
1198 QVERIFY(mafw_gst_renderer_worker_get_colorkey(m_worker) == -1);
1199 QVERIFY(mafw_gst_renderer_worker_get_seekable(m_worker) == TRUE);
1200 QVERIFY(m_gotErrorCallback == false);
1204 void ut_MafwGstRendererWorker::mediaRouteTestCase()
1207 GSList *list = NULL;
1209 m_worker->notify_play_handler = &playCallback;
1210 m_worker->notify_error_handler = &errorCallback;
1211 m_worker->notify_eos_handler = &eosCallback;
1212 m_worker->notify_error_handler = &errorCallback;
1213 m_worker->blanking__control_handler = &blankingControlCallback;
1214 mafw_gst_renderer_worker_set_xid(m_worker, 0xffff);
1216 /* normal audio playback */
1217 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
1218 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1219 QVERIFY(m_gotPlayCallback == true);
1220 QVERIFY(m_gotErrorCallback == false);
1222 list = g_slist_append(list, GINT_TO_POINTER(WORKER_OUTPUT_BUILTIN_SPEAKERS));
1223 list = g_slist_append(list, GINT_TO_POINTER(WORKER_OUTPUT_BUILTIN_DISPLAY));
1224 mafw_gst_renderer_worker_notify_media_destination(m_worker, list);
1227 QVERIFY(g_slist_length(m_worker->destinations) == 2);
1228 QVERIFY(g_slist_find(m_worker->destinations, GINT_TO_POINTER(WORKER_OUTPUT_BUILTIN_SPEAKERS)));
1229 QVERIFY(g_slist_find(m_worker->destinations, GINT_TO_POINTER(WORKER_OUTPUT_BUILTIN_DISPLAY)));
1231 waitForEvent(EOS_TIMEOUT, m_gotEosCallback);
1233 QVERIFY(m_gotEosCallback == true);
1234 QVERIFY(m_gotErrorCallback == false);
1236 /* normal video playback */
1237 m_gotPlayCallback = false;
1238 m_gotEosCallback = false;
1239 m_gotErrorCallback = false;
1240 QVERIFY(m_blankingProhibited == false);
1241 mafw_gst_renderer_worker_play(m_worker, VIDEO_URI.toString().toAscii());
1242 m_worker->media.has_visual_content = true; // normally gst sets this but not in unittest for some reason
1243 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1244 QVERIFY(m_gotPlayCallback == true);
1245 QVERIFY(m_gotErrorCallback == false);
1246 QVERIFY(m_blankingProhibited == true);
1248 list = g_slist_append(list, GINT_TO_POINTER(WORKER_OUTPUT_HEADPHONE_JACK));
1249 list = g_slist_append(list, GINT_TO_POINTER(WORKER_OUTPUT_BUILTIN_DISPLAY));
1250 mafw_gst_renderer_worker_notify_media_destination(m_worker, list);
1253 QVERIFY(g_slist_length(m_worker->destinations) == 2);
1254 QVERIFY(g_slist_find(m_worker->destinations, GINT_TO_POINTER(WORKER_OUTPUT_HEADPHONE_JACK)));
1255 QVERIFY(g_slist_find(m_worker->destinations, GINT_TO_POINTER(WORKER_OUTPUT_BUILTIN_DISPLAY)));
1257 waitForEvent(WAIT_TIMEOUT, m_gotEosCallback);
1258 QVERIFY(m_gotEosCallback == true);
1259 QVERIFY(m_gotErrorCallback == false);
1263 void ut_MafwGstRendererWorker::setReadyTimeoutTestCase()
1266 m_worker->notify_play_handler = &playCallback;
1267 m_worker->notify_error_handler = &errorCallback;
1268 m_worker->notify_pause_handler = &pauseCallback;
1269 m_worker->notify_eos_handler = &eosCallback;
1270 m_worker->blanking__control_handler = &blankingControlCallback;
1272 /* do some basic set calls first */
1273 mafw_gst_renderer_worker_set_ready_timeout(m_worker, 0);
1274 QVERIFY(m_worker->config->seconds_to_pause_to_ready == 0);
1275 mafw_gst_renderer_worker_set_ready_timeout(m_worker, 60);
1276 QVERIFY(m_worker->config->seconds_to_pause_to_ready == 60);
1278 /* set timeout to 0, pause in the middle of the playback */
1279 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
1280 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1281 QVERIFY(m_gotPlayCallback == true);
1282 QVERIFY(m_gotErrorCallback == false);
1284 m_gotPlayCallback = false;
1285 m_gotPauseCallback = false;
1286 mafw_gst_renderer_worker_set_ready_timeout(m_worker, 0);
1287 QVERIFY(m_worker->config->seconds_to_pause_to_ready == 0);
1289 QVERIFY(m_worker->state == GST_STATE_PLAYING);
1290 mafw_gst_renderer_worker_pause(m_worker);
1291 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
1292 QVERIFY(m_worker->state == GST_STATE_PAUSED);
1294 QVERIFY(m_worker->state == GST_STATE_READY);
1296 m_gotPlayCallback = false;
1297 m_gotPauseCallback = false;
1299 mafw_gst_renderer_worker_resume(m_worker);
1300 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1301 QVERIFY(m_gotPlayCallback == true);
1302 QVERIFY(m_worker->state == GST_STATE_PLAYING);
1303 waitForEvent(WAIT_TIMEOUT, m_gotEosCallback);
1304 QVERIFY(m_gotEosCallback == true);
1306 /* set timeout to 3, pause in the middle of the playback */
1307 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
1308 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1309 QVERIFY(m_gotPlayCallback == true);
1310 QVERIFY(m_gotErrorCallback == false);
1312 m_gotPlayCallback = false;
1313 m_gotPauseCallback = false;
1314 mafw_gst_renderer_worker_set_ready_timeout(m_worker, 3);
1315 QVERIFY(m_worker->config->seconds_to_pause_to_ready == 3);
1317 QVERIFY(m_worker->state == GST_STATE_PLAYING);
1318 mafw_gst_renderer_worker_pause(m_worker);
1319 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
1320 QVERIFY(m_worker->state == GST_STATE_PAUSED);
1322 m_gotPlayCallback = false;
1323 m_gotPauseCallback = false;
1325 QVERIFY(m_worker->state == GST_STATE_READY);
1327 mafw_gst_renderer_worker_resume(m_worker);
1328 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1329 QVERIFY(m_gotPlayCallback == true);
1330 QVERIFY(m_worker->state == GST_STATE_PLAYING);
1331 waitForEvent(WAIT_TIMEOUT, m_gotEosCallback);
1332 QVERIFY(m_gotEosCallback == true);
1334 /* set timeout to 0, pause in the middle of the playback after setting the
1335 * timeout value --> we should go to ready immediately */
1336 mafw_gst_renderer_worker_play(m_worker, AUDIO_URI.toString().toAscii());
1337 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1338 QVERIFY(m_gotPlayCallback == true);
1339 QVERIFY(m_gotErrorCallback == false);
1340 mafw_gst_renderer_worker_set_ready_timeout(m_worker, 60);
1341 QVERIFY(m_worker->config->seconds_to_pause_to_ready == 60);
1343 m_gotPlayCallback = false;
1344 m_gotPauseCallback = false;
1346 QVERIFY(m_worker->state == GST_STATE_PLAYING);
1347 mafw_gst_renderer_worker_pause(m_worker);
1348 waitForEvent(WAIT_TIMEOUT, m_gotPauseCallback);
1349 QVERIFY(m_worker->state == GST_STATE_PAUSED);
1350 mafw_gst_renderer_worker_set_ready_timeout(m_worker, 0);
1351 QVERIFY(m_worker->config->seconds_to_pause_to_ready == 0);
1353 QVERIFY(m_worker->state == GST_STATE_READY);
1355 m_gotPlayCallback = false;
1356 m_gotPauseCallback = false;
1358 mafw_gst_renderer_worker_resume(m_worker);
1359 waitForEvent(WAIT_TIMEOUT, m_gotPlayCallback);
1360 QVERIFY(m_gotPlayCallback == true);
1361 QVERIFY(m_worker->state == GST_STATE_PLAYING);
1362 waitForEvent(WAIT_TIMEOUT, m_gotEosCallback);
1363 QVERIFY(m_gotEosCallback == true);
1367 void ut_MafwGstRendererWorker::initTestCase()
1372 void ut_MafwGstRendererWorker::init()
1375 qDebug() << __PRETTY_FUNCTION__;
1378 m_receivedErrorCode = -1;
1379 m_receivedPropertyId = -1;
1380 m_receivedBufferStatus = -1.0;
1381 m_receivedMetadata.clear();
1382 m_gotPlayCallback = false;
1383 m_gotEosCallback = false;
1384 m_gotErrorCallback = false;
1385 m_gotPauseCallback = false;
1386 m_gotSeekCallback = false;
1387 m_gotMetadataCallback = false;
1388 m_gotPropertyCallback = false;
1389 m_gotBufferStatusCallback = false;
1390 m_blankingProhibited = false;
1392 global_context_duration = 0;
1395 QByteArray tmo = qgetenv("WAIT_TIMEOUT");
1396 int val = tmo.toInt(&ok, 10);
1400 qDebug() << "WAIT_TIMEOUT is set to" << WAIT_TIMEOUT;
1404 qDebug() << "Using default WAIT_TIMEOUT" << WAIT_TIMEOUT;
1407 const QString scheme("file");
1408 AUDIO_URI.setScheme(scheme);
1409 VIDEO_URI.setScheme(scheme);
1410 IMAGE_URI.setScheme(scheme);
1412 m_worker = mafw_gst_renderer_worker_new(this);
1414 QVERIFY(m_worker != 0);
1416 globalGstFactoryRequests.clear();
1419 void ut_MafwGstRendererWorker::cleanup()
1421 QVERIFY(m_worker != 0);
1423 mafw_gst_renderer_worker_exit(m_worker);
1426 QVERIFY(m_blankingProhibited == false);
1428 m_gotPlayCallback = false;
1429 m_gotErrorCallback = false;
1432 QTEST_MAIN(ut_MafwGstRendererWorker)