# HG changeset patch # User Vladimir Nadvornik # Date 1301174019 -3600 # Node ID 59e5122e8db9ef137e555eefa23796952ac21216 # Parent f26539b61a6c6349c8ab71941cf6179e30f2f495 split jpeg parser functions to separate file diff -r f26539b61a6c -r 59e5122e8db9 src/Makefile.am --- a/src/Makefile.am Sat Mar 26 22:03:30 2011 +0100 +++ b/src/Makefile.am Sat Mar 26 22:13:39 2011 +0100 @@ -168,6 +168,8 @@ image-overlay.h \ img-view.c \ img-view.h \ + jpeg_parser.c \ + jpeg_parser.h \ layout.c \ layout.h \ layout_config.c \ diff -r f26539b61a6c -r 59e5122e8db9 src/exif-common.c --- a/src/exif-common.c Sat Mar 26 22:03:30 2011 +0100 +++ b/src/exif-common.c Sat Mar 26 22:13:39 2011 +0100 @@ -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) @@ -674,64 +675,6 @@ /* 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; @@ -746,7 +689,7 @@ 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 -r f26539b61a6c -r 59e5122e8db9 src/jpeg_parser.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jpeg_parser.c Sat Mar 26 22:13:39 2011 +0100 @@ -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 -r f26539b61a6c -r 59e5122e8db9 src/jpeg_parser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jpeg_parser.h Sat Mar 26 22:13:39 2011 +0100 @@ -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