static void test_missing_suburisource_handler (void) { GstStructure *s; GstMessage *msg; GstElement *playbin; GError *err = NULL; GstBus *bus; playbin = create_playbin ("file:///does/not/exis.t"); g_object_set (playbin, "suburi", "cookie://withahint.of/cinnamon", NULL); fail_unless_equals_int (gst_element_set_state (playbin, GST_STATE_READY), GST_STATE_CHANGE_SUCCESS); fail_unless_equals_int (gst_element_set_state (playbin, GST_STATE_PAUSED), GST_STATE_CHANGE_FAILURE); /* there should be at least a missing-plugin message on the bus now and an * error message; the missing-plugin message should be first */ bus = gst_element_get_bus (playbin); msg = gst_bus_poll (bus, GST_MESSAGE_ELEMENT | GST_MESSAGE_ERROR, -1); fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT); fail_unless (msg->structure != NULL); s = msg->structure; fail_unless (gst_structure_has_name (s, "missing-plugin")); fail_unless (gst_structure_has_field_typed (s, "detail", G_TYPE_STRING)); fail_unless_equals_string (gst_structure_get_string (s, "detail"), "cookie"); fail_unless (gst_structure_has_field_typed (s, "type", G_TYPE_STRING)); fail_unless_equals_string (gst_structure_get_string (s, "type"), "urisource"); gst_message_unref (msg); msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, -1); fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ERROR); /* make sure the error is a CORE MISSING_PLUGIN one */ gst_message_parse_error (msg, &err, NULL); fail_unless (err != NULL); fail_unless (err->domain == GST_CORE_ERROR, "error has wrong error domain " "%s instead of core-error-quark", g_quark_to_string (err->domain)); fail_unless (err->code == GST_CORE_ERROR_MISSING_PLUGIN, "error has wrong " "code %u instead of GST_CORE_ERROR_MISSING_PLUGIN", err->code); g_error_free (err); gst_message_unref (msg); gst_object_unref (bus); gst_element_set_state (playbin, GST_STATE_NULL); gst_object_unref (playbin); }
static void test_initialized_with_audio_caps (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" num-buffers=1 ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_PLAYING); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); fail_unless (e->caps != NULL, NULL); gint i, cs = gst_caps_get_size (e->caps); fail_unless (cs > 0, NULL); for (i = 0; i < cs; i++) { fail_unless (gst_structure_has_name (gst_caps_get_structure (e->caps, i), "audio/x-raw"), NULL); } GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
/* * run_pipeline: * @pipe: the pipeline to run * @desc: the description for use in messages * @events: is a mask of expected events * @tevent: is the expected terminal event. * * the poll call will time out after half a second. */ static void run_pipeline (GstElement * pipe, const gchar * descr, GstMessageType events, GstMessageType tevent, GstState target_state) { GstBus *bus; GstMessage *message; GstMessageType revent; GstStateChangeReturn ret; g_assert (pipe); bus = gst_element_get_bus (pipe); g_assert (bus); fail_if (gst_element_set_state (pipe, target_state) == GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to playing", descr); ret = gst_element_get_state (pipe, NULL, NULL, 10 * GST_SECOND); if (ret == GST_STATE_CHANGE_ASYNC) { g_critical ("Pipeline '%s' failed to go to PAUSED fast enough", descr); goto done; } else if ((ret != GST_STATE_CHANGE_SUCCESS) && (ret != GST_STATE_CHANGE_NO_PREROLL)) { g_critical ("Pipeline '%s' failed to go into PAUSED state (%s)", descr, gst_element_state_change_return_get_name (ret)); goto done; } while (1) { message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2); /* always have to pop the message before getting back into poll */ if (message) { revent = GST_MESSAGE_TYPE (message); gst_message_unref (message); } else { revent = GST_MESSAGE_UNKNOWN; } if (revent == tevent) { break; } else if (revent == GST_MESSAGE_UNKNOWN) { g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s", tevent, descr); break; } else if (revent & events) { continue; } g_critical ("Unexpected message received of type %d, '%s', looking for %d: %s", revent, gst_message_type_get_name (revent), tevent, descr); } done: fail_if (gst_element_set_state (pipe, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to NULL", descr); gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); gst_object_unref (pipe); gst_bus_set_flushing (bus, TRUE); gst_object_unref (bus); }
static void event_loop (GstElement * pipe) { GstBus *bus; GstMessage *message = NULL; bus = gst_element_get_bus (GST_ELEMENT (pipe)); while (TRUE) { message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1); g_assert (message != NULL); switch (message->type) { case GST_MESSAGE_EOS: gst_message_unref (message); return; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR:{ GError *gerror; gchar *debug; gst_message_parse_error (message, &gerror, &debug); gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); gst_message_unref (message); g_error_free (gerror); g_free (debug); return; } default: gst_message_unref (message); break; } } }
static void test_buffers_are_contigous (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" num-buffers=2 ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_PLAYING); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); BufferFields *bf0 = get_buffer_info (e, 0); BufferFields *bf1 = get_buffer_info (e, 1); ck_assert_uint64_eq (bf1->ts, bf0->ts + bf0->duration); ck_assert_uint64_eq (bf1->offset, bf0->offset + bf0->offset_end); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
void poll_the_bus (GstBus * bus) { GstMessage *message; gboolean carry_on = TRUE; while (carry_on) { message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10); if (message) { switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_EOS: /* we should check if we really finished here */ GST_DEBUG ("Got an EOS"); carry_on = FALSE; break; case GST_MESSAGE_SEGMENT_START: case GST_MESSAGE_SEGMENT_DONE: /* We shouldn't see any segement messages, since we didn't do a segment seek */ GST_WARNING ("Saw a Segment start/stop"); fail_if (TRUE); break; case GST_MESSAGE_ERROR: fail_error_message (message); default: break; } gst_mini_object_unref (GST_MINI_OBJECT (message)); } } }
static void test_reset_on_seek (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_PAUSED); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_element_seek (p, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, GST_MSECOND * 100, GST_SEEK_TYPE_SET, GST_MSECOND * 200); gst_element_set_state (p, GST_STATE_PLAYING); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); ck_assert_int_eq (e->num_disconts, 1); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
static void test_position_query_time (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" num-buffers=1 ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_PLAYING); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); BufferFields *bf = get_buffer_info (e, 0); gint64 pos; gboolean res = gst_element_query_position ((GstElement *) e, GST_FORMAT_TIME, &pos); fail_unless (res, NULL); ck_assert_uint64_eq (bf->duration, pos); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
void Pipeline::start () { // set a callback to retrieve the gst gl textures GstElement *fakesink = gst_bin_get_by_name (GST_BIN (this->m_pipeline), "fakesink0"); g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL); g_signal_connect (fakesink, "handoff", G_CALLBACK (on_gst_buffer), this); gst_object_unref (fakesink); GstStateChangeReturn ret = gst_element_set_state (GST_ELEMENT (this->m_pipeline), GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { qDebug ("Failed to start up pipeline!"); /* check if there is an error message with details on the bus */ GstMessage *msg = gst_bus_poll (this->m_bus, GST_MESSAGE_ERROR, 0); if (msg) { GError *err = NULL; gst_message_parse_error (msg, &err, NULL); qDebug ("ERROR: %s", err->message); g_error_free (err); gst_message_unref (msg); } return; } #ifdef Q_WS_WIN g_main_loop_run (m_loop); #endif }
static void play_file (const gchar * uri) { GstStateChangeReturn sret; GstMessage *msg; GstElement *play; guint wait_nanosecs; play = gst_element_factory_make ("playbin", "playbin"); g_object_set (play, "uri", uri, NULL); sret = gst_element_set_state (play, GST_STATE_PLAYING); if (sret != GST_STATE_CHANGE_ASYNC) { g_printerr ("ERROR: state change failed, sret=%d\n", sret); goto next; } wait_nanosecs = g_random_int_range (0, GST_SECOND / 10); msg = gst_bus_poll (GST_ELEMENT_BUS (play), GST_MESSAGE_ERROR | GST_MESSAGE_EOS, wait_nanosecs); if (msg) { g_printerr ("Got %s messge\n", GST_MESSAGE_TYPE_NAME (msg)); gst_message_unref (msg); goto next; } /* on to the next one */ g_print ("."); next: gst_element_set_state (play, GST_STATE_NULL); }
static void test_audio_context_configures_buffer_size (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" num-buffers=1 ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_READY); gst_element_set_context (p, ctx); gst_element_set_state (p, GST_STATE_PLAYING); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); BufferFields *bf = get_buffer_info (e, 0); // sizeof(gint16) * (int)(0.5 + (44100 * (60.0 / 8)) / (120 * 4)) ck_assert_uint_eq (bf->size, 1378); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (bus); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
static void get_device_data (ofGstDevice &webcam_device, int desired_framerate) { string pipeline_desc = webcam_device.gstreamer_src + " name=source device=" + webcam_device.video_device + " ! fakesink"; GError * err = NULL; GstElement * pipeline = gst_parse_launch (pipeline_desc.c_str(), &err); if ((pipeline == NULL) || (err != NULL)){ if (err){ ofLog(OF_LOG_ERROR, "ofGstUtils: error getting device data: %s", err->message); g_error_free (err); }else{ ofLog(OF_LOG_ERROR, "ofGstUtils: error getting device data, cannot get pipeline"); } if(pipeline) gst_object_unref (pipeline); return; } // TODO: try to lower seconds, // Start the pipeline and wait for max. 10 seconds for it to start up gst_element_set_state (pipeline, GST_STATE_PLAYING); GstStateChangeReturn ret = gst_element_get_state (pipeline, NULL, NULL, 10 * GST_SECOND); // Check if any error messages were posted on the bus GstBus * bus = gst_element_get_bus (pipeline); GstMessage * msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); gst_object_unref (bus); if ((msg == NULL) && (ret == GST_STATE_CHANGE_SUCCESS)){ gst_element_set_state (pipeline, GST_STATE_PAUSED); GstElement *src = gst_bin_get_by_name (GST_BIN (pipeline), "source"); char *name; g_object_get (G_OBJECT (src), "device-name", &name, (void*)NULL); ofLog(OF_LOG_VERBOSE, "Device: %s (%s)\n", name==NULL?"":name, webcam_device.video_device.c_str()); GstPad *pad = gst_element_get_pad (src, "src"); GstCaps *caps = gst_pad_get_caps (pad); gst_object_unref (pad); get_supported_video_formats (webcam_device, *caps, desired_framerate); gst_caps_unref (caps); }else if(msg){ gchar *debug; gst_message_parse_error(msg, &err, &debug); ofLog(OF_LOG_ERROR, "ofGstUtils: error getting device data; module %s reported: %s", gst_element_get_name(GST_MESSAGE_SRC (msg)), err->message); g_error_free(err); g_free(debug); } gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); }
static void get_device_data (ofGstDevice &webcam_device) { char *pipeline_desc; GstElement *pipeline; GError *err; GstStateChangeReturn ret; GstMessage *msg; GstBus *bus; { pipeline_desc = g_strdup_printf ("%s name=source device=%s ! fakesink", webcam_device.gstreamer_src, webcam_device.video_device); err = NULL; pipeline = gst_parse_launch (pipeline_desc, &err); if ((pipeline != NULL) && (err == NULL)) { /* Start the pipeline and wait for max. 10 seconds for it to start up */ gst_element_set_state (pipeline, GST_STATE_PLAYING); ret = gst_element_get_state (pipeline, NULL, NULL, 10 * GST_SECOND); /* Check if any error messages were posted on the bus */ bus = gst_element_get_bus (pipeline); msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); gst_object_unref (bus); if ((msg == NULL) && (ret == GST_STATE_CHANGE_SUCCESS)) { GstElement *src; GstPad *pad; char *name; GstCaps *caps; gst_element_set_state (pipeline, GST_STATE_PAUSED); src = gst_bin_get_by_name (GST_BIN (pipeline), "source"); g_object_get (G_OBJECT (src), "device-name", &name, (void*)NULL); if (name == NULL) name = "Unknown"; // ofLog(OF_LOG_VERBOSE,"Device: %s (%s)\n", name, webcam_device.video_device); pad = gst_element_get_pad (src, "src"); caps = gst_pad_get_caps (pad); gst_object_unref (pad); get_supported_video_formats (webcam_device, *caps); gst_caps_unref (caps); } gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); } if (err) g_error_free (err); g_free (pipeline_desc); } }
static int poll_gst(void *data) { GstMessage *message; while( (message = gst_bus_poll(_bus_instance(), GST_MESSAGE_ANY, 0)) != 0) { handle_gst_message(message); } return TRUE; }
static GstMessageType get_message_type (GstBus * bus) { GstMessage *message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2); GstMessageType message_type = GST_MESSAGE_UNKNOWN; if (message) { message_type = GST_MESSAGE_TYPE (message); gst_message_unref (message); } return message_type; }
/* * run_pipeline: * @pipe: the pipeline to run * @desc: the description for use in messages * @message_types: is a mask of expected message_types * @tmessage: is the expected terminal message * * the poll call will time out after half a second. */ static void run_pipeline (GstElement * pipeline, const gchar * descr, GstMessageType message_types, GstMessageType tmessage) { GstBus *bus; GstMessageType rmessage; GstStateChangeReturn ret; fail_if (pipeline == NULL); bus = gst_element_get_bus (pipeline); fail_if (bus == NULL); GST_DEBUG ("running pipeline %s", descr); ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); ret = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); if (ret != GST_STATE_CHANGE_SUCCESS) { GST_WARNING ("have failed state change %d", ret); g_critical ("Couldn't set pipeline to PLAYING"); goto done; } while (1) { GstMessage *message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2); if (message) { rmessage = GST_MESSAGE_TYPE (message); gst_message_unref (message); } else { rmessage = GST_MESSAGE_UNKNOWN; } if (rmessage == tmessage) { break; } else if (rmessage == GST_MESSAGE_UNKNOWN) { g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s", tmessage, descr); break; } else if (rmessage & message_types) { continue; } g_critical ("Unexpected message received of type %d, '%s', looking for %d: %s", rmessage, gst_message_type_get_name (rmessage), tmessage, descr); } done: gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); gst_object_unref (bus); }
static void play_file (const gint delay, const gchar * uri) { GstStateChangeReturn sret; GstMessage *msg; GstElement *play; guint wait_nanosecs; play = gst_element_factory_make ("playbin", "playbin"); g_object_set (play, "uri", uri, NULL); g_printerr ("Playing %s\n", uri); sret = gst_element_set_state (play, GST_STATE_PLAYING); if (sret != GST_STATE_CHANGE_ASYNC && sret != GST_STATE_CHANGE_SUCCESS) { g_printerr ("ERROR: state change failed, sret=%d\n", sret); goto next; } wait_nanosecs = g_random_int_range (0, GST_MSECOND * delay); msg = gst_bus_poll (GST_ELEMENT_BUS (play), GST_MESSAGE_ERROR | GST_MESSAGE_EOS, wait_nanosecs); if (msg) { switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_ERROR: { GError *gerror; gchar *debug; gst_message_parse_error (msg, &gerror, &debug); gst_object_default_error (GST_MESSAGE_SRC (msg), gerror, debug); g_clear_error (&gerror); g_free (debug); break; } case GST_MESSAGE_EOS: g_printerr ("Got EOS\n"); break; default: g_printerr ("Got unexpected %s messge\n", GST_MESSAGE_TYPE_NAME (msg)); break; } gst_message_unref (msg); goto next; } /* on to the next one */ g_print ("."); next: gst_element_set_state (play, GST_STATE_NULL); gst_object_unref (play); }
/* * run_pipeline: * @pipe: the pipeline to run * @desc: the description for use in messages * @events: is a mask of expected events * @tevent: is the expected terminal event. * * the poll call will time out after half a second. */ static void run_pipeline (GstElement * pipe, const gchar * descr, GstMessageType events, GstMessageType tevent) { GstBus *bus; GstMessage *message; GstMessageType revent; GstStateChangeReturn ret; g_assert (pipe); bus = gst_element_get_bus (pipe); g_assert (bus); ret = gst_element_set_state (pipe, GST_STATE_PLAYING); ret = gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); if (ret != GST_STATE_CHANGE_SUCCESS) { g_critical ("Couldn't set pipeline to PLAYING"); goto done; } while (1) { message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2); /* always have to pop the message before getting back into poll */ if (message) { revent = GST_MESSAGE_TYPE (message); gst_message_unref (message); } else { revent = GST_MESSAGE_UNKNOWN; } if (revent == tevent) { break; } else if (revent == GST_MESSAGE_UNKNOWN) { g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s", tevent, descr); break; } else if (revent & events) { continue; } g_critical ("Unexpected message received of type %d, '%s', looking for %d: %s", revent, gst_message_type_get_name (revent), tevent, descr); } done: gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); }
void test_buffer_probe_n_times() { GstElement *pipeline, *fakesrc, *fakesink; GstBus *bus; GstMessage *message; GstPad *pad; xmlfile = "gstutils_test_buffer_probe_n_times"; std_log(LOG_FILENAME_LINE, "Test Started gstutils_test_buffer_probe_n_times"); pipeline = gst_element_factory_make ("pipeline", NULL); fakesrc = gst_element_factory_make ("fakesrc", NULL); fakesink = gst_element_factory_make ("fakesink", NULL); g_object_set (fakesrc, "num-buffers", (int) 10, NULL); gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL); gst_element_link (fakesrc, fakesink); pad = gst_element_get_pad (fakesink, "sink"); gst_pad_add_data_probe (pad, G_CALLBACK (data_probe), SPECIAL_POINTER (0)); gst_pad_add_buffer_probe (pad, G_CALLBACK (buffer_probe), SPECIAL_POINTER (1)); gst_pad_add_event_probe (pad, G_CALLBACK (event_probe), SPECIAL_POINTER (2)); gst_object_unref (pad); gst_element_set_state (pipeline, GST_STATE_PLAYING); bus = gst_element_get_bus (pipeline); message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); gst_message_unref (message); gst_object_unref (bus); g_assert (n_buffer_probes == 10); /* one for every buffer */ g_assert (n_event_probes == 3); /* new segment, latency and eos */ g_assert (n_data_probes == 13); /* duh */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); /* make sure nothing was sent in addition to the above when shutting down */ g_assert (n_buffer_probes == 10); /* one for every buffer */ g_assert (n_event_probes == 3); /* new segment, latency and eos */ g_assert (n_data_probes == 13); /* duh */ std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
static void do_test_simple_shutdown_while_running (guint64 ring_buffer_max_size) { GstElement *pipe, *q2; GstElement *input; GstElement *output; GstMessage *msg; pipe = gst_pipeline_new ("pipeline"); input = gst_element_factory_make ("fakesrc", NULL); fail_unless (input != NULL, "failed to create 'fakesrc' element"); g_object_set (input, "format", GST_FORMAT_TIME, "sizetype", 2, "sizemax", 10, NULL); output = gst_element_factory_make ("fakesink", NULL); fail_unless (output != NULL, "failed to create 'fakesink' element"); q2 = setup_queue2 (pipe, input, output); if (ring_buffer_max_size > 0) { g_object_set (q2, "ring-buffer-max-size", ring_buffer_max_size, "temp-template", NULL, NULL); } gst_element_set_state (pipe, GST_STATE_PAUSED); /* wait until pipeline is up and running */ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE, -1); fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR, "Got ERROR message"); gst_message_unref (msg); GST_LOG ("pipeline is running now"); gst_element_set_state (pipe, GST_STATE_PLAYING); g_usleep (G_USEC_PER_SEC / 20); /* now shut down only the sink, so the queue gets a wrong-state flow return */ gst_element_set_state (output, GST_STATE_NULL); GST_LOG ("Cleaning up"); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); }
void test_buffer_probe_once() { GstElement *pipeline, *fakesrc, *fakesink; GstBus *bus; GstMessage *message; GstPad *pad; guint id1, id2, id3; xmlfile = "gstutils_test_buffer_probe_once"; std_log(LOG_FILENAME_LINE, "Test Started gstutils_test_buffer_probe_once"); pipeline = gst_element_factory_make ("pipeline", NULL); fakesrc = gst_element_factory_make ("fakesrc", NULL); fakesink = gst_element_factory_make ("fakesink", NULL); g_object_set (fakesrc, "num-buffers", (int) 10, NULL); gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL); gst_element_link (fakesrc, fakesink); pad = gst_element_get_pad (fakesink, "sink"); id1 = gst_pad_add_data_probe (pad, G_CALLBACK (data_probe_once), &id1); id2 = gst_pad_add_buffer_probe (pad, G_CALLBACK (buffer_probe_once), &id2); id3 = gst_pad_add_event_probe (pad, G_CALLBACK (event_probe_once), &id3); gst_object_unref (pad); gst_element_set_state (pipeline, GST_STATE_PLAYING); bus = gst_element_get_bus (pipeline); message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); gst_message_unref (message); gst_object_unref (bus); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_assert (n_buffer_probes_once == 1); /* can we hit it and quit? */ g_assert (n_event_probes_once == 1); /* i said, can we hit it and quit? */ g_assert (n_data_probes_once == 1); /* let's hit it and quit!!! */ std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
void Pipeline::setState(GstState state) { GstStateChangeReturn ret = gst_element_set_state (m_pipeline, state); if (ret == GST_STATE_CHANGE_FAILURE) { qDebug ("Failed to start up pipeline!"); /* check if there is an error message with details on the bus */ GstMessage* msg = gst_bus_poll (m_bus, GST_MESSAGE_ERROR, 0); if (msg) { GError *err = NULL; gst_message_parse_error (msg, &err, NULL); qDebug ("ERROR: %s", err->message); g_error_free (err); gst_message_unref (msg); } return; } }
/* * Utility function that sets up a pipeline with deinterlace for * validanting that it operates in passthrough mode when receiving * data with 'infiltercaps' as the input caps and operating in 'mode' mode */ static void deinterlace_check_passthrough (gint mode, const gchar * infiltercaps) { GstMessage *msg; GQueue *queue; GstCaps *incaps = NULL; if (infiltercaps) incaps = gst_caps_from_string (infiltercaps); setup_test_pipeline (mode, incaps, NULL, 20); queue = g_queue_new (); /* set up probes for testing */ gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_BUFFER, sinkpad_enqueue_buffer, queue, NULL); gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_BUFFER, srcpad_dequeue_and_compare_buffer, queue, NULL); fail_unless (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_ERROR | GST_MESSAGE_EOS, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GST_ERROR ("ERROR: %" GST_PTR_FORMAT, msg); fail ("Unexpected error message"); } gst_message_unref (msg); /* queue should be empty */ fail_unless (g_queue_is_empty (queue)); fail_unless (gst_element_set_state (pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (pipeline); gst_object_unref (sinkpad); gst_object_unref (srcpad); g_queue_free (queue); }
static void test_num_buffers_with_stop_pos (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GstSeekFlags seek_flags[] = { GST_SEEK_FLAG_FLUSH, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT }; GstMessageType end_msg[] = { GST_MESSAGE_EOS, GST_MESSAGE_SEGMENT_DONE }; GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_READY); gst_element_set_context (p, ctx); gst_element_set_state (p, GST_STATE_PAUSED); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_element_seek (p, 1.0, GST_FORMAT_TIME, seek_flags[_i], GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT (0), GST_SEEK_TYPE_SET, ticktime * 2); gst_element_set_state (p, GST_STATE_PLAYING); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_bus_poll (bus, end_msg[_i] | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); gint num_buffers = g_list_length (e->buffer_info); ck_assert_uint_eq (num_buffers, 2); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
static gboolean check_bus_for_errors (GstBus * bus, GstClockTime max_wait_time) { GstMessage *msg; msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, max_wait_time); if (msg) { GError *err = NULL; gchar *debug = NULL; g_assert (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR); gst_message_parse_error (msg, &err, &debug); GST_ERROR ("ERROR: %s [%s]", err->message, debug); g_print ("\n===========> ERROR: %s\n%s\n\n", err->message, debug); g_error_free (err); g_free (debug); gst_message_unref (msg); } return (msg != NULL); }
static void event_loop (GstElement * bin) { GstBus *bus; GstMessage *msg = NULL; gboolean running = TRUE; bus = gst_element_get_bus (bin); while (running) { msg = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, -1); if (GST_MESSAGE_SRC (msg) == (GstObject *) bin) { GstState old_state, new_state; gst_message_parse_state_changed (msg, &old_state, &new_state, NULL); if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED) { running = FALSE; } } gst_message_unref (msg); } }
void test_element_found_tags() { GstElement *pipeline, *fakesrc, *fakesink; GstTagList *list; GstBus *bus; GstMessage *message; xmlfile = "gstutils_test_element_found_tags"; std_log(LOG_FILENAME_LINE, "Test Started gstutils_test_element_found_tags"); pipeline = gst_element_factory_make ("pipeline", NULL); fakesrc = gst_element_factory_make ("fakesrc", NULL); fakesink = gst_element_factory_make ("fakesink", NULL); list = gst_tag_list_new (); g_object_set (fakesrc, "num-buffers", (int) 10, NULL); gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL); gst_element_link (fakesrc, fakesink); gst_element_set_state (pipeline, GST_STATE_PLAYING); gst_element_found_tags (GST_ELEMENT (fakesrc), list); bus = gst_element_get_bus (pipeline); message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); gst_message_unref (message); gst_object_unref (bus); /* FIXME: maybe also check if the fakesink receives the message */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
static void test_last_buffer_is_clipped (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_READY); gst_element_set_context (p, ctx); gst_element_set_state (p, GST_STATE_PAUSED); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_element_seek (p, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT (0), GST_SEEK_TYPE_SET, ticktime * 1.5); gst_element_set_state (p, GST_STATE_PLAYING); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); BufferFields *bf0 = get_buffer_info (e, 0); BufferFields *bf1 = get_buffer_info (e, 1); ck_assert_uint64_le (bf1->duration, bf0->duration / 2); ck_assert_uint_le (bf1->size, bf0->size / 2); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }
void IKGSTAudioPlayer::event_loop(GstElement * pipe) { GstBus *bus; GstMessage *message = NULL; bus = gst_element_get_bus(GST_ELEMENT(pipe)); bool loop = true; while(loop) { message = gst_bus_poll(bus, GST_MESSAGE_ANY, -1); g_assert(message != NULL); switch(message->type) { case GST_MESSAGE_EOS: gst_message_unref(message); loop = false;//return break; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR: { GError *gerror; gchar *debug; gst_message_parse_error(message, &gerror, &debug); gst_object_default_error(GST_MESSAGE_SRC(message), gerror, debug); gst_message_unref(message); g_error_free(gerror); g_free(debug); loop = false;//return } break; default: gst_message_unref(message); break; } } gst_object_unref(bus); }
static void test_backwards_last_buffer_ends_at_zero (BT_TEST_ARGS) { BT_TEST_START; GST_INFO ("-- arrange --"); GstElement *p = gst_parse_launch ("buzztrax-test-audio-synth name=\"src\" num-buffers=1 ! fakesink async=false", NULL); BtTestAudioSynth *e = (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src"); GstBus *bus = gst_element_get_bus (p); GST_INFO ("-- act --"); gst_element_set_state (p, GST_STATE_READY); gst_element_set_context (p, ctx); gst_element_set_state (p, GST_STATE_PAUSED); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_element_seek (p, -1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT (0), GST_SEEK_TYPE_SET, ticktime); gst_element_set_state (p, GST_STATE_PLAYING); gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE); gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE); GST_INFO ("-- assert --"); BufferFields *bf = get_buffer_info (e, 0); ck_assert_uint64_eq (bf->ts, 0); ck_assert_uint64_eq (bf->offset, 0); GST_INFO ("-- cleanup --"); gst_element_set_state (p, GST_STATE_NULL); gst_object_unref (e); gst_object_unref (p); BT_TEST_END; }