forked from enlightenment/efl
85 lines
2.3 KiB
C
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;
|
|
}
|