efl/legacy/emotion/src/modules/gstreamer/emotion_gstreamer_pipeline_...

85 lines
2.3 KiB
C

#include "emotion_gstreamer.h"
#include "emotion_gstreamer_pipeline.h"
int
emotion_pipeline_v4l_build(void *video, const char *device)
{
GstElement *v4l2src, *cspace, *queue, *sink;
Emotion_Video_Sink *vsink;
GstCaps *caps;
Emotion_Gstreamer_Video *ev;
char dev[128];
int devno;
ev = (Emotion_Gstreamer_Video *)video;
if (!ev) return 0;
v4l2src = gst_element_factory_make("v4l2src", "v4l2src");
cspace = gst_element_factory_make("ffmpegcolorspace", "cspace");
queue = gst_element_factory_make("queue", "queue");
sink = gst_element_factory_make("fakesink", "sink");
if ((!v4l2src) || (!cspace) || (!queue) || (!sink))
goto failure;
if (sscanf(device, "v4l://%d", &devno) != 1)
devno = 0;
snprintf(dev, sizeof(dev), "/dev/video%d", devno);
g_object_set (v4l2src, "device", dev, NULL);
gst_bin_add_many(GST_BIN(ev->pipeline), v4l2src, cspace, queue, sink, NULL);
caps = gst_caps_new_simple("video/x-raw-yuv",
"width", G_TYPE_INT, 320,
"height", G_TYPE_INT, 240,
NULL);
if (!gst_element_link_filtered(v4l2src, cspace, caps))
{
gst_caps_unref(caps);
goto failure;
}
gst_caps_unref(caps);
caps = gst_caps_new_simple("video/x-raw-rgb",
"bpp", G_TYPE_INT, 32,
"width", G_TYPE_INT, 320,
"height", G_TYPE_INT, 240,
NULL);
if (!gst_element_link_filtered(cspace, queue, caps))
{
gst_caps_unref(caps);
goto failure;
}
gst_caps_unref(caps);
gst_element_link(queue, sink);
vsink = emotion_video_sink_new(ev);
if(!vsink) goto failure;
vsink->sink = sink;
vsink->width=320;
vsink->height=240;
vsink->fourcc = GST_MAKE_FOURCC ('A', 'R', 'G', 'B');
g_object_set(G_OBJECT(vsink->sink), "sync", FALSE, NULL);
g_object_set(G_OBJECT(vsink->sink), "signal-handoffs", TRUE, NULL);
g_signal_connect(G_OBJECT(vsink->sink),
"handoff",
G_CALLBACK(cb_handoff), ev);
return 1;
failure:
if(v4l2src)
gst_object_unref(v4l2src);
if(cspace)
gst_object_unref(cspace);
if(queue)
gst_object_unref(queue);
if(sink)
gst_object_unref(sink);
return 0;
}