1 /* GStreamer
2 * unit test for the videobox element
3 *
4 * Copyright (C) 2006 Ravi Kiran K N <ravi.kiran@samsung.com>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 */
21
22 #ifdef HAVE_CONFIG_H
23 # include "config.h"
24 #endif
25
26 #include <gst/check/gstcheck.h>
27
28 typedef struct _GstVideoBoxTestContext
29 {
30 GstElement *pipeline;
31 GstElement *src;
32 GstElement *filter;
33 GstElement *box;
34 GstElement *filter2;
35 GstElement *sink;
36 } GstVideoBoxTestContext;
37
38 typedef struct _FormatConversion
39 {
40 const gchar *in_caps;
41 const gchar *out_caps;
42 gboolean expected_result;
43 } FormatConversion;
44
45
46 /*
47 * Update this table as and when the conversion is supported(or unsupported) in videobox
48 */
49 static const FormatConversion conversion_table[] = {
50 {"video/x-raw,format={RGBA}", "video/x-raw,format={AYUV}", TRUE},
51 {"video/x-raw,format={AYUV}", "video/x-raw,format={RGBA}", TRUE},
52 {"video/x-raw,format={I420}", "video/x-raw,format={AYUV}", TRUE},
53 {"video/x-raw,format={AYUV}", "video/x-raw,format={I420}", TRUE},
54 {"video/x-raw,format={I420}", "video/x-raw,format={YV12}", TRUE},
55 {"video/x-raw,format={YV12}", "video/x-raw,format={AYUV}", TRUE},
56 {"video/x-raw,format={YV12}", "video/x-raw,format={I420}", TRUE},
57 {"video/x-raw,format={AYUV}", "video/x-raw,format={YV12}", TRUE},
58 {"video/x-raw,format={AYUV}", "video/x-raw,format={xRGB}", TRUE},
59 {"video/x-raw,format={xRGB}", "video/x-raw,format={xRGB}", TRUE},
60 {"video/x-raw,format={xRGB}", "video/x-raw,format={AYUV}", TRUE},
61 {"video/x-raw,format={GRAY8}", "video/x-raw,format={GRAY16_LE}", FALSE},
62 {"video/x-raw,format={GRAY8}", "video/x-raw,format={GRAY16_BE}", FALSE},
63 {"video/x-raw,format={Y444}", "video/x-raw,format={Y42B}", FALSE},
64 {"video/x-raw,format={Y444}", "video/x-raw,format={Y41B}", FALSE},
65 {"video/x-raw,format={Y42B}", "video/x-raw,format={Y41B}", FALSE}
66 };
67
68
69 static gboolean
bus_handler(GstBus * bus,GstMessage * message,gpointer data)70 bus_handler (GstBus * bus, GstMessage * message, gpointer data)
71 {
72 GMainLoop *loop = (GMainLoop *) data;
73
74 switch (message->type) {
75 case GST_MESSAGE_EOS:{
76 GST_LOG ("EOS event received");
77 g_main_loop_quit (loop);
78 break;
79 }
80 case GST_MESSAGE_ERROR:{
81 GError *gerror;
82 gchar *debug;
83 gst_message_parse_error (message, &gerror, &debug);
84 g_error ("Error from %s: %s (%s)\n",
85 GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)), gerror->message,
86 GST_STR_NULL (debug));
87 g_error_free (gerror);
88 g_free (debug);
89 g_main_loop_quit (loop);
90 break;
91 }
92 case GST_MESSAGE_WARNING:{
93 g_main_loop_quit (loop);
94 break;
95 }
96 default:
97 break;
98 }
99
100 return TRUE;
101 }
102
103 static void
videobox_test_init_context(GstVideoBoxTestContext * ctx)104 videobox_test_init_context (GstVideoBoxTestContext * ctx)
105 {
106 fail_unless (ctx != NULL);
107
108 ctx->pipeline = gst_pipeline_new ("pipeline");
109 fail_unless (ctx->pipeline != NULL);
110 ctx->src = gst_element_factory_make ("videotestsrc", "src");
111 fail_unless (ctx->src != NULL, "Failed to create videotestsrc element");
112 ctx->filter = gst_element_factory_make ("capsfilter", "filter");
113 fail_unless (ctx->filter != NULL, "Failed to create capsfilter element");
114 ctx->box = gst_element_factory_make ("videobox", "box");
115 fail_unless (ctx->box != NULL, "Failed to create videobox element");
116 ctx->filter2 = gst_element_factory_make ("capsfilter", "filter2");
117 fail_unless (ctx->filter2 != NULL,
118 "Failed to create second capsfilter element");
119 ctx->sink = gst_element_factory_make ("fakesink", "sink");
120 fail_unless (ctx->sink != NULL, "Failed to create fakesink element");
121
122 gst_bin_add_many (GST_BIN (ctx->pipeline), ctx->src, ctx->filter,
123 ctx->box, ctx->filter2, ctx->sink, NULL);
124 fail_unless (gst_element_link_many (ctx->src, ctx->filter, ctx->box,
125 ctx->filter2, ctx->sink, NULL) == TRUE, "Can not link elements");
126
127 fail_unless (gst_element_set_state (ctx->pipeline,
128 GST_STATE_READY) != GST_STATE_CHANGE_FAILURE,
129 "couldn't set pipeline to READY state");
130
131 GST_LOG ("videobox context inited");
132 }
133
134 static void
videobox_test_deinit_context(GstVideoBoxTestContext * ctx)135 videobox_test_deinit_context (GstVideoBoxTestContext * ctx)
136 {
137 GST_LOG ("deiniting videobox context");
138
139 gst_element_set_state (ctx->pipeline, GST_STATE_NULL);
140 gst_object_unref (ctx->pipeline);
141 memset (ctx, 0x00, sizeof (GstVideoBoxTestContext));
142 }
143
GST_START_TEST(test_caps_transform)144 GST_START_TEST (test_caps_transform)
145 {
146 GstStateChangeReturn state_ret;
147 GstVideoBoxTestContext ctx;
148 guint conversions_test_size;
149 guint itr;
150 gboolean link_res;
151 GMainLoop *loop;
152 GstBus *bus;
153
154 videobox_test_init_context (&ctx);
155 gst_util_set_object_arg (G_OBJECT (ctx.src), "num-buffers", "1");
156
157 loop = g_main_loop_new (NULL, TRUE);
158 fail_unless (loop != NULL);
159
160 bus = gst_element_get_bus (ctx.pipeline);
161 fail_unless (bus != NULL);
162
163 gst_bus_add_watch (bus, bus_handler, loop);
164
165 conversions_test_size = G_N_ELEMENTS (conversion_table);
166 for (itr = 0; itr < conversions_test_size; itr++) {
167 gst_element_unlink_many (ctx.src, ctx.filter, ctx.box, ctx.filter2,
168 ctx.sink, NULL);
169 gst_util_set_object_arg (G_OBJECT (ctx.filter), "caps",
170 conversion_table[itr].in_caps);
171 gst_util_set_object_arg (G_OBJECT (ctx.filter2), "caps",
172 conversion_table[itr].out_caps);
173
174 /* Link with new input and output format from conversion table */
175 link_res =
176 gst_element_link_many (ctx.src, ctx.filter, ctx.box, ctx.filter2,
177 ctx.sink, NULL);
178
179 /* Check if the specified format conversion is supported or not by videobox */
180 fail_unless (link_res == conversion_table[itr].expected_result,
181 "videobox can not convert from '%s'' to '%s'",
182 conversion_table[itr].in_caps, conversion_table[itr].out_caps);
183
184 if (link_res == FALSE) {
185 GST_LOG ("elements linking failed");
186 continue;
187 }
188
189 state_ret = gst_element_set_state (ctx.pipeline, GST_STATE_PLAYING);
190 fail_unless (state_ret != GST_STATE_CHANGE_FAILURE,
191 "couldn't set pipeline to PLAYING state");
192
193 g_main_loop_run (loop);
194
195 state_ret = gst_element_set_state (ctx.pipeline, GST_STATE_READY);
196 fail_unless (state_ret != GST_STATE_CHANGE_FAILURE,
197 "couldn't set pipeline to READY state");
198 }
199
200 gst_bus_remove_watch (bus);
201 gst_object_unref (bus);
202 g_main_loop_unref (loop);
203
204 videobox_test_deinit_context (&ctx);
205 }
206
207 GST_END_TEST;
208
209
210 static Suite *
videobox_suite(void)211 videobox_suite (void)
212 {
213 Suite *s = suite_create ("videobox");
214 TCase *tc_chain = tcase_create ("general");
215
216 suite_add_tcase (s, tc_chain);
217 tcase_add_test (tc_chain, test_caps_transform);
218
219 return s;
220 }
221
222 GST_CHECK_MAIN (videobox);
223