From 5db05091967c83ffbc8f269f8074007682c6131c Mon Sep 17 00:00:00 2001 From: Zeeshan Ali Date: Sun, 8 May 2005 12:22:04 +0000 Subject: Ported the libcaca plugin. Original commit message from CVS: Ported the libcaca plugin. --- ext/libcaca/Makefile.am | 8 +-- ext/libcaca/gstcacasink.c | 153 +++++++++++++--------------------------------- ext/libcaca/gstcacasink.h | 7 ++- 3 files changed, 51 insertions(+), 117 deletions(-) (limited to 'ext/libcaca') diff --git a/ext/libcaca/Makefile.am b/ext/libcaca/Makefile.am index f9439667..ce687fc8 100644 --- a/ext/libcaca/Makefile.am +++ b/ext/libcaca/Makefile.am @@ -2,9 +2,9 @@ plugin_LTLIBRARIES = libgstcacasink.la libgstcacasink_la_SOURCES = gstcacasink.c -libgstcacasink_la_CFLAGS = $(GST_CFLAGS) $(LIBCACA_CFLAGS) -libgstcacasink_la_LIBADD = $(LIBCACA_LIBS) \ - $(top_builddir)/gst-libs/gst/libgstinterfaces-$(GST_MAJORMINOR).la -libgstcacasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcacasink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_LIBS_CFLAGS) $(LIBCACA_CFLAGS) +libgstcacasink_la_LIBADD = $(LIBCACA_LIBS) #\ + #$(top_builddir)/gst-libs/gst/libgstinterfaces-$(GST_MAJORMINOR).la +libgstcacasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_LIBS_LIBS) noinst_HEADERS = gstcacasink.h diff --git a/ext/libcaca/gstcacasink.c b/ext/libcaca/gstcacasink.c index a9ac5271..9dece871 100644 --- a/ext/libcaca/gstcacasink.c +++ b/ext/libcaca/gstcacasink.c @@ -23,7 +23,6 @@ #include #include -#include #include "gstcacasink.h" @@ -61,14 +60,12 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", static void gst_cacasink_base_init (gpointer g_class); static void gst_cacasink_class_init (GstCACASinkClass * klass); static void gst_cacasink_init (GstCACASink * cacasink); -static void gst_cacasink_interface_init (GstImplementsInterfaceClass * klass); -static gboolean gst_cacasink_interface_supported (GstImplementsInterface * - iface, GType type); -static void gst_cacasink_navigation_init (GstNavigationInterface * iface); -static void gst_cacasink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure); -static void gst_cacasink_chain (GstPad * pad, GstData * _data); +static gboolean gst_cacasink_setcaps (GstBaseSink * pad, GstCaps * caps); +static void gst_cacasink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end); +static GstFlowReturn gst_cacasink_render (GstBaseSink * basesink, + GstBuffer * buffer); static void gst_cacasink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -97,26 +94,9 @@ gst_cacasink_get_type (void) (GInstanceInitFunc) gst_cacasink_init, }; - static const GInterfaceInfo iface_info = { - (GInterfaceInitFunc) gst_cacasink_interface_init, - NULL, - NULL, - }; - - static const GInterfaceInfo navigation_info = { - (GInterfaceInitFunc) gst_cacasink_navigation_init, - NULL, - NULL, - }; - cacasink_type = - g_type_register_static (GST_TYPE_VIDEOSINK, "GstCACASink", + g_type_register_static (GST_TYPE_BASESINK, "GstCACASink", &cacasink_info, 0); - - g_type_add_interface_static (cacasink_type, GST_TYPE_IMPLEMENTS_INTERFACE, - &iface_info); - g_type_add_interface_static (cacasink_type, GST_TYPE_NAVIGATION, - &navigation_info); } return cacasink_type; } @@ -168,13 +148,17 @@ gst_cacasink_class_init (GstCACASinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - GstVideoSinkClass *gstvs_class; + GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; - gstvs_class = (GstVideoSinkClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_BASESINK); + + gobject_class->set_property = gst_cacasink_set_property; + gobject_class->get_property = gst_cacasink_get_property; + gstelement_class->change_state = gst_cacasink_change_state; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_WIDTH, g_param_spec_int ("screen_width", "screen_width", "screen_width", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_HEIGHT, g_param_spec_int ("screen_height", "screen_height", "screen_height", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ @@ -185,68 +169,37 @@ gst_cacasink_class_init (GstCACASinkClass * klass) g_param_spec_boolean ("anti_aliasing", "Anti-Aliasing", "Enables Anti-Aliasing", TRUE, G_PARAM_READWRITE)); - gobject_class->set_property = gst_cacasink_set_property; - gobject_class->get_property = gst_cacasink_get_property; - - gstelement_class->change_state = gst_cacasink_change_state; + gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_cacasink_setcaps); + gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_cacasink_get_times); + gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_cacasink_render); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_cacasink_render); } static void -gst_cacasink_interface_init (GstImplementsInterfaceClass * klass) +gst_cacasink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end) { - klass->supported = gst_cacasink_interface_supported; + *start = GST_BUFFER_TIMESTAMP (buffer); + *end = *start + GST_BUFFER_DURATION (buffer); } static gboolean -gst_cacasink_interface_supported (GstImplementsInterface * iface, GType type) -{ - g_assert (type == GST_TYPE_NAVIGATION); - - return (GST_STATE (iface) != GST_STATE_NULL); -} - -static void -gst_cacasink_navigation_init (GstNavigationInterface * iface) -{ - iface->send_event = gst_cacasink_navigation_send_event; -} - -static void -gst_cacasink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) -{ - GstCACASink *cacasink = GST_CACASINK (navigation); - GstEvent *event; - - event = gst_event_new (GST_EVENT_NAVIGATION); - /*GST_EVENT_TIMESTAMP (event) = 0; */ - event->event_data.structure.structure = structure; - - /* FIXME - * Obviously, the pointer x,y coordinates need to be adjusted by the - * window size and relation to the bounding window. */ - - gst_pad_send_event (gst_pad_get_peer (GST_VIDEOSINK_PAD (cacasink)), event); -} - -static GstPadLinkReturn -gst_cacasink_sinkconnect (GstPad * pad, const GstCaps * caps) +gst_cacasink_setcaps (GstBaseSink * basesink, GstCaps * caps) { GstCACASink *cacasink; GstStructure *structure; - cacasink = GST_CACASINK (gst_pad_get_parent (pad)); + cacasink = GST_CACASINK (basesink); /* We cannot use library functions if the sink is not open */ if (!GST_FLAG_IS_SET (GST_ELEMENT (cacasink), GST_CACASINK_OPEN)) - return GST_PAD_LINK_DELAYED; + return FALSE; /*if (!GST_CAPS_IS_FIXED (caps)) - return GST_PAD_LINK_DELAYED; */ + return FALSE; */ structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "width", &(GST_VIDEOSINK_WIDTH (cacasink))); - gst_structure_get_int (structure, "height", - &(GST_VIDEOSINK_HEIGHT (cacasink))); + gst_structure_get_int (structure, "width", &(cacasink->width)); + gst_structure_get_int (structure, "height", &(cacasink->height)); gst_structure_get_int (structure, "bpp", &cacasink->bpp); gst_structure_get_int (structure, "red_mask", &cacasink->red_mask); gst_structure_get_int (structure, "green_mask", &cacasink->green_mask); @@ -275,28 +228,25 @@ gst_cacasink_sinkconnect (GstPad * pad, const GstCaps * caps) } cacasink->bitmap = caca_create_bitmap (cacasink->bpp, - GST_VIDEOSINK_WIDTH (cacasink), - GST_VIDEOSINK_HEIGHT (cacasink), - GST_VIDEOSINK_WIDTH (cacasink) * cacasink->bpp / 8, + cacasink->width, + cacasink->height, + cacasink->width * cacasink->bpp / 8, cacasink->red_mask, cacasink->green_mask, cacasink->blue_mask, 0); if (!cacasink->bitmap) { - return GST_PAD_LINK_DELAYED; + return FALSE; } - return GST_PAD_LINK_OK; + return TRUE; } static void gst_cacasink_init (GstCACASink * cacasink) { - GST_VIDEOSINK_PAD (cacasink) = - gst_pad_new_from_template (gst_static_pad_template_get (&sink_template), - "sink"); - gst_element_add_pad (GST_ELEMENT (cacasink), GST_VIDEOSINK_PAD (cacasink)); - gst_pad_set_chain_function (GST_VIDEOSINK_PAD (cacasink), gst_cacasink_chain); - gst_pad_set_link_function (GST_VIDEOSINK_PAD (cacasink), - gst_cacasink_sinkconnect); + GstPad *pad; + + pad = GST_BASESINK_PAD (cacasink); + /* gst_pad_set_fixatecaps_function (pad, gst_cacasink_fixate); */ cacasink->screen_width = GST_CACA_DEFAULT_SCREEN_WIDTH; cacasink->screen_height = GST_CACA_DEFAULT_SCREEN_HEIGHT; @@ -304,38 +254,25 @@ gst_cacasink_init (GstCACASink * cacasink) cacasink->red_mask = GST_CACA_DEFAULT_RED_MASK; cacasink->green_mask = GST_CACA_DEFAULT_GREEN_MASK; cacasink->blue_mask = GST_CACA_DEFAULT_BLUE_MASK; - - GST_FLAG_SET (cacasink, GST_ELEMENT_THREAD_SUGGESTED); } -static void -gst_cacasink_chain (GstPad * pad, GstData * _data) +static GstFlowReturn +gst_cacasink_render (GstBaseSink * basesink, GstBuffer * buffer) { - GstBuffer *buf = GST_BUFFER (_data); - GstCACASink *cacasink; + GstCACASink *cacasink = GST_CACASINK (basesink); - g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD (pad)); - g_return_if_fail (buf != NULL); - - cacasink = GST_CACASINK (gst_pad_get_parent (pad)); /* We cannot use library functions if the sink is not open */ if (!GST_FLAG_IS_SET (GST_ELEMENT (cacasink), GST_CACASINK_OPEN)) - return; - - GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, - GST_BUFFER_TIMESTAMP (buf)); + return GST_FLOW_WRONG_STATE; - if (GST_VIDEOSINK_CLOCK (cacasink) && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { - gst_element_wait (GST_ELEMENT (cacasink), GST_BUFFER_TIMESTAMP (buf)); - } + GST_DEBUG ("render"); caca_clear (); caca_draw_bitmap (0, 0, cacasink->screen_width - 1, - cacasink->screen_height - 1, cacasink->bitmap, GST_BUFFER_DATA (buf)); + cacasink->screen_height - 1, cacasink->bitmap, GST_BUFFER_DATA (buffer)); caca_refresh (); - gst_buffer_unref (buf); + return GST_FLOW_OK; } static void @@ -463,10 +400,6 @@ gst_cacasink_change_state (GstElement * element) static gboolean plugin_init (GstPlugin * plugin) { - /* Loading the library containing GstVideoSink, our parent object */ - if (!gst_library_load ("gstvideo")) - return FALSE; - if (!gst_element_register (plugin, "cacasink", GST_RANK_NONE, GST_TYPE_CACASINK)) return FALSE; diff --git a/ext/libcaca/gstcacasink.h b/ext/libcaca/gstcacasink.h index c253eaca..571e2094 100644 --- a/ext/libcaca/gstcacasink.h +++ b/ext/libcaca/gstcacasink.h @@ -22,7 +22,7 @@ #define __GST_CACASINK_H__ #include -#include +#include #include #include @@ -63,11 +63,12 @@ typedef struct _GstCACASink GstCACASink; typedef struct _GstCACASinkClass GstCACASinkClass; struct _GstCACASink { - GstVideoSink videosink; + GstBaseSink parent; GstPad *sinkpad; gulong format; + gint width, height; gint screen_width, screen_height; guint bpp; guint dither; @@ -78,7 +79,7 @@ struct _GstCACASink { }; struct _GstCACASinkClass { - GstVideoSinkClass parent_class; + GstBaseSinkClass parent_class; /* signals */ }; -- cgit