1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| typedef struct g_pipeline0_style { GstElement *pipeline;
GstElement *src; GstElement *yuy2_filter; GstElement *v4l2convert; GstElement *rgb_filter; GstElement *appsink; } g_pipeline0_style;
typedef struct g_pipeline1_style { GstElement *pipeline;
GstElement *appsrc; GstElement *rgb_filter; GstElement *waylandsink; } g_pipeline1_style;
void init_gstreamer(g_pipeline0_style *pipeline0, g_pipeline1_style *pipeline1) { g_assert(pipeline0 && pipeline1);
pipeline0->pipeline = gst_pipeline_new("pipeline0"); pipeline0->src = gst_element_factory_make(GST_SRC, "src"); pipeline0->yuy2_filter = gst_element_factory_make("capsfilter", "videoconvert"); pipeline0->v4l2convert = gst_element_factory_make("v4l2convert", "v4l2convert"); pipeline0->rgb_filter = gst_element_factory_make("capsfilter", "rgb_filter"); pipeline0->appsink = gst_element_factory_make("appsink", "appsink");
pipeline1->pipeline = gst_pipeline_new("pipeline1"); pipeline1->appsrc = gst_element_factory_make("appsrc", "appsrc"); pipeline1->rgb_filter = gst_element_factory_make("capsfilter", "rgb_filter"); pipeline1->waylandsink = gst_element_factory_make("waylandsink", "waylandsink");
g_assert(pipeline0->pipeline && pipeline0->src && pipeline0->yuy2_filter && pipeline0->v4l2convert && pipeline0->rgb_filter && pipeline0->appsink && pipeline1->pipeline && pipeline1->appsrc && pipeline1->rgb_filter && pipeline1->waylandsink);
GstCaps *caps_yuy2 = gst_caps_new_simple("video/x-raw", "width", G_TYPE_INT, DEFAULT_WIDTH, "height", G_TYPE_INT, DEFAULT_HEIGHT, "format", G_TYPE_STRING, "YUY2", "framerate", GST_TYPE_FRACTION, 30, 1, NULL); g_assert(caps_yuy2); g_object_set(G_OBJECT(pipeline0->yuy2_filter), "caps", caps_yuy2, NULL); gst_caps_unref(caps_yuy2);
g_object_set(pipeline0->v4l2convert, "disable-passthrough", TRUE, NULL); gst_util_set_object_arg(G_OBJECT(pipeline0->v4l2convert), "output-io-mode", "dmabuf-import"); gst_util_set_object_arg(G_OBJECT(pipeline0->v4l2convert), "capture-io-mode", "dmabuf");
GstCaps *caps_rgb0 = gst_caps_new_simple("video/x-raw", "width", G_TYPE_INT, DEFAULT_WIDTH, "height", G_TYPE_INT, DEFAULT_HEIGHT, "format", G_TYPE_STRING, "RGB", "framerate", GST_TYPE_FRACTION, 30, 1, NULL); g_assert(caps_rgb0); g_object_set(G_OBJECT(pipeline0->rgb_filter), "caps", caps_rgb0, NULL); gst_caps_unref(caps_rgb0);
GstAppSinkCallbacks app_sink_callback = { NULL, NULL, on_new_sample }; gst_app_sink_set_callbacks(GST_APP_SINK(pipeline0->appsink), &app_sink_callback, pipeline1->appsrc, NULL);
GstCaps *caps_rgb1 = gst_caps_new_simple("video/x-raw", "width", G_TYPE_INT, DEFAULT_WIDTH, "height", G_TYPE_INT, DEFAULT_HEIGHT, "format", G_TYPE_STRING, "RGB", "framerate", GST_TYPE_FRACTION, 30, 1, NULL); g_assert(caps_rgb1); g_object_set(G_OBJECT(pipeline1->rgb_filter), "caps", caps_rgb1, NULL); gst_caps_unref(caps_rgb1);
g_object_set(G_OBJECT(pipeline1->waylandsink), "sync", FALSE, NULL);
gst_bin_add_many(GST_BIN(pipeline0->pipeline), pipeline0->src, pipeline0->yuy2_filter, pipeline0->v4l2convert, pipeline0->rgb_filter, pipeline0->appsink, NULL); gst_bin_add_many(GST_BIN(pipeline1->pipeline), pipeline1->appsrc, pipeline1->rgb_filter, pipeline1->waylandsink, NULL);
gst_bin_link_many(pipeline0->src, pipeline0->yuy2_filter, pipeline0->v4l2convert, pipeline0->rgb_filter, pipeline0->appsink, NULL); gst_bin_link_many(pipeline1->appsrc, pipeline1->rgb_filter, pipeline1->waylandsink, NULL); }
|