From 5db05091967c83ffbc8f269f8074007682c6131c Mon Sep 17 00:00:00 2001 From: Zeeshan Ali Date: Sun, 8 May 2005 12:22:04 +0000 Subject: [PATCH] Ported the libcaca plugin. Original commit message from CVS: Ported the libcaca plugin. --- ChangeLog | 12 +++ configure.ac | 9 +++ ext/Makefile.am | 10 +-- ext/libcaca/Makefile.am | 8 +- ext/libcaca/gstcacasink.c | 153 +++++++++++--------------------------- ext/libcaca/gstcacasink.h | 7 +- 6 files changed, 77 insertions(+), 122 deletions(-) diff --git a/ChangeLog b/ChangeLog index c6c17f686b..3de6a6feea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-05-08 Zeeshan Ali + + * configure.ac: + * ext/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), + (gst_cacasink_class_init), (gst_cacasink_get_times), + (gst_cacasink_setcaps), (gst_cacasink_init), (gst_cacasink_render), + (plugin_init): + * ext/libcaca/gstcacasink.h: + Ported the libcaca plugin. + 2005-05-08 Zeeshan Ali * configure.ac: diff --git a/configure.ac b/configure.ac index 1939c4c58a..0616b1b05c 100644 --- a/configure.ac +++ b/configure.ac @@ -372,6 +372,14 @@ GST_CHECK_FEATURE(AALIB, [aasink plug-in], aasink, [ AS_SCRUB_INCLUDE(AALIB_CFLAGS) ]) +dnl *** libcaca *** +translit(dnm, m, l) AM_CONDITIONAL(USE_LIBCACA, true) +GST_CHECK_FEATURE(LIBCACA, [libcaca], libcaca, [ + GST_CHECK_CONFIGPROG(LIBCACA, caca-config) + AC_SUBST(LIBCACA_CFLAGS) + AC_SUBST(LIBCACA_LIBS) +]) + dnl *** sidplay : works with libsidplay 1.36.x (not 2.x.x) *** translit(dnm, m, l) AM_CONDITIONAL(USE_SIDPLAY, true) GST_CHECK_FEATURE(SIDPLAY, [sidplay plug-in], sidplay, [ @@ -458,6 +466,7 @@ gst/videofilter/Makefile sys/Makefile ext/Makefile ext/aalib/Makefile +ext/libcaca/Makefile ext/mad/Makefile ext/sidplay/Makefile common/Makefile diff --git a/ext/Makefile.am b/ext/Makefile.am index 8225604c02..1e0a249a67 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -178,11 +178,11 @@ endif # LCS_DIR= # endif -# if USE_LIBCACA -# LIBCACA_DIR=libcaca -# else -# LIBCACA_DIR= -# endif +if USE_LIBCACA +LIBCACA_DIR=libcaca +else +LIBCACA_DIR= +endif # if USE_LIBDV # LIBDV_DIR=dv diff --git a/ext/libcaca/Makefile.am b/ext/libcaca/Makefile.am index f94396676a..ce687fc8f0 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 a9ac5271e7..9dece87183 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; + return GST_FLOW_WRONG_STATE; - GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, - GST_BUFFER_TIMESTAMP (buf)); - - 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 c253eacaec..571e2094e9 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 */ };