static void gst_inter_video_sink_class_init (GstInterVideoSinkClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass); GstVideoSinkClass *video_sink_class = GST_VIDEO_SINK_CLASS (klass); GST_DEBUG_CATEGORY_INIT (gst_inter_video_sink_debug_category, "intervideosink", 0, "debug category for intervideosink element"); gst_element_class_add_static_pad_template (element_class, &gst_inter_video_sink_sink_template); gst_element_class_set_static_metadata (element_class, "Internal video sink", "Sink/Video", "Virtual video sink for internal process communication", "David Schleef <*****@*****.**>"); gobject_class->set_property = gst_inter_video_sink_set_property; gobject_class->get_property = gst_inter_video_sink_get_property; gobject_class->finalize = gst_inter_video_sink_finalize; base_sink_class->get_times = GST_DEBUG_FUNCPTR (gst_inter_video_sink_get_times); base_sink_class->start = GST_DEBUG_FUNCPTR (gst_inter_video_sink_start); base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_inter_video_sink_stop); base_sink_class->set_caps = GST_DEBUG_FUNCPTR (gst_inter_video_sink_set_caps); video_sink_class->show_frame = GST_DEBUG_FUNCPTR (gst_inter_video_sink_show_frame); g_object_class_install_property (gobject_class, PROP_CHANNEL, g_param_spec_string ("channel", "Channel", "Channel name to match inter src and sink elements", DEFAULT_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); }
static void gst_imx_blitter_video_sink_class_init(GstImxBlitterVideoSinkClass *klass) { GObjectClass *object_class; GstBaseSinkClass *base_class; GstVideoSinkClass *parent_class; GstElementClass *element_class; GST_DEBUG_CATEGORY_INIT(imx_blitter_video_sink_debug, "imxblittervideosink", 0, "Freescale i.MX blitter sink base class"); object_class = G_OBJECT_CLASS(klass); base_class = GST_BASE_SINK_CLASS(klass); parent_class = GST_VIDEO_SINK_CLASS(klass); element_class = GST_ELEMENT_CLASS(klass); object_class->dispose = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_dispose); object_class->set_property = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_set_property); object_class->get_property = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_get_property); element_class->change_state = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_change_state); base_class->set_caps = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_set_caps); base_class->event = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_event); base_class->propose_allocation = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_propose_allocation); parent_class->show_frame = GST_DEBUG_FUNCPTR(gst_imx_blitter_video_sink_show_frame); klass->start = NULL; klass->stop = NULL; klass->create_blitter = NULL; g_object_class_install_property( object_class, PROP_FORCE_ASPECT_RATIO, g_param_spec_boolean( "force-aspect-ratio", "Force aspect ratio", "When enabled, scaling will respect original aspect ratio", DEFAULT_FORCE_ASPECT_RATIO, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_FBDEV_NAME, g_param_spec_string( "framebuffer", "Framebuffer device name", "The device name of the framebuffer to render to", DEFAULT_FBDEV_NAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_USE_VSYNC, g_param_spec_boolean( "use-vsync", "Use VSync", "Enable and use verticeal synchronization to eliminate tearing", DEFAULT_USE_VSYNC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_INPUT_CROP, g_param_spec_boolean( "input-crop", "Input crop", "Whether or not to crop input frames based on their video crop metadata", DEFAULT_INPUT_CROP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_OUTPUT_ROTATION, g_param_spec_enum( "output-rotation", "Output rotation", "Output rotation in 90-degree steps", gst_imx_canvas_inner_rotation_get_type(), DEFAULT_OUTPUT_ROTATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_WINDOW_X_COORD, g_param_spec_int( "window-x-coord", "Window x coordinate", "X coordinate of the window's top left corner, in pixels", G_MININT, G_MAXINT, DEFAULT_WINDOW_X_COORD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_WINDOW_Y_COORD, g_param_spec_int( "window-y-coord", "Window y coordinate", "Y coordinate of the window's top left corner, in pixels", G_MININT, G_MAXINT, DEFAULT_WINDOW_Y_COORD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_WINDOW_WIDTH, g_param_spec_uint( "window-width", "Window width", "Window width, in pixels (0 = automatically set to the video input width)", 0, G_MAXINT, DEFAULT_WINDOW_WIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_WINDOW_HEIGHT, g_param_spec_uint( "window-height", "Window height", "Window height, in pixels (0 = automatically set to the video input height)", 0, G_MAXINT, DEFAULT_WINDOW_HEIGHT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_LEFT_MARGIN, g_param_spec_uint( "left-margin", "Left margin", "Left margin", 0, G_MAXUINT, DEFAULT_LEFT_MARGIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_TOP_MARGIN, g_param_spec_uint( "top-margin", "Top margin", "Top margin", 0, G_MAXUINT, DEFAULT_TOP_MARGIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_RIGHT_MARGIN, g_param_spec_uint( "right-margin", "Right margin", "Right margin", 0, G_MAXUINT, DEFAULT_RIGHT_MARGIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); g_object_class_install_property( object_class, PROP_BOTTOM_MARGIN, g_param_spec_uint( "bottom-margin", "Bottom margin", "Bottom margin", 0, G_MAXUINT, DEFAULT_BOTTOM_MARGIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) ); }
static void gst_qt_quick2_video_sink_class_init (GstQtQuick2VideoSinkClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = gst_qt_quick2_video_sink_finalize; gobject_class->set_property = gst_qt_quick2_video_sink_set_property; gobject_class->get_property = gst_qt_quick2_video_sink_get_property; GstElementClass *element_class = GST_ELEMENT_CLASS(klass); element_class->change_state = gst_qt_quick2_video_sink_change_state; GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS(klass); base_sink_class->set_caps = gst_qt_quick2_video_sink_set_caps; GstVideoSinkClass *video_sink_class = GST_VIDEO_SINK_CLASS(klass); video_sink_class->show_frame = gst_qt_quick2_video_sink_show_frame; GstQtQuick2VideoSinkClass *qtquick2_class = GST_QT_QUICK2_VIDEO_SINK_CLASS(klass); qtquick2_class->update_node = gst_qt_quick2_video_sink_update_node; /** * GstQtQuick2VideoSink::pixel-aspect-ratio * * The pixel aspect ratio of the display device. **/ g_object_class_install_property(gobject_class, PROP_PIXEL_ASPECT_RATIO, g_param_spec_string("pixel-aspect-ratio", "Pixel aspect ratio", "The pixel aspect ratio of the display device", "1/1", static_cast<GParamFlags>(G_PARAM_READWRITE))); /** * GstQtQuick2VideoSink::force-aspect-ratio * * If set to TRUE, the sink will scale the video respecting its original aspect ratio * and any remaining space will be filled with black. * If set to FALSE, the sink will scale the video to fit the whole drawing area. **/ g_object_class_install_property(gobject_class, PROP_FORCE_ASPECT_RATIO, g_param_spec_boolean("force-aspect-ratio", "Force aspect ratio", "When enabled, scaling will respect original aspect ratio", FALSE, static_cast<GParamFlags>(G_PARAM_READWRITE))); g_object_class_install_property(gobject_class, PROP_CONTRAST, g_param_spec_int("contrast", "Contrast", "The contrast of the video", -100, 100, 0, static_cast<GParamFlags>(G_PARAM_READWRITE))); g_object_class_install_property(gobject_class, PROP_BRIGHTNESS, g_param_spec_int("brightness", "Brightness", "The brightness of the video", -100, 100, 0, static_cast<GParamFlags>(G_PARAM_READWRITE))); g_object_class_install_property(gobject_class, PROP_HUE, g_param_spec_int("hue", "Hue", "The hue of the video", -100, 100, 0, static_cast<GParamFlags>(G_PARAM_READWRITE))); g_object_class_install_property(gobject_class, PROP_SATURATION, g_param_spec_int("saturation", "Saturation", "The saturation of the video", -100, 100, 0, static_cast<GParamFlags>(G_PARAM_READWRITE))); /** * GstQtQuick2VideoSink::update-node * @node: The QSGNode to update * @x: The x coordinate of the target area rectangle * @y: The y coordinate of the target area rectangle * @width: The width of the target area rectangle * @height: The height of the target area rectangle * @returns: The updated QGSNode * * This is an action signal that you can call from your QQuickItem subclass * inside its updateNode function to render the video. It takes a QSGNode* * and the item's area rectangle as arguments. You should schedule to call * this function to repaint the surface whenever the ::update signal is * emited. * * Note that the x,y,width and height arguments are actually qreal. * This means that on architectures like arm they will be float instead * of double. You should cast the arguments to qreal if they are not * already when emitting this signal. */ s_signals[ACTION_UPDATE_NODE] = g_signal_new("update-node", G_TYPE_FROM_CLASS(klass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET(GstQtQuick2VideoSinkClass, update_node), NULL, NULL, qRealIsDouble() ? g_cclosure_user_marshal_POINTER__POINTER_DOUBLE_DOUBLE_DOUBLE_DOUBLE : g_cclosure_user_marshal_POINTER__POINTER_FLOAT_FLOAT_FLOAT_FLOAT, G_TYPE_POINTER, 5, G_TYPE_POINTER, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL); /** * GstQtQuick2VideoSink::update * * This signal is emited when the surface should be repainted. It should * be connected to QQuickItem::update(). */ s_signals[SIGNAL_UPDATE] = g_signal_new("update", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_type_class_add_private (klass, sizeof (GstQtQuick2VideoSinkPrivate)); static GstStaticPadTemplate sink_pad_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (CAPS_FORMATS)) ); gst_element_class_add_pad_template( element_class, gst_static_pad_template_get(&sink_pad_template)); gst_element_class_set_details_simple(element_class, "QtQuick2 video sink", "Sink/Video", "A video sink that can draw on a QQuickItem", "George Kiagiadakis <*****@*****.**>"); }
static void gst_kms_sink_class_init (GstKMSSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class; GstBaseSinkClass *basesink_class; GstVideoSinkClass *videosink_class; GstCaps *caps; gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); basesink_class = GST_BASE_SINK_CLASS (klass); videosink_class = GST_VIDEO_SINK_CLASS (klass); gst_element_class_set_static_metadata (element_class, "KMS video sink", "Sink/Video", GST_PLUGIN_DESC, "Víctor Jáquez <*****@*****.**>"); caps = gst_kms_sink_caps_template_fill (); gst_element_class_add_pad_template (element_class, gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps)); gst_caps_unref (caps); basesink_class->start = GST_DEBUG_FUNCPTR (gst_kms_sink_start); basesink_class->stop = GST_DEBUG_FUNCPTR (gst_kms_sink_stop); basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_kms_sink_set_caps); basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_kms_sink_get_caps); basesink_class->propose_allocation = gst_kms_sink_propose_allocation; basesink_class->get_times = gst_kms_sink_get_times; videosink_class->show_frame = gst_kms_sink_show_frame; gobject_class->finalize = gst_kms_sink_finalize; gobject_class->set_property = gst_kms_sink_set_property; gobject_class->get_property = gst_kms_sink_get_property; /** * kmssink:driver-name: * * If you have a system with multiple GPUs, you can choose which GPU * to use setting the DRM device driver name. Otherwise, the first * one from an internal list is used. */ g_properties[PROP_DRIVER_NAME] = g_param_spec_string ("driver-name", "device name", "DRM device driver name", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); /** * kmssink:connector-id: * * A GPU has several output connectors, for example: LVDS, VGA, * HDMI, etc. By default the first LVDS is tried, then the first * eDP, and at the end, the first connected one. */ g_properties[PROP_CONNECTOR_ID] = g_param_spec_int ("connector-id", "Connector ID", "DRM connector id", -1, G_MAXINT32, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); /** * kmssink:plane-id: * * There could be several planes associated with a CRTC. * By default the first plane that's possible to use with a given * CRTC is tried. */ g_properties[PROP_PLANE_ID] = g_param_spec_int ("plane-id", "Plane ID", "DRM plane id", -1, G_MAXINT32, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); g_object_class_install_properties (gobject_class, PROP_N, g_properties); }