[tracker] tracker-extract: Avoid allocating full image in memory at once



commit d54665c64bfddcb9825721a7254cfcbfec0edcd2
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Feb 28 18:38:04 2017 +0100

    tracker-extract: Avoid allocating full image in memory at once
    
    Just read it line by line reusing the same buffer, it will still
    let us to fetch metadata at the end of the file.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=778090

 src/tracker-extract/tracker-extract-png.c |   20 +++++---------------
 1 files changed, 5 insertions(+), 15 deletions(-)
---
diff --git a/src/tracker-extract/tracker-extract-png.c b/src/tracker-extract/tracker-extract-png.c
index fcfd5f4..0e19765 100644
--- a/src/tracker-extract/tracker-extract-png.c
+++ b/src/tracker-extract/tracker-extract-png.c
@@ -621,7 +621,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
        png_structp png_ptr;
        png_infop info_ptr;
        png_infop end_ptr;
-       png_bytepp row_pointers;
+       png_bytep row_data;
        guint row;
        png_uint_32 width, height;
        gint bit_depth, color_type;
@@ -694,20 +694,10 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
        /* Read the image. FIXME We should be able to skip this step and
         * just get the info from the end. This causes some errors atm.
         */
-       row_pointers = g_new0 (png_bytep, height);
-
-       for (row = 0; row < height; row++) {
-               row_pointers[row] = png_malloc (png_ptr,
-                                               png_get_rowbytes (png_ptr,info_ptr));
-       }
-
-       png_read_image (png_ptr, row_pointers);
-
-       for (row = 0; row < height; row++) {
-               png_free (png_ptr, row_pointers[row]);
-       }
-
-       g_free (row_pointers);
+       row_data = png_malloc (png_ptr, png_get_rowbytes (png_ptr, info_ptr));
+       for (row = 0; row < height; row++)
+               png_read_row (png_ptr, row_data, NULL);
+       png_free (png_ptr, row_data);
 
        png_read_end (png_ptr, end_ptr);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]