libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 8b019a71f547023de8b32674e457007215412aab
parent a62d5549a400a96302775ebddbdf5f5b172599f8
Author: Christian Grothoff <christian@grothoff.org>
Date:   Tue,  8 May 2012 16:30:27 +0000

-LRN: port PNG extractor

Diffstat:
Msrc/plugins/Makefile.am | 9+++++++++
Msrc/plugins/png_extractor.c | 128++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
2 files changed, 87 insertions(+), 50 deletions(-)

diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am @@ -17,6 +17,7 @@ plugin_LTLIBRARIES = \ libextractor_ebml.la \ libextractor_s3m.la \ libextractor_ogg.la \ + libextractor_png.la \ libextractor_mp3.la libextractor_mp3_la_SOURCES = \ @@ -68,4 +69,12 @@ libextractor_ogg_la_LIBADD = \ $(top_builddir)/src/common/libextractor_common.la \ -lvorbisfile -lvorbis $(vorbisflag) -logg +libextractor_png_la_SOURCES = \ + png_extractor.c +libextractor_png_la_LDFLAGS = \ + $(PLUGINFLAGS) +libextractor_png_la_LIBADD = \ + $(top_builddir)/src/main/libextractor.la \ + $(top_builddir)/src/common/libextractor_common.la + EXTRA_DIST = template_extractor.c diff --git a/src/plugins/png_extractor.c b/src/plugins/png_extractor.c @@ -85,17 +85,21 @@ static struct static int -processtEXt (const char *data, +processtEXt (struct EXTRACTOR_PluginList *plugin, unsigned int length, EXTRACTOR_MetaDataProcessor proc, void *proc_cls) { + unsigned char *data; char *keyword; unsigned int off; int i; int ret; - data += 4; + if (length != pl_read (plugin, &data, length)) + return 1; + + //data += 4; off = stnlen (data, length) + 1; if (off >= length) return 0; /* failed to find '\0' */ @@ -115,16 +119,17 @@ processtEXt (const char *data, i++; } ADDF (EXTRACTOR_METATYPE_KEYWORDS, keyword); - FINISH: +FINISH: return ret; } static int -processiTXt (const char *data, +processiTXt (struct EXTRACTOR_PluginList *plugin, unsigned int length, EXTRACTOR_MetaDataProcessor proc, void *proc_cls) { + unsigned char *data; unsigned int pos; char *keyword; const char *language; @@ -137,8 +142,11 @@ processiTXt (const char *data, int ret; int zret; + if (length != pl_read (plugin, &data, length)) + return 1; + pos = stnlen (data, length) + 1; - if (pos + 3 >= length) + if (pos >= length) return 0; compressed = data[pos++]; if (compressed && (data[pos++] != 0)) @@ -148,8 +156,7 @@ processiTXt (const char *data, if (stnlen (language, length - pos) > 0) { lan = stndup (language, length - pos); - ADDF (EXTRACTOR_METATYPE_LANGUAGE, - lan); + ADDF (EXTRACTOR_METATYPE_LANGUAGE, lan); } pos += stnlen (language, length - pos) + 1; if (pos + 1 >= length) @@ -158,8 +165,7 @@ processiTXt (const char *data, if (stnlen (translated, length - pos) > 0) { lan = stndup (translated, length - pos); - ADDF (EXTRACTOR_METATYPE_KEYWORDS, - lan); + ADDF (EXTRACTOR_METATYPE_KEYWORDS, lan); } pos += stnlen (translated, length - pos) + 1; if (pos >= length) @@ -214,38 +220,44 @@ processiTXt (const char *data, i++; } ADDF (EXTRACTOR_METATYPE_COMMENT, keyword); - FINISH: +FINISH: return ret; } static int -processIHDR (const char *data, +processIHDR (struct EXTRACTOR_PluginList *plugin, unsigned int length, EXTRACTOR_MetaDataProcessor proc, void *proc_cls) { + unsigned char *data; char tmp[128]; int ret; if (length < 12) return 0; + + if (length != pl_read (plugin, &data, length)) + return 1; + ret = 0; snprintf (tmp, sizeof(tmp), "%ux%u", - htonl (getIntAt (&data[4])), htonl (getIntAt (&data[8]))); + htonl (getIntAt (data)), htonl (getIntAt (&data[4]))); ADD (EXTRACTOR_METATYPE_IMAGE_DIMENSIONS, tmp); - FINISH: +FINISH: return ret; } static int -processzTXt (const char *data, +processzTXt (struct EXTRACTOR_PluginList *plugin, unsigned int length, EXTRACTOR_MetaDataProcessor proc, void *proc_cls) { + unsigned char *data; char *keyword; unsigned int off; int i; @@ -254,7 +266,10 @@ processzTXt (const char *data, int zret; int ret; - data += 4; + if (length != pl_read (plugin, &data, length)) + return 1; + + //data += 4; off = stnlen (data, length) + 1; if (off >= length) return 0; /* failed to find '\0' */ @@ -303,16 +318,17 @@ processzTXt (const char *data, i++; } ADDF (EXTRACTOR_METATYPE_COMMENT, keyword); - FINISH: +FINISH: return ret; } static int -processtIME (const char *data, +processtIME (struct EXTRACTOR_PluginList *plugin, unsigned int length, EXTRACTOR_MetaDataProcessor proc, void *proc_cls) { + unsigned char *data; unsigned short y; unsigned int year; unsigned int mo; @@ -325,8 +341,12 @@ processtIME (const char *data, if (length != 7) return 0; + + if (length != pl_read (plugin, &data, length)) + return 1; + ret = 0; - memcpy (&y, &data[4], sizeof (unsigned short)); + memcpy (&y, data, sizeof (unsigned short)); year = ntohs (y); mo = (unsigned char) data[6]; day = (unsigned char) data[7]; @@ -337,7 +357,7 @@ processtIME (const char *data, sizeof(val), "%04u-%02u-%02u %02d:%02d:%02d", year, mo, day, h, m, s); ADD (EXTRACTOR_METATYPE_MODIFICATION_DATE, val); - FINISH: +FINISH: return ret; } @@ -345,47 +365,55 @@ processtIME (const char *data, -int -EXTRACTOR_png_extract (const char *data, - size_t size, - EXTRACTOR_MetaDataProcessor proc, - void *proc_cls, - const char *options) +int +EXTRACTOR_png_extract_method (struct EXTRACTOR_PluginList *plugin, + EXTRACTOR_MetaDataProcessor proc, void *proc_cls) { - const char *pos; - const char *end; + unsigned char *data; unsigned int length; + int64_t pos; int ret; - if (size < strlen (PNG_HEADER)) - return 0; - if (0 != strncmp (data, PNG_HEADER, strlen (PNG_HEADER))) - return 0; - end = &data[size]; - pos = &data[strlen (PNG_HEADER)]; + if (plugin == NULL) + return 1; + + ret = strlen (PNG_HEADER); + + if (ret != pl_read (plugin, &data, ret)) + return 1; + + if (0 != strncmp (data, PNG_HEADER, ret)) + return 1; + ADD (EXTRACTOR_METATYPE_MIMETYPE, "image/png"); ret = 0; while (ret == 0) { - if (pos + 12 >= end) + if (4 != pl_read (plugin, &data, 4)) break; - length = htonl (getIntAt (pos)); - pos += 4; + length = htonl (getIntAt (data)); /* printf("Length: %u, pos %u\n", length, pos - data); */ - if ((pos + 4 + length + 4 > end) || (pos + 4 + length + 4 < pos + 8)) + if (4 != pl_read (plugin, &data, 4)) + break; + pos = pl_get_pos (plugin); + if (pos <= 0) + break; + pos += length + 4; /* Chunk type, data, crc */ + if (0 == strncmp (data, "IHDR", 4)) + ret = processIHDR (plugin, length, proc, proc_cls); + if (0 == strncmp (data, "iTXt", 4)) + ret = processiTXt (plugin, length, proc, proc_cls); + if (0 == strncmp (data, "tEXt", 4)) + ret = processtEXt (plugin, length, proc, proc_cls); + if (0 == strncmp (data, "zTXt", 4)) + ret = processzTXt (plugin, length, proc, proc_cls); + if (0 == strncmp (data, "tIME", 4)) + ret = processtIME (plugin, length, proc, proc_cls); + if (ret != 0) + break; + if (pos != pl_seek (plugin, pos, SEEK_SET)) break; - if (0 == strncmp (pos, "IHDR", 4)) - ret = processIHDR (pos, length, proc, proc_cls); - if (0 == strncmp (pos, "iTXt", 4)) - ret = processiTXt (pos, length, proc, proc_cls); - if (0 == strncmp (pos, "tEXt", 4)) - ret = processtEXt (pos, length, proc, proc_cls); - if (0 == strncmp (pos, "zTXt", 4)) - ret = processzTXt (pos, length, proc, proc_cls); - if (0 == strncmp (pos, "tIME", 4)) - ret = processtIME (pos, length, proc, proc_cls); - pos += 4 + length + 4; /* Chunk type, data, crc */ } - FINISH: - return ret; +FINISH: + return 1; }