From 46814db7532c879401826bd364c40103938aa620 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Mon, 20 Jan 2003 23:32:39 +0000 Subject: [PATCH] clean up Original commit message from CVS: clean up --- ext/libpng/gstpngenc.c | 163 ++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 93 deletions(-) diff --git a/ext/libpng/gstpngenc.c b/ext/libpng/gstpngenc.c index 32b4bb87f2..f798d53406 100644 --- a/ext/libpng/gstpngenc.c +++ b/ext/libpng/gstpngenc.c @@ -2,7 +2,7 @@ * Copyright (C) <1999> Erik Walthinsen * * 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 @@ -20,15 +20,14 @@ #include #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 ", "(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 ]; - - if (frame != 30) - { - frame++; - gst_buffer_unref (buf); - return ; - } + gint row_index; + png_byte *row_pointers[MAX_HEIGHT]; + GstEvent *event; pngenc = GST_PNGENC (gst_pad_get_parent (pad)); pngenc->buffer_out = NULL; + if (!GST_PAD_IS_USABLE (pngenc->srcpad)) + { + gst_buffer_unref (buf); + return; + } - png_set_filter (pngenc->png_struct_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE); + /* 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->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_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); - g_print ("Frame %d dumped\n", frame); - frame++; + png_destroy_info_struct (pngenc->png_struct_ptr, &pngenc->png_info_ptr); + png_destroy_write_struct (&pngenc->png_struct_ptr, (png_infopp) NULL); + + 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; - } -}