static GstElement * setup_vp8enc (const gchar * src_caps_str) { GstElement *vp8enc; GstCaps *srccaps = NULL; GstBus *bus; if (src_caps_str) { srccaps = gst_caps_from_string (src_caps_str); fail_unless (srccaps != NULL); } vp8enc = gst_check_setup_element ("vp8enc"); fail_unless (vp8enc != NULL); srcpad = gst_check_setup_src_pad (vp8enc, &srctemplate); sinkpad = gst_check_setup_sink_pad (vp8enc, &sinktemplate); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); gst_check_setup_events (srcpad, vp8enc, srccaps, GST_FORMAT_TIME); bus = gst_bus_new (); gst_element_set_bus (vp8enc, bus); fail_unless (gst_element_set_state (vp8enc, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); if (srccaps) gst_caps_unref (srccaps); buffers = NULL; return vp8enc; }
static void do_one_buffer_test_apply (gboolean clean_point) { GstBuffer *buffer_in, *buffer_out; g_object_set (element, "ntp-offset", NTP_OFFSET, "cseq", 0x12345678, "set-e-bit", FALSE, NULL); ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS); buffer_in = create_rtp_buffer (TIMESTAMP, clean_point); buffer_out = create_extension_buffer (buffer_in, clean_point, FALSE, FALSE, NTP_OFFSET, CSEQ); /* push initial events */ gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME); /* Push buffer */ fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK); check_buffer_equal ((GstBuffer *) buffers->data, buffer_out); gst_buffer_unref (buffer_out); ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS); }
static GstElement * setup_element (const gchar * factory, GstStaticPadTemplate * sink_template, GstCaps * sink_caps, GstStaticPadTemplate * src_template, GstCaps * src_caps) { GstElement *element; GstBus *bus; gchar *caps_str = NULL; element = gst_check_setup_element (factory); srcpad = gst_check_setup_src_pad (element, src_template); if (sink_caps) { caps_str = gst_caps_to_string (sink_caps); sink_template->static_caps.string = caps_str; } sinkpad = gst_check_setup_sink_pad (element, sink_template); gst_pad_set_active (srcpad, TRUE); gst_check_setup_events (srcpad, element, src_caps, GST_FORMAT_BYTES); gst_pad_set_active (sinkpad, TRUE); bus = gst_bus_new (); gst_element_set_bus (element, bus); fail_unless (gst_element_set_state (element, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); ts_counter = offset_counter = buffer_counter = 0; buffers = NULL; g_free (caps_str); return element; }
static GstElement * setup_amrnbenc (void) { GstElement *amrnbenc; GstCaps *caps; GstBus *bus; GST_DEBUG ("setup_amrnbenc"); amrnbenc = gst_check_setup_element ("amrnbenc"); srcpad = gst_check_setup_src_pad (amrnbenc, &srctemplate); sinkpad = gst_check_setup_sink_pad (amrnbenc, &sinktemplate); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); bus = gst_bus_new (); gst_element_set_bus (amrnbenc, bus); fail_unless (gst_element_set_state (amrnbenc, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); caps = gst_caps_from_string (SRC_CAPS); gst_check_setup_events (srcpad, amrnbenc, caps, GST_FORMAT_TIME); gst_caps_unref (caps); buffers = NULL; return amrnbenc; }
static GstElement * setup_vp8dec (const gchar * src_caps_str) { GstElement *bin; GstElement *vp8enc, *vp8dec; GstCaps *srccaps = NULL; GstBus *bus; GstPad *ghostpad, *targetpad; if (src_caps_str) { srccaps = gst_caps_from_string (src_caps_str); fail_unless (srccaps != NULL); } bin = gst_bin_new ("bin"); vp8enc = gst_check_setup_element ("vp8enc"); fail_unless (vp8enc != NULL); vp8dec = gst_check_setup_element ("vp8dec"); fail_unless (vp8dec != NULL); g_object_set (vp8enc, "name", "encoder", NULL); g_object_set (vp8dec, "name", "decoder", NULL); gst_bin_add_many (GST_BIN (bin), vp8enc, vp8dec, NULL); fail_unless (gst_element_link_pads (vp8enc, "src", vp8dec, "sink")); targetpad = gst_element_get_static_pad (vp8enc, "sink"); fail_unless (targetpad != NULL); ghostpad = gst_ghost_pad_new ("sink", targetpad); fail_unless (ghostpad != NULL); gst_element_add_pad (bin, ghostpad); gst_object_unref (targetpad); targetpad = gst_element_get_static_pad (vp8dec, "src"); fail_unless (targetpad != NULL); ghostpad = gst_ghost_pad_new ("src", targetpad); fail_unless (ghostpad != NULL); gst_element_add_pad (bin, ghostpad); gst_object_unref (targetpad); srcpad = gst_check_setup_src_pad (bin, &srctemplate); sinkpad = gst_check_setup_sink_pad (bin, &sinktemplate); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); gst_check_setup_events (srcpad, bin, srccaps, GST_FORMAT_TIME); bus = gst_bus_new (); gst_element_set_bus (bin, bus); fail_unless (gst_element_set_state (bin, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); if (srccaps) gst_caps_unref (srccaps); buffers = NULL; return bin; }
static void check_filter_caps (const gchar * name, GstEvent * event, GstCaps * caps, gint size, gint num_buffers, const gchar * prop, va_list varargs) { GstElement *filter; GstBuffer *inbuffer, *outbuffer; gint i; GstSegment segment; filter = setup_filter (name, prop, varargs); fail_unless (gst_element_set_state (filter, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); gst_check_setup_events (mysrcpad, filter, caps, GST_FORMAT_TIME); /* ensure segment (format) properly setup */ gst_segment_init (&segment, GST_FORMAT_TIME); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment))); if (event) fail_unless (gst_pad_push_event (mysrcpad, event)); for (i = 0; i < num_buffers; ++i) { inbuffer = gst_buffer_new_and_alloc (size); /* makes valgrind's memcheck happier */ gst_buffer_memset (inbuffer, 0, 0, size); GST_BUFFER_TIMESTAMP (inbuffer) = 0; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); } fail_unless (g_list_length (buffers) == num_buffers); /* clean up buffers */ for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); switch (i) { case 0: fail_unless (gst_buffer_get_size (outbuffer) == size); /* no check on filter operation itself */ break; default: break; } buffers = g_list_remove (buffers, outbuffer); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } cleanup_filter (filter); g_list_free (buffers); buffers = NULL; }
static void do_two_buffers_test_apply (gboolean end_contiguous) { GstBuffer *buffer_in, *buffer_out; GList *node; g_object_set (element, "ntp-offset", NTP_OFFSET, "cseq", 0x12345678, "set-e-bit", TRUE, NULL); ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS); buffer_in = create_rtp_buffer (TIMESTAMP, FALSE); buffer_out = create_extension_buffer (buffer_in, FALSE, end_contiguous, FALSE, NTP_OFFSET, CSEQ); /* push initial events */ gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME); /* Push buffer */ fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK); /* The buffer hasn't been pushed it as the element is waiting for the next * buffer. */ fail_unless_equals_int (g_list_length (buffers), 0); /* push an ntp-offset event to trigger a discontinuty */ fail_unless (gst_pad_push_event (mysrcpad, create_ntp_offset_event (NTP_OFFSET, end_contiguous))); /* A second buffer is pushed */ buffer_in = create_rtp_buffer (TIMESTAMP + 1, FALSE); fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK); /* The first buffer has now been pushed out */ fail_unless_equals_int (g_list_length (buffers), 1); node = g_list_last (buffers); check_buffer_equal ((GstBuffer *) node->data, buffer_out); gst_buffer_unref (buffer_out); /* Push EOS */ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* The second buffer has been pushed out */ fail_unless_equals_int (g_list_length (buffers), 2); /* Last buffer always has the 'E' flag */ buffer_out = create_extension_buffer (buffer_in, FALSE, TRUE, end_contiguous, NTP_OFFSET, CSEQ); node = g_list_last (buffers); check_buffer_equal ((GstBuffer *) node->data, buffer_out); gst_buffer_unref (buffer_out); ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS); }
static void setup_glimagesink (void) { GstCaps *caps = NULL; sinkelement = gst_check_setup_element ("glimagesink"); srcpad = gst_check_setup_src_pad (sinkelement, &srctemplate); gst_pad_set_active (srcpad, TRUE); caps = gst_caps_from_string ("video/x-raw, width=320, height=240, format=RGBA, framerate=30/1"); gst_check_setup_events (srcpad, sinkelement, caps, GST_FORMAT_TIME); gst_caps_unref (caps); }
static GstElement * setup_wavpackparse (void) { GstElement *wavpackparse; GST_DEBUG ("setup_wavpackparse"); wavpackparse = gst_check_setup_element ("wavpackparse"); mysrcpad = gst_check_setup_src_pad (wavpackparse, &srctemplate); mysinkpad = gst_check_setup_sink_pad (wavpackparse, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); gst_check_setup_events (mysrcpad, wavpackparse, NULL, GST_FORMAT_BYTES); return wavpackparse; }
static GstElement * setup_avisubtitle (void) { GstElement *avisubtitle; GstCaps *srccaps; GST_DEBUG ("setup_avisubtitle"); avisubtitle = gst_check_setup_element ("avisubtitle"); mysinkpad = gst_check_setup_sink_pad (avisubtitle, &sink_template); mysrcpad = gst_check_setup_src_pad (avisubtitle, &src_template); gst_pad_set_active (mysinkpad, TRUE); gst_pad_set_active (mysrcpad, TRUE); srccaps = gst_caps_new_empty_simple ("application/x-subtitle-avi"); gst_check_setup_events (mysrcpad, avisubtitle, srccaps, GST_FORMAT_TIME); gst_caps_unref (srccaps); return avisubtitle; }
static void push_and_test (GstCaps * prop_caps, gboolean join, gboolean replace, GstCaps * in_caps, GstCaps * out_caps) { GstElement *capssetter; GstBuffer *buffer; GstCaps *current_out; capssetter = setup_capssetter (); fail_unless (gst_element_set_state (capssetter, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (capssetter, "join", join, NULL); g_object_set (capssetter, "replace", replace, NULL); g_object_set (capssetter, "caps", prop_caps, NULL); gst_caps_unref (prop_caps); buffer = gst_buffer_new_and_alloc (4); ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1); gst_buffer_fill (buffer, 0, "data", 4); gst_check_setup_events (mysrcpad, capssetter, in_caps, GST_FORMAT_TIME); gst_caps_unref (in_caps); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK, "Failed pushing buffer to capssetter"); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); /* ... but it should end up being collected on the global buffer list */ fail_unless (g_list_length (buffers) == 1); buffer = g_list_first (buffers)->data; ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1); current_out = gst_pad_get_current_caps (mysinkpad); fail_unless (gst_caps_is_equal (out_caps, current_out)); gst_caps_unref (current_out); gst_caps_unref (out_caps); /* cleanup */ cleanup_capssetter (capssetter); }
static GstElement * setup_wavpackdec (void) { GstElement *wavpackdec; GST_DEBUG ("setup_wavpackdec"); wavpackdec = gst_check_setup_element ("wavpackdec"); mysrcpad = gst_check_setup_src_pad (wavpackdec, &srctemplate); mysinkpad = gst_check_setup_sink_pad (wavpackdec, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); gst_check_setup_events (mysrcpad, wavpackdec, NULL, GST_FORMAT_TIME); fail_unless (gst_element_set_state (wavpackdec, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); return wavpackdec; }
/* takes over reference for outcaps */ static GstElement * setup_spectrum (const gchar * caps_str) { GstElement *spectrum; GstCaps *caps; GST_DEBUG ("setup_spectrum"); spectrum = gst_check_setup_element ("spectrum"); mysrcpad = gst_check_setup_src_pad (spectrum, &srctemplate); mysinkpad = gst_check_setup_sink_pad (spectrum, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); caps = gst_caps_from_string (caps_str); gst_check_setup_events (mysrcpad, spectrum, caps, GST_FORMAT_TIME); gst_caps_unref (caps); return spectrum; }
GstElement * setup_xingmux () { GstElement *xingmux; GstCaps *caps; GST_DEBUG ("setup_xingmux"); xingmux = gst_check_setup_element ("xingmux"); mysrcpad = gst_check_setup_src_pad (xingmux, &srctemplate); mysinkpad = gst_check_setup_sink_pad (xingmux, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL); gst_check_setup_events (mysrcpad, xingmux, caps, GST_FORMAT_TIME); gst_caps_unref (caps); return xingmux; }
static GstElement * setup_x264enc (const gchar * profile, const gchar * stream_format, const gchar * input_format) { GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (MPEG_CAPS_STRING)); GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_STRING)); GstElement *x264enc; gchar *caps_str; GstCaps *caps; GST_DEBUG ("setup_x264enc"); caps_str = g_strdup_printf ("%s, profile = (string) %s, " "stream-format = (string) %s", MPEG_CAPS_STRING, profile, stream_format); sinktemplate.static_caps.string = caps_str; x264enc = gst_check_setup_element ("x264enc"); mysrcpad = gst_check_setup_src_pad (x264enc, &srctemplate); mysinkpad = gst_check_setup_sink_pad (x264enc, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); caps = gst_caps_from_string (VIDEO_CAPS_STRING); gst_caps_set_simple (caps, "format", G_TYPE_STRING, input_format, NULL); gst_check_setup_events (mysrcpad, x264enc, caps, GST_FORMAT_TIME); gst_caps_unref (caps); g_free (caps_str); return x264enc; }
static void mulawdec_setup (void) { GstCaps *src_caps; src_caps = gst_caps_from_string ("audio/x-mulaw," "rate = (int) 8000," "channels = (int) 1"); GST_DEBUG ("%s", __FUNCTION__); mulawdec = gst_check_setup_element ("mulawdec"); mysrcpad = gst_check_setup_src_pad (mulawdec, &srctemplate); mysinkpad = gst_check_setup_sink_pad (mulawdec, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); gst_check_setup_events (mysrcpad, mulawdec, src_caps, GST_FORMAT_TIME); gst_caps_unref (src_caps); }