libextractor

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

commit c21fafc7b640836719597b425a7e598524137575
parent fe641c0d363f2bcb75cef8d7b67e44f4d972ba47
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat, 19 Dec 2009 12:32:34 +0000

sid

Diffstat:
Msrc/include/extractor.h | 4++--
Msrc/main/extractor_metatypes.c | 14++++++++++++--
Msrc/plugins/Makefile.am | 14++++++--------
Asrc/plugins/sid_extractor.c | 191+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/plugins/sidextractor.c | 234-------------------------------------------------------------------------------
5 files changed, 211 insertions(+), 246 deletions(-)

diff --git a/src/include/extractor.h b/src/include/extractor.h @@ -283,6 +283,8 @@ enum EXTRACTOR_MetaType EXTRACTOR_METATYPE_TV_NETWORK_NAME = 151, EXTRACTOR_METATYPE_TV_SHOW_NAME = 152, EXTRACTOR_METATYPE_CHAPTER_NAME = 153, + EXTRACTOR_METATYPE_SONG_COUNT = 154, + EXTRACTOR_METATYPE_STARTING_SONG = 155, /* fixme: used up to here! */ @@ -290,8 +292,6 @@ enum EXTRACTOR_MetaType EXTRACTOR_METATYPE_CONDUCTOR = 64, EXTRACTOR_METATYPE_INTERPRET = 65, EXTRACTOR_METATYPE_MUSIC_CD_IDENTIFIER = 117, - EXTRACTOR_METATYPE_SONG_COUNT = 127, - EXTRACTOR_METATYPE_STARTING_SONG = 128, EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST = 123, diff --git a/src/main/extractor_metatypes.c b/src/main/extractor_metatypes.c @@ -217,7 +217,7 @@ static const struct MetaTypeDescription meta_type_descriptions[] = { { gettext_noop ("is essential"), gettext_noop ("package is marked as essential") }, { gettext_noop ("target architecture"), - gettext_noop ("hardware architecture the package can be used for") }, + gettext_noop ("hardware architecture the contents can be used for") }, { gettext_noop ("pre-dependency"), gettext_noop ("dependency that must be satisfied before installation") }, /* 85 */ @@ -375,6 +375,17 @@ static const struct MetaTypeDescription meta_type_descriptions[] = { gettext_noop ("name of the TV show") }, { gettext_noop ("chapter name"), gettext_noop ("name of the chapter") }, + { gettext_noop ("song count"), + gettext_noop ("number of songs") }, + /* 155 */ + { gettext_noop ("starting song"), + gettext_noop ("number of the first song to play") }, + { gettext_noop (""), + gettext_noop ("") }, + { gettext_noop (""), + gettext_noop ("") }, + { gettext_noop (""), + gettext_noop ("") }, { gettext_noop (""), gettext_noop ("") }, { gettext_noop (""), @@ -498,7 +509,6 @@ static const struct MetaTypeDescription meta_type_descriptions[] = { gettext_noop("format version"), /* 125 */ gettext_noop("television system"), gettext_noop("song count"), - gettext_noop("starting song"), gettext_noop("hardware dependency"), gettext_noop("ripper"), /* 130 */ gettext_noop("filesize"), diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am @@ -93,6 +93,7 @@ plugin_LTLIBRARIES = \ libextractor_real.la \ libextractor_riff.la \ $(rpm) \ + libextractor_sid.la \ libextractor_tar.la \ $(thumbgtk) \ libextractor_tiff.la \ @@ -280,6 +281,11 @@ libextractor_rpm_la_LDFLAGS = \ libextractor_rpm_la_LIBADD = \ -lrpm +libextractor_sid_la_SOURCES = \ + sid_extractor.c +libextractor_sid_la_LDFLAGS = \ + $(PLUGINFLAGS) + libextractor_tar_la_SOURCES = \ tar_extractor.c libextractor_tar_la_LDFLAGS = \ @@ -335,7 +341,6 @@ OLD_LIBS = \ libextractor_nsf.la \ libextractor_nsfe.la \ libextractor_s3m.la \ - libextractor_sid.la \ libextractor_tar.la \ $(thumbqt) \ libextractor_xm.la \ @@ -364,13 +369,6 @@ libextractor_id3v24_la_LIBADD = \ $(top_builddir)/src/common/libextractor_common.la -libextractor_sid_la_SOURCES = \ - sidextractor.c -libextractor_sid_la_LDFLAGS = \ - $(PLUGINFLAGS) -libextractor_sid_la_LIBADD = \ - $(top_builddir)/src/main/libextractor.la - libextractor_nsf_la_SOURCES = \ nsfextractor.c libextractor_nsf_la_LDFLAGS = \ diff --git a/src/plugins/sid_extractor.c b/src/plugins/sid_extractor.c @@ -0,0 +1,191 @@ +/* + * This file is part of libextractor. + * (C) 2006, 2007 Toni Ruottu + * + * 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 SID1_HEADER_SIZE 0x76 +#define SID2_HEADER_SIZE 0x7c + +/* flags */ + +#define MUSPLAYER_FLAG 0x01 +#define PLAYSID_FLAG 0x02 +#define PAL_FLAG 0x04 +#define NTSC_FLAG 0x08 +#define MOS6581_FLAG 0x10 +#define MOS8580_FLAG 0x20 + +typedef char sidwrd[2]; +typedef char sidlongwrd[4]; + +struct header +{ + char magicid[4]; + sidwrd sidversion; + sidwrd dataoffset; + sidwrd loadaddr; + sidwrd initaddr; + sidwrd playaddr; + sidwrd songs; + sidwrd firstsong; + sidlongwrd speed; + char title[32]; + char artist[32]; + char copyright[32]; + sidwrd flags; /* version 2 specific fields start */ + char startpage; + char pagelength; + sidwrd reserved; +}; + +static int +sidword (const sidwrd data) +{ + int value = (unsigned char) data[0] * 0x100 + (unsigned char) data[1]; + return value; + +} + +#define ADD(s,t) do { if (0 != proc (proc_cls, "sid", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0) + +/* "extract" keyword from a SID file + * + * This plugin is based on the nsf extractor + * + */ + +int +EXTRACTOR_sid_extract (const char *data, + size_t size, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls, + const char *options) +{ + unsigned int flags; + int version; + char album[33]; + char artist[33]; + char copyright[33]; + char songs[32]; + char startingsong[32]; + char sidversion[32]; + const struct header *head; + + /* Check header size */ + + if (size < SID1_HEADER_SIZE) + return 0; + head = (const struct header *) data; + + /* Check "magic" id bytes */ + if (memcmp (head->magicid, "PSID", 4) && + memcmp (head->magicid, "RSID", 4)) + return 0; + + /* Mime-type */ + ADD ("audio/prs.sid", EXTRACTOR_METATYPE_MIMETYPE); + + /* Version of SID format */ + version = sidword (head->sidversion); + snprintf (sidversion, + sizeof(sidversion), + "%d", + version); + ADD (sidversion, EXTRACTOR_METATYPE_FORMAT_VERSION); + + /* Get song count */ + snprintf (songs, + sizeof(songs), + "%d", sidword (head->songs)); + ADD (songs, EXTRACTOR_METATYPE_SONG_COUNT); + + /* Get number of the first song to be played */ + snprintf (startingsong, + sizeof(startingsong), + "%d", + sidword (head->firstsong)); + ADD (startingsong, EXTRACTOR_METATYPE_STARTING_SONG); + + + /* name, artist, copyright fields */ + memcpy (&album, head->title, 32); + album[32] = '\0'; + ADD (album, EXTRACTOR_METATYPE_ALBUM); + + memcpy (&artist, head->artist, 32); + artist[32] = '\0'; + ADD (artist, EXTRACTOR_METATYPE_ARTIST); + + memcpy (&copyright, head->copyright, 32); + copyright[32] = '\0'; + ADD (copyright, EXTRACTOR_METATYPE_COPYRIGHT); + + + if ( (version < 2) || (size < SID2_HEADER_SIZE)) + return 0; + + /* Version 2 specific options follow + * + * Note: Had some troubles understanding specification + * on the flags in version 2. I hope this is correct. + */ + flags = sidword (head->flags); + /* MUS data */ + if (flags & MUSPLAYER_FLAG) + ADD ("Compute!'s Sidplayer", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE); + + /* PlaySID data */ + if (flags & PLAYSID_FLAG) + ADD ("PlaySID", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE); + + + /* PAL or NTSC */ + + if (flags & PAL_FLAG) + { + if (flags & NTSC_FLAG) + ADD ("PAL/NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + else + ADD ("PAL", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + } + else + { + if (flags & NTSC_FLAG) + ADD ("NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + } + + /* Detect SID Chips suitable for play the files */ + if (flags & MOS6581_FLAG) + { + if (flags & MOS8580_FLAG) + ADD ("MOS6581/MOS8580", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + else + ADD ("MOS6581", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + } + else + { + if (flags & MOS8580_FLAG) + ADD ("MOS8580", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + } + + return 0; +} diff --git a/src/plugins/sidextractor.c b/src/plugins/sidextractor.c @@ -1,234 +0,0 @@ -/* - * This file is part of libextractor. - * (C) 2006, 2007 Toni Ruottu - * - * 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 "convert.h" - - -#define SID1_HEADER_SIZE 0x76 -#define SID2_HEADER_SIZE 0x7c - -/* flags */ - -#define MUSPLAYER_FLAG 0x01 -#define PLAYSID_FLAG 0x02 -#define PAL_FLAG 0x04 -#define NTSC_FLAG 0x08 -#define MOS6581_FLAG 0x10 -#define MOS8580_FLAG 0x20 - -typedef char sidwrd[2]; -typedef char sidlongwrd[4]; - -struct header -{ - char magicid[4]; - sidwrd sidversion; - sidwrd dataoffset; - sidwrd loadaddr; - sidwrd initaddr; - sidwrd playaddr; - sidwrd songs; - sidwrd firstsong; - sidlongwrd speed; - char title[32]; - char artist[32]; - char copyright[32]; - sidwrd flags; /* version 2 specific fields start */ - char startpage; - char pagelength; - sidwrd reserved; -}; - -int -sidword (sidwrd data) -{ - int value = (unsigned char) data[0] * 0x100 + (unsigned char) data[1]; - - return (value); - -} - -static struct EXTRACTOR_Keywords *addkword - (EXTRACTOR_KeywordList * oldhead, - const char *phrase, EXTRACTOR_KeywordType type) -{ - EXTRACTOR_KeywordList *keyword; - - keyword = malloc (sizeof (EXTRACTOR_KeywordList)); - keyword->next = oldhead; - keyword->keyword = strdup (phrase); - keyword->keywordType = type; - return (keyword); -} - - -/* "extract" keyword from a SID file - * - * This plugin is based on the nsf extractor - * - */ -struct EXTRACTOR_Keywords *libextractor_sid_extract - (const char *filename, - char *data, size_t size, struct EXTRACTOR_Keywords *prev) -{ - unsigned int flags; - int version; - char album[33]; - char artist[33]; - char copyright[33]; - char songs[32]; - char startingsong[32]; - char sidversion[32]; - struct header *head; - - /* Check header size */ - - if (size < SID1_HEADER_SIZE) - { - return (prev); - } - - head = (struct header *) data; - - /* Check "magic" id bytes */ - - if (memcmp (head->magicid, "PSID", 4) && memcmp (head->magicid, "RSID", 4)) - { - return (prev); - } - - - /* Mime-type */ - - prev = addkword (prev, "audio/prs.sid", EXTRACTOR_MIMETYPE); - - - /* Version of SID format */ - - version = sidword (head->sidversion); - sprintf (sidversion, "%d", version); - prev = addkword (prev, sidversion, EXTRACTOR_FORMAT_VERSION); - - - /* Get song count */ - - sprintf (songs, "%d", sidword (head->songs)); - prev = addkword (prev, songs, EXTRACTOR_SONG_COUNT); - - - /* Get number of the first song to be played */ - - sprintf (startingsong, "%d", sidword (head->firstsong)); - prev = addkword (prev, startingsong, EXTRACTOR_STARTING_SONG); - - - /* name, artist, copyright fields */ - - memcpy (&album, head->title, 32); - memcpy (&artist, head->artist, 32); - memcpy (&copyright, head->copyright, 32); - - album[32] = '\0'; - artist[32] = '\0'; - copyright[32] = '\0'; - - prev = addkword (prev, album, EXTRACTOR_ALBUM); - prev = addkword (prev, artist, EXTRACTOR_ARTIST); - prev = addkword (prev, copyright, EXTRACTOR_COPYRIGHT); - - - if (version < 2 || size < SID2_HEADER_SIZE) - { - return (prev); - } - - /* Version 2 specific options follow - * - * Note: Had some troubles understanding specification - * on the flags in version 2. I hope this is correct. - * - */ - - flags = sidword (head->flags); - - - /* MUS data */ - - if (flags & MUSPLAYER_FLAG) - { - prev = addkword (prev, "Compute!'s Sidplayer", EXTRACTOR_DEPENDENCY); - } - - /* PlaySID data */ - - if (flags & PLAYSID_FLAG) - { - prev = addkword (prev, "PlaySID", EXTRACTOR_DEPENDENCY); - } - - - /* PAL or NTSC */ - - if (flags & PAL_FLAG) - { - if (flags & NTSC_FLAG) - { - prev = addkword (prev, "PAL/NTSC", EXTRACTOR_TELEVISION_SYSTEM); - } - else - { - prev = addkword (prev, "PAL", EXTRACTOR_TELEVISION_SYSTEM); - } - } - else - { - if (flags & NTSC_FLAG) - { - prev = addkword (prev, "NTSC", EXTRACTOR_TELEVISION_SYSTEM); - } - } - - /* Detect SID Chips suitable for play the files */ - - if (flags & MOS6581_FLAG) - { - if (flags & MOS8580_FLAG) - { - prev = - addkword (prev, "MOS6581/MOS8580", EXTRACTOR_HARDWARE_DEPENDENCY); - } - else - { - prev = addkword (prev, "MOS6581", EXTRACTOR_HARDWARE_DEPENDENCY); - } - } - else - { - if (flags & MOS8580_FLAG) - { - prev = addkword (prev, "MOS8580", EXTRACTOR_HARDWARE_DEPENDENCY); - } - } - - return (prev); -}