clean up
authorThomas Vander Stichele <thomas@apestaart.org>
Mon, 20 Jan 2003 23:32:39 +0000 (23:32 +0000)
committerThomas Vander Stichele <thomas@apestaart.org>
Mon, 20 Jan 2003 23:32:39 +0000 (23:32 +0000)
Original commit message from CVS:
clean up

ext/libpng/gstpngenc.c

index 32b4bb8..f798d53 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
  *
  * Filter:
- * Copyright (C) 2000 Donald A. Graft  
+ * Copyright (C) 2000 Donald A. Graft
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include <gst/gst.h>
 #include "gstpngenc.h"
 
-#define MAX_HEIGHT                     4096 
+#define MAX_HEIGHT             4096
 
-gint frame=0;
 
 GstElementDetails gst_pngenc_details = {
   "",
   "Filter/Video/Effect",
   "LGPL",
-  "Apply a pngenc effect on video"
+  "Encode a video frame to a .png image"
   VERSION,
   "Jeremy SIMON <jsimon13@yahoo.fr>",
   "(C) 2000 Donald Graft",
@@ -47,25 +46,20 @@ enum
   ARG_0
 };
 
-static void    gst_pngenc_class_init           (GstPngEncClass * klass);
-static void    gst_pngenc_init                 (GstPngEnc * pngenc);
+static void    gst_pngenc_class_init   (GstPngEncClass *klass);
+static void    gst_pngenc_init         (GstPngEnc *pngenc);
 
-static void    gst_pngenc_set_property         (GObject * object, guint prop_id,
-                                                const GValue * value, GParamSpec * pspec);
-static void    gst_pngenc_get_property         (GObject * object, guint prop_id,
-                                                GValue * value, GParamSpec * pspec);
-
-static void    gst_pngenc_chain                (GstPad * pad, GstBuffer * buf);
+static void    gst_pngenc_chain        (GstPad *pad, GstBuffer *buf);
 
 static GstElementClass *parent_class = NULL;
 
 
-static void user_error_fn(png_structp png_ptr, png_const_charp error_msg)
+static void user_error_fn (png_structp png_ptr, png_const_charp error_msg)
 {
   g_warning("%s", error_msg);
 }
 
-static void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg)
+static void user_warning_fn (png_structp png_ptr, png_const_charp warning_msg)
 {
   g_warning("%s", warning_msg);
 }
@@ -87,13 +81,14 @@ GType gst_pngenc_get_type (void)
       (GInstanceInitFunc) gst_pngenc_init,
     };
 
-    pngenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPngEnc", &pngenc_info, 0);
+    pngenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPngEnc",
+                                         &pngenc_info, 0);
   }
   return pngenc_type;
 }
 
 static void
-gst_pngenc_class_init (GstPngEncClass * klass)
+gst_pngenc_class_init (GstPngEncClass *klass)
 {
   GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
@@ -102,14 +97,11 @@ gst_pngenc_class_init (GstPngEncClass * klass)
   gstelement_class = (GstElementClass *) klass;
 
   parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
-
-  gobject_class->set_property = gst_pngenc_set_property;
-  gobject_class->get_property = gst_pngenc_get_property;
 }
 
 
 static GstPadLinkReturn
-gst_pngenc_sinkconnect (GstPad * pad, GstCaps * caps)
+gst_pngenc_sinklink (GstPad *pad, GstCaps *caps)
 {
   GstPngEnc *pngenc;
 
@@ -130,39 +122,32 @@ gst_pngenc_init (GstPngEnc * pngenc)
 {
   pngenc->sinkpad = gst_pad_new_from_template (pngenc_sink_template, "sink");
   gst_element_add_pad (GST_ELEMENT (pngenc), pngenc->sinkpad);
-  
-  pngenc->srcpad = gst_pad_new("src",GST_PAD_SRC);
+
+  pngenc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
   gst_element_add_pad (GST_ELEMENT (pngenc), pngenc->srcpad);
 
   gst_pad_set_chain_function (pngenc->sinkpad, gst_pngenc_chain);
-  gst_pad_set_link_function (pngenc->sinkpad, gst_pngenc_sinkconnect);
+  gst_pad_set_link_function (pngenc->sinkpad, gst_pngenc_sinklink);
 
-  pngenc->png_struct_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, (png_voidp)NULL, user_error_fn, user_warning_fn);
-  if ( pngenc->png_struct_ptr == NULL )
-     g_warning ("Failed to initialize png structure");
-
-  pngenc->png_info_ptr = png_create_info_struct (pngenc->png_struct_ptr);
-
-  if (setjmp(pngenc->png_struct_ptr->jmpbuf))
-      png_destroy_write_struct (&pngenc->png_struct_ptr, &pngenc->png_info_ptr);
+  pngenc->png_struct_ptr = NULL;
+  pngenc->png_info_ptr = NULL;
 
 }
 
-
 void user_flush_data (png_structp png_ptr)
 {
 GstPngEnc *pngenc;
 
   pngenc = (GstPngEnc *) png_get_io_ptr (png_ptr);
-  
+
   gst_pad_push (pngenc->srcpad, GST_BUFFER (gst_event_new (GST_EVENT_FLUSH)));
 }
 
 
 void user_write_data (png_structp png_ptr, png_bytep data, png_uint_32 length)
 {
-GstBuffer *buffer;
-GstPngEnc *pngenc;
+  GstBuffer *buffer;
+  GstPngEnc *pngenc;
 
   pngenc = (GstPngEnc *) png_get_io_ptr (png_ptr);
 
@@ -170,34 +155,56 @@ GstPngEnc *pngenc;
   GST_BUFFER_DATA (buffer) = g_memdup (data, length);
   GST_BUFFER_SIZE (buffer) = length;
 
-  if (pngenc->buffer_out) 
-  {    
+  if (pngenc->buffer_out)
+  {
     pngenc->buffer_out = gst_buffer_merge (pngenc->buffer_out, buffer);
-    gst_buffer_unref( buffer );
+    gst_buffer_unref (buffer);
   }
   else
     pngenc->buffer_out = buffer;
 }
 
 static void
-gst_pngenc_chain (GstPad * pad, GstBuffer * buf)
+gst_pngenc_chain (GstPad *pad, GstBuffer *buf)
 {
   GstPngEnc *pngenc;
-  gint row_indice;
-  png_byte *row_pointers[ MAX_HEIGHT ];
+  gint row_index;
+  png_byte *row_pointers[MAX_HEIGHT];
+  GstEvent *event;
+
+  pngenc = GST_PNGENC (gst_pad_get_parent (pad));
 
-  if (frame != 30)
+  pngenc->buffer_out = NULL;
+  if (!GST_PAD_IS_USABLE (pngenc->srcpad))
   {
-    frame++;
     gst_buffer_unref (buf);
-    return ;
+    return;
   }
 
-  pngenc = GST_PNGENC (gst_pad_get_parent (pad));
+  /* initialize png struct stuff */
+  pngenc->png_struct_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING,
+                          (png_voidp) NULL, user_error_fn, user_warning_fn);
+  /* FIXME: better error handling */
+  if (pngenc->png_struct_ptr == NULL)
+     g_warning ("Failed to initialize png structure");
 
-  pngenc->buffer_out = NULL;
+  pngenc->png_info_ptr = png_create_info_struct (pngenc->png_struct_ptr);
+  if (!pngenc->png_info_ptr)
+  {
+    png_destroy_read_struct (&(pngenc->png_struct_ptr), (png_infopp) NULL,
+                            (png_infopp) NULL);
+  }
+
+  /* non-0 return is from a longjmp inside of libpng */
+  if (setjmp (pngenc->png_struct_ptr->jmpbuf) != 0)
+  {
+    GST_DEBUG (GST_CAT_PLUGIN_INFO, "returning from longjmp");
+    png_destroy_write_struct (&pngenc->png_struct_ptr, &pngenc->png_info_ptr);
+    return;
+  }
 
-  png_set_filter (pngenc->png_struct_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE);
+  png_set_filter (pngenc->png_struct_ptr, 0,
+                 PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE);
   png_set_compression_level (pngenc->png_struct_ptr, 9);
 
   png_set_IHDR(
@@ -205,63 +212,33 @@ gst_pngenc_chain (GstPad * pad, GstBuffer * buf)
     pngenc->png_info_ptr,
     pngenc->width,
     pngenc->height,
-    pngenc->bpp/3,
+    pngenc->bpp / 3,
     PNG_COLOR_TYPE_RGB,
     PNG_INTERLACE_NONE,
     PNG_COMPRESSION_TYPE_DEFAULT,
     PNG_FILTER_TYPE_DEFAULT
   );
 
-  png_set_write_fn (pngenc->png_struct_ptr, pngenc, (png_rw_ptr)user_write_data, user_flush_data);
+  png_set_write_fn (pngenc->png_struct_ptr, pngenc,
+                   (png_rw_ptr) user_write_data, user_flush_data);
+
+  for (row_index = 0; row_index < pngenc->height; row_index++)
+    row_pointers[row_index] = GST_BUFFER_DATA (buf) +
+                             (pngenc->width * row_index * pngenc->bpp / 8);
 
-  for (row_indice = 0; row_indice < pngenc->height; row_indice++)
-    row_pointers[row_indice] = GST_BUFFER_DATA (buf) + (pngenc->width * row_indice * pngenc->bpp/8);
-  
   png_write_info (pngenc->png_struct_ptr, pngenc->png_info_ptr);
   png_write_image (pngenc->png_struct_ptr, row_pointers);
   png_write_end (pngenc->png_struct_ptr, NULL);
 
-  gst_pad_push (pngenc->srcpad, pngenc->buffer_out );
   user_flush_data (pngenc->png_struct_ptr);
-  
+
   png_destroy_info_struct (pngenc->png_struct_ptr, &pngenc->png_info_ptr);
-  png_destroy_write_struct (&pngenc->png_struct_ptr, (png_infopp)NULL);
+  png_destroy_write_struct (&pngenc->png_struct_ptr, (png_infopp) NULL);
 
-  g_print ("Frame %d dumped\n", frame);
-  frame++;
+  gst_pad_push (pngenc->srcpad, pngenc->buffer_out);
+  /* send NEW MEDIA event, since a frame has been pushed out */
+  event = gst_event_new (GST_EVENT_NEW_MEDIA);
+  gst_pad_send_event (pngenc->srcpad, event);
 
   gst_buffer_unref (buf);
 }
-
-static void
-gst_pngenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)
-{
-  GstPngEnc *pngenc;
-
-  /* it's not null if we got it, but it might not be ours */
-  g_return_if_fail (GST_IS_PNGENC (object));
-
-  pngenc = GST_PNGENC (object);
-
-  switch (prop_id) {
-    default:
-      break;
-  }
-}
-
-static void
-gst_pngenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec)
-{
-  GstPngEnc *pngenc;
-
-  /* it's not null if we got it, but it might not be ours */
-  g_return_if_fail (GST_IS_PNGENC (object));
-
-  pngenc = GST_PNGENC (object);
-
-  switch (prop_id) {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}