[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r9775 - Extractor/src/plugins
From: |
gnunet |
Subject: |
[GNUnet-SVN] r9775 - Extractor/src/plugins |
Date: |
Wed, 16 Dec 2009 09:54:17 +0100 |
Author: grothoff
Date: 2009-12-16 09:54:16 +0100 (Wed, 16 Dec 2009)
New Revision: 9775
Added:
Extractor/src/plugins/gif_extractor.c
Extractor/src/plugins/jpeg_extractor.c
Removed:
Extractor/src/plugins/gifextractor.c
Extractor/src/plugins/jpegextractor.c
Modified:
Extractor/src/plugins/Makefile.am
Log:
gif and jpeg
Modified: Extractor/src/plugins/Makefile.am
===================================================================
--- Extractor/src/plugins/Makefile.am 2009-12-16 02:13:28 UTC (rev 9774)
+++ Extractor/src/plugins/Makefile.am 2009-12-16 08:54:16 UTC (rev 9775)
@@ -89,8 +89,10 @@
libextractor_dvi.la \
libextractor_elf.la \
$(exiv2) \
+ libextractor_gif.la \
libextractor_html.la \
libextractor_it.la \
+ libextractor_jpeg.la \
libextractor_mime.la \
$(pdf) \
$(rpm) \
@@ -135,6 +137,13 @@
libextractor_exiv2_la_LIBADD = \
-lexiv2
+libextractor_gif_la_SOURCES = \
+ gif_extractor.c
+libextractor_gif_la_LDFLAGS = \
+ $(PLUGINFLAGS)
+libextractor_gif_la_LIBADD = \
+ $(top_builddir)/src/common/libextractor_common.la
+
libextractor_html_la_SOURCES = \
html_extractor.c
libextractor_html_la_LDFLAGS = \
@@ -147,6 +156,13 @@
libextractor_it_la_LDFLAGS = \
$(PLUGINFLAGS)
+libextractor_jpeg_la_SOURCES = \
+ jpeg_extractor.c
+libextractor_jpeg_la_LDFLAGS = \
+ $(PLUGINFLAGS)
+libextractor_jpeg_la_LIBADD = \
+ $(LE_LIBINTL)
+
libextractor_mime_la_SOURCES = \
mime_extractor.c
libextractor_mime_la_LDFLAGS = \
@@ -183,11 +199,9 @@
libextractor_elf.la \
$(extraflac) \
libextractor_flv.la \
- libextractor_gif.la \
libextractor_id3v2.la \
libextractor_id3v24.la \
libextractor_id3v23.la \
- libextractor_jpeg.la \
libextractor_man.la \
libextractor_mp3.la \
$(extrampeg) \
@@ -290,13 +304,6 @@
$(top_builddir)/src/main/libextractor.la -lz
endif
-libextractor_gif_la_SOURCES = \
- gifextractor.c
-libextractor_gif_la_LDFLAGS = \
- $(PLUGINFLAGS)
-libextractor_gif_la_LIBADD = \
- $(top_builddir)/src/common/libextractor_common.la
-
libextractor_tiff_la_SOURCES = \
tiffextractor.c
libextractor_tiff_la_LDFLAGS = \
@@ -311,13 +318,6 @@
libextractor_zip_la_LIBADD = \
$(top_builddir)/src/main/libextractor.la
-libextractor_jpeg_la_SOURCES = \
- jpegextractor.c
-libextractor_jpeg_la_LDFLAGS = \
- $(PLUGINFLAGS)
-libextractor_jpeg_la_LIBADD = \
- $(LE_LIBINTL)
-
libextractor_flv_la_SOURCES = \
flvextractor.c
libextractor_flv_la_LDFLAGS = \
Copied: Extractor/src/plugins/gif_extractor.c (from rev 9774,
Extractor/src/plugins/gifextractor.c)
===================================================================
--- Extractor/src/plugins/gif_extractor.c (rev 0)
+++ Extractor/src/plugins/gif_extractor.c 2009-12-16 08:54:16 UTC (rev
9775)
@@ -0,0 +1,262 @@
+/*
+ This file is part of libextractor.
+ (C) 2002, 2003, 2009 Vidyut Samanta and Christian Grothoff
+
+ libextractor is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ libextractor is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libextractor; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include "pack.h"
+
+#define DEBUG_GIF 0
+#if DEBUG_GIF
+#define PRINT(a,b) fprintf(stderr,a,b)
+#else
+#define PRINT(a,b)
+#endif
+
+typedef struct
+{
+ char gif[3];
+ char version[3];
+ unsigned short screen_width;
+ unsigned short screen_height;
+ unsigned char flags;
+#define HEADER_FLAGS__SIZE_OF_GLOBAL_COLOR_TABLE 0x07
+#define HEADER_FLAGS__SORT_FLAG 0x08
+#define HEADER_FLAGS__COLOR_RESOLUTION 0x70
+#define HEADER_FLAGS__GLOBAL_COLOR_TABLE_FLAG 0x80
+ unsigned char background_color_index;
+ unsigned char pixel_aspect_ratio;
+} GIF_HEADER;
+
+#define GIF_HEADER_SIZE 13
+#define GIF_HEADER_SPEC "3b3bhhbbb"
+#define GIF_HEADER_FIELDS(p) \
+ &(p)->gif,\
+ &(p)->version, \
+ &(p)->screen_width, \
+ &(p)->screen_height, \
+ &(p)->flags, \
+ &(p)->background_color_index, \
+ &(p)->pixel_aspect_ratio
+
+typedef struct
+{
+ unsigned char image_separator;
+ unsigned short image_left;
+ unsigned short image_top;
+ unsigned short image_width;
+ unsigned short image_height;
+ unsigned char flags;
+#define DESCRIPTOR_FLAGS__PIXEL_SIZE 0x07
+#define DESCRIPTOR_FLAGS__RESERVED 0x18
+#define DESCRIPTOR_FLAGS__SORT_FLAG 0x20
+#define DESCRIPTOR_FLAGS__INTERLACE_FLAG 0x40
+#define DESCRIPTOR_FLAGS__LOCAL_COLOR_TABLE_FLAG 0x80
+} GIF_DESCRIPTOR;
+#define GIF_DESCRIPTOR_SIZE 10
+#define GIF_DESCRIPTOR_SPEC "chhhhc"
+#define GIF_DESCRIPTOR_FIELDS(p) \
+ &(p)->image_separator, \
+ &(p)->image_left, \
+ &(p)->image_top, \
+ &(p)->image_width, \
+ &(p)->image_height, \
+ &(p)->flags
+
+typedef struct
+{
+ unsigned char extension_introducer;
+ unsigned char graphic_control_label;
+} GIF_EXTENSION;
+
+/**
+ * Skip a data block.
+ * @return the position after the block
+ **/
+static size_t
+skipDataBlock (const unsigned char *data, size_t pos, const size_t size)
+{
+ while ((pos < size) && (data[pos] != 0))
+ pos += data[pos] + 1;
+ return pos + 1;
+}
+
+/**
+ * skip an extention block
+ * @return the position after the block
+ **/
+static size_t
+skipExtensionBlock (const unsigned char *data,
+ size_t pos, const size_t size, const GIF_EXTENSION * ext)
+{
+ return skipDataBlock (data, pos + sizeof (GIF_EXTENSION), size);
+}
+
+/**
+ * @return the offset after the global color map
+ **/
+static size_t
+skipGlobalColorMap (const unsigned char *data,
+ const size_t size, const GIF_HEADER * header)
+{
+ size_t gct_size;
+
+ if ((header->flags & HEADER_FLAGS__GLOBAL_COLOR_TABLE_FLAG) > 0)
+ gct_size =
+ 3 *
+ (1 << ((header->flags & HEADER_FLAGS__SIZE_OF_GLOBAL_COLOR_TABLE) + 1));
+ else
+ gct_size = 0;
+ return GIF_HEADER_SIZE + gct_size;
+}
+
+/**
+ * @return the offset after the local color map
+ **/
+static size_t
+skipLocalColorMap (const unsigned char *data,
+ size_t pos, const size_t size, GIF_DESCRIPTOR * descriptor)
+{
+ size_t lct_size;
+
+ if (pos + GIF_DESCRIPTOR_SIZE > size)
+ return size;
+ if ((descriptor->flags & DESCRIPTOR_FLAGS__LOCAL_COLOR_TABLE_FLAG) > 0)
+ lct_size =
+ 3 * (1 << ((descriptor->flags & DESCRIPTOR_FLAGS__PIXEL_SIZE) + 1));
+ else
+ lct_size = 0;
+ return pos + GIF_DESCRIPTOR_SIZE + lct_size;
+}
+
+static int
+parseComment (const unsigned char *data,
+ size_t pos, const size_t size,
+ EXTRACTOR_MetaDataProcessor proc,
+ void *proc_cls)
+{
+ size_t length = 0;
+ size_t curr = pos;
+ char *comment;
+ int ret;
+
+ while ((data[curr] != 0) && (curr < size))
+ {
+ length += data[curr];
+ curr += data[curr] + 1;
+ }
+ comment = malloc (length + 1);
+ curr = pos;
+ length = 0;
+ while ((data[curr] != 0) && (curr < size))
+ {
+ length += data[curr];
+ if (length >= size)
+ break;
+ memcpy (&comment[length - data[curr]], &data[curr] + 1, data[curr]);
+ comment[length] = '\0';
+ curr += data[curr] + 1;
+ }
+ ret = proc (proc_cls,
+ "gif",
+ EXTRACTOR_METATYPE_COMMENT,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ comment,
+ length+1);
+ free (comment);
+ return ret;
+}
+
+
+int
+EXTRACTOR_gif_extract (const unsigned char *data,
+ size_t size,
+ EXTRACTOR_MetaDataProcessor proc,
+ void *proc_cls,
+ const char *options)
+{
+ size_t pos;
+ GIF_HEADER header;
+ char tmp[128];
+
+ if (size < GIF_HEADER_SIZE)
+ return 0;
+ EXTRACTOR_common_cat_unpack (data, GIF_HEADER_SPEC, GIF_HEADER_FIELDS
(&header));
+ if (0 != strncmp (&header.gif[0], "GIF", 3))
+ return 0;
+ if (0 != strncmp (&header.version[0], "89a", 3))
+ return 0; /* only 89a has support for comments */
+ if (0 != proc (proc_cls,
+ "gif",
+ EXTRACTOR_METATYPE_MIMETYPE,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ "image/gif",
+ strlen ("image/gif")+1))
+ return 1;
+ snprintf (tmp,
+ sizeof(tmp),
+ "%ux%u",
+ header.screen_width, header.screen_height);
+ if (0 != proc (proc_cls,
+ "gif",
+ EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ tmp,
+ strlen (tmp)+1))
+ return 1;
+ pos = skipGlobalColorMap (data, size, &header);
+ PRINT ("global color map ends at %d\n", pos);
+ while (pos < size)
+ {
+ GIF_DESCRIPTOR gd;
+
+ switch (data[pos])
+ {
+ case ',': /* image descriptor block */
+ PRINT ("skipping local color map %d\n", pos);
+ EXTRACTOR_common_cat_unpack (&data[pos],
+ GIF_DESCRIPTOR_SPEC,
+ GIF_DESCRIPTOR_FIELDS (&gd));
+ pos = skipLocalColorMap (data, pos, size, &gd);
+ break;
+ case '!': /* extension block */
+ PRINT ("skipping extension block %d\n", pos);
+ if (data[pos + 1] == (unsigned char) 0xFE)
+ {
+ if (0 != parseComment (data, pos + 2, size, proc, proc_cls))
+ return 1;
+ }
+ pos = skipExtensionBlock (data, pos, size,
+ (GIF_EXTENSION *) & data[pos]);
+ break;
+ case ';':
+ PRINT ("hit terminator at %d!\n", pos);
+ return 0; /* terminator! */
+ default: /* raster data block */
+ PRINT ("skipping data block at %d\n", pos);
+ pos = skipDataBlock (data, pos + 1, size);
+ break;
+ }
+ }
+ PRINT ("returning at %d\n", pos);
+ return 0;
+}
Deleted: Extractor/src/plugins/gifextractor.c
===================================================================
--- Extractor/src/plugins/gifextractor.c 2009-12-16 02:13:28 UTC (rev
9774)
+++ Extractor/src/plugins/gifextractor.c 2009-12-16 08:54:16 UTC (rev
9775)
@@ -1,249 +0,0 @@
-/*
- This file is part of libextractor.
- (C) 2002, 2003 Vidyut Samanta and Christian Grothoff
-
- libextractor is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- libextractor is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with libextractor; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include "pack.h"
-
-#define DEBUG_GIF 0
-#if DEBUG_GIF
-#define PRINT(a,b) fprintf(stderr,a,b)
-#else
-#define PRINT(a,b)
-#endif
-
-typedef struct
-{
- char gif[3];
- char version[3];
- unsigned short screen_width;
- unsigned short screen_height;
- unsigned char flags;
-#define HEADER_FLAGS__SIZE_OF_GLOBAL_COLOR_TABLE 0x07
-#define HEADER_FLAGS__SORT_FLAG 0x08
-#define HEADER_FLAGS__COLOR_RESOLUTION 0x70
-#define HEADER_FLAGS__GLOBAL_COLOR_TABLE_FLAG 0x80
- unsigned char background_color_index;
- unsigned char pixel_aspect_ratio;
-} GIF_HEADER;
-
-#define GIF_HEADER_SIZE 13
-#define GIF_HEADER_SPEC "3b3bhhbbb"
-#define GIF_HEADER_FIELDS(p) \
- &(p)->gif,\
- &(p)->version, \
- &(p)->screen_width, \
- &(p)->screen_height, \
- &(p)->flags, \
- &(p)->background_color_index, \
- &(p)->pixel_aspect_ratio
-
-typedef struct
-{
- unsigned char image_separator;
- unsigned short image_left;
- unsigned short image_top;
- unsigned short image_width;
- unsigned short image_height;
- unsigned char flags;
-#define DESCRIPTOR_FLAGS__PIXEL_SIZE 0x07
-#define DESCRIPTOR_FLAGS__RESERVED 0x18
-#define DESCRIPTOR_FLAGS__SORT_FLAG 0x20
-#define DESCRIPTOR_FLAGS__INTERLACE_FLAG 0x40
-#define DESCRIPTOR_FLAGS__LOCAL_COLOR_TABLE_FLAG 0x80
-} GIF_DESCRIPTOR;
-#define GIF_DESCRIPTOR_SIZE 10
-#define GIF_DESCRIPTOR_SPEC "chhhhc"
-#define GIF_DESCRIPTOR_FIELDS(p) \
- &(p)->image_separator, \
- &(p)->image_left, \
- &(p)->image_top, \
- &(p)->image_width, \
- &(p)->image_height, \
- &(p)->flags
-
-typedef struct
-{
- unsigned char extension_introducer;
- unsigned char graphic_control_label;
-} GIF_EXTENSION;
-
-static struct EXTRACTOR_Keywords *
-addKeyword (EXTRACTOR_KeywordType type,
- char *keyword, struct EXTRACTOR_Keywords *next)
-{
- EXTRACTOR_KeywordList *result;
-
- if (keyword == NULL)
- return next;
- result = malloc (sizeof (EXTRACTOR_KeywordList));
- result->next = next;
- result->keyword = keyword;
- result->keywordType = type;
- return result;
-}
-
-/**
- * Skip a data block.
- * @return the position after the block
- **/
-static size_t
-skipDataBlock (const unsigned char *data, size_t pos, const size_t size)
-{
- while ((pos < size) && (data[pos] != 0))
- pos += data[pos] + 1;
- return pos + 1;
-}
-
-/**
- * skip an extention block
- * @return the position after the block
- **/
-static size_t
-skipExtensionBlock (const unsigned char *data,
- size_t pos, const size_t size, const GIF_EXTENSION * ext)
-{
- return skipDataBlock (data, pos + sizeof (GIF_EXTENSION), size);
-}
-
-/**
- * @return the offset after the global color map
- **/
-static size_t
-skipGlobalColorMap (const unsigned char *data,
- const size_t size, const GIF_HEADER * header)
-{
- size_t gct_size;
-
- if ((header->flags & HEADER_FLAGS__GLOBAL_COLOR_TABLE_FLAG) > 0)
- gct_size =
- 3 *
- (1 << ((header->flags & HEADER_FLAGS__SIZE_OF_GLOBAL_COLOR_TABLE) + 1));
- else
- gct_size = 0;
- return GIF_HEADER_SIZE + gct_size;
-}
-
-/**
- * @return the offset after the local color map
- **/
-static size_t
-skipLocalColorMap (const unsigned char *data,
- size_t pos, const size_t size, GIF_DESCRIPTOR * descriptor)
-{
- size_t lct_size;
-
- if (pos + GIF_DESCRIPTOR_SIZE > size)
- return size;
- if ((descriptor->flags & DESCRIPTOR_FLAGS__LOCAL_COLOR_TABLE_FLAG) > 0)
- lct_size =
- 3 * (1 << ((descriptor->flags & DESCRIPTOR_FLAGS__PIXEL_SIZE) + 1));
- else
- lct_size = 0;
- return pos + GIF_DESCRIPTOR_SIZE + lct_size;
-}
-
-static struct EXTRACTOR_Keywords *
-parseComment (const unsigned char *data,
- size_t pos, const size_t size, struct EXTRACTOR_Keywords *prev)
-{
- size_t length = 0;
- size_t curr = pos;
- char *keyword;
-
- while ((data[curr] != 0) && (curr < size))
- {
- length += data[curr];
- curr += data[curr] + 1;
- }
- keyword = malloc (length + 1);
- curr = pos;
- length = 0;
- while ((data[curr] != 0) && (curr < size))
- {
- length += data[curr];
- if (length >= size)
- break;
- memcpy (&keyword[length - data[curr]], &data[curr] + 1, data[curr]);
- keyword[length] = 0;
- curr += data[curr] + 1;
- }
- return addKeyword (EXTRACTOR_COMMENT, keyword, prev);
-}
-
-
-struct EXTRACTOR_Keywords *
-libextractor_gif_extract (const char *filename,
- const unsigned char *data,
- const size_t size, struct EXTRACTOR_Keywords *prev)
-{
- size_t pos;
- struct EXTRACTOR_Keywords *result;
- GIF_HEADER header;
- char *tmp;
-
- if (size < GIF_HEADER_SIZE)
- return prev;
- EXTRACTOR_common_cat_unpack (data, GIF_HEADER_SPEC, GIF_HEADER_FIELDS
(&header));
- if (0 != strncmp (&header.gif[0], "GIF", 3))
- return prev;
- if (0 != strncmp (&header.version[0], "89a", 3))
- return prev; /* only 89a has support for comments */
- result = prev;
- result = addKeyword (EXTRACTOR_MIMETYPE, strdup ("image/gif"), result);
- tmp = malloc (128);
- snprintf (tmp, 128, "%ux%u", header.screen_width, header.screen_height);
- result = addKeyword (EXTRACTOR_SIZE, strdup (tmp), result);
- free (tmp);
- pos = skipGlobalColorMap (data, size, &header);
- PRINT ("global color map ends at %d\n", pos);
- while (pos < size)
- {
- GIF_DESCRIPTOR gd;
-
- switch (data[pos])
- {
- case ',': /* image descriptor block */
- PRINT ("skipping local color map %d\n", pos);
- EXTRACTOR_common_cat_unpack (&data[pos],
- GIF_DESCRIPTOR_SPEC, GIF_DESCRIPTOR_FIELDS (&gd));
- pos = skipLocalColorMap (data, pos, size, &gd);
- break;
- case '!': /* extension block */
- PRINT ("skipping extension block %d\n", pos);
- if (data[pos + 1] == (unsigned char) 0xFE)
- {
- result = parseComment (data, pos + 2, size, result);
- }
- pos = skipExtensionBlock (data, pos, size,
- (GIF_EXTENSION *) & data[pos]);
- break;
- case ';':
- PRINT ("hit terminator at %d!\n", pos);
- return result; /* terminator! */
- default: /* raster data block */
- PRINT ("skipping data block at %d\n", pos);
- pos = skipDataBlock (data, pos + 1, size);
- break;
- }
- }
- PRINT ("returning at %d\n", pos);
- return result;
-}
Copied: Extractor/src/plugins/jpeg_extractor.c (from rev 9774,
Extractor/src/plugins/jpegextractor.c)
===================================================================
--- Extractor/src/plugins/jpeg_extractor.c (rev 0)
+++ Extractor/src/plugins/jpeg_extractor.c 2009-12-16 08:54:16 UTC (rev
9775)
@@ -0,0 +1,275 @@
+/*
+ This file is part of libextractor.
+ (C) 2002, 2003, 2004 Vidyut Samanta and Christian Grothoff
+
+ libextractor is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ libextractor is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libextractor; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ */
+
+#include "platform.h"
+#include "extractor.h"
+
+
+#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */
+#define M_EOI 0xD9 /* End Of Image (end of datastream) */
+#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */
+#define M_APP12 0xEC
+#define M_COM 0xFE /* COMment */
+#define M_APP0 0xE0
+
+/**
+ * Get the next character in the sequence and advance
+ * the pointer *data to the next location in the sequence.
+ * If we're at the end, return -1.
+ */
+#define NEXTC(data,end) ((*(data)<(end))?*((*(data))++):-1)
+
+/* The macro does:
+unsigned int NEXTC(unsigned char ** data, char * end) {
+ if (*data < end) {
+ char result = **data;
+ (*data)++;
+ return result;
+ } else
+ return -1;
+}
+*/
+
+/**
+ * Read length, convert to unsigned int.
+ * All 2-byte quantities in JPEG markers are MSB first
+ * @return -1 on error
+ */
+static int
+readLength (const unsigned char **data, const unsigned char *end)
+{
+ int c1;
+ int c2;
+
+ c1 = NEXTC (data, end);
+ if (c1 == -1)
+ return -1;
+ c2 = NEXTC (data, end);
+ if (c2 == -1)
+ return -1;
+ return ((((unsigned int) c1) << 8) + ((unsigned int) c2)) - 2;
+}
+
+/**
+ * @return the next marker or -1 on error.
+ */
+static int
+next_marker (const unsigned char **data, const unsigned char *end)
+{
+ int c;
+ c = NEXTC (data, end);
+ while ((c != 0xFF) && (c != -1))
+ c = NEXTC (data, end);
+ do
+ {
+ c = NEXTC (data, end);
+ }
+ while ((c == 0xFF) && (c != -1));
+ return c;
+}
+
+static void
+skip_variable (const unsigned char **data, const unsigned char *end)
+{
+ int length;
+
+ length = readLength (data, end);
+ if (length < 0)
+ {
+ (*data) = end; /* skip to the end */
+ return;
+ }
+ /* Skip over length bytes */
+ (*data) += length;
+}
+
+static char *
+process_COM (const unsigned char **data, const unsigned char *end)
+{
+ unsigned int length;
+ int ch;
+ int pos;
+ char *comment;
+
+ length = readLength (data, end);
+ if (length <= 0)
+ return NULL;
+ comment = malloc (length + 1);
+ pos = 0;
+ while (length > 0)
+ {
+ ch = NEXTC (data, end);
+ if ((ch == '\r') || (ch == '\n'))
+ comment[pos++] = '\n';
+ else if (isprint (ch))
+ comment[pos++] = ch;
+ length--;
+ }
+ comment[pos] = '\0';
+ return comment;
+}
+
+
+int
+EXTRACTOR_jpeg_extract (const unsigned char *data,
+ size_t size,
+ EXTRACTOR_MetaDataProcessor proc,
+ void *proc_cls,
+ const char *options)
+{
+ int c1;
+ int c2;
+ int marker;
+ const unsigned char *end;
+ char *tmp;
+ char val[128];
+
+ if (size < 0x12)
+ return 0;
+ end = &data[size];
+ c1 = NEXTC (&data, end);
+ c2 = NEXTC (&data, end);
+ if ((c1 != 0xFF) || (c2 != M_SOI))
+ return 0; /* not a JPEG */
+ if (0 != proc (proc_cls,
+ "jpeg",
+ EXTRACTOR_METATYPE_MIMETYPE,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ "image/jpeg",
+ strlen ("image/jpeg")+1))
+ return 1;
+ while (1)
+ {
+ marker = next_marker (&data, end);
+ switch (marker)
+ {
+ case -1: /* end of file */
+ case M_SOS:
+ case M_EOI:
+ goto RETURN;
+ case M_APP0:
+ {
+ int len = readLength (&data, end);
+ if (len < 0x8)
+ goto RETURN;
+ if (0 == strncmp ((char *) data, "JFIF", 4))
+ {
+ switch (data[0x4])
+ {
+ case 1: /* dots per inch */
+ snprintf (val,
+ sizeof (val),
+ _("%ux%u dots per inch"),
+ (data[0x8] << 8) + data[0x9],
+ (data[0xA] << 8) + data[0xB]);
+ if (0 != proc (proc_cls,
+ "jpeg",
+ EXTRACTOR_METATYPE_IMAGE_RESOLUTION,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ val,
+ strlen (val)+1))
+ return 1;
+ break;
+ case 2: /* dots per cm */
+ snprintf (val,
+ sizeof (val),
+ _("%ux%u dots per cm"),
+ (data[0x8] << 8) + data[0x9],
+ (data[0xA] << 8) + data[0xB]);
+ if (0 != proc (proc_cls,
+ "jpeg",
+ EXTRACTOR_METATYPE_IMAGE_RESOLUTION,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ val,
+ strlen (val)+1))
+ return 1;
+ break;
+ case 0: /* no unit given */
+ snprintf (val,
+ sizeof (val),
+ _("%ux%u dots per inch?"),
+ (data[0x8] << 8) + data[0x9],
+ (data[0xA] << 8) + data[0xB]);
+ if (0 != proc (proc_cls,
+ "jpeg",
+ EXTRACTOR_METATYPE_IMAGE_RESOLUTION,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ val,
+ strlen (val)+1))
+ return 1;
+ break;
+ default: /* unknown unit */
+ break;
+ }
+ }
+ data = &data[len];
+ break;
+ }
+ case 0xC0:
+ {
+ int len = readLength (&data, end);
+ if (len < 0x9)
+ goto RETURN;
+ snprintf (val,
+ sizeof (val),
+ "%ux%u",
+ (data[0x3] << 8) + data[0x4],
+ (data[0x1] << 8) + data[0x2]);
+ if (0 != proc (proc_cls,
+ "jpeg",
+ EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ val,
+ strlen (val)+1))
+ return 1;
+ data = &data[len];
+ break;
+ }
+ case M_COM:
+ case M_APP12:
+ tmp = process_COM (&data, end);
+ if (NULL == tmp)
+ break;
+ if (0 != proc (proc_cls,
+ "jpeg",
+ EXTRACTOR_METATYPE_COMMENT,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ tmp,
+ strlen (tmp)+1))
+ {
+ free (tmp);
+ return 1;
+ }
+ free (tmp);
+ break;
+ default:
+ skip_variable (&data, end);
+ break;
+ }
+ }
+RETURN:
+ return 0;
+}
Deleted: Extractor/src/plugins/jpegextractor.c
===================================================================
--- Extractor/src/plugins/jpegextractor.c 2009-12-16 02:13:28 UTC (rev
9774)
+++ Extractor/src/plugins/jpegextractor.c 2009-12-16 08:54:16 UTC (rev
9775)
@@ -1,243 +0,0 @@
-/*
- This file is part of libextractor.
- (C) 2002, 2003, 2004 Vidyut Samanta and Christian Grothoff
-
- libextractor is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- libextractor is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with libextractor; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
- */
-
-#include "platform.h"
-#include "extractor.h"
-
-
-#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */
-#define M_EOI 0xD9 /* End Of Image (end of datastream) */
-#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */
-#define M_APP12 0xEC
-#define M_COM 0xFE /* COMment */
-#define M_APP0 0xE0
-
-static EXTRACTOR_KeywordList *
-addKeyword (EXTRACTOR_KeywordType type,
- char *keyword, EXTRACTOR_KeywordList * next)
-{
- EXTRACTOR_KeywordList *result;
-
- if (keyword == NULL)
- return next;
- result = malloc (sizeof (EXTRACTOR_KeywordList));
- result->next = next;
- result->keyword = keyword;
- result->keywordType = type;
- return result;
-}
-
-/**
- * Get the next character in the sequence and advance
- * the pointer *data to the next location in the sequence.
- * If we're at the end, return -1.
- */
-#define NEXTC(data,end) ((*(data)<(end))?*((*(data))++):-1)
-
-/* The macro does:
-unsigned int NEXTC(unsigned char ** data, char * end) {
- if (*data < end) {
- char result = **data;
- (*data)++;
- return result;
- } else
- return -1;
-}
-*/
-
-/**
- * Read length, convert to unsigned int.
- * All 2-byte quantities in JPEG markers are MSB first
- * @return -1 on error
- */
-static int
-readLength (unsigned char **data, unsigned char *end)
-{
- int c1;
- int c2;
-
- c1 = NEXTC (data, end);
- if (c1 == -1)
- return -1;
- c2 = NEXTC (data, end);
- if (c2 == -1)
- return -1;
- return ((((unsigned int) c1) << 8) + ((unsigned int) c2)) - 2;
-}
-
-/**
- * @return the next marker or -1 on error.
- */
-static int
-next_marker (unsigned char **data, unsigned char *end)
-{
- int c;
- c = NEXTC (data, end);
- while ((c != 0xFF) && (c != -1))
- c = NEXTC (data, end);
- do
- {
- c = NEXTC (data, end);
- }
- while ((c == 0xFF) && (c != -1));
- return c;
-}
-
-static void
-skip_variable (unsigned char **data, unsigned char *end)
-{
- int length;
-
- length = readLength (data, end);
- if (length < 0)
- {
- (*data) = end; /* skip to the end */
- return;
- }
- /* Skip over length bytes */
- (*data) += length;
-}
-
-static char *
-process_COM (unsigned char **data, unsigned char *end)
-{
- unsigned int length;
- int ch;
- int pos;
- char *comment;
-
- length = readLength (data, end);
- if (length <= 0)
- return NULL;
- comment = malloc (length + 1);
- pos = 0;
- while (length > 0)
- {
- ch = NEXTC (data, end);
- if ((ch == '\r') || (ch == '\n'))
- comment[pos++] = '\n';
- else if (isprint (ch))
- comment[pos++] = ch;
- length--;
- }
- comment[pos] = '\0';
- return comment;
-}
-
-struct EXTRACTOR_Keywords *
-libextractor_jpeg_extract (const char *filename,
- unsigned char *data,
- size_t size, struct EXTRACTOR_Keywords *prev)
-{
- int c1;
- int c2;
- int marker;
- unsigned char *end;
- struct EXTRACTOR_Keywords *result;
-
- if (size < 0x12)
- return prev;
- result = prev;
- end = &data[size];
- c1 = NEXTC (&data, end);
- c2 = NEXTC (&data, end);
- if ((c1 != 0xFF) || (c2 != M_SOI))
- return result; /* not a JPEG */
- result = addKeyword (EXTRACTOR_MIMETYPE, strdup ("image/jpeg"), result);
- while (1)
- {
- marker = next_marker (&data, end);
- switch (marker)
- {
- case -1: /* end of file */
- case M_SOS:
- case M_EOI:
- goto RETURN; /* this used to be "return result", but this
- makes certain compilers unhappy... */
- case M_APP0:
- {
- int len = readLength (&data, end);
- if (len < 0x8)
- goto RETURN;
- if (0 == strncmp ((char *) data, "JFIF", 4))
- {
- char *val;
-
- switch (data[0x4])
- {
- case 1: /* dots per inch */
- val = malloc (128);
- snprintf (val, 128,
- _("%ux%u dots per inch"),
- (data[0x8] << 8) + data[0x9],
- (data[0xA] << 8) + data[0xB]);
- result = addKeyword (EXTRACTOR_RESOLUTION, val, result);
- break;
- case 2: /* dots per cm */
- val = malloc (128);
- snprintf (val, 128,
- _("%ux%u dots per cm"),
- (data[0x8] << 8) + data[0x9],
- (data[0xA] << 8) + data[0xB]);
- result = addKeyword (EXTRACTOR_RESOLUTION, val, result);
- break;
- case 0: /* no unit given */
- val = malloc (128);
- snprintf (val, 128,
- _("%ux%u dots per inch?"),
- (data[0x8] << 8) + data[0x9],
- (data[0xA] << 8) + data[0xB]);
- result = addKeyword (EXTRACTOR_RESOLUTION, val, result);
- break;
- default: /* unknown unit */
- break;
- }
- }
- data = &data[len];
- break;
- }
- case 0xC0:
- {
- char *val;
- int len = readLength (&data, end);
- if (len < 0x9)
- goto RETURN;
- val = malloc (128);
- snprintf (val, 128,
- "%ux%u",
- (data[0x3] << 8) + data[0x4],
- (data[0x1] << 8) + data[0x2]);
- result = addKeyword (EXTRACTOR_SIZE, val, result);
- data = &data[len];
- break;
- }
- case M_COM:
- case M_APP12:
- result = addKeyword (EXTRACTOR_COMMENT,
- process_COM (&data, end), result);
- break;
- default:
- skip_variable (&data, end);
- break;
- }
- }
-RETURN:
- return result;
-}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r9775 - Extractor/src/plugins,
gnunet <=