summaryrefslogtreecommitdiffstats
path: root/ext/libcaca
diff options
context:
space:
mode:
authorZeeshan Ali <zeenix@gmail.com>2004-01-12 23:26:27 +0000
committerZeeshan Ali <zeenix@gmail.com>2004-01-12 23:26:27 +0000
commit6777b924620a045b2e6d29026f4f87111903fdf4 (patch)
treea0b046b009661903ee9b93578a286356270ef3ad /ext/libcaca
parent21522cfe7d41516b8ad6d4e83d184b0d6dd9db97 (diff)
Congratulations, The first working version of cacasink. There is still one issue unresolved: libcaca accepts the colo...
Original commit message from CVS: Congratulations, The first working version of cacasink. There is still one issue unresolved: libcaca accepts the color masks reversed.
Diffstat (limited to 'ext/libcaca')
-rw-r--r--ext/libcaca/Makefile.am5
-rw-r--r--ext/libcaca/gstcacasink.c100
2 files changed, 65 insertions, 40 deletions
diff --git a/ext/libcaca/Makefile.am b/ext/libcaca/Makefile.am
index 2c822bd9..f9439667 100644
--- a/ext/libcaca/Makefile.am
+++ b/ext/libcaca/Makefile.am
@@ -2,8 +2,9 @@
plugin_LTLIBRARIES = libgstcacasink.la
libgstcacasink_la_SOURCES = gstcacasink.c
-libgstcacasink_la_CFLAGS = $(GST_CFLAGS) $(CACALIB_CFLAGS)
-libgstcacasink_la_LIBADD = $(CACALIB_LIBS)
+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)
noinst_HEADERS = gstcacasink.h
diff --git a/ext/libcaca/gstcacasink.c b/ext/libcaca/gstcacasink.c
index 805e4c2e..a48cba60 100644
--- a/ext/libcaca/gstcacasink.c
+++ b/ext/libcaca/gstcacasink.c
@@ -53,22 +53,26 @@ GST_STATIC_PAD_TEMPLATE (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
+ //GST_STATIC_CAPS (GST_VIDEO_RGB_PAD_TEMPLATE_CAPS_24));
GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB));
-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_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 void gst_cacasink_chain (GstPad *pad, GstData *_data);
-static void gst_cacasink_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec);
-static void gst_cacasink_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec);
+static void gst_cacasink_set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec);
+static void gst_cacasink_get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec);
+static void gst_cacasink_dispose (GObject *object);
static GstElementStateReturn gst_cacasink_change_state (GstElement *element);
@@ -179,6 +183,7 @@ gst_cacasink_class_init (GstCACASinkClass *klass)
gobject_class->set_property = gst_cacasink_set_property;
gobject_class->get_property = gst_cacasink_get_property;
+ gobject_class->dispose = gst_cacasink_dispose;
gstelement_class->change_state = gst_cacasink_change_state;
}
@@ -242,13 +247,34 @@ gst_cacasink_sinkconnect (GstPad *pad, const GstCaps *caps)
gst_structure_get_int (structure, "green_mask", &cacasink->green_mask);
gst_structure_get_int (structure, "blue_mask", &cacasink->blue_mask);
- gst_video_sink_got_video_size (GST_VIDEOSINK (cacasink), GST_VIDEOSINK_WIDTH (cacasink), GST_VIDEOSINK_HEIGHT (cacasink));
-
- /*if (cacasink->bitmap != NULL) {
+ if (cacasink->bitmap) {
caca_free_bitmap (cacasink->bitmap);
}
- caca->bitmap = caca_create_bitmap (cacasink->bpp, cacasink->image_width, cacasink->image_height, cacasink->image_width * cacasink->bpp/8, cacasink->red_mask, cacasink->green_mask, cacasink->blue_mask);*/
+ cacasink->bitmap = caca_create_bitmap (
+ cacasink->bpp,
+ //32,
+ GST_VIDEOSINK_WIDTH (cacasink),
+ GST_VIDEOSINK_HEIGHT (cacasink),
+ //GST_VIDEOSINK_WIDTH (cacasink) * cacasink->bpp/8,
+ ((GST_VIDEOSINK_WIDTH (cacasink) + 15) & ~15)
+ * cacasink->bpp/8,
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ //cacasink->red_mask,
+ //cacasink->green_mask,
+ //cacasink->blue_mask,
+ 0);
+
+ //g_print ("Bpp: %u, width: %u, height: %u\n", cacasink->bpp, GST_VIDEOSINK_WIDTH (cacasink), GST_VIDEOSINK_HEIGHT (cacasink));
+ g_print ("red: %x, green: %x, blue: %x\n", cacasink->red_mask, cacasink->green_mask, cacasink->blue_mask);
+
+ if (!cacasink->bitmap) {
+ return GST_PAD_LINK_DELAYED;
+ }
+
+ //gst_video_sink_got_video_size (GST_VIDEOSINK (cacasink), GST_VIDEOSINK_WIDTH (cacasink), GST_VIDEOSINK_HEIGHT (cacasink));
return GST_PAD_LINK_OK;
}
@@ -272,7 +298,11 @@ gst_cacasink_init (GstCACASink *cacasink)
cacasink->blue_mask = GST_CACA_DEFAULT_BLUE_MASK;
cacasink->bitmap = NULL;
+ caca_init ();
+ cacasink->screen_width = caca_get_width ();
+ cacasink->screen_height = caca_get_height ();
+
GST_FLAG_SET(cacasink, GST_ELEMENT_THREAD_SUGGESTED);
}
@@ -305,7 +335,7 @@ gst_cacasink_chain (GstPad *pad, GstData *_data)
cacasink->id = NULL;
}
- //caca_clear ();
+ caca_clear ();
caca_draw_bitmap (0, 0, cacasink->screen_width-1, cacasink->screen_height-1, cacasink->bitmap, GST_BUFFER_DATA (buf));
caca_refresh ();
@@ -316,12 +346,25 @@ gst_cacasink_chain (GstPad *pad, GstData *_data)
cacasink->correction = 0;
}
-
gst_buffer_unref(buf);
}
static void
+gst_cacasink_dispose (GObject *object)
+{
+ GstCACASink *cacasink = GST_CACASINK (object);
+
+ if (cacasink->bitmap) {
+ caca_free_bitmap (cacasink->bitmap);
+ }
+
+ caca_end ();
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
gst_cacasink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
GstCACASink *cacasink;
@@ -334,6 +377,7 @@ gst_cacasink_set_property (GObject *object, guint prop_id, const GValue *value,
switch (prop_id) {
case ARG_DITHER: {
cacasink->dither = g_value_get_enum (value);
+ caca_set_dithering (cacasink->dither + CACA_DITHERING_NONE);
break;
}
default:
@@ -374,22 +418,6 @@ gst_cacasink_open (GstCACASink *cacasink)
{
g_return_val_if_fail (!GST_FLAG_IS_SET (cacasink ,GST_CACASINK_OPEN), FALSE);
- caca_init ();
-
- cacasink->screen_width = caca_get_width ();
- cacasink->screen_height = caca_get_height ();
- caca_set_dithering (cacasink->dither + CACA_DITHERING_NONE);
-
- cacasink->bitmap = caca_create_bitmap (
- cacasink->bpp,
- GST_VIDEOSINK_WIDTH (cacasink),
- GST_VIDEOSINK_HEIGHT (cacasink),
- GST_VIDEOSINK_WIDTH (cacasink) * cacasink->bpp/8,
- cacasink->red_mask,
- cacasink->green_mask,
- cacasink->blue_mask,
- 0);
-
GST_FLAG_SET (cacasink, GST_CACASINK_OPEN);
return TRUE;
@@ -400,10 +428,6 @@ gst_cacasink_close (GstCACASink *cacasink)
{
g_return_if_fail (GST_FLAG_IS_SET (cacasink ,GST_CACASINK_OPEN));
- caca_free_bitmap (cacasink->bitmap);
- cacasink->bitmap = NULL;
- caca_end ();
-
GST_FLAG_UNSET (cacasink, GST_CACASINK_OPEN);
}