libextractor

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

commit 21d4464f2dd32afe60f3c5cb6d59723f7241a80e
parent 7cd6af4cdfc3b300fe95697883b630bceea2db11
Author: Christian Grothoff <christian@grothoff.org>
Date:   Fri, 18 Dec 2009 17:42:53 +0000

wav

Diffstat:
Msrc/plugins/Makefile.am | 19++++++++++---------
Asrc/plugins/wav_extractor.c | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/plugins/wavextractor.c | 123-------------------------------------------------------------------------------
3 files changed, 134 insertions(+), 132 deletions(-)

diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am @@ -88,7 +88,8 @@ plugin_LTLIBRARIES = \ $(pdf) \ libextractor_real.la \ $(rpm) \ - $(thumbgtk) + $(thumbgtk) \ + libextractor_wav.la libextractor_applefile_la_SOURCES = \ applefile_extractor.c @@ -244,6 +245,14 @@ libextractor_thumbnailgtk_la_LDFLAGS = \ libextractor_thumbnailgtk_la_SOURCES = \ thumbnailgtk_extractor.c +libextractor_wav_la_SOURCES = \ + wav_extractor.c +libextractor_wav_la_LDFLAGS = \ + $(PLUGINFLAGS) +libextractor_wav_la_LIBADD = \ + $(LE_LIBINTL) + + @@ -268,7 +277,6 @@ OLD_LIBS = \ libextractor_tar.la \ libextractor_tiff.la \ $(thumbqt) \ - libextractor_wav.la \ libextractor_xm.la \ libextractor_zip.la @@ -288,13 +296,6 @@ libextractor_ps_la_LDFLAGS = \ libextractor_ps_la_LIBADD = \ $(top_builddir)/src/main/libextractor.la -libextractor_wav_la_SOURCES = \ - wavextractor.c -libextractor_wav_la_LDFLAGS = \ - $(PLUGINFLAGS) -libextractor_wav_la_LIBADD = \ - $(LE_LIBINTL) - libextractor_id3v2_la_SOURCES = \ id3v2extractor.c libextractor_id3v2_la_LDFLAGS = \ diff --git a/src/plugins/wav_extractor.c b/src/plugins/wav_extractor.c @@ -0,0 +1,124 @@ +/* + This file is part of libextractor. + (C) 2004, 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. + + This code was based on bitcollider 0.6.0 + (PD) 2004 The Bitzi Corporation + http://bitzi.com/ + (PD) 2001 The Bitzi Corporation + Please see file COPYING or http://bitzi.com/publicdomain + for more info. +*/ + + +#include "platform.h" +#include "extractor.h" + +#if BIG_ENDIAN_HOST +static short +toLittleEndian16 (short in) +{ + char *ptr = (char *) &in; + + return ((ptr[1] & 0xFF) << 8) | (ptr[0] & 0xFF); +} + +static unsigned int +toLittleEndian32 (unsigned int in) +{ + char *ptr = (char *) &in; + + return ((ptr[3] & 0xFF) << 24) | ((ptr[2] & 0xFF) << 16) | ((ptr[1] & 0xFF) + << 8) | (ptr[0] + & + 0xFF); +} +#endif + + +/* + 16 4 bytes 0x00000010 // Length of the fmt data (16 bytes) + 20 2 bytes 0x0001 // Format tag: 1 = PCM + 22 2 bytes <channels> // Channels: 1 = mono, 2 = stereo + 24 4 bytes <sample rate> // Samples per second: e.g., 44100 +*/ +int +EXTRACTOR_wav_extract (const unsigned char *buf, + size_t bufLen, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls, + const char *options) +{ + unsigned short channels; + unsigned short sampleSize; + unsigned int sampleRate; + unsigned int dataLen; + unsigned int samples; + char scratch[256]; + + if ((bufLen < 44) || + (buf[0] != 'R' || buf[1] != 'I' || + buf[2] != 'F' || buf[3] != 'F' || + buf[8] != 'W' || buf[9] != 'A' || + buf[10] != 'V' || buf[11] != 'E' || + buf[12] != 'f' || buf[13] != 'm' || buf[14] != 't' || buf[15] != ' ')) + return 0; /* not a WAV file */ + + channels = *((unsigned short *) &buf[22]); + sampleRate = *((unsigned int *) &buf[24]); + sampleSize = *((unsigned short *) &buf[34]); + dataLen = *((unsigned int *) &buf[40]); + +#if BIG_ENDIAN_HOST + channels = toLittleEndian16 (channels); + sampleSize = toLittleEndian16 (sampleSize); + sampleRate = toLittleEndian32 (sampleRate); + dataLen = toLittleEndian32 (dataLen); +#endif + + if (sampleSize != 8 && sampleSize != 16) + return 0; /* invalid sample size found in wav file */ + if (channels == 0) + return 0; /* invalid channels value -- avoid division by 0! */ + samples = dataLen / (channels * (sampleSize >> 3)); + + snprintf (scratch, + sizeof (scratch), + "%u ms, %d Hz, %s", + (samples < sampleRate) + ? (samples * 1000 / sampleRate) + : (samples / sampleRate) * 1000, + sampleRate, channels == 1 ? _("mono") : _("stereo")); + if (0 != proc (proc_cls, + "wav", + EXTRACTOR_METATYPE_RESOURCE_TYPE, + EXTRACTOR_METAFORMAT_UTF8, + "text/plain", + scratch, + strlen (scratch) +1)) + return 1; + if (0 != proc (proc_cls, + "wav", + EXTRACTOR_METATYPE_MIMETYPE, + EXTRACTOR_METAFORMAT_UTF8, + "text/plain", + "audio/x-wav", + strlen ("audio/x-wav") +1)) + return 1; + return 0; +} diff --git a/src/plugins/wavextractor.c b/src/plugins/wavextractor.c @@ -1,123 +0,0 @@ -/* - This file is part of libextractor. - (C) 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. - - This code was based on bitcollider 0.6.0 - (PD) 2004 The Bitzi Corporation - http://bitzi.com/ - (PD) 2001 The Bitzi Corporation - Please see file COPYING or http://bitzi.com/publicdomain - for more info. -*/ - - -#include "platform.h" -#include "extractor.h" -#include "pack.h" - -static void -addKeyword (struct EXTRACTOR_Keywords **list, - char *keyword, EXTRACTOR_KeywordType type) -{ - EXTRACTOR_KeywordList *next; - next = malloc (sizeof (EXTRACTOR_KeywordList)); - next->next = *list; - next->keyword = keyword; - next->keywordType = type; - *list = next; -} - -#if BIG_ENDIAN_HOST -static short -toLittleEndian16 (short in) -{ - char *ptr = (char *) &in; - - return ((ptr[1] & 0xFF) << 8) | (ptr[0] & 0xFF); -} - -static unsigned int -toLittleEndian32 (unsigned int in) -{ - char *ptr = (char *) &in; - - return ((ptr[3] & 0xFF) << 24) | ((ptr[2] & 0xFF) << 16) | ((ptr[1] & 0xFF) - << 8) | (ptr[0] - & - 0xFF); -} -#endif - - -/* - 16 4 bytes 0x00000010 // Length of the fmt data (16 bytes) - 20 2 bytes 0x0001 // Format tag: 1 = PCM - 22 2 bytes <channels> // Channels: 1 = mono, 2 = stereo - 24 4 bytes <sample rate> // Samples per second: e.g., 44100 -*/ -struct EXTRACTOR_Keywords * -libextractor_wav_extract (char *filename, - const unsigned char *buf, - size_t bufLen, struct EXTRACTOR_Keywords *prev) -{ - unsigned short channels; - unsigned short sampleSize; - unsigned int sampleRate; - unsigned int dataLen; - unsigned int samples; - char *scratch; - - - if ((bufLen < 44) || - (buf[0] != 'R' || buf[1] != 'I' || - buf[2] != 'F' || buf[3] != 'F' || - buf[8] != 'W' || buf[9] != 'A' || - buf[10] != 'V' || buf[11] != 'E' || - buf[12] != 'f' || buf[13] != 'm' || buf[14] != 't' || buf[15] != ' ')) - return prev; /* not a WAV file */ - - channels = *((unsigned short *) &buf[22]); - sampleRate = *((unsigned int *) &buf[24]); - sampleSize = *((unsigned short *) &buf[34]); - dataLen = *((unsigned int *) &buf[40]); - -#if BIG_ENDIAN_HOST - channels = toLittleEndian16 (channels); - sampleSize = toLittleEndian16 (sampleSize); - sampleRate = toLittleEndian32 (sampleRate); - dataLen = toLittleEndian32 (dataLen); -#endif - - if (sampleSize != 8 && sampleSize != 16) - return prev; /* invalid sample size found in wav file */ - if (channels == 0) - return prev; /* invalid channels value -- avoid division by 0! */ - samples = dataLen / (channels * (sampleSize >> 3)); - - scratch = malloc (256); - snprintf (scratch, - 256, - "%u ms, %d Hz, %s", - (samples < sampleRate) - ? (samples * 1000 / sampleRate) - : (samples / sampleRate) * 1000, - sampleRate, channels == 1 ? _("mono") : _("stereo")); - addKeyword (&prev, scratch, EXTRACTOR_FORMAT); - addKeyword (&prev, strdup ("audio/x-wav"), EXTRACTOR_MIMETYPE); - return prev; -}