VideoDataOutput::VideoDataOutput(Backend *backend, QObject *parent) : QObject(parent), MediaNode(backend, VideoSink), m_frontend(0) { static int count = 0; m_name = "VideoDataOutput" + QString::number(count++); m_queue = gst_bin_new(NULL); gst_object_ref_sink(GST_OBJECT(m_queue)); GstElement* sink = gst_element_factory_make("fakesink", NULL); GstElement* queue = gst_element_factory_make("queue", NULL); GstElement* convert = gst_element_factory_make("videoconvert", NULL); g_signal_connect(sink, "handoff", G_CALLBACK(processBuffer), this); g_object_set(G_OBJECT(sink), "signal-handoffs", true, NULL); // Save ourselves a metric crapton of work by simply requesting // a format native to Qt. GstCaps *caps = gst_caps_new_simple("video/x-raw", "format = (string)", G_TYPE_STRING, GST_VIDEO_NE(RGB), NULL); gst_bin_add_many(GST_BIN(m_queue), sink, convert, queue, NULL); gst_element_link(queue, convert); gst_element_link_filtered(convert, sink, caps); gst_caps_unref(caps); GstPad *inputpad = gst_element_get_static_pad(queue, "sink"); gst_element_add_pad(m_queue, gst_ghost_pad_new("sink", inputpad)); gst_object_unref(inputpad); g_object_set(G_OBJECT(sink), "sync", true, NULL); m_isValid = true; }
static GstCaps * gst_shape_wipe_mask_sink_getcaps (GstPad * pad, GstCaps * filter) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); GstCaps *ret, *tmp; guint i, n; if (gst_pad_has_current_caps (pad)) return gst_pad_get_current_caps (pad); tmp = gst_pad_peer_query_caps (self->video_sinkpad, NULL); if (tmp) { ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (self->video_sinkpad)); gst_caps_unref (tmp); } else { ret = gst_pad_get_pad_template_caps (self->video_sinkpad); } GST_LOG_OBJECT (pad, "video sink accepted caps: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; tmp = gst_pad_peer_query_caps (self->srcpad, NULL); GST_LOG_OBJECT (pad, "srcpad accepted caps: %" GST_PTR_FORMAT, ret); if (tmp) { GstCaps *intersection; intersection = gst_caps_intersect (ret, tmp); gst_caps_unref (ret); gst_caps_unref (tmp); ret = intersection; } GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; n = gst_caps_get_size (ret); tmp = gst_caps_new_empty (); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (ret, i); GstStructure *t; gst_structure_set_name (s, "video/x-raw"); gst_structure_remove_fields (s, "format", "framerate", NULL); if (self->vinfo.width && self->vinfo.height) gst_structure_set (s, "width", G_TYPE_INT, self->vinfo.width, "height", G_TYPE_INT, self->vinfo.height, NULL); gst_structure_set (s, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); t = gst_structure_copy (s); gst_structure_set (s, "format", G_TYPE_STRING, GST_VIDEO_NE (GRAY16), NULL); gst_structure_set (t, "format", G_TYPE_STRING, "GRAY8", NULL); gst_caps_append_structure (tmp, t); } gst_caps_append (ret, tmp); tmp = gst_pad_peer_query_caps (pad, NULL); GST_LOG_OBJECT (pad, "peer accepted caps: %" GST_PTR_FORMAT, tmp); if (tmp) { GstCaps *intersection; intersection = gst_caps_intersect (tmp, ret); gst_caps_unref (tmp); gst_caps_unref (ret); ret = intersection; } done: gst_object_unref (self); GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); return ret; }
static GstStaticPadTemplate video_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("video_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, ARGB, BGRA, ABGR, RGBA }"))); static GstStaticPadTemplate mask_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("mask_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw, " "format = (string) GRAY8, " "width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = 0/1 ; " "video/x-raw, " "format = (string) " GST_VIDEO_NE (GRAY16) ", " "width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = 0/1")); static GstStaticPadTemplate src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, ARGB, BGRA, ABGR, RGBA }"))); GST_DEBUG_CATEGORY_STATIC (gst_shape_wipe_debug); #define GST_CAT_DEFAULT gst_shape_wipe_debug #define gst_shape_wipe_parent_class parent_class G_DEFINE_TYPE (GstShapeWipe, gst_shape_wipe, GST_TYPE_ELEMENT); static void gst_shape_wipe_class_init (GstShapeWipeClass * klass)
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstdshowvideosrc.h" #include <gst/video/video.h> GST_DEBUG_CATEGORY_STATIC (dshowvideosrc_debug); #define GST_CAT_DEFAULT dshowvideosrc_debug static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw, format=(string) { " GST_VIDEO_NE(BGR) ", " GST_VIDEO_NE(I420) ", " GST_VIDEO_NE(YUY2) ", " GST_VIDEO_NE(UYVY) " }, " "width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = " GST_VIDEO_FPS_RANGE "; " "video/x-dv, " "format= (string) DVSD, " "width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = " GST_VIDEO_FPS_RANGE ", " "systemstream = (boolean) { TRUE, FALSE }; " "image/jpeg, "