From 59e7f0597d1cc524174e847de7b91407922304c8 Mon Sep 17 00:00:00 2001 From: Vineeth T M Date: Thu, 13 Nov 2014 15:56:07 +0530 Subject: [PATCH] pngparse: improve parsing of the image Everytime a buffer is being provided from baseparse, we are parsing all the data from the beginning. But since we would have already parsed some of the data in the previous iterations, it doesnt make much sense to keep parsing the same everytime. Hence skipping the data which is already read in previous iterations to improve the parsing performance. https://bugzilla.gnome.org/show_bug.cgi?id=740058 --- gst/videoparsers/gstpngparse.c | 9 ++++++++- gst/videoparsers/gstpngparse.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gst/videoparsers/gstpngparse.c b/gst/videoparsers/gstpngparse.c index c4dbe3cf54..86fd9bcdb9 100644 --- a/gst/videoparsers/gstpngparse.c +++ b/gst/videoparsers/gstpngparse.c @@ -130,7 +130,7 @@ gst_png_parse_handle_frame (GstBaseParse * parse, GstByteReader reader; GstFlowReturn ret = GST_FLOW_OK; guint64 signature; - guint width = 0, height = 0; + static guint width = 0, height = 0; gst_buffer_map (frame->buffer, &map, GST_MAP_READ); gst_byte_reader_init (&reader, map.data, map.size); @@ -165,6 +165,8 @@ gst_png_parse_handle_frame (GstBaseParse * parse, } gst_byte_reader_skip (&reader, 8); + /* Skipping the data read in previous iterations */ + gst_byte_reader_skip (&reader, pngparse->skip_length); for (;;) { guint32 length; @@ -191,6 +193,8 @@ gst_png_parse_handle_frame (GstBaseParse * parse, if (!gst_byte_reader_skip (&reader, length + 4)) goto beach; + /* We have already read the data till now. Hence skip the read data next time we enter handle_frame() */ + pngparse->skip_length = gst_byte_reader_get_pos (&reader) + length + 4; if (code == GST_MAKE_FOURCC ('I', 'E', 'N', 'D')) { /* the start code and at least 2 empty frames (IHDR and IEND) */ @@ -234,6 +238,9 @@ gst_png_parse_handle_frame (GstBaseParse * parse, gst_buffer_unmap (frame->buffer, &map); + pngparse->skip_length = 0; + width = 0; + height = 0; return gst_base_parse_finish_frame (parse, frame, gst_byte_reader_get_pos (&reader)); } diff --git a/gst/videoparsers/gstpngparse.h b/gst/videoparsers/gstpngparse.h index 35744813c0..2142358b43 100644 --- a/gst/videoparsers/gstpngparse.h +++ b/gst/videoparsers/gstpngparse.h @@ -49,6 +49,7 @@ struct _GstPngParse guint width; guint height; + guint32 skip_length; gboolean sent_codec_tag; };