/* GStreamer unit tests for the deinterlace element * Copyright (C) 2010 Thiago Santos * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include static gboolean gst_caps_is_interlaced (GstCaps * caps) { GstVideoInfo info; fail_unless (gst_caps_is_fixed (caps)); fail_unless (gst_video_info_from_caps (&info, caps)); return GST_VIDEO_INFO_IS_INTERLACED (&info); } GST_START_TEST (test_create_and_unref) { GstElement *deinterlace; deinterlace = gst_element_factory_make ("deinterlace", NULL); fail_unless (deinterlace != NULL); gst_element_set_state (deinterlace, GST_STATE_NULL); gst_object_unref (deinterlace); } GST_END_TEST; #define CAPS_VIDEO_COMMON \ "width=(int)800, height=(int)600, framerate=(fraction)15/1" #define CAPS_IMAGE_COMMON \ "width=(int)3200, height=(int)3400, framerate=(fraction)0/1" #define CAPS_YUY2 \ "video/x-raw, " \ CAPS_VIDEO_COMMON ", " \ "format=(string)YUY2" #define CAPS_YUY2_INTERLACED \ CAPS_YUY2 ", " \ "interlace-mode=interleaved" #define CAPS_YVYU \ "video/x-raw, " \ CAPS_VIDEO_COMMON ", " \ "format=(string)YVYU" #define CAPS_YVYU_INTERLACED \ CAPS_YVYU ", " \ "interlace-mode=interleaved" #define CAPS_YUY2_IMAGE \ "video/x-raw, " \ CAPS_IMAGE_COMMON ", " \ "format=(string)YUY2" #define CAPS_YUY2_INTERLACED_IMAGE \ CAPS_YUY2_IMAGE ", " \ "interlace-mode=interleaved" #define CAPS_YVYU_IMAGE \ "video/x-raw, " \ CAPS_IMAGE_COMMON ", " \ "format=(string)YVYU" #define CAPS_YVYU_INTERLACED_IMAGE \ CAPS_YVYU_IMAGE ", " \ "interlace-mode=interleaved" static GstElement *deinterlace; static GstPad *srcpad; static GstPad *sinkpad; static GstElement *pipeline; /* sets up deinterlace and shortcut pointers to its pads */ static void setup_deinterlace (void) { deinterlace = gst_element_factory_make ("deinterlace", NULL); fail_unless (deinterlace != NULL); sinkpad = gst_element_get_static_pad (deinterlace, "sink"); fail_unless (sinkpad != NULL); srcpad = gst_element_get_static_pad (deinterlace, "src"); fail_unless (srcpad != NULL); } /* sets up a basic test pipeline containing: * * videotestsrc ! capsfilter ! deinterlace ! fakesink * * The parameters set the capsfilter caps and the num-buffers * property of videotestsrc * * It is useful for adding buffer probes to deinterlace pads * and validating inputs/outputs */ static void setup_test_pipeline (gint mode, GstCaps * infiltercaps, GstCaps * outfiltercaps, gint numbuffers) { GstElement *src; GstElement *infilter; GstElement *outfilter; GstElement *sink; setup_deinterlace (); pipeline = gst_pipeline_new ("pipeline"); src = gst_element_factory_make ("videotestsrc", NULL); infilter = gst_element_factory_make ("capsfilter", "infilter"); outfilter = gst_element_factory_make ("capsfilter", "outfilter"); sink = gst_element_factory_make ("fakesink", NULL); fail_if (src == NULL); fail_if (infilter == NULL); fail_if (outfilter == NULL); fail_if (sink == NULL); fail_unless (gst_bin_add (GST_BIN (pipeline), src)); fail_unless (gst_bin_add (GST_BIN (pipeline), infilter)); fail_unless (gst_bin_add (GST_BIN (pipeline), deinterlace)); fail_unless (gst_bin_add (GST_BIN (pipeline), outfilter)); fail_unless (gst_bin_add (GST_BIN (pipeline), sink)); /* set the properties */ g_object_set (deinterlace, "mode", mode, NULL); if (numbuffers > 0) g_object_set (src, "num-buffers", numbuffers, NULL); if (infiltercaps) g_object_set (infilter, "caps", infiltercaps, NULL); if (outfiltercaps) g_object_set (outfilter, "caps", outfiltercaps, NULL); fail_unless (gst_element_link_many (src, infilter, deinterlace, outfilter, sink, NULL)); if (infiltercaps) gst_caps_unref (infiltercaps); if (outfiltercaps) gst_caps_unref (outfiltercaps); } /* * Checks if 2 buffers are equal * * Equals means same data */ static gboolean test_buffer_equals (GstBuffer * buf_a, GstBuffer * buf_b) { GstMapInfo m1, m2; gboolean res = FALSE; gst_buffer_map (buf_a, &m1, GST_MAP_READ); gst_buffer_map (buf_b, &m2, GST_MAP_READ); if (m1.size == m2.size) { res = memcmp (m1.data, m2.data, m1.size) == 0; } gst_buffer_unmap (buf_a, &m1); gst_buffer_unmap (buf_b, &m2); return res; } static GstPadProbeReturn sinkpad_enqueue_buffer (GstPad * pad, GstPadProbeInfo * info, gpointer data) { GQueue *queue = (GQueue *) data; GstBuffer *buf = GST_PAD_PROBE_INFO_BUFFER (info); /* enqueue a copy for being compared later */ g_queue_push_tail (queue, gst_buffer_copy (buf)); return GST_PAD_PROBE_OK; } /* * pad buffer probe that compares the buffer with the top one * in the GQueue passed as the user data */ static GstPadProbeReturn srcpad_dequeue_and_compare_buffer (GstPad * pad, GstPadProbeInfo * info, gpointer data) { GQueue *queue = (GQueue *) data; GstBuffer *buf = GST_PAD_PROBE_INFO_BUFFER (info); GstBuffer *queue_buf; queue_buf = (GstBuffer *) g_queue_pop_head (queue); fail_if (queue_buf == NULL); fail_unless (test_buffer_equals (buf, queue_buf)); gst_buffer_unref (queue_buf); return GST_PAD_PROBE_OK; } /* * Utility function that sets up a pipeline with deinterlace for * validating 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); } /* * Sets the caps on deinterlace sinkpad and validates the * caps that is set on the srcpad */ static void deinterlace_set_caps_and_check (GstCaps * input, gboolean must_deinterlace) { GstCaps *othercaps = NULL; GstSegment segment; gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test")); fail_unless (gst_pad_set_caps (sinkpad, input)); gst_segment_init (&segment, GST_FORMAT_TIME); gst_pad_send_event (sinkpad, gst_event_new_segment (&segment)); g_object_get (srcpad, "caps", &othercaps, NULL); if (must_deinterlace) { fail_if (gst_caps_is_interlaced (othercaps)); } else { GstStructure *s; fail_unless (gst_caps_is_interlaced (input) == gst_caps_is_interlaced (othercaps)); othercaps = gst_caps_make_writable (othercaps); s = gst_caps_get_structure (othercaps, 0); gst_structure_remove_field (s, "interlace-mode"); input = gst_caps_make_writable (input); s = gst_caps_get_structure (input, 0); gst_structure_remove_field (s, "interlace-mode"); fail_unless (gst_caps_is_equal (input, othercaps)); } gst_caps_unref (input); gst_caps_unref (othercaps); } static void deinterlace_set_string_caps_and_check (const gchar * input, gboolean must_deinterlace) { deinterlace_set_caps_and_check (gst_caps_from_string (input), must_deinterlace); } GST_START_TEST (test_mode_auto_accept_caps) { setup_deinterlace (); /* auto mode */ g_object_set (deinterlace, "mode", 0, NULL); fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); /* try to set non interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2, FALSE); deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, FALSE); /* now try to set interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, TRUE); /* cleanup */ gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); } GST_END_TEST; GST_START_TEST (test_mode_forced_accept_caps) { setup_deinterlace (); /* forced mode */ g_object_set (deinterlace, "mode", 1, NULL); fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); /* try to set non interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2, TRUE); deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, TRUE); /* now try to set interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, TRUE); /* cleanup */ gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); } GST_END_TEST; GST_START_TEST (test_mode_disabled_accept_caps) { setup_deinterlace (); /* disabled mode */ g_object_set (deinterlace, "mode", 2, NULL); fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); /* try to set non interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2, FALSE); deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, FALSE); /* now try to set interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, FALSE); deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, FALSE); /* cleanup */ gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); } GST_END_TEST; GST_START_TEST (test_mode_disabled_passthrough) { /* 2 is disabled mode */ deinterlace_check_passthrough (2, CAPS_YUY2_INTERLACED); deinterlace_check_passthrough (2, CAPS_YVYU_INTERLACED); deinterlace_check_passthrough (2, CAPS_YUY2); deinterlace_check_passthrough (2, CAPS_YVYU); deinterlace_check_passthrough (2, CAPS_YUY2_INTERLACED_IMAGE); deinterlace_check_passthrough (2, CAPS_YVYU_INTERLACED_IMAGE); deinterlace_check_passthrough (2, CAPS_YUY2_IMAGE); deinterlace_check_passthrough (2, CAPS_YVYU_IMAGE); } GST_END_TEST; GST_START_TEST (test_mode_auto_deinterlaced_passthrough) { /* 0 is auto mode */ deinterlace_check_passthrough (0, CAPS_YUY2); deinterlace_check_passthrough (0, CAPS_YVYU); deinterlace_check_passthrough (0, CAPS_YUY2_IMAGE); deinterlace_check_passthrough (0, CAPS_YVYU_IMAGE); } GST_END_TEST; static GstPadProbeReturn catch_caps_event (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) { GstCaps **outcaps = user_data; if (GST_EVENT_TYPE (info->data) == GST_EVENT_CAPS) { g_assert (*outcaps == NULL); gst_event_parse_caps (GST_EVENT (info->data), outcaps); gst_caps_ref (*outcaps); } return GST_PAD_PROBE_OK; } static void deinterlace_set_caps_with_filter_and_check_result (gint mode, gint fields, const gchar * input_caps, const gchar * filter_caps, const gchar * output_caps) { GstElement *deinterlace, *capsfilter; GstPad *sinkpad, *srcpad; GstCaps *caps, *outcaps_actual = NULL; GstCaps *outcaps_expected = NULL; deinterlace = gst_element_factory_make ("deinterlace", NULL); fail_unless (deinterlace != NULL); g_object_set (deinterlace, "mode", mode, "fields", fields, NULL); caps = gst_caps_from_string (filter_caps); fail_unless (caps != NULL); capsfilter = gst_element_factory_make ("capsfilter", NULL); g_object_set (capsfilter, "caps", caps, NULL); gst_caps_unref (caps); fail_unless (gst_element_link (deinterlace, capsfilter)); sinkpad = gst_element_get_static_pad (deinterlace, "sink"); fail_unless (sinkpad); srcpad = gst_element_get_static_pad (capsfilter, "src"); fail_unless (srcpad); gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, catch_caps_event, &outcaps_actual, NULL); if (output_caps) { outcaps_expected = gst_caps_from_string (output_caps); fail_unless (outcaps_expected != NULL); } fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_set_state (capsfilter, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); caps = gst_caps_from_string (input_caps); fail_unless (caps != NULL); gst_pad_send_event (sinkpad, gst_event_new_caps (caps)); gst_caps_unref (caps); if (output_caps) { gchar *actual; fail_if (outcaps_actual == NULL, "Expected %s, got no caps", output_caps); actual = gst_caps_to_string (outcaps_actual); fail_unless (gst_caps_is_equal (outcaps_actual, outcaps_expected), "Expected %s, got %s", output_caps, actual); g_free (actual); } else { gchar *actual; actual = gst_caps_to_string (outcaps_actual); fail_if (outcaps_actual != NULL, "Expected negotiation failure, got %s", actual); g_free (actual); } gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_set_state (capsfilter, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); gst_object_unref (capsfilter); if (outcaps_expected) gst_caps_unref (outcaps_expected); if (outcaps_actual) gst_caps_unref (outcaps_actual); } GST_START_TEST (test_mode_disabled_expected_caps) { deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (2, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (2, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); } GST_END_TEST; GST_START_TEST (test_mode_interlaced_expected_caps) { deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=40/1"); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=40/1"); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (1, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); } GST_END_TEST; GST_START_TEST (test_mode_auto_expected_caps) { deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=40/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (0, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (0, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); } GST_END_TEST; GST_START_TEST (test_mode_auto_strict_expected_caps) { deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=40/1"); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw(ANY)", "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw(memory:SomeMemory), format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw(ANY)", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw", "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 0, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=progressive, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); deinterlace_set_caps_with_filter_and_check_result (3, 1, "video/x-raw, format=v210, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=interleaved", NULL); } GST_END_TEST; GST_START_TEST (test_fields_auto_expected_caps) { deinterlace_set_caps_with_filter_and_check_result (0, 3, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=progressive, framerate=20/1", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=20/1"); deinterlace_set_caps_with_filter_and_check_result (0, 3, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=progressive, framerate=40/1", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=40/1"); deinterlace_set_caps_with_filter_and_check_result (0, 3, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=progressive", "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=progressive, framerate=40/1"); deinterlace_set_caps_with_filter_and_check_result (0, 3, "video/x-raw, format=I420, width=320, height=240, " "interlace-mode=interleaved, framerate=20/1", "video/x-raw, interlace-mode=progressive, framerate=15/1", NULL); } GST_END_TEST; static Suite * deinterlace_suite (void) { Suite *s = suite_create ("deinterlace"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_set_timeout (tc_chain, 180); if (!gst_registry_check_feature_version (gst_registry_get (), "deinterlace", GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO)) { GST_ERROR ("FIXME: port deinterlace element"); return s; } tcase_add_test (tc_chain, test_create_and_unref); tcase_add_test (tc_chain, test_mode_auto_accept_caps); tcase_add_test (tc_chain, test_mode_forced_accept_caps); tcase_add_test (tc_chain, test_mode_disabled_accept_caps); tcase_add_test (tc_chain, test_mode_disabled_passthrough); tcase_add_test (tc_chain, test_mode_auto_deinterlaced_passthrough); tcase_add_test (tc_chain, test_mode_disabled_expected_caps); tcase_add_test (tc_chain, test_mode_interlaced_expected_caps); tcase_add_test (tc_chain, test_mode_auto_expected_caps); tcase_add_test (tc_chain, test_mode_auto_strict_expected_caps); tcase_add_test (tc_chain, test_fields_auto_expected_caps); return s; } GST_CHECK_MAIN (deinterlace);