[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r23109 - Extractor/src/plugins
From: |
gnunet |
Subject: |
[GNUnet-SVN] r23109 - Extractor/src/plugins |
Date: |
Sat, 4 Aug 2012 23:46:54 +0200 |
Author: grothoff
Date: 2012-08-04 23:46:54 +0200 (Sat, 04 Aug 2012)
New Revision: 23109
Added:
Extractor/src/plugins/test_gif.c
Modified:
Extractor/src/plugins/Makefile.am
Extractor/src/plugins/gif_extractor.c
Extractor/src/plugins/mime_extractor.c
Log:
adding test for gif extractor
Modified: Extractor/src/plugins/Makefile.am
===================================================================
--- Extractor/src/plugins/Makefile.am 2012-08-04 21:46:29 UTC (rev 23108)
+++ Extractor/src/plugins/Makefile.am 2012-08-04 21:46:54 UTC (rev 23109)
@@ -25,9 +25,15 @@
TEST_MIME=test_mime
endif
+if HAVE_GIF
+PLUGIN_GIF=libextractor_gif.la
+TEST_GIF=test_gif
+endif
+
plugin_LTLIBRARIES = \
$(PLUGIN_OGG) \
- $(PLUGIN_MIME)
+ $(PLUGIN_MIME) \
+ $(PLUGIN_GIF)
if HAVE_ZZUF
fuzz_tests=fuzz_default.sh
@@ -35,7 +41,8 @@
check_PROGRAMS = \
$(TEST_OGG) \
- $(TEST_MIME)
+ $(TEST_MIME) \
+ $(TEST_GIF)
TESTS = \
$(fuzz_tests) \
@@ -81,4 +88,19 @@
$(top_builddir)/src/plugins/libtest.la
+libextractor_gif_la_SOURCES = \
+ gif_extractor.c
+libextractor_gif_la_LDFLAGS = \
+ $(PLUGINFLAGS)
+libextractor_gif_la_LIBADD = \
+ $(top_builddir)/src/main/libextractor.la \
+ $(top_builddir)/src/common/libextractor_common.la \
+ -lgif
+test_gif_SOURCES = \
+ test_gif.c
+test_gif_LDADD = \
+ $(top_builddir)/src/plugins/libtest.la
+
+
+
Modified: Extractor/src/plugins/gif_extractor.c
===================================================================
--- Extractor/src/plugins/gif_extractor.c 2012-08-04 21:46:29 UTC (rev
23108)
+++ Extractor/src/plugins/gif_extractor.c 2012-08-04 21:46:54 UTC (rev
23109)
@@ -1,10 +1,10 @@
/*
This file is part of libextractor.
- (C) 2002, 2003, 2009 Vidyut Samanta and Christian Grothoff
+ (C) 2012 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
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
libextractor is distributed in the hope that it will be useful, but
@@ -20,261 +20,104 @@
#include "platform.h"
#include "extractor.h"
-#include "pack.h"
+#include <gif_lib.h>
-#define DEBUG_GIF 0
-#if DEBUG_GIF
-#define PRINT(a,b) fprintf(stderr,a,b)
-#else
-#define PRINT(a,b)
-#endif
-struct GifHeader
-{
- char gif[3];
- char version[3];
- uint16_t screen_width;
- uint16_t 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;
-};
-
-#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
-
-struct GifDescriptor
-{
- unsigned char image_separator;
- uint16_t image_left;
- uint16_t image_top;
- uint16_t image_width;
- uint16_t 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
-};
-
-#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
-
-struct GifExtension
-{
- unsigned char extension_introducer;
- unsigned char graphic_control_label;
-};
-
/**
- * Skip a data block.
- * @return the position after the block
+ * Callback invoked by libgif to read data.
+ *
+ * @param ft the file handle, including our extract context
+ * @param bt where to write the data
+ * @param arg number of bytes to read
+ * @return -1 on error, otherwise number of bytes read
*/
-static size_t
-skipDataBlock (const unsigned char *data, size_t pos, const size_t size)
+static int
+gif_read_func (GifFileType *ft,
+ GifByteType *bt,
+ int arg)
{
- while ((pos < size) && (data[pos] != 0))
- pos += data[pos] + 1;
- return pos + 1;
+ struct EXTRACTOR_ExtractContext *ec = ft->UserData;
+ void *data;
+ ssize_t ret;
+
+ ret = ec->read (ec->cls,
+ &data,
+ arg);
+ if (-1 == ret)
+ return -1;
+ memcpy (bt, data, ret);
+ return ret;
}
-/**
- * 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 struct GifExtension * ext)
-{
- return skipDataBlock (data, pos + sizeof (struct GifExtension), size);
-}
/**
- * @return the offset after the global color map
+ * Main entry method for the 'image/gif' extraction plugin.
+ *
+ * @param ec extraction context provided to the plugin
*/
-static size_t
-skipGlobalColorMap (const unsigned char *data,
- const size_t size,
- const struct GifHeader * header)
+void
+EXTRACTOR_gif_extract_method (struct EXTRACTOR_ExtractContext *ec)
{
- 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,
- const struct GifDescriptor * 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;
- size_t off;
- size_t curr = pos;
- int ret;
-
- length = 0;
- while ( (curr < size) &&
- (data[curr] != 0) )
+ GifFileType *gif_file;
+ GifRecordType gif_type;
+ GifByteType *ext;
+ int et;
+ char dims[128];
+
+ if (NULL == (gif_file = DGifOpen (ec, &gif_read_func)))
+ return; /* not a GIF */
+ if (0 !=
+ ec->proc (ec->cls,
+ "gif",
+ EXTRACTOR_METATYPE_MIMETYPE,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ "image/gif",
+ strlen ("image/gif") + 1))
+ return;
+ snprintf (dims,
+ sizeof (dims),
+ "%dx%d",
+ gif_file->SHeight,
+ gif_file->SWidth);
+ if (0 !=
+ ec->proc (ec->cls,
+ "gif",
+ EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ dims,
+ strlen (dims) + 1))
+ return;
+ while (1)
{
- length += data[curr];
- curr += data[curr] + 1;
- if (length > 65536)
+ if (GIF_OK !=
+ DGifGetRecordType (gif_file,
+ &gif_type))
break;
- }
- if ( (length < 65536) &&
- (curr < size) )
- {
- char comment[length+1];
-
- curr = pos;
- off = 0;
- while ((data[curr] != 0) && (curr < size))
+ if (UNDEFINED_RECORD_TYPE == gif_type)
+ break;
+ if (EXTENSION_RECORD_TYPE != gif_type)
+ continue;
+ if (GIF_OK !=
+ DGifGetExtension (gif_file, &et, &ext))
+ continue;
+ if (COMMENT_EXT_FUNC_CODE == et)
{
- if (off + data[curr] >= size)
- break;
- memcpy (&comment[off],
- &data[curr] + 1,
- data[curr]);
- off += data[curr];
- curr += data[curr] + 1;
+ ec->proc (ec->cls,
+ "gif",
+ EXTRACTOR_METATYPE_COMMENT,
+ EXTRACTOR_METAFORMAT_C_STRING,
+ "text/plain",
+ (char*) &ext[1],
+ (uint8_t) ext[0]);
+ break;
}
- comment[off] = '\0';
- ret = proc (proc_cls,
- "gif",
- EXTRACTOR_METATYPE_COMMENT,
- EXTRACTOR_METAFORMAT_UTF8,
- "text/plain",
- comment,
- length+1);
+ while ( (GIF_ERROR !=
+ DGifGetExtensionNext(gif_file, &ext)) &&
+ (NULL != ext) ) ; /* keep going */
}
- else
- {
- /* too big */
- ret = 0;
- }
- return ret;
+ DGifCloseFile (gif_file);
}
-
-int
-EXTRACTOR_gif_extract (const unsigned char *data,
- size_t size,
- EXTRACTOR_MetaDataProcessor proc,
- void *proc_cls,
- const char *options)
-{
- size_t pos;
- struct GifHeader header;
- struct GifDescriptor gd;
- 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)
- {
- 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,
- (const struct GifExtension *) & 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;
-}
+/* end of gif_extractor.c */
Modified: Extractor/src/plugins/mime_extractor.c
===================================================================
--- Extractor/src/plugins/mime_extractor.c 2012-08-04 21:46:29 UTC (rev
23108)
+++ Extractor/src/plugins/mime_extractor.c 2012-08-04 21:46:54 UTC (rev
23109)
@@ -4,7 +4,7 @@
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
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
libextractor is distributed in the hope that it will be useful, but
Added: Extractor/src/plugins/test_gif.c
===================================================================
--- Extractor/src/plugins/test_gif.c (rev 0)
+++ Extractor/src/plugins/test_gif.c 2012-08-04 21:46:54 UTC (rev 23109)
@@ -0,0 +1,77 @@
+/*
+ This file is part of libextractor.
+ (C) 2012 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 3, 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.
+*/
+/**
+ * @file plugins/test_gif.c
+ * @brief testcase for ogg plugin
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "test_lib.h"
+
+
+
+/**
+ * Main function for the GIF testcase.
+ *
+ * @param argc number of arguments (ignored)
+ * @param argv arguments (ignored)
+ * @return 0 on success
+ */
+int
+main (int argc, char *argv[])
+{
+ struct SolutionData gif_image_sol[] =
+ {
+ {
+ EXTRACTOR_METATYPE_MIMETYPE,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ "image/gif",
+ strlen ("image/gif") + 1,
+ 0
+ },
+ {
+ EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
+ EXTRACTOR_METAFORMAT_UTF8,
+ "text/plain",
+ "4x4",
+ strlen ("4x4") + 1,
+ 0
+ },
+ {
+ EXTRACTOR_METATYPE_COMMENT,
+ EXTRACTOR_METAFORMAT_C_STRING,
+ "text/plain",
+ "Testing keyword extraction\n",
+ strlen ("Testing keyword extraction\n"),
+ 0
+ },
+ { 0, 0, NULL, NULL, 0, -1 }
+ };
+ struct ProblemSet ps[] =
+ {
+ { "testdata/gif_image.gif",
+ gif_image_sol },
+ { NULL, NULL }
+ };
+ return ET_main ("gif", ps);
+}
+
+/* end of test_gif.c */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r23109 - Extractor/src/plugins,
gnunet <=