From 2b5cfd86cf330203c3c6840260f7a75507408aa2 Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Tue, 25 Oct 2005 10:47:09 +0000 Subject: ext/libpng/gstpngdec.c: Push a newsegment event, move some redundant code in a single place. Original commit message from CVS: 2005-10-25 Julien MOUTTE * ext/libpng/gstpngdec.c: (user_info_callback), (gst_pngdec_caps_create_and_set), (gst_pngdec_task): Push a newsegment event, move some redundant code in a single place. --- ext/libpng/gstpngdec.c | 100 ++++++++++++++++++++----------------------------- 1 file changed, 40 insertions(+), 60 deletions(-) (limited to 'ext/libpng') diff --git a/ext/libpng/gstpngdec.c b/ext/libpng/gstpngdec.c index 35515723..d98a2265 100644 --- a/ext/libpng/gstpngdec.c +++ b/ext/libpng/gstpngdec.c @@ -175,8 +175,6 @@ user_info_callback (png_structp png_ptr, png_infop info) { GstPngDec *pngdec = NULL; GstFlowReturn ret = GST_FLOW_OK; - gint bpc = 0, color_type; - png_uint_32 width, height; size_t buffer_size; GstBuffer *buffer = NULL; @@ -184,33 +182,6 @@ user_info_callback (png_structp png_ptr, png_infop info) GST_LOG ("info ready"); - /* Get bits per channel */ - bpc = png_get_bit_depth (pngdec->png, pngdec->info); - - /* We don't handle 16 bits per color, strip down to 8 */ - if (bpc == 16) { - GST_LOG ("this is a 16 bits per channel PNG image, strip down to 8 bits"); - png_set_strip_16 (pngdec->png); - } - - /* Get Color type */ - color_type = png_get_color_type (pngdec->png, pngdec->info); - - /* HACK: The doc states that it's RGBA but apparently it's not... */ - if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) - png_set_bgr (pngdec->png); - - /* Update the info structure */ - png_read_update_info (pngdec->png, pngdec->info); - - /* Get IHDR header again after transformation settings */ - - png_get_IHDR (pngdec->png, pngdec->info, &width, &height, - &bpc, &pngdec->color_type, NULL, NULL, NULL); - - pngdec->width = width; - pngdec->height = height; - /* Generate the caps and configure */ ret = gst_pngdec_caps_create_and_set (pngdec); if (ret != GST_FLOW_OK) { @@ -310,9 +281,39 @@ gst_pngdec_caps_create_and_set (GstPngDec * pngdec) GstFlowReturn ret = GST_FLOW_OK; GstCaps *caps = NULL, *res = NULL; GstPadTemplate *templ = NULL; + GstEvent *new_seg = NULL; + gint bpc = 0, color_type; + png_uint_32 width, height; g_return_val_if_fail (GST_IS_PNGDEC (pngdec), GST_FLOW_ERROR); + /* Get bits per channel */ + bpc = png_get_bit_depth (pngdec->png, pngdec->info); + + /* We don't handle 16 bits per color, strip down to 8 */ + if (bpc == 16) { + GST_LOG ("this is a 16 bits per channel PNG image, strip down to 8 bits"); + png_set_strip_16 (pngdec->png); + } + + /* Get Color type */ + color_type = png_get_color_type (pngdec->png, pngdec->info); + + /* HACK: The doc states that it's RGBA but apparently it's not... */ + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr (pngdec->png); + + /* Update the info structure */ + png_read_update_info (pngdec->png, pngdec->info); + + /* Get IHDR header again after transformation settings */ + + png_get_IHDR (pngdec->png, pngdec->info, &width, &height, + &bpc, &pngdec->color_type, NULL, NULL, NULL); + + pngdec->width = width; + pngdec->height = height; + GST_LOG ("this is a %dx%d PNG image", pngdec->width, pngdec->height); switch (pngdec->color_type) { @@ -351,6 +352,12 @@ gst_pngdec_caps_create_and_set (GstPngDec * pngdec) gst_caps_unref (res); + /* Push a newsegment event */ + new_seg = gst_event_new_newsegment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0); + if (GST_IS_EVENT (new_seg)) { + gst_pad_push_event (pngdec->srcpad, new_seg); + } + beach: return ret; } @@ -361,9 +368,9 @@ gst_pngdec_task (GstPad * pad) GstPngDec *pngdec; GstBuffer *buffer = NULL; size_t buffer_size = 0; - gint i = 0, bpc = 0, color_type; + gint i = 0; png_bytep *rows, inp; - png_uint_32 width, height, rowbytes; + png_uint_32 rowbytes; GstFlowReturn ret = GST_FLOW_OK; pngdec = GST_PNGDEC (GST_OBJECT_PARENT (pad)); @@ -380,33 +387,6 @@ gst_pngdec_task (GstPad * pad) /* Read info */ png_read_info (pngdec->png, pngdec->info); - /* Get bits per channel */ - bpc = png_get_bit_depth (pngdec->png, pngdec->info); - - /* We don't handle 16 bits per color, strip down to 8 */ - if (bpc == 16) { - GST_LOG ("this is a 16 bits per channel PNG image, strip down to 8 bits"); - png_set_strip_16 (pngdec->png); - } - - /* Get Color type */ - color_type = png_get_color_type (pngdec->png, pngdec->info); - - /* HACK: The doc states that it's RGBA but apparently it's not... */ - if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) - png_set_bgr (pngdec->png); - - /* Update the info structure */ - png_read_update_info (pngdec->png, pngdec->info); - - /* Get IHDR header again after transformation settings */ - - png_get_IHDR (pngdec->png, pngdec->info, &width, &height, - &bpc, &pngdec->color_type, NULL, NULL, NULL); - - pngdec->width = width; - pngdec->height = height; - /* Generate the caps and configure */ ret = gst_pngdec_caps_create_and_set (pngdec); if (ret != GST_FLOW_OK) { @@ -422,11 +402,11 @@ gst_pngdec_task (GstPad * pad) goto pause; } - rows = (png_bytep *) g_malloc (sizeof (png_bytep) * height); + rows = (png_bytep *) g_malloc (sizeof (png_bytep) * pngdec->height); inp = GST_BUFFER_DATA (buffer); - for (i = 0; i < height; i++) { + for (i = 0; i < pngdec->height; i++) { rows[i] = inp; inp += GST_ROUND_UP_4 (rowbytes); } -- cgit