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
This commit is contained in:
Vineeth T M 2014-11-13 15:56:07 +05:30 committed by Luis de Bethencourt
parent e7c6eb6326
commit 59e7f0597d
2 changed files with 9 additions and 1 deletions

View file

@ -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));
}

View file

@ -49,6 +49,7 @@ struct _GstPngParse
guint width;
guint height;
guint32 skip_length;
gboolean sent_codec_tag;
};