static GstStateChangeReturn gst_base_camera_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstBaseCameraSrc *self = GST_BASE_CAMERA_SRC (element); GST_DEBUG_OBJECT (self, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!construct_pipeline (self)) return GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!setup_pipeline (self)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return ret; }
static GstStateChangeReturn gst_base_camera_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstBaseCameraSrc *self = GST_BASE_CAMERA_SRC (element); GST_DEBUG_OBJECT (self, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!construct_pipeline (self)) return GST_STATE_CHANGE_FAILURE; if (self->preview_pipeline == NULL) { /* failed to create preview pipeline, fail state change */ return GST_STATE_CHANGE_FAILURE; } if (self->preview_caps) { GST_DEBUG_OBJECT (self, "Setting preview pipeline caps %" GST_PTR_FORMAT, self->preview_caps); gst_camerabin_preview_set_caps (self->preview_pipeline, self->preview_caps); } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!setup_pipeline (self)) return GST_STATE_CHANGE_FAILURE; /* without this the preview pipeline will not post buffer * messages on the pipeline */ gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_PLAYING); if (self->auto_start) g_signal_emit_by_name (G_OBJECT (self), "start-capture", NULL); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_READY); if (self->auto_start) g_signal_emit_by_name (G_OBJECT (self), "stop-capture", NULL); break; case GST_STATE_CHANGE_READY_TO_NULL: gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_NULL); break; default: break; } return ret; }
GST_END_TEST GST_START_TEST (test_glfilterapp) { gchar *s; GstState target_state = GST_STATE_PLAYING; s = "videotestsrc num-buffers=10 ! glfilterapp ! fakesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = "gltestsrc num-buffers=10 ! glfilterapp ! fakesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); }
static GstStateChangeReturn gst_base_camera_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstBaseCameraBinSrc *self = GST_BASE_CAMERA_SRC (element); GST_DEBUG_OBJECT (self, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!construct_pipeline (self)) return GST_STATE_CHANGE_FAILURE; /* recreate the preview pipeline */ if (self->preview_pipeline && self->preview_filter_changed) { gst_camerabin_destroy_preview_pipeline (self->preview_pipeline); self->preview_pipeline = NULL; } if (self->preview_pipeline == NULL) self->preview_pipeline = gst_camerabin_create_preview_pipeline (GST_ELEMENT_CAST (self), self->preview_filter); g_assert (self->preview_pipeline != NULL); self->preview_filter_changed = FALSE; if (self->preview_caps) { GST_DEBUG_OBJECT (self, "Setting preview pipeline caps %" GST_PTR_FORMAT, self->preview_caps); gst_camerabin_preview_set_caps (self->preview_pipeline, self->preview_caps); } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!setup_pipeline (self)) return GST_STATE_CHANGE_FAILURE; gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_PLAYING); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_NULL); break; default: break; } return ret; }
void test_launch_lines() { GstElement *pipeline; const gchar **s; xmlfile = "test_launch_lines"; std_log(LOG_FILENAME_LINE, "Test Started test_launch_lines"); for (s = test_lines; *s != NULL; s++) { pipeline = setup_pipeline (*s); gst_object_unref (pipeline); } std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
GST_END_TEST #undef N_EFFECTS #if GST_GL_HAVE_OPENGL #define N_SRCS 13 GST_START_TEST (test_gltestsrc) { gchar *s; GstState target_state = GST_STATE_PLAYING; guint i; for (i = 0; i < N_SRCS; i++) { s = g_strdup_printf ("gltestsrc pattern=%i num-buffers=10 ! fakesink", i); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); g_free (s); } }
GST_END_TEST #if GST_GL_HAVE_GLES2 # define N_EFFECTS 3 #else # define N_EFFECTS 16 #endif GST_START_TEST (test_gleffects) { gchar *s; GstState target_state = GST_STATE_PLAYING; guint i; for (i = 0; i < N_EFFECTS; i++) { s = g_strdup_printf ("videotestsrc num-buffers=10 ! gleffects effect=%i" " ! fakesink", i); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); g_free (s); } }
/* Helper function to test delayed linking support in parse_launch by creating * a test element based on bin, which contains a fakesrc and a sometimes * pad-template, and trying to link to a fakesink. When the bin transitions * to paused it adds a pad, which should get linked to the fakesink */ static void run_delayed_test (const gchar * pipe_str, const gchar * peer, gboolean expect_link) { GstElement *pipe, *src, *sink; GstPad *srcpad, *sinkpad, *peerpad = NULL; pipe = setup_pipeline (pipe_str); src = gst_bin_get_by_name (GST_BIN (pipe), "src"); fail_if (src == NULL, "Test source element was not created"); sink = gst_bin_get_by_name (GST_BIN (pipe), "sink"); fail_if (sink == NULL, "Test sink element was not created"); /* The src should not yet have a src pad */ srcpad = gst_element_get_static_pad (src, "src"); fail_unless (srcpad == NULL, "Source element already has a source pad"); /* Set the state to PAUSED and wait until the src at least reaches that * state */ fail_if (gst_element_set_state (pipe, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE); fail_if (gst_element_get_state (src, NULL, NULL, GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE); /* Now, the source element should have a src pad, and if "peer" was passed, * then the src pad should have gotten linked to the 'sink' pad of that * peer */ srcpad = gst_element_get_static_pad (src, "src"); fail_if (srcpad == NULL, "Source element did not create source pad"); peerpad = gst_pad_get_peer (srcpad); if (expect_link == TRUE) { fail_if (peerpad == NULL, "Source element pad did not get linked"); } else { fail_if (peerpad != NULL, "Source element pad got linked but should not have"); } if (peerpad != NULL) gst_object_unref (peerpad); if (peer != NULL) { GstElement *peer_elem = gst_bin_get_by_name (GST_BIN (pipe), peer); fail_if (peer_elem == NULL, "Could not retrieve peer %s", peer); sinkpad = gst_element_get_static_pad (peer_elem, "sink"); fail_if (sinkpad == NULL, "Peer element did not have a 'sink' pad"); fail_unless (peerpad == sinkpad, "Source src pad got connected to the wrong peer"); gst_object_unref (sinkpad); } gst_object_unref (srcpad); gst_object_unref (src); gst_object_unref (sink); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); }
static void run_nice_transmitter_test (gint n_parameters, GParameter *params, gint flags) { GError *error = NULL; FsTransmitter *trans = NULL, *trans2 = NULL; FsStreamTransmitter *st = NULL, *st2 = NULL; GstBus *bus = NULL; GstElement *pipeline = NULL; GstElement *pipeline2 = NULL; FsNiceTestParticipant *p1 = NULL, *p2 = NULL; memset (buffer_count, 0, sizeof(gint)*4); memset (received_known, 0, sizeof(guint)*4); running = TRUE; associate_on_source = !(flags & FLAG_NO_SOURCE); is_address_local = (flags & FLAG_IS_LOCAL); force_candidates = (flags & FLAG_FORCE_CANDIDATES); if (flags & FLAG_RECVONLY_FILTER) ts_fail_unless (fs_fake_filter_register ()); if (flags & FLAG_NOT_SENDING) { buffer_count[0][0] = 20; received_known[0][0] = 20; buffer_count[1][0] = 20; received_known[1][0] = 20; } loop = g_main_loop_new (NULL, FALSE); trans = fs_transmitter_new ("nice", 2, 0, &error); if (error) { ts_fail ("Error creating transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } ts_fail_if (trans == NULL, "No transmitter create, yet error is still NULL"); if (flags & FLAG_RECVONLY_FILTER) ts_fail_unless (g_signal_connect (trans, "get-recvonly-filter", G_CALLBACK (_get_recvonly_filter), NULL)); trans2 = fs_transmitter_new ("nice", 2, 0, &error); if (error) { ts_fail ("Error creating transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } ts_fail_if (trans2 == NULL, "No transmitter create, yet error is still NULL"); if (flags & FLAG_RECVONLY_FILTER) ts_fail_unless (g_signal_connect (trans2, "get-recvonly-filter", G_CALLBACK (_get_recvonly_filter), NULL)); pipeline = setup_pipeline (trans, G_CALLBACK (_handoff_handler1)); pipeline2 = setup_pipeline (trans2, G_CALLBACK (_handoff_handler2)); g_object_set_data (G_OBJECT (trans), "pipeline", pipeline); g_object_set_data (G_OBJECT (trans2), "pipeline", pipeline2); bus = gst_element_get_bus (pipeline); gst_bus_add_watch (bus, bus_error_callback, NULL); gst_object_unref (bus); bus = gst_element_get_bus (pipeline2); gst_bus_add_watch (bus, bus_error_callback, NULL); gst_object_unref (bus); /* * I'm passing the participant because any gobject will work, * but it should be the participant */ p1 = g_object_new (fs_nice_test_participant_get_type (), NULL); p2 = g_object_new (fs_nice_test_participant_get_type (), NULL); st = fs_transmitter_new_stream_transmitter (trans, FS_PARTICIPANT (p1), n_parameters, params, &error); if (error) ts_fail ("Error creating stream transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_if (st == NULL, "No stream transmitter created, yet error is NULL"); st2 = fs_transmitter_new_stream_transmitter (trans2, FS_PARTICIPANT (p2), n_parameters, params, &error); if (error) ts_fail ("Error creating stream transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_if (st2 == NULL, "No stream transmitter created, yet error is NULL"); g_object_set (st, "sending", !(flags & FLAG_NOT_SENDING), NULL); g_object_set (st2, "sending", !(flags & FLAG_NOT_SENDING), NULL); ts_fail_unless (g_signal_connect (st, "new-local-candidate", G_CALLBACK (_new_local_candidate), st2), "Could not connect new-local-candidate signal"); ts_fail_unless (g_signal_connect (st, "local-candidates-prepared", G_CALLBACK (_local_candidates_prepared), st2), "Could not connect local-candidates-prepared signal"); ts_fail_unless (g_signal_connect (st, "new-active-candidate-pair", G_CALLBACK (_new_active_candidate_pair), trans), "Could not connect new-active-candidate-pair signal"); ts_fail_unless (g_signal_connect (st, "error", G_CALLBACK (stream_transmitter_error), NULL), "Could not connect error signal"); ts_fail_unless (g_signal_connect (st, "state-changed", G_CALLBACK (_stream_state_changed), trans), "Could not connect to state-changed signal"); ts_fail_unless (g_signal_connect (st, "known-source-packet-received", G_CALLBACK (_known_source_packet_received), GUINT_TO_POINTER (1)), "Could not connect to known-source-packet-received signal"); ts_fail_unless (g_signal_connect (st2, "new-local-candidate", G_CALLBACK (_new_local_candidate), st), "Could not connect new-local-candidate signal"); ts_fail_unless (g_signal_connect (st2, "local-candidates-prepared", G_CALLBACK (_local_candidates_prepared), st), "Could not connect local-candidates-prepared signal"); ts_fail_unless (g_signal_connect (st2, "new-active-candidate-pair", G_CALLBACK (_new_active_candidate_pair), trans2), "Could not connect new-active-candidate-pair signal"); ts_fail_unless (g_signal_connect (st2, "error", G_CALLBACK (stream_transmitter_error), NULL), "Could not connect error signal"); ts_fail_unless (g_signal_connect (st2, "state-changed", G_CALLBACK (_stream_state_changed), trans2), "Could not connect to state-changed signal"); ts_fail_unless (g_signal_connect (st2, "known-source-packet-received", G_CALLBACK (_known_source_packet_received), GUINT_TO_POINTER (2)), "Could not connect to known-source-packet-received signal"); ts_fail_if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE, "Could not set the pipeline to playing"); ts_fail_if (gst_element_set_state (pipeline2, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE, "Could not set the pipeline to playing"); if (!fs_stream_transmitter_gather_local_candidates (st, &error)) { if (error) ts_fail ("Could not start gathering local candidates %s", error->message); else ts_fail ("Could not start gathering candidates" " (without a specified error)"); } if (!fs_stream_transmitter_gather_local_candidates (st2, &error)) { if (error) ts_fail ("Could not start gathering local candidates %s", error->message); else ts_fail ("Could not start gathering candidates" " (without a specified error)"); } g_idle_add (check_running, NULL); g_main_loop_run (loop); fs_stream_transmitter_stop (st); fs_stream_transmitter_stop (st2); gst_element_set_state (pipeline, GST_STATE_NULL); gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); gst_element_set_state (pipeline2, GST_STATE_NULL); gst_element_get_state (pipeline2, NULL, NULL, GST_CLOCK_TIME_NONE); if (st) g_object_unref (st); if (st2) g_object_unref (st2); g_object_unref (trans); g_object_unref (trans2); g_object_unref (p1); g_object_unref (p2); gst_object_unref (pipeline); g_main_loop_unref (loop); }
int main (int argc, char *argv[]) { gchar *target_times = NULL; gchar *ev_option = NULL; gchar *fn_option = NULL; GOptionEntry options[] = { {"ev-compensation", '\0', 0, G_OPTION_ARG_STRING, &ev_option, "EV compensation for source element GstPhotography interface", NULL}, {"aperture", '\0', 0, G_OPTION_ARG_INT, &aperture, "Aperture (size of lens opening) for source element GstPhotography interface", NULL}, {"flash-mode", '\0', 0, G_OPTION_ARG_INT, &flash_mode, "Flash mode for source element GstPhotography interface", NULL}, {"scene-mode", '\0', 0, G_OPTION_ARG_INT, &scene_mode, "Scene mode for source element GstPhotography interface", NULL}, {"exposure", '\0', 0, G_OPTION_ARG_INT64, &exposure, "Exposure time (in ms) for source element GstPhotography interface", NULL}, {"iso-speed", '\0', 0, G_OPTION_ARG_INT, &iso_speed, "ISO speed for source element GstPhotography interface", NULL}, {"white-balance-mode", '\0', 0, G_OPTION_ARG_INT, &wb_mode, "White balance mode for source element GstPhotography interface", NULL}, {"colour-tone-mode", '\0', 0, G_OPTION_ARG_INT, &color_mode, "Colour tone mode for source element GstPhotography interface", NULL}, {"directory", '\0', 0, G_OPTION_ARG_STRING, &fn_option, "Directory for capture file(s) (default is current directory)", NULL}, {"mode", '\0', 0, G_OPTION_ARG_INT, &mode, "Capture mode (default = 1 (image), 2 = video)", NULL}, {"capture-time", '\0', 0, G_OPTION_ARG_INT, &capture_time, "Time to capture video in seconds (default = 10)", NULL}, {"capture-total", '\0', 0, G_OPTION_ARG_INT, &capture_total, "Total number of captures to be done (default = 1)", NULL}, {"zoom", '\0', 0, G_OPTION_ARG_INT, &zoom, "Zoom (100 = 1x (default), 200 = 2x etc.)", NULL}, {"wrapper-source", '\0', 0, G_OPTION_ARG_STRING, &wrappersrc_name, "Camera source wrapper used for setting the video source (default is wrappercamerabinsrc)", NULL}, {"video-source", '\0', 0, G_OPTION_ARG_STRING, &videosrc_name, "Video source used in still capture and video recording", NULL}, {"video-device", '\0', 0, G_OPTION_ARG_STRING, &videodevice_name, "Video device to be set on the video source", NULL}, {"audio-source", '\0', 0, G_OPTION_ARG_STRING, &audiosrc_name, "Audio source used in video recording", NULL}, {"image-pp", '\0', 0, G_OPTION_ARG_STRING, &imagepp_name, "List of image post-processing elements separated with comma", NULL}, {"viewfinder-sink", '\0', 0, G_OPTION_ARG_STRING, &vfsink_name, "Viewfinder sink (default = fakesink)", NULL}, {"image-width", '\0', 0, G_OPTION_ARG_INT, &image_width, "Width for image capture", NULL}, {"image-height", '\0', 0, G_OPTION_ARG_INT, &image_height, "Height for image capture", NULL}, {"view-framerate-num", '\0', 0, G_OPTION_ARG_INT, &view_framerate_num, "Framerate numerator for viewfinder", NULL}, {"view-framerate-den", '\0', 0, G_OPTION_ARG_INT, &view_framerate_den, "Framerate denominator for viewfinder", NULL}, {"preview-caps", '\0', 0, G_OPTION_ARG_STRING, &preview_caps_name, "Preview caps (e.g. video/x-raw-rgb,width=320,height=240)", NULL}, {"viewfinder-filter", '\0', 0, G_OPTION_ARG_STRING, &viewfinder_filter, "Filter to process all frames going to viewfinder sink", NULL}, {"x-width", '\0', 0, G_OPTION_ARG_INT, &x_width, "X window width (default = 320)", NULL}, {"x-height", '\0', 0, G_OPTION_ARG_INT, &x_height, "X window height (default = 240)", NULL}, {"no-xwindow", '\0', 0, G_OPTION_ARG_NONE, &no_xwindow, "Do not create XWindow", NULL}, {"encoding-target", '\0', 0, G_OPTION_ARG_STRING, &gep_targetname, "Video encoding target name", NULL}, {"encoding-profile", '\0', 0, G_OPTION_ARG_STRING, &gep_profilename, "Video encoding profile name", NULL}, {"encoding-profile-filename", '\0', 0, G_OPTION_ARG_STRING, &gep_filename, "Video encoding profile filename", NULL}, {"image-capture-caps", '\0', 0, G_OPTION_ARG_STRING, &image_capture_caps_str, "Image capture caps (e.g. video/x-raw-rgb,width=640,height=480)", NULL}, {"viewfinder-caps", '\0', 0, G_OPTION_ARG_STRING, &viewfinder_caps_str, "Viewfinder caps (e.g. video/x-raw-rgb,width=640,height=480)", NULL}, {"video-capture-caps", '\0', 0, G_OPTION_ARG_STRING, &video_capture_caps_str, "Video capture caps (e.g. video/x-raw-rgb,width=640,height=480)", NULL}, {NULL} }; GOptionContext *ctx; GError *err = NULL; if (!g_thread_supported ()) g_thread_init (NULL); ctx = g_option_context_new ("\n\ncamerabin command line test application."); g_option_context_add_main_entries (ctx, options, NULL); g_option_context_add_group (ctx, gst_init_get_option_group ()); if (!g_option_context_parse (ctx, &argc, &argv, &err)) { g_print ("Error initializing: %s\n", err->message); exit (1); } g_option_context_free (ctx); GST_DEBUG_CATEGORY_INIT (camerabin_test, "camerabin-test", 0, "camerabin test"); /* if we fail to create xwindow should we care? */ if (!no_xwindow) create_host_window (); /* FIXME: error handling */ if (ev_option != NULL) ev_compensation = strtod (ev_option, (char **) NULL); if (vfsink_name == NULL) vfsink_name = g_strdup ("fakesink"); filename = g_string_new (fn_option); if (filename->len == 0) filename = g_string_append (filename, "."); timer = g_timer_new (); /* init */ if (setup_pipeline ()) { loop = g_main_loop_new (NULL, FALSE); g_idle_add ((GSourceFunc) run_pipeline, NULL); g_main_loop_run (loop); cleanup_pipeline (); g_main_loop_unref (loop); } /* free */ g_string_free (filename, TRUE); g_free (ev_option); g_free (wrappersrc_name); g_free (videosrc_name); g_free (videodevice_name); g_free (audiosrc_name); g_free (imagepp_name); g_free (vfsink_name); g_free (target_times); g_free (gep_targetname); g_free (gep_profilename); g_free (gep_filename); g_timer_destroy (timer); if (window) XDestroyWindow (display, window); if (display) XCloseDisplay (display); return 0; }
static void run_rawudp_transmitter_test (gint n_parameters, GParameter *params, gint flags) { GError *error = NULL; FsTransmitter *trans; FsStreamTransmitter *st; GstBus *bus = NULL; guint tos; buffer_count[0] = 0; buffer_count[1] = 0; received_known[0] = 0; received_known[1] = 0; pipeline_done = FALSE; has_stun = flags & FLAG_HAS_STUN; associate_on_source = !(flags & FLAG_NO_SOURCE); if ((flags & FLAG_NOT_SENDING) && (flags & FLAG_RECVONLY_FILTER)) { buffer_count[0] = 20; received_known[0] = 20; } loop = g_main_loop_new (NULL, FALSE); trans = fs_transmitter_new ("rawudp", 2, 0, &error); if (error) { ts_fail ("Error creating transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } ts_fail_if (trans == NULL, "No transmitter create, yet error is still NULL"); g_object_set (trans, "tos", 2, NULL); g_object_get (trans, "tos", &tos, NULL); ts_fail_unless (tos == 2); if (flags & FLAG_RECVONLY_FILTER) ts_fail_unless (g_signal_connect (trans, "get-recvonly-filter", G_CALLBACK (get_recvonly_filter), NULL)); pipeline = setup_pipeline (trans, G_CALLBACK (_handoff_handler)); bus = gst_element_get_bus (pipeline); gst_bus_add_watch (bus, bus_error_callback, NULL); gst_bus_enable_sync_message_emission (bus); g_signal_connect (bus, "sync-message::error", G_CALLBACK (sync_error_handler), NULL); gst_object_unref (bus); st = fs_transmitter_new_stream_transmitter (trans, NULL, n_parameters, params, &error); if (error) { if (has_stun && error->domain == FS_ERROR && error->code == FS_ERROR_NETWORK && error->message && strstr (error->message, "unreachable")) { GST_WARNING ("Skipping stunserver test, we have no network"); goto skip; } else ts_fail ("Error creating stream transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } ts_fail_if (st == NULL, "No stream transmitter created, yet error is NULL"); g_object_set (st, "sending", !(flags & FLAG_NOT_SENDING), NULL); ts_fail_unless (g_signal_connect (st, "new-local-candidate", G_CALLBACK (_new_local_candidate), GINT_TO_POINTER (flags)), "Could not connect new-local-candidate signal"); ts_fail_unless (g_signal_connect (st, "local-candidates-prepared", G_CALLBACK (_local_candidates_prepared), GINT_TO_POINTER (flags)), "Could not connect local-candidates-prepared signal"); ts_fail_unless (g_signal_connect (st, "new-active-candidate-pair", G_CALLBACK (_new_active_candidate_pair), trans), "Could not connect new-active-candidate-pair signal"); ts_fail_unless (g_signal_connect (st, "error", G_CALLBACK (stream_transmitter_error), NULL), "Could not connect error signal"); ts_fail_unless (g_signal_connect (st, "known-source-packet-received", G_CALLBACK (_known_source_packet_received), NULL), "Could not connect known-source-packet-received signal"); ts_fail_if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE, "Could not set the pipeline to playing"); if (!fs_stream_transmitter_gather_local_candidates (st, &error)) { if (error) { ts_fail ("Could not start gathering local candidates (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } else ts_fail ("Could not start gathering candidates" " (without a specified error)"); } g_idle_add (check_running, NULL); g_main_loop_run (loop); skip: g_mutex_lock (&pipeline_mod_mutex); pipeline_done = TRUE; g_mutex_unlock (&pipeline_mod_mutex); gst_element_set_state (pipeline, GST_STATE_NULL); if (st) { fs_stream_transmitter_stop (st); g_object_unref (st); } g_object_unref (trans); gst_object_unref (pipeline); g_main_loop_unref (loop); }
void test_launch_lines2() { GstElement *cur; gint i; gboolean b; gchar *s = NULL; xmlfile = "test_launch_lines2"; std_log(LOG_FILENAME_LINE, "Test Started test_launch_lines2"); /** * checks: * - specifying an element works :) * - if only 1 element is requested, no bin is returned, but the element */ cur = setup_pipeline (PIPELINE1); fail_unless (G_OBJECT_TYPE (cur) == g_type_from_name ("GstFakeSrc"), "parse_launch did not produce a fakesrc"); gst_object_unref (cur); /** * checks: * - properties works * - string, int, boolean and enums can be properly set * - first test of escaping strings */ cur = setup_pipeline (PIPELINE2); g_object_get (G_OBJECT (cur), "name", &s, "num-buffers", &i, "silent", &b, NULL); fail_if (s == NULL, "name was NULL"); fail_unless (strcmp (s, "donald") == 0, "fakesrc name was not 'donald'"); fail_unless (i == 27, "num-buffers was not 27"); fail_unless (b == TRUE, "silent was not TRUE"); g_free (s); g_object_get (G_OBJECT (cur), "sizetype", &i, NULL); fail_unless (i == 3, "sizetype != 3"); g_object_get (G_OBJECT (cur), "data", &i, NULL); fail_unless (i == 2, "data != 2"); gst_object_unref (cur); /** * checks: * - specifying multiple elements without links works * - if multiple toplevel elements exist, a pipeline is returned */ cur = setup_pipeline (PIPELINE3); fail_unless (GST_BIN_NUMCHILDREN (cur) == 3, "Pipeline does not contain 3 children"); gst_object_unref (cur); /** * checks: * - test default link "!" * - test if specifying pads on links works */ cur = setup_pipeline (PIPELINE4); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - test if appending the links works, too * - check if the pipeline constructed works the same as the one before (how?) */ cur = setup_pipeline (PIPELINE5); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - test various types of bins * - test if linking across bins works * - test if escaping strings works */ cur = setup_pipeline (PIPELINE6); fail_unless (GST_IS_PIPELINE (cur), "Parse did not produce a pipeline"); g_object_get (G_OBJECT (cur), "name", &s, NULL); fail_if (s == NULL, "name was NULL"); fail_unless (strcmp (s, "john") == 0, "Name was not 'john'"); g_free (s); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - test request pads */ cur = setup_pipeline (PIPELINE7); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - multiple pads on 1 link */ cur = setup_pipeline (PIPELINE8); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - failed in grammar.y cvs version 1.17 */ cur = setup_pipeline (PIPELINE9); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - failed in grammar.y cvs version 1.17 */ cur = setup_pipeline (PIPELINE10); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - failed in grammar.y cvs version 1.18 */ cur = setup_pipeline (PIPELINE11); check_pipeline_runs (cur); gst_object_unref (cur); /** * checks: * - URI detection works */ cur = setup_pipeline (PIPELINE12); gst_object_unref (cur); /** * checks: * - URI sink detection works */ cur = setup_pipeline (PIPELINE13); gst_object_unref (cur); /* Checks handling of a assignment followed by error inside a bin. * This should warn, but ignore the error and carry on */ cur = setup_pipeline ("( filesrc blocksize=4 location=/dev/null @ )"); gst_object_unref (cur); std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
static void run_shm_transmitter_test (gint flags) { GError *error = NULL; FsTransmitter *trans; FsStreamTransmitter *st; GstBus *bus = NULL; GParameter params[1]; GList *local_cands = NULL; GstStateChangeReturn ret; FsCandidate *cand; GList *remote_cands = NULL; int param_count = 0; gint bus_source; done = FALSE; connected_count = 0; g_cond_init (&cond); g_mutex_init (&test_mutex); buffer_count[0] = 0; buffer_count[1] = 0; received_known[0] = 0; received_known[1] = 0; got_candidates[0] = FALSE; got_candidates[1] = FALSE; got_prepared[0] = FALSE; got_prepared[1] = FALSE; if (unlink ("/tmp/src1") < 0 && errno != ENOENT) fail ("Could not unlink /tmp/src1: %s", strerror (errno)); if (unlink ("/tmp/src2") < 0 && errno != ENOENT) fail ("Could not unlink /tmp/src2: %s", strerror (errno)); local_cands = g_list_append (local_cands, fs_candidate_new (NULL, 1, FS_CANDIDATE_TYPE_HOST, FS_NETWORK_PROTOCOL_UDP, "/tmp/src1", 0)); local_cands = g_list_append (local_cands, fs_candidate_new (NULL, 2, FS_CANDIDATE_TYPE_HOST, FS_NETWORK_PROTOCOL_UDP, "/tmp/src2", 0)); if (flags & FLAG_LOCAL_CANDIDATES) { memset (params, 0, sizeof (GParameter)); params[0].name = "preferred-local-candidates"; g_value_init (¶ms[0].value, FS_TYPE_CANDIDATE_LIST); g_value_take_boxed (¶ms[0].value, local_cands); param_count = 1; } associate_on_source = !(flags & FLAG_NO_SOURCE); if ((flags & FLAG_NOT_SENDING) && (flags & FLAG_RECVONLY_FILTER)) { buffer_count[0] = 20; received_known[0] = 20; } trans = fs_transmitter_new ("shm", 2, 0, &error); if (error) ts_fail ("Error creating transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_if (trans == NULL, "No transmitter create, yet error is still NULL"); g_clear_error (&error); if (flags & FLAG_RECVONLY_FILTER) ts_fail_unless (g_signal_connect (trans, "get-recvonly-filter", G_CALLBACK (get_recvonly_filter), NULL)); pipeline = setup_pipeline (trans, G_CALLBACK (_handoff_handler)); bus = gst_element_get_bus (pipeline); bus_source = gst_bus_add_watch (bus, bus_error_callback, NULL); gst_bus_enable_sync_message_emission (bus); g_signal_connect (bus, "sync-message::error", G_CALLBACK (sync_error_handler), NULL); gst_object_unref (bus); st = fs_transmitter_new_stream_transmitter (trans, NULL, param_count, params, &error); if (param_count) g_value_unset (¶ms[0].value); if (error) ts_fail ("Error creating stream transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_if (st == NULL, "No stream transmitter created, yet error is NULL"); g_clear_error (&error); g_object_set (st, "sending", !(flags & FLAG_NOT_SENDING), NULL); ts_fail_unless (g_signal_connect (st, "new-local-candidate", G_CALLBACK (_new_local_candidate), trans), "Could not connect new-local-candidate signal"); ts_fail_unless (g_signal_connect (st, "local-candidates-prepared", G_CALLBACK (_candidate_prepared), NULL), "Could not connect local-candidates-prepared signal"); ts_fail_unless (g_signal_connect (st, "error", G_CALLBACK (stream_transmitter_error), NULL), "Could not connect error signal"); ts_fail_unless (g_signal_connect (st, "known-source-packet-received", G_CALLBACK (_known_source_packet_received), NULL), "Could not connect known-source-packet-received signal"); ts_fail_unless (g_signal_connect (st, "state-changed", G_CALLBACK (_state_changed), NULL), "Could not connect state-changed signal"); if (!fs_stream_transmitter_gather_local_candidates (st, &error)) { if (error) ts_fail ("Could not start gathering local candidates (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); else ts_fail ("Could not start gathering candidates" " (without a specified error)"); } else { ts_fail_unless (error == NULL); } g_clear_error (&error); ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); ts_fail_if (ret == GST_STATE_CHANGE_FAILURE, "Could not set the pipeline to playing"); if (!(flags & FLAG_LOCAL_CANDIDATES)) { ret = fs_stream_transmitter_force_remote_candidates (st, local_cands, &error); fs_candidate_list_destroy (local_cands); if (error) ts_fail ("Error while adding candidate: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_unless (ret == TRUE, "No detailed error from add_remote_candidate"); } else { ts_fail_unless (error == NULL); } g_clear_error (&error); cand = fs_candidate_new (NULL, 1, FS_CANDIDATE_TYPE_HOST, FS_NETWORK_PROTOCOL_UDP, NULL, 0); cand->username = g_strdup ("/tmp/src1"); remote_cands = g_list_prepend (remote_cands, cand); cand = fs_candidate_new (NULL, 2, FS_CANDIDATE_TYPE_HOST, FS_NETWORK_PROTOCOL_UDP, NULL, 0); cand->username = g_strdup ("/tmp/src2"); remote_cands = g_list_prepend (remote_cands, cand); ret = fs_stream_transmitter_force_remote_candidates (st, remote_cands, &error); fs_candidate_list_destroy (remote_cands); if (error) ts_fail ("Error while adding candidate: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_unless (ret == TRUE, "No detailed error from add_remote_candidate"); g_clear_error (&error); g_mutex_lock (&test_mutex); while (connected_count < 2) g_cond_wait (&cond, &test_mutex); g_mutex_unlock (&test_mutex); setup_fakesrc (trans, pipeline, 1); setup_fakesrc (trans, pipeline, 2); g_mutex_lock (&test_mutex); while (!done) g_cond_wait (&cond, &test_mutex); g_mutex_unlock (&test_mutex); fail_unless (got_prepared[0] == TRUE); fail_unless (got_prepared[1] == TRUE); fail_unless (got_candidates[0] == TRUE); fail_unless (got_candidates[1] == TRUE); gst_element_set_state (pipeline, GST_STATE_NULL); if (st) { fs_stream_transmitter_stop (st); g_object_unref (st); } g_object_unref (trans); g_source_remove (bus_source); gst_object_unref (pipeline); g_cond_clear (&cond); g_mutex_clear (&test_mutex); }
static void run_multicast_transmitter_test (gint n_parameters, GParameter *params) { GError *error = NULL; FsTransmitter *trans; FsStreamTransmitter *st; FsCandidate *tmpcand = NULL; GList *candidates = NULL; GstBus *bus = NULL; loop = g_main_loop_new (NULL, FALSE); trans = fs_transmitter_new ("multicast", 2, &error); if (error) { ts_fail ("Error creating transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } ts_fail_if (trans == NULL, "No transmitter create, yet error is still NULL"); pipeline = setup_pipeline (trans, G_CALLBACK (_handoff_handler)); st = fs_transmitter_new_stream_transmitter (trans, NULL, n_parameters, params, &error); if (error) { ts_fail ("Error creating stream transmitter: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); } ts_fail_if (st == NULL, "No stream transmitter created, yet error is NULL"); bus = gst_element_get_bus (pipeline); gst_bus_add_watch (bus, bus_error_callback, NULL); gst_object_unref (bus); ts_fail_unless (g_signal_connect (st, "new-active-candidate-pair", G_CALLBACK (_new_active_candidate_pair), trans), "Coult not connect new-active-candidate-pair signal"); ts_fail_unless (g_signal_connect (st, "error", G_CALLBACK (stream_transmitter_error), NULL), "Could not connect error signal"); g_idle_add (_start_pipeline, pipeline); tmpcand = fs_candidate_new ("L1", FS_COMPONENT_RTP, FS_CANDIDATE_TYPE_MULTICAST, FS_NETWORK_PROTOCOL_UDP, "224.0.0.110", 2322); tmpcand->ttl = 1; candidates = g_list_prepend (candidates, tmpcand); tmpcand = fs_candidate_new ("L2", FS_COMPONENT_RTCP, FS_CANDIDATE_TYPE_MULTICAST, FS_NETWORK_PROTOCOL_UDP, "224.0.0.110", 2323); tmpcand->ttl = 1; candidates = g_list_prepend (candidates, tmpcand); if (!fs_stream_transmitter_set_remote_candidates (st, candidates, &error)) ts_fail ("Error setting the remote candidates: %p %s", error, error ? error->message : "NO ERROR SET"); ts_fail_unless (error == NULL, "Error is not null after successful candidate" " addition"); fs_candidate_list_destroy (candidates); g_main_run (loop); g_object_unref (st); g_object_unref (trans); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_main_loop_unref (loop); }
int main (int argc, char *argv[]) { gchar *target_times = NULL; gchar *ev_option = NULL; gchar *fn_option = NULL; GOptionEntry options[] = { {"ev-compensation", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_STRING, &ev_option, "EV compensation (-2.5..2.5, default = 0)", NULL}, {"aperture", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &aperture, "Aperture (size of lens opening, default = 0 (auto))", NULL}, {"flash-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &flash_mode, "Flash mode (default = 0 (auto))", NULL}, {"scene-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &scene_mode, "Scene mode (default = 6 (auto))", NULL}, {"exposure", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT64, &exposure, "Exposure (default = 0 (auto))", NULL}, {"iso-speed", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &iso_speed, "ISO speed (default = 0 (auto))", NULL}, {"white-balance-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &wb_mode, "White balance mode (default = 0 (auto))", NULL}, {"colour-tone-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &color_mode, "Colour tone mode (default = 0 (auto))", NULL}, {"directory", '\0', 0, G_OPTION_ARG_STRING, &fn_option, "Directory for capture file(s) (default is current directory)", NULL}, {"mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &mode, "Capture mode (default = 0 (image), 1 = video)", NULL}, {"capture-time", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &capture_time, "Time to capture video in seconds (default = 10)", NULL}, {"capture-total", '\0', 0, G_OPTION_ARG_INT, &capture_total, "Total number of captures to be done (default = 1)", NULL}, {"flags", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &flags, "Flags for camerabin, (default = 0x9)", NULL}, {"mute", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_STRING, &mute, "Mute audio (default = 0 (no))", NULL}, {"zoom", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_STRING, &zoom, "Zoom (100 = 1x (default), 200 = 2x etc.)", NULL}, {"audio-src", '\0', 0, G_OPTION_ARG_STRING, &audiosrc_name, "Audio source used in video recording", NULL}, {"audio-bitrate", '\0', 0, G_OPTION_ARG_INT, &audio_bitrate, "Audio bitrate (default 128000)", NULL}, {"audio-samplerate", '\0', 0, G_OPTION_ARG_INT, &audio_samplerate, "Audio samplerate (default 48000)", NULL}, {"audio-channels", '\0', 0, G_OPTION_ARG_INT, &audio_channels, "Audio channels (default 1)", NULL}, {"video-src", '\0', 0, G_OPTION_ARG_STRING, &videosrc_name, "Video source used in still capture and video recording", NULL}, {"audio-enc", '\0', 0, G_OPTION_ARG_STRING, &audioenc_name, "Audio encoder used in video recording", NULL}, {"video-enc", '\0', 0, G_OPTION_ARG_STRING, &videoenc_name, "Video encoder used in video recording", NULL}, {"image-enc", '\0', 0, G_OPTION_ARG_STRING, &imageenc_name, "Image encoder used in still capture", NULL}, {"image-pp", '\0', 0, G_OPTION_ARG_STRING, &imagepp_name, "Image post-processing element", NULL}, {"video-mux", '\0', 0, G_OPTION_ARG_STRING, &videomux_name, "Muxer used in video recording", NULL}, {"viewfinder-sink", '\0', 0, G_OPTION_ARG_STRING, &vfsink_name, "Viewfinder sink (default = fakesink)", NULL}, {"image-width", '\0', 0, G_OPTION_ARG_INT, &image_width, "Width for image capture", NULL}, {"image-height", '\0', 0, G_OPTION_ARG_INT, &image_height, "Height for image capture", NULL}, {"view-framerate-num", '\0', 0, G_OPTION_ARG_INT, &view_framerate_num, "Framerate numerator for viewfinder", NULL}, {"view-framerate-den", '\0', 0, G_OPTION_ARG_INT, &view_framerate_den, "Framerate denominator for viewfinder", NULL}, {"src-colorspace", '\0', 0, G_OPTION_ARG_STRING, &src_csp, "Colorspace format for video source (e.g. YUY2, UYVY)", NULL}, {"src-format", '\0', 0, G_OPTION_ARG_STRING, &src_format, "Video format for video source", NULL}, {"preview-caps", '\0', 0, G_OPTION_ARG_STRING, &preview_caps_name, "Preview caps (e.g. video/x-raw-rgb,width=320,height=240)", NULL}, {"video-source-filter", '\0', 0, G_OPTION_ARG_STRING, &video_src_filter, "Video filter to process all frames from video source", NULL}, {"viewfinder-filter", '\0', 0, G_OPTION_ARG_STRING, &viewfinder_filter, "Filter to process all frames going to viewfinder sink", NULL}, {"x-width", '\0', 0, G_OPTION_ARG_INT, &x_width, "X window width (default = 320)", NULL}, {"x-height", '\0', 0, G_OPTION_ARG_INT, &x_height, "X window height (default = 240)", NULL}, {NULL} }; GOptionContext *ctx; GError *err = NULL; /* if we fail to create xwindow should we care? */ create_host_window (); if (!g_thread_supported ()) g_thread_init (NULL); ctx = g_option_context_new ("\n\ncamerabin command line test application."); g_option_context_add_main_entries (ctx, options, NULL); g_option_context_add_group (ctx, gst_init_get_option_group ()); if (!g_option_context_parse (ctx, &argc, &argv, &err)) { g_print ("Error initializing: %s\n", err->message); exit (1); } g_option_context_free (ctx); GST_DEBUG_CATEGORY_INIT (camerabin_test, "camerabin-test", 0, "camerabin test"); /* FIXME: error handling */ if (ev_option != NULL) ev_compensation = strtod (ev_option, (char **) NULL); if (vfsink_name == NULL) vfsink_name = g_strdup ("fakesink"); filename = g_string_new (fn_option); if (filename->len == 0) filename = g_string_append (filename, "."); filename = g_string_append (filename, "/test_%04u"); if (mode == 1) filename = g_string_append (filename, ".mp4"); else filename = g_string_append (filename, ".jpg"); /* init */ if (setup_pipeline ()) { loop = g_main_loop_new (NULL, FALSE); g_idle_add ((GSourceFunc) run_pipeline, NULL); g_main_loop_run (loop); cleanup_pipeline (); g_main_loop_unref (loop); } /* free */ g_string_free (filename, TRUE); g_free (ev_option); g_free (audiosrc_name); g_free (videosrc_name); g_free (audioenc_name); g_free (videoenc_name); g_free (imageenc_name); g_free (imagepp_name); g_free (videomux_name); g_free (vfsink_name); g_free (src_csp); g_free (src_format); g_free (target_times); if (window) XDestroyWindow (display, window); if (display) XCloseDisplay (display); return 0; }