split jpeg parser functions to separate file
authorVladimir Nadvornik <nadvornik@suse.cz>
Sat, 26 Mar 2011 21:13:39 +0000 (22:13 +0100)
committerVladimir Nadvornik <nadvornik@suse.cz>
Tue, 27 Sep 2011 12:30:08 +0000 (14:30 +0200)
src/Makefile.am
src/exif-common.c
src/jpeg_parser.c [new file with mode: 0644]
src/jpeg_parser.h [new file with mode: 0644]

index 05c55cf..237e6f2 100644 (file)
@@ -168,6 +168,8 @@ geeqie_SOURCES = \
        image-overlay.h \
        img-view.c      \
        img-view.h      \
+       jpeg_parser.c   \
+       jpeg_parser.h   \
        layout.c        \
        layout.h        \
        layout_config.c \
index f87d141..fbc4199 100644 (file)
@@ -43,6 +43,7 @@
 #include "format_raw.h"
 #include "ui_fileops.h"
 #include "cache.h"
+#include "jpeg_parser.h"
 
 
 static gdouble exif_rational_to_double(ExifRational *r, gint sign)
@@ -680,64 +681,6 @@ void exif_free_fd(FileData *fd, ExifData *exif)
 
 /* embedded icc in jpeg */
 
-
-#define JPEG_MARKER            0xFF
-#define JPEG_MARKER_SOI                0xD8
-#define JPEG_MARKER_EOI                0xD9
-#define JPEG_MARKER_APP1       0xE1
-#define JPEG_MARKER_APP2       0xE2
-
-/* jpeg container format:
-     all data markers start with 0XFF
-     2 byte long file start and end markers: 0xFFD8(SOI) and 0XFFD9(EOI)
-     4 byte long data segment markers in format: 0xFFTTSSSSNNN...
-       FF:   1 byte standard marker identifier
-       TT:   1 byte data type
-       SSSS: 2 bytes in Motorola byte alignment for length of the data.
-            This value includes these 2 bytes in the count, making actual
-            length of NN... == SSSS - 2.
-       NNN.: the data in this segment
- */
-
-gboolean exif_jpeg_segment_find(guchar *data, guint size,
-                           guchar app_marker, const gchar *magic, guint magic_len,
-                           guint *seg_offset, guint *seg_length)
-{
-       guchar marker = 0;
-       guint offset = 0;
-       guint length = 0;
-
-       while (marker != app_marker &&
-              marker != JPEG_MARKER_EOI)
-               {
-               offset += length;
-               length = 2;
-
-               if (offset + 2 >= size ||
-                   data[offset] != JPEG_MARKER) return FALSE;
-
-               marker = data[offset + 1];
-               if (marker != JPEG_MARKER_SOI &&
-                   marker != JPEG_MARKER_EOI)
-                       {
-                       if (offset + 4 >= size) return FALSE;
-                       length += ((guint)data[offset + 2] << 8) + data[offset + 3];
-                       }
-               }
-
-       if (marker == app_marker &&
-           offset + length < size &&
-           length >= 4 + magic_len &&
-           memcmp(data + offset + 4, magic, magic_len) == 0)
-               {
-               *seg_offset = offset + 4;
-               *seg_length = length - 4;
-               return TRUE;
-               }
-
-       return FALSE;
-}
-
 gboolean exif_jpeg_parse_color(ExifData *exif, guchar *data, guint size)
 {
        guint seg_offset = 0;
@@ -752,7 +695,7 @@ gboolean exif_jpeg_parse_color(ExifData *exif, guchar *data, guint size)
           TT = total number of ICC segments (TT in each ICC segment should match)
         */
 
-       while (exif_jpeg_segment_find(data + seg_offset + seg_length,
+       while (jpeg_segment_find(data + seg_offset + seg_length,
                                      size - seg_offset - seg_length,
                                      JPEG_MARKER_APP2,
                                      "ICC_PROFILE\x00", 12,
diff --git a/src/jpeg_parser.c b/src/jpeg_parser.c
new file mode 100644 (file)
index 0000000..bedf00a
--- /dev/null
@@ -0,0 +1,42 @@
+
+#include "main.h" 
+#include "jpeg_parser.h"
+
+gboolean jpeg_segment_find(guchar *data, guint size,
+                           guchar app_marker, const gchar *magic, guint magic_len,
+                           guint *seg_offset, guint *seg_length)
+{
+       guchar marker = 0;
+       guint offset = 0;
+       guint length = 0;
+
+       while (marker != app_marker &&
+              marker != JPEG_MARKER_EOI)
+               {
+               offset += length;
+               length = 2;
+
+               if (offset + 2 >= size ||
+                   data[offset] != JPEG_MARKER) return FALSE;
+
+               marker = data[offset + 1];
+               if (marker != JPEG_MARKER_SOI &&
+                   marker != JPEG_MARKER_EOI)
+                       {
+                       if (offset + 4 >= size) return FALSE;
+                       length += ((guint)data[offset + 2] << 8) + data[offset + 3];
+                       }
+               }
+
+       if (marker == app_marker &&
+           offset + length < size &&
+           length >= 4 + magic_len &&
+           memcmp(data + offset + 4, magic, magic_len) == 0)
+               {
+               *seg_offset = offset + 4;
+               *seg_length = length - 4;
+               return TRUE;
+               }
+
+       return FALSE;
+}
diff --git a/src/jpeg_parser.h b/src/jpeg_parser.h
new file mode 100644 (file)
index 0000000..767b3e9
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef JPEG_PARSER_H
+#define JPEG_PARSER_H
+
+#define JPEG_MARKER            0xFF
+#define JPEG_MARKER_SOI                0xD8
+#define JPEG_MARKER_EOI                0xD9
+#define JPEG_MARKER_APP1       0xE1
+#define JPEG_MARKER_APP2       0xE2
+
+/* jpeg container format:
+     all data markers start with 0XFF
+     2 byte long file start and end markers: 0xFFD8(SOI) and 0XFFD9(EOI)
+     4 byte long data segment markers in format: 0xFFTTSSSSNNN...
+       FF:   1 byte standard marker identifier
+       TT:   1 byte data type
+       SSSS: 2 bytes in Motorola byte alignment for length of the data.
+            This value includes these 2 bytes in the count, making actual
+            length of NN... == SSSS - 2.
+       NNN.: the data in this segment
+ */
+
+gboolean jpeg_segment_find(guchar *data, guint size,
+                           guchar app_marker, const gchar *magic, guint magic_len,
+                           guint *seg_offset, guint *seg_length);
+
+#endif
\ No newline at end of file