gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r23241 - in Extractor: po src/plugins src/plugins/old


From: gnunet
Subject: [GNUnet-SVN] r23241 - in Extractor: po src/plugins src/plugins/old
Date: Wed, 15 Aug 2012 01:02:50 +0200

Author: grothoff
Date: 2012-08-15 01:02:49 +0200 (Wed, 15 Aug 2012)
New Revision: 23241

Added:
   Extractor/src/plugins/old/
   Extractor/src/plugins/old/applefile_extractor.c
   Extractor/src/plugins/old/asf_extractor.c
   Extractor/src/plugins/old/dvi_extractor.c
   Extractor/src/plugins/old/ebml_extractor.c
   Extractor/src/plugins/old/elf_extractor.c
   Extractor/src/plugins/old/flv_extractor.c
   Extractor/src/plugins/old/html_extractor.c
   Extractor/src/plugins/old/id3_extractor.c
   Extractor/src/plugins/old/id3v2_extractor.c
   Extractor/src/plugins/old/man_extractor.c
   Extractor/src/plugins/old/mkv_extractor.c
   Extractor/src/plugins/old/mp3_extractor.c
   Extractor/src/plugins/old/ps_extractor.c
   Extractor/src/plugins/old/qt_extractor.c
   Extractor/src/plugins/old/real_extractor.c
   Extractor/src/plugins/old/riff_extractor.c
   Extractor/src/plugins/old/tar_extractor.c
   Extractor/src/plugins/old/thumbnailffmpeg_extractor.c
   Extractor/src/plugins/old/thumbnailgtk_extractor.c
   Extractor/src/plugins/old/tiff_extractor.c
   Extractor/src/plugins/wav_extractor.c
Removed:
   Extractor/src/plugins/applefile_extractor.c
   Extractor/src/plugins/asf_extractor.c
   Extractor/src/plugins/dvi_extractor.c
   Extractor/src/plugins/ebml_extractor.c
   Extractor/src/plugins/elf_extractor.c
   Extractor/src/plugins/flv_extractor.c
   Extractor/src/plugins/html_extractor.c
   Extractor/src/plugins/id3_extractor.c
   Extractor/src/plugins/id3v2_extractor.c
   Extractor/src/plugins/man_extractor.c
   Extractor/src/plugins/mkv_extractor.c
   Extractor/src/plugins/mp3_extractor.c
   Extractor/src/plugins/ps_extractor.c
   Extractor/src/plugins/qt_extractor.c
   Extractor/src/plugins/real_extractor.c
   Extractor/src/plugins/riff_extractor.c
   Extractor/src/plugins/tar_extractor.c
   Extractor/src/plugins/thumbnailffmpeg_extractor.c
   Extractor/src/plugins/thumbnailgtk_extractor.c
   Extractor/src/plugins/tiff_extractor.c
   Extractor/src/plugins/wav_extractor.c
Modified:
   Extractor/po/POTFILES.in
   Extractor/po/de.po
   Extractor/po/fr.po
   Extractor/po/ga.po
   Extractor/po/it.po
   Extractor/po/libextractor.pot
   Extractor/po/nl.po
   Extractor/po/ro.po
   Extractor/po/rw.po
   Extractor/po/sv.po
   Extractor/po/uk.po
   Extractor/po/vi.po
Log:
moving plugins that currently do not compile to 'old' directory

Modified: Extractor/po/POTFILES.in
===================================================================
--- Extractor/po/POTFILES.in    2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/POTFILES.in    2012-08-14 23:02:49 UTC (rev 23241)
@@ -20,24 +20,12 @@
 src/main/getopt.c
 src/main/iconv.c
 src/main/test2_extractor.c
-src/plugins/applefile_extractor.c
-src/plugins/asf_extractor.c
 src/plugins/deb_extractor.c
-src/plugins/dvi_extractor.c
-src/plugins/ebml_extractor.c
-src/plugins/elf_extractor.c
 src/plugins/flac_extractor.c
-src/plugins/flv_extractor.c
 src/plugins/gif_extractor.c
-src/plugins/html_extractor.c
-src/plugins/id3_extractor.c
-src/plugins/id3v2_extractor.c
 src/plugins/it_extractor.c
 src/plugins/jpeg_extractor.c
-src/plugins/man_extractor.c
 src/plugins/mime_extractor.c
-src/plugins/mkv_extractor.c
-src/plugins/mp3_extractor.c
 src/plugins/mpeg_extractor.c
 src/plugins/nsfe_extractor.c
 src/plugins/nsf_extractor.c
@@ -45,18 +33,10 @@
 src/plugins/ogg_extractor.c
 src/plugins/ole2_extractor.c
 src/plugins/png_extractor.c
-src/plugins/ps_extractor.c
-src/plugins/qt_extractor.c
-src/plugins/real_extractor.c
-src/plugins/riff_extractor.c
 src/plugins/rpm_extractor.c
 src/plugins/s3m_extractor.c
 src/plugins/sid_extractor.c
-src/plugins/tar_extractor.c
 src/plugins/template_extractor.c
-src/plugins/thumbnailffmpeg_extractor.c
-src/plugins/thumbnailgtk_extractor.c
-src/plugins/tiff_extractor.c
 src/plugins/wav_extractor.c
 src/plugins/xm_extractor.c
 src/plugins/zip_extractor.c

Modified: Extractor/po/de.po
===================================================================
--- Extractor/po/de.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/de.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.5.14\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2007-03-23 23:16+0100\n"
 "Last-Translator: Nils Durner <address@hidden>\n"
 "Language-Team: German <address@hidden>\n"
@@ -533,7 +533,7 @@
 msgid "description"
 msgstr "Beschreibung"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "Copyright"
 
@@ -1610,806 +1610,591 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: Option »-W %s« erwartet kein Argument\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "Bytes"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blues"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr "No Proofing"
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Klassischer Rock"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Traditional Chinese"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "Country"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Simplified Chinese"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Dance"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Schweizerdeutsch"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Disco"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "U.S. Englisch"
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Funk"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Britsches Englisch"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Grunge"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Australisches Englisch"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hip-Hop"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Jazz"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Mexikanisches Spanisch"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Metal"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Belgisches Französisch"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "New Age"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Kanadisches Französisch"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Oldies"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Schweizer Französisch"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Sonstiges"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Schweizer Italienisch"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pop"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Belgisches Holländisch"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "R&B"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rock"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Techno"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Industriell"
+#: src/plugins/ole2_extractor.c:578
+#, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Alternative"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "Mono"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "Stereo"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Death Metal"
+#~ msgid "Bytes"
+#~ msgstr "Bytes"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Pranks"
+#~ msgid "Blues"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Filmmusik (Soundtrack)"
+#~ msgid "Classic Rock"
+#~ msgstr "Klassischer Rock"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Euro-Techno"
+#, fuzzy
+#~ msgid "Country"
+#~ msgstr "Country"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Ambient"
+#~ msgid "Dance"
+#~ msgstr "Dance"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Trip-Hop"
+#~ msgid "Disco"
+#~ msgstr "Disco"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Vokal"
+#~ msgid "Funk"
+#~ msgstr "Funk"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Jazz+Funk"
+#~ msgid "Grunge"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Fusion"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hip-Hop"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Trance"
+#~ msgid "Jazz"
+#~ msgstr "Jazz"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Klassik"
+#~ msgid "Metal"
+#~ msgstr "Metal"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Instrumental"
+#~ msgid "New Age"
+#~ msgstr "New Age"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Acid"
+#~ msgid "Oldies"
+#~ msgstr "Oldies"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "House"
+#~ msgid "Other"
+#~ msgstr "Sonstiges"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Spiel"
+#~ msgid "Pop"
+#~ msgstr "Pop"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Soundclip"
+#~ msgid "R&B"
+#~ msgstr "R&B"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Gospel"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Noise"
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Alt. Rock"
+#~ msgid "Rock"
+#~ msgstr "Rock"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Bass"
+#~ msgid "Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Soul"
+#~ msgid "Industrial"
+#~ msgstr "Industriell"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punk"
+#~ msgid "Alternative"
+#~ msgstr "Alternative"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Space"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "Meditative"
+#~ msgid "Death Metal"
+#~ msgstr "Death Metal"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Instrumental Pop"
+#~ msgid "Pranks"
+#~ msgstr "Pranks"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Instrumental Rock"
+#~ msgid "Soundtrack"
+#~ msgstr "Filmmusik (Soundtrack)"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Ethnic"
+#~ msgid "Euro-Techno"
+#~ msgstr "Euro-Techno"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gothic"
+#~ msgid "Ambient"
+#~ msgstr "Ambient"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Darkwave"
+#~ msgid "Trip-Hop"
+#~ msgstr "Trip-Hop"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Techno-Industrial"
+#~ msgid "Vocal"
+#~ msgstr "Vokal"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Electronic"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Jazz+Funk"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pop-Folk"
+#~ msgid "Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Eurodance"
+#~ msgid "Trance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Dream"
+#~ msgid "Classical"
+#~ msgstr "Klassik"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Southern Rock"
+#~ msgid "Instrumental"
+#~ msgstr "Instrumental"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Comedy"
+#~ msgid "Acid"
+#~ msgstr "Acid"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Cult"
+#~ msgid "House"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Gangsta Rap"
+#~ msgid "Game"
+#~ msgstr "Spiel"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Top 40"
+#~ msgid "Sound Clip"
+#~ msgstr "Soundclip"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Christian Rap"
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pop/Funk"
+#~ msgid "Noise"
+#~ msgstr "Noise"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Jungle"
+#~ msgid "Alt. Rock"
+#~ msgstr "Alt. Rock"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Native American"
+#~ msgid "Bass"
+#~ msgstr "Bass"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Cabaret"
+#~ msgid "Soul"
+#~ msgstr "Soul"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "New Wave"
+#~ msgid "Punk"
+#~ msgstr "Punk"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Psychedelic"
+#~ msgid "Space"
+#~ msgstr "Space"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rave"
+#~ msgid "Meditative"
+#~ msgstr "Meditative"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Showtunes"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Instrumental Pop"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Trailer"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Instrumental Rock"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "Lo-Fi"
+#~ msgid "Ethnic"
+#~ msgstr "Ethnic"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Tribal"
+#~ msgid "Gothic"
+#~ msgstr "Gothic"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Acid Punk"
+#~ msgid "Darkwave"
+#~ msgstr "Darkwave"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Techno-Industrial"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polka"
+#~ msgid "Electronic"
+#~ msgstr "Electronic"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Retro"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pop-Folk"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Musical"
+#~ msgid "Eurodance"
+#~ msgstr "Eurodance"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rock & Roll"
+#~ msgid "Dream"
+#~ msgstr "Dream"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Hard Rock"
+#~ msgid "Southern Rock"
+#~ msgstr "Southern Rock"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Folk"
+#~ msgid "Comedy"
+#~ msgstr "Comedy"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Folk/Rock"
+#~ msgid "Cult"
+#~ msgstr "Cult"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "National Folk"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Gangsta Rap"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Swing"
+#~ msgid "Top 40"
+#~ msgstr "Top 40"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Fast-Fusion"
+#~ msgid "Christian Rap"
+#~ msgstr "Christian Rap"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bebob"
+#~ msgid "Pop/Funk"
+#~ msgstr "Pop/Funk"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-#, fuzzy
-msgid "Latin"
-msgstr "Latin"
+#~ msgid "Jungle"
+#~ msgstr "Jungle"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Revival"
+#~ msgid "Native American"
+#~ msgstr "Native American"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Celtic"
+#~ msgid "Cabaret"
+#~ msgstr "Cabaret"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#~ msgid "New Wave"
+#~ msgstr "New Wave"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avantgarde"
+#~ msgid "Psychedelic"
+#~ msgstr "Psychedelic"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Gothic Rock"
+#~ msgid "Rave"
+#~ msgstr "Rave"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Progressive Rock"
+#~ msgid "Showtunes"
+#~ msgstr "Showtunes"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Psychedelic Rock"
+#~ msgid "Trailer"
+#~ msgstr "Trailer"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Symphonic Rock"
+#~ msgid "Lo-Fi"
+#~ msgstr "Lo-Fi"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Slow Rock"
+#~ msgid "Tribal"
+#~ msgstr "Tribal"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Big Band"
+#~ msgid "Acid Punk"
+#~ msgstr "Acid Punk"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Chor"
+#~ msgid "Acid Jazz"
+#~ msgstr "Acid Jazz"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "Easy Listening"
+#~ msgid "Polka"
+#~ msgstr "Polka"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Acoustic"
+#~ msgid "Retro"
+#~ msgstr "Retro"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Humor"
+#~ msgid "Musical"
+#~ msgstr "Musical"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Sprache"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rock & Roll"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Chanson"
+#~ msgid "Hard Rock"
+#~ msgstr "Hard Rock"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Oper"
+#~ msgid "Folk"
+#~ msgstr "Folk"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Kammermusik"
+#~ msgid "Folk/Rock"
+#~ msgstr "Folk/Rock"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Sonate"
+#~ msgid "National Folk"
+#~ msgstr "National Folk"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Symphonie"
+#~ msgid "Swing"
+#~ msgstr "Swing"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Booty Bass"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Fast-Fusion"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Primus"
+#~ msgid "Bebob"
+#~ msgstr "Bebob"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Porn Groove"
+#, fuzzy
+#~ msgid "Latin"
+#~ msgstr "Latin"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Satire"
+#~ msgid "Revival"
+#~ msgstr "Revival"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Slow Jam"
+#~ msgid "Celtic"
+#~ msgstr "Celtic"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
+#~ msgid "Bluegrass"
+#~ msgstr "Bluegrass"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tango"
+#~ msgid "Avantgarde"
+#~ msgstr "Avantgarde"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
+#~ msgid "Gothic Rock"
+#~ msgstr "Gothic Rock"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Folklore"
+#~ msgid "Progressive Rock"
+#~ msgstr "Progressive Rock"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Ballad"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Psychedelic Rock"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Power Ballad"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Symphonic Rock"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Rhythmic Soul"
+#~ msgid "Slow Rock"
+#~ msgstr "Slow Rock"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Freestyle"
+#~ msgid "Big Band"
+#~ msgstr "Big Band"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Duet"
+#~ msgid "Chorus"
+#~ msgstr "Chor"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punk Rock"
+#~ msgid "Easy Listening"
+#~ msgstr "Easy Listening"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Drum Solo"
+#~ msgid "Acoustic"
+#~ msgstr "Acoustic"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "A cappella"
+#~ msgid "Humour"
+#~ msgstr "Humor"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Euro-House"
+#~ msgid "Speech"
+#~ msgstr "Sprache"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Dance Hall"
+#~ msgid "Chanson"
+#~ msgstr "Chanson"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Opera"
+#~ msgstr "Oper"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Drum & Bass"
+#~ msgid "Chamber Music"
+#~ msgstr "Kammermusik"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Club-House"
+#~ msgid "Sonata"
+#~ msgstr "Sonate"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Hardcore"
+#~ msgid "Symphony"
+#~ msgstr "Symphonie"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Terror"
+#~ msgid "Booty Bass"
+#~ msgstr "Booty Bass"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Indie"
+#~ msgid "Primus"
+#~ msgstr "Primus"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "BritPop"
+#~ msgid "Porn Groove"
+#~ msgstr "Porn Groove"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Negerpunk"
+#~ msgid "Satire"
+#~ msgstr "Satire"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Polsk Punk"
+#~ msgid "Slow Jam"
+#~ msgstr "Slow Jam"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Beat"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Christian Gangsta Rap"
+#~ msgid "Tango"
+#~ msgstr "Tango"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Heavy Metal"
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Black Metal"
+#~ msgid "Folklore"
+#~ msgstr "Folklore"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Crossover"
+#~ msgid "Ballad"
+#~ msgstr "Ballad"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Contemporary Christian"
+#~ msgid "Power Ballad"
+#~ msgstr "Power Ballad"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Christlicher Rock"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Rhythmic Soul"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Merengue"
+#~ msgid "Freestyle"
+#~ msgstr "Freestyle"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "Duet"
+#~ msgstr "Duet"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Thrash Metal"
+#~ msgid "Punk Rock"
+#~ msgstr "Punk Rock"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "Anime"
+#~ msgid "Drum Solo"
+#~ msgstr "Drum Solo"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "JPop"
+#~ msgid "A Cappella"
+#~ msgstr "A cappella"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Synthpop"
+#~ msgid "Euro-House"
+#~ msgstr "Euro-House"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Befehle"
+#~ msgid "Dance Hall"
+#~ msgstr "Dance Hall"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Systemaufrufe"
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Bibliotheksaufrufe"
+#~ msgid "Drum & Bass"
+#~ msgstr "Drum & Bass"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Spezialdateien"
+#~ msgid "Club-House"
+#~ msgstr "Club-House"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Dateiformate und -konventionen"
+#~ msgid "Hardcore"
+#~ msgstr "Hardcore"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Spiele"
+#~ msgid "Terror"
+#~ msgstr "Terror"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Konventionen und Sonstiges"
+#~ msgid "Indie"
+#~ msgstr "Indie"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Befehle zur Systemkonfiguration"
+#~ msgid "BritPop"
+#~ msgstr "BritPop"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Kernelroutinen"
+#~ msgid "Negerpunk"
+#~ msgstr "Negerpunk"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "Stereo"
+#~ msgid "Polsk Punk"
+#~ msgstr "Polsk Punk"
 
-#: src/plugins/mp3_extractor.c:96
-#, fuzzy
-msgid "joint stereo"
-msgstr "Stereo"
+#~ msgid "Beat"
+#~ msgstr "Beat"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Christian Gangsta Rap"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "Mono"
+#~ msgid "Heavy Metal"
+#~ msgstr "Heavy Metal"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
+#~ msgid "Black Metal"
+#~ msgstr "Black Metal"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
+#~ msgid "Crossover"
+#~ msgstr "Crossover"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
+#~ msgid "Contemporary Christian"
+#~ msgstr "Contemporary Christian"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
+#~ msgid "Christian Rock"
+#~ msgstr "Christlicher Rock"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
+#~ msgid "Merengue"
+#~ msgstr "Merengue"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
+#~ msgid "Thrash Metal"
+#~ msgstr "Thrash Metal"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
+#~ msgid "Anime"
+#~ msgstr "Anime"
 
-#: src/plugins/mp3_extractor.c:206
-#, fuzzy
-msgid "no copyright"
-msgstr "Copyright"
+#~ msgid "JPop"
+#~ msgstr "JPop"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
+#~ msgid "Synthpop"
+#~ msgstr "Synthpop"
 
-#: src/plugins/mp3_extractor.c:207
-#, fuzzy
-msgid "copy"
-msgstr "Unternehmen"
+#~ msgid "Commands"
+#~ msgstr "Befehle"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr "No Proofing"
+#~ msgid "System calls"
+#~ msgstr "Systemaufrufe"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Traditional Chinese"
+#~ msgid "Library calls"
+#~ msgstr "Bibliotheksaufrufe"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Simplified Chinese"
+#~ msgid "Special files"
+#~ msgstr "Spezialdateien"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Schweizerdeutsch"
+#~ msgid "File formats and conventions"
+#~ msgstr "Dateiformate und -konventionen"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "U.S. Englisch"
+#~ msgid "Games"
+#~ msgstr "Spiele"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Britsches Englisch"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Konventionen und Sonstiges"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Australisches Englisch"
+#~ msgid "System management commands"
+#~ msgstr "Befehle zur Systemkonfiguration"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr ""
+#~ msgid "Kernel routines"
+#~ msgstr "Kernelroutinen"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Mexikanisches Spanisch"
+#, fuzzy
+#~ msgid "joint stereo"
+#~ msgstr "Stereo"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Belgisches Französisch"
+#, fuzzy
+#~ msgid "no copyright"
+#~ msgstr "Copyright"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Kanadisches Französisch"
+#, fuzzy
+#~ msgid "copy"
+#~ msgstr "Unternehmen"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Schweizer Französisch"
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "Codec: %s, %u fps, %u ms"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Schweizer Italienisch"
-
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Belgisches Holländisch"
-
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:578
-#, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr ""
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "Codec: %s, %u fps, %u ms"
-
 #, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u Punkte je Zentimeter?"

Modified: Extractor/po/fr.po
===================================================================
--- Extractor/po/fr.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/fr.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: libextractor-0.5.20a\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2008-08-24 19:08+0100\n"
 "Last-Translator: Nicolas Provost <address@hidden>\n"
 "Language-Team: French <address@hidden>\n"
@@ -531,7 +531,7 @@
 msgid "description"
 msgstr "description"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "copyright"
 
@@ -1604,828 +1604,553 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: l'option `-W %s' ne prend pas d'argument\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "Go"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "Mo"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "Ko"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "Octets"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blues"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Rock classique"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Traditionnel Chinois"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "Country"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Dance"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Allemand (Suisse)"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Disco"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "Anglais (US)"
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Funk"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Anglais"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Grunge"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Anglais (Australie)"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hip-Hop"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr "Espagnol (castillan)"
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Jazz"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Espagnol (mexicain)"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Metal"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Français (Belgique)"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "New Age"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Français (Canada)"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Oldies"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Français (Suisse)"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Autre"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Italien (Suisse)"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pop"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Allemand (Belgique)"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "R&B"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Bokmal (Norvège)"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr "Rhaeto-Romanic"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr "Serbo-Croate (latin)"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rock"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr "Serbo-Croate (cyrillique)"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Techno"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Farsi"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Industrial"
+#: src/plugins/ole2_extractor.c:578
+#, fuzzy, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr "Révision #%u: Auteur '%s' sur '%s'"
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Alternative"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "mono"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "stereo"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Death Metal"
+#~ msgid "GB"
+#~ msgstr "Go"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Pranks"
+#~ msgid "MB"
+#~ msgstr "Mo"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-#, fuzzy
-msgid "Soundtrack"
-msgstr "Sonate"
+#~ msgid "KB"
+#~ msgstr "Ko"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-#, fuzzy
-msgid "Euro-Techno"
-msgstr "Techno"
+#~ msgid "Bytes"
+#~ msgstr "Octets"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr ""
+#~ msgid "Blues"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
+#~ msgid "Classic Rock"
+#~ msgstr "Rock classique"
+
 #, fuzzy
-msgid "Trip-Hop"
-msgstr "Hip-Hop"
+#~ msgid "Country"
+#~ msgstr "Country"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Vocal"
+#~ msgid "Dance"
+#~ msgstr "Dance"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Jazz+Funk"
+#~ msgid "Disco"
+#~ msgstr "Disco"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Fusion"
+#~ msgid "Funk"
+#~ msgstr "Funk"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Trance"
+#~ msgid "Grunge"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Classique"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hip-Hop"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Instrumental"
+#~ msgid "Jazz"
+#~ msgstr "Jazz"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Acid"
+#~ msgid "Metal"
+#~ msgstr "Metal"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "House"
+#~ msgid "New Age"
+#~ msgstr "New Age"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-#, fuzzy
-msgid "Game"
-msgstr "Jeux"
+#~ msgid "Oldies"
+#~ msgstr "Oldies"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr ""
+#~ msgid "Other"
+#~ msgstr "Autre"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Gospel"
+#~ msgid "Pop"
+#~ msgstr "Pop"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-#, fuzzy
-msgid "Noise"
-msgstr "House"
+#~ msgid "R&B"
+#~ msgstr "R&B"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Alt. Rock"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr ""
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Soul"
+#~ msgid "Rock"
+#~ msgstr "Rock"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punk"
+#~ msgid "Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-#, fuzzy
-msgid "Space"
-msgstr "conditionneur"
+#~ msgid "Industrial"
+#~ msgstr "Industrial"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr ""
+#~ msgid "Alternative"
+#~ msgstr "Alternative"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Pop instrumentale"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Rock instrumental"
+#~ msgid "Death Metal"
+#~ msgstr "Death Metal"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Ethnique"
+#~ msgid "Pranks"
+#~ msgstr "Pranks"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gothic"
-
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
 #, fuzzy
-msgid "Techno-Industrial"
-msgstr "Industrial"
+#~ msgid "Soundtrack"
+#~ msgstr "Sonate"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Electronique"
-
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pop-Folk"
-
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
 #, fuzzy
-msgid "Eurodance"
-msgstr "Trance"
+#~ msgid "Euro-Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
 #, fuzzy
-msgid "Southern Rock"
-msgstr "Gothic Rock"
+#~ msgid "Trip-Hop"
+#~ msgstr "Hip-Hop"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Comédie"
+#~ msgid "Vocal"
+#~ msgstr "Vocal"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr ""
+#~ msgid "Jazz+Funk"
+#~ msgstr "Jazz+Funk"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Gangsta Rap"
+#~ msgid "Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Top 40"
+#~ msgid "Trance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr ""
+#~ msgid "Classical"
+#~ msgstr "Classique"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pop/Funk"
+#~ msgid "Instrumental"
+#~ msgstr "Instrumental"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-#, fuzzy
-msgid "Jungle"
-msgstr "Grunge"
+#~ msgid "Acid"
+#~ msgstr "Acid"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr ""
+#~ msgid "House"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Cabaret"
-
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "New Wave"
-
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
 #, fuzzy
-msgid "Psychedelic"
-msgstr "Psychedelic Rock"
+#~ msgid "Game"
+#~ msgstr "Jeux"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rave"
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
 #, fuzzy
-msgid "Trailer"
-msgstr "Trance"
+#~ msgid "Noise"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr ""
+#~ msgid "Alt. Rock"
+#~ msgstr "Alt. Rock"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr ""
+#~ msgid "Soul"
+#~ msgstr "Soul"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Acid Punk"
+#~ msgid "Punk"
+#~ msgstr "Punk"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#, fuzzy
+#~ msgid "Space"
+#~ msgstr "conditionneur"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polka"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Pop instrumentale"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Retro"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Rock instrumental"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Musical"
+#~ msgid "Ethnic"
+#~ msgstr "Ethnique"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rock & Roll"
+#~ msgid "Gothic"
+#~ msgstr "Gothic"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Hard Rock"
+#, fuzzy
+#~ msgid "Techno-Industrial"
+#~ msgstr "Industrial"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Folk"
+#~ msgid "Electronic"
+#~ msgstr "Electronique"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Folk/Rock"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pop-Folk"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "National Folk"
-
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
 #, fuzzy
-msgid "Swing"
-msgstr "alerte"
+#~ msgid "Eurodance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
 #, fuzzy
-msgid "Fast-Fusion"
-msgstr "Fusion"
+#~ msgid "Southern Rock"
+#~ msgstr "Gothic Rock"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bebob"
+#~ msgid "Comedy"
+#~ msgstr "Comédie"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-#, fuzzy
-msgid "Latin"
-msgstr "relation"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Gangsta Rap"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr ""
+#~ msgid "Top 40"
+#~ msgstr "Top 40"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr ""
+#~ msgid "Pop/Funk"
+#~ msgstr "Pop/Funk"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
 #, fuzzy
-msgid "Bluegrass"
-msgstr "Blues"
+#~ msgid "Jungle"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avant-garde"
+#~ msgid "Cabaret"
+#~ msgstr "Cabaret"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Gothic Rock"
+#~ msgid "New Wave"
+#~ msgstr "New Wave"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Progressive Rock"
+#, fuzzy
+#~ msgid "Psychedelic"
+#~ msgstr "Psychedelic Rock"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Psychedelic Rock"
+#~ msgid "Rave"
+#~ msgstr "Rave"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Symphonic Rock"
+#, fuzzy
+#~ msgid "Trailer"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Slow Rock"
+#~ msgid "Acid Punk"
+#~ msgstr "Acid Punk"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Big Band"
+#~ msgid "Acid Jazz"
+#~ msgstr "Acid Jazz"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Choeur"
+#~ msgid "Polka"
+#~ msgstr "Polka"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr ""
+#~ msgid "Retro"
+#~ msgstr "Retro"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr ""
+#~ msgid "Musical"
+#~ msgstr "Musical"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Humour"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rock & Roll"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Parole"
+#~ msgid "Hard Rock"
+#~ msgstr "Hard Rock"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Chanson"
+#~ msgid "Folk"
+#~ msgstr "Folk"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Opera"
+#~ msgid "Folk/Rock"
+#~ msgstr "Folk/Rock"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Musique de chambre"
+#~ msgid "National Folk"
+#~ msgstr "National Folk"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Sonate"
+#, fuzzy
+#~ msgid "Swing"
+#~ msgstr "alerte"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Symphonie"
-
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Booty Bass"
-
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Porn Groove"
-
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Satirique"
-
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Slow Jam"
-
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
-
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tango"
-
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
-
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Folklore"
-
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Ballade"
-
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
 #, fuzzy
-msgid "Power Ballad"
-msgstr "Ballade"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Rhythmic Soul"
+#~ msgid "Bebob"
+#~ msgstr "Bebob"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Freestyle"
-
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Duo"
-
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punk Rock"
-
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Drum Solo"
-
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "A Cappella"
-
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
 #, fuzzy
-msgid "Euro-House"
-msgstr "House"
+#~ msgid "Latin"
+#~ msgstr "relation"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
 #, fuzzy
-msgid "Dance Hall"
-msgstr "Dance"
+#~ msgid "Bluegrass"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Avantgarde"
+#~ msgstr "Avant-garde"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr ""
+#~ msgid "Gothic Rock"
+#~ msgstr "Gothic Rock"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-#, fuzzy
-msgid "Club-House"
-msgstr "House"
+#~ msgid "Progressive Rock"
+#~ msgstr "Progressive Rock"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr ""
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Psychedelic Rock"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr ""
+#~ msgid "Symphonic Rock"
+#~ msgstr "Symphonic Rock"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr ""
+#~ msgid "Slow Rock"
+#~ msgstr "Slow Rock"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "BritPop"
+#~ msgid "Big Band"
+#~ msgstr "Big Band"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Negerpunk"
+#~ msgid "Chorus"
+#~ msgstr "Choeur"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Polsk Punk"
+#~ msgid "Humour"
+#~ msgstr "Humour"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Beat"
+#~ msgid "Speech"
+#~ msgstr "Parole"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-#, fuzzy
-msgid "Christian Gangsta Rap"
-msgstr "Gangsta Rap"
+#~ msgid "Chanson"
+#~ msgstr "Chanson"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Heavy Metal"
+#~ msgid "Opera"
+#~ msgstr "Opera"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Black Metal"
+#~ msgid "Chamber Music"
+#~ msgstr "Musique de chambre"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Crossover"
+#~ msgid "Sonata"
+#~ msgstr "Sonate"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr ""
+#~ msgid "Symphony"
+#~ msgstr "Symphonie"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-#, fuzzy
-msgid "Christian Rock"
-msgstr "Rock classique"
+#~ msgid "Booty Bass"
+#~ msgstr "Booty Bass"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr ""
+#~ msgid "Porn Groove"
+#~ msgstr "Porn Groove"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "Satire"
+#~ msgstr "Satirique"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Thrash Metal"
+#~ msgid "Slow Jam"
+#~ msgstr "Slow Jam"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-#, fuzzy
-msgid "Anime"
-msgstr "temps"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "JPop"
+#~ msgid "Tango"
+#~ msgstr "Tango"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Synthpop"
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Commandes"
+#~ msgid "Folklore"
+#~ msgstr "Folklore"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Appels système"
+#~ msgid "Ballad"
+#~ msgstr "Ballade"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Appels de librairie"
+#, fuzzy
+#~ msgid "Power Ballad"
+#~ msgstr "Ballade"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Fichiers spéciaux"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Rhythmic Soul"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Formats et préférences de fichier"
+#~ msgid "Freestyle"
+#~ msgstr "Freestyle"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Jeux"
+#~ msgid "Duet"
+#~ msgstr "Duo"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Préférences - Divers"
+#~ msgid "Punk Rock"
+#~ msgstr "Punk Rock"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Commandes de gestion système"
+#~ msgid "Drum Solo"
+#~ msgstr "Drum Solo"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Fonctions du Noyau"
+#~ msgid "A Cappella"
+#~ msgstr "A Cappella"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "stereo"
+#, fuzzy
+#~ msgid "Euro-House"
+#~ msgstr "House"
 
-#: src/plugins/mp3_extractor.c:96
 #, fuzzy
-msgid "joint stereo"
-msgstr "stereo"
+#~ msgid "Dance Hall"
+#~ msgstr "Dance"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "mono"
+#, fuzzy
+#~ msgid "Club-House"
+#~ msgstr "House"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
+#~ msgid "BritPop"
+#~ msgstr "BritPop"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
+#~ msgid "Negerpunk"
+#~ msgstr "Negerpunk"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
+#~ msgid "Polsk Punk"
+#~ msgstr "Polsk Punk"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
+#~ msgid "Beat"
+#~ msgstr "Beat"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
+#, fuzzy
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Gangsta Rap"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
+#~ msgid "Heavy Metal"
+#~ msgstr "Heavy Metal"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
+#~ msgid "Black Metal"
+#~ msgstr "Black Metal"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
+#~ msgid "Crossover"
+#~ msgstr "Crossover"
 
-#: src/plugins/mp3_extractor.c:206
 #, fuzzy
-msgid "no copyright"
-msgstr "copyright"
+#~ msgid "Christian Rock"
+#~ msgstr "Rock classique"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/mp3_extractor.c:207
+#~ msgid "Thrash Metal"
+#~ msgstr "Thrash Metal"
+
 #, fuzzy
-msgid "copy"
-msgstr "société"
+#~ msgid "Anime"
+#~ msgstr "temps"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr ""
+#~ msgid "JPop"
+#~ msgstr "JPop"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Traditionnel Chinois"
+#~ msgid "Synthpop"
+#~ msgstr "Synthpop"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Chinois simplifié"
+#~ msgid "Commands"
+#~ msgstr "Commandes"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Allemand (Suisse)"
+#~ msgid "System calls"
+#~ msgstr "Appels système"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "Anglais (US)"
+#~ msgid "Library calls"
+#~ msgstr "Appels de librairie"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Anglais"
+#~ msgid "Special files"
+#~ msgstr "Fichiers spéciaux"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Anglais (Australie)"
+#~ msgid "File formats and conventions"
+#~ msgstr "Formats et préférences de fichier"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr "Espagnol (castillan)"
+#~ msgid "Games"
+#~ msgstr "Jeux"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Espagnol (mexicain)"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Préférences - Divers"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Français (Belgique)"
+#~ msgid "System management commands"
+#~ msgstr "Commandes de gestion système"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Français (Canada)"
+#~ msgid "Kernel routines"
+#~ msgstr "Fonctions du Noyau"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Français (Suisse)"
+#, fuzzy
+#~ msgid "joint stereo"
+#~ msgstr "stereo"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Italien (Suisse)"
+#, fuzzy
+#~ msgid "no copyright"
+#~ msgstr "copyright"
 
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Allemand (Belgique)"
+#, fuzzy
+#~ msgid "copy"
+#~ msgstr "société"
 
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Bokmal (Norvège)"
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "codec: %s, %u fps, %u ms"
 
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr "Rhaeto-Romanic"
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr "Serbo-Croate (latin)"
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr "Serbo-Croate (cyrillique)"
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Farsi"
-
-#: src/plugins/ole2_extractor.c:578
-#, fuzzy, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr "Révision #%u: Auteur '%s' sur '%s'"
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "codec: %s, %u fps, %u ms"
-
 #, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u points par pouce ?"

Modified: Extractor/po/ga.po
===================================================================
--- Extractor/po/ga.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/ga.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.5.20\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2008-03-21 20:46-0700\n"
 "Last-Translator: Kevin Scannell <address@hidden>\n"
 "Language-Team: Irish <address@hidden>\n"
@@ -529,7 +529,7 @@
 msgid "description"
 msgstr "cur s�os"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "c�ipcheart"
 
@@ -1606,807 +1606,601 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: n� cheada�tear arg�int i ndiaidh na rogha `-W %s'\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "GB"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "MB"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "kB"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "Beart"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Gormacha"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr "Gan Phrofadh"
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Rac Clasaiceach"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "S�nis Traidisi�nta"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "Ceolta Tuaithe"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "S�nis Simplithe"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Damhsa"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Gearm�inis Eilv�iseach"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Diosc�"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "B�arla S.A.M."
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Func"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "B�arla Sasanach"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Gruinse"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "B�arla Astr�lach"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hip-Hap"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr "Sp�innis Chaist�leach"
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Snagcheol"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Sp�innis Mheicsiceach"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Miotal"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Fraincis Bheilgeach"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "Nua-Aoiseach"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Fraincis Cheanadach"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Seancheol"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Fraincis Eilv�iseach"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Eile"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Iod�ilis Eilv�iseach"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Popcheol"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Ollainnis Bheilgeach"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "Rithim & Gormacha"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Ioruais Bokm�l"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rapcheol"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr "Raeta-R�m�insis"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr "Seirbea-Chr�itis (Laidineach)"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rac-Cheol"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr "Seirbea-Chr�itis (Coireallach)"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Teicneo"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Fairsis"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Tionscla�och"
+#: src/plugins/ole2_extractor.c:578
+#, fuzzy, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr "Leas� #%u: D'oibrigh �dar '%s' ar '%s'"
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Malartach"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "mona"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "steiri�"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "B�smhiotal"
+#~ msgid "GB"
+#~ msgstr "GB"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Cleasa"
+#~ msgid "MB"
+#~ msgstr "MB"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Fuaimrian"
+#~ msgid "KB"
+#~ msgstr "kB"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Eora-Teicneo"
+#~ msgid "Bytes"
+#~ msgstr "Beart"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Timpeallach"
+#~ msgid "Blues"
+#~ msgstr "Gormacha"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Truip-Hap"
+#~ msgid "Classic Rock"
+#~ msgstr "Rac Clasaiceach"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Guthach"
+#, fuzzy
+#~ msgid "Country"
+#~ msgstr "Ceolta Tuaithe"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Snagcheol+Func"
+#~ msgid "Dance"
+#~ msgstr "Damhsa"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Comhle�"
+#~ msgid "Disco"
+#~ msgstr "Diosc�"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "T�mhn�al"
+#~ msgid "Funk"
+#~ msgstr "Func"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Clasaiceach"
+#~ msgid "Grunge"
+#~ msgstr "Gruinse"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Ionstraimeach"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hip-Hap"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Aig�ad"
+#~ msgid "Jazz"
+#~ msgstr "Snagcheol"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "Teach"
+#~ msgid "Metal"
+#~ msgstr "Miotal"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Cluiche"
+#~ msgid "New Age"
+#~ msgstr "Nua-Aoiseach"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Gearrth�g Fhuaime"
+#~ msgid "Oldies"
+#~ msgstr "Seancheol"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Ceol Gaspal"
+#~ msgid "Other"
+#~ msgstr "Eile"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Torann"
+#~ msgid "Pop"
+#~ msgstr "Popcheol"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Rac-Cheol Mal."
+#~ msgid "R&B"
+#~ msgstr "Rithim & Gormacha"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Dord"
+#~ msgid "Rap"
+#~ msgstr "Rapcheol"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Anamcheol"
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punc"
+#~ msgid "Rock"
+#~ msgstr "Rac-Cheol"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Sp�s"
+#~ msgid "Techno"
+#~ msgstr "Teicneo"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "Machnamhach"
+#~ msgid "Industrial"
+#~ msgstr "Tionscla�och"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Popcheol Ionstraimeach"
+#~ msgid "Alternative"
+#~ msgstr "Malartach"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Rac Ionstraimeach"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Eitneach"
+#~ msgid "Death Metal"
+#~ msgstr "B�smhiotal"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gotach"
+#~ msgid "Pranks"
+#~ msgstr "Cleasa"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "An Tonn Dhubh"
+#~ msgid "Soundtrack"
+#~ msgstr "Fuaimrian"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Teicneo-Tionscla�och"
+#~ msgid "Euro-Techno"
+#~ msgstr "Eora-Teicneo"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Leictreonach"
+#~ msgid "Ambient"
+#~ msgstr "Timpeallach"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Popcheol T�re"
+#~ msgid "Trip-Hop"
+#~ msgstr "Truip-Hap"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Eoradamhsa"
+#~ msgid "Vocal"
+#~ msgstr "Guthach"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Aisling"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Snagcheol+Func"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Rac Deisceartach"
+#~ msgid "Fusion"
+#~ msgstr "Comhle�"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Coim�ide"
+#~ msgid "Trance"
+#~ msgstr "T�mhn�al"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Cultas"
+#~ msgid "Classical"
+#~ msgstr "Clasaiceach"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Rapcheol Gangstaeir"
+#~ msgid "Instrumental"
+#~ msgstr "Ionstraimeach"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Cnagshingil�"
+#~ msgid "Acid"
+#~ msgstr "Aig�ad"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Rapcheol Cr�osta�"
+#~ msgid "House"
+#~ msgstr "Teach"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Popcheol/Func"
+#~ msgid "Game"
+#~ msgstr "Cluiche"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Dufair"
+#~ msgid "Sound Clip"
+#~ msgstr "Gearrth�g Fhuaime"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Indiach-Mheirice�nach"
+#~ msgid "Gospel"
+#~ msgstr "Ceol Gaspal"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Cabaret"
+#~ msgid "Noise"
+#~ msgstr "Torann"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "Tonn Nua"
+#~ msgid "Alt. Rock"
+#~ msgstr "Rac-Cheol Mal."
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "S�cideileach"
+#~ msgid "Bass"
+#~ msgstr "Dord"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "R�ibhcheol"
+#~ msgid "Soul"
+#~ msgstr "Anamcheol"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Se�thi�ineanna"
+#~ msgid "Punk"
+#~ msgstr "Punc"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Tr�il�ar"
+#~ msgid "Space"
+#~ msgstr "Sp�s"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "�sle-D�lse"
+#~ msgid "Meditative"
+#~ msgstr "Machnamhach"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Treibheach"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Popcheol Ionstraimeach"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Punc Aig�adach"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Rac Ionstraimeach"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Snagcheol Aig�adach"
+#~ msgid "Ethnic"
+#~ msgstr "Eitneach"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polca"
+#~ msgid "Gothic"
+#~ msgstr "Gotach"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Aischeol"
+#~ msgid "Darkwave"
+#~ msgstr "An Tonn Dhubh"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Ceolra"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Teicneo-Tionscla�och"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rac Is Roll"
+#~ msgid "Electronic"
+#~ msgstr "Leictreonach"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Rac-Cheol Crua"
+#~ msgid "Pop-Folk"
+#~ msgstr "Popcheol T�re"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Ceol na nDaoine"
+#~ msgid "Eurodance"
+#~ msgstr "Eoradamhsa"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Ceol T�re/Rac-Cheol"
+#~ msgid "Dream"
+#~ msgstr "Aisling"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "Ceol an N�isi�in"
+#~ msgid "Southern Rock"
+#~ msgstr "Rac Deisceartach"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Luasc-Cheol"
+#~ msgid "Comedy"
+#~ msgstr "Coim�ide"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Comhle� Tapa"
+#~ msgid "Cult"
+#~ msgstr "Cultas"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bap"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Rapcheol Gangstaeir"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-#, fuzzy
-msgid "Latin"
-msgstr "Laitvis"
+#~ msgid "Top 40"
+#~ msgstr "Cnagshingil�"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Athbheochan"
+#~ msgid "Christian Rap"
+#~ msgstr "Rapcheol Cr�osta�"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Ceilteach"
+#~ msgid "Pop/Funk"
+#~ msgstr "Popcheol/Func"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#~ msgid "Jungle"
+#~ msgstr "Dufair"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avant garde"
+#~ msgid "Native American"
+#~ msgstr "Indiach-Mheirice�nach"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Rac Gotach"
+#~ msgid "Cabaret"
+#~ msgstr "Cabaret"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Rac For�sach"
+#~ msgid "New Wave"
+#~ msgstr "Tonn Nua"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Rac S�cideileach"
+#~ msgid "Psychedelic"
+#~ msgstr "S�cideileach"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Rac Siansach"
+#~ msgid "Rave"
+#~ msgstr "R�ibhcheol"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Rac-Cheol Mall"
+#~ msgid "Showtunes"
+#~ msgstr "Se�thi�ineanna"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Banna M�r"
+#~ msgid "Trailer"
+#~ msgstr "Tr�il�ar"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "C�r"
+#~ msgid "Lo-Fi"
+#~ msgstr "�sle-D�lse"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "R�cheol"
+#~ msgid "Tribal"
+#~ msgstr "Treibheach"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Fuaimi�il"
+#~ msgid "Acid Punk"
+#~ msgstr "Punc Aig�adach"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Greann"
+#~ msgid "Acid Jazz"
+#~ msgstr "Snagcheol Aig�adach"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Caint"
+#~ msgid "Polka"
+#~ msgstr "Polca"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Chanson"
+#~ msgid "Retro"
+#~ msgstr "Aischeol"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Ceoldr�ma"
+#~ msgid "Musical"
+#~ msgstr "Ceolra"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Ceol Aireagail"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rac Is Roll"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Son�id"
+#~ msgid "Hard Rock"
+#~ msgstr "Rac-Cheol Crua"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Siansa"
+#~ msgid "Folk"
+#~ msgstr "Ceol na nDaoine"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Dord B�it�"
+#~ msgid "Folk/Rock"
+#~ msgstr "Ceol T�re/Rac-Cheol"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Primus"
+#~ msgid "National Folk"
+#~ msgstr "Ceol an N�isi�in"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "PornGr�ibh"
+#~ msgid "Swing"
+#~ msgstr "Luasc-Cheol"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Aoir"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Comhle� Tapa"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Seam Mall"
+#~ msgid "Bebob"
+#~ msgstr "Bap"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
+#, fuzzy
+#~ msgid "Latin"
+#~ msgstr "Laitvis"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tang�"
+#~ msgid "Revival"
+#~ msgstr "Athbheochan"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
+#~ msgid "Celtic"
+#~ msgstr "Ceilteach"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "B�aloideas"
+#~ msgid "Bluegrass"
+#~ msgstr "Bluegrass"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Bail�ad"
+#~ msgid "Avantgarde"
+#~ msgstr "Avant garde"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Bail�ad Cumhachta"
+#~ msgid "Gothic Rock"
+#~ msgstr "Rac Gotach"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Anamcheol Rithimeach"
+#~ msgid "Progressive Rock"
+#~ msgstr "Rac For�sach"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Saorst�l"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Rac S�cideileach"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "D�s�ad"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Rac Siansach"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punc-Rac"
+#~ msgid "Slow Rock"
+#~ msgstr "Rac-Cheol Mall"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Aonr�ad Druma"
+#~ msgid "Big Band"
+#~ msgstr "Banna M�r"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "A Cappella"
+#~ msgid "Chorus"
+#~ msgstr "C�r"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Eora-Teach"
+#~ msgid "Easy Listening"
+#~ msgstr "R�cheol"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Halla Damhsa"
+#~ msgid "Acoustic"
+#~ msgstr "Fuaimi�il"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Humour"
+#~ msgstr "Greann"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Druma & Dord"
+#~ msgid "Speech"
+#~ msgstr "Caint"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Clubtheach"
+#~ msgid "Chanson"
+#~ msgstr "Chanson"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "F�orchrua"
+#~ msgid "Opera"
+#~ msgstr "Ceoldr�ma"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Uaf�s"
+#~ msgid "Chamber Music"
+#~ msgstr "Ceol Aireagail"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Neamhsple�ch"
+#~ msgid "Sonata"
+#~ msgstr "Son�id"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "BriotPhop"
+#~ msgid "Symphony"
+#~ msgstr "Siansa"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Negerpunk"
+#~ msgid "Booty Bass"
+#~ msgstr "Dord B�it�"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Punc Polannach"
+#~ msgid "Primus"
+#~ msgstr "Primus"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Buille"
+#~ msgid "Porn Groove"
+#~ msgstr "PornGr�ibh"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Rapcheol Cr�osta� Gangstaeir"
+#~ msgid "Satire"
+#~ msgstr "Aoir"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Ceol Trom-Mhiotalach"
+#~ msgid "Slow Jam"
+#~ msgstr "Seam Mall"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Miotal Dubh"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Trasach"
+#~ msgid "Tango"
+#~ msgstr "Tang�"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Cr�osta� Comhaimseartha"
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Rac-Cheol Cr�osta�"
+#~ msgid "Folklore"
+#~ msgstr "B�aloideas"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Meireang"
+#~ msgid "Ballad"
+#~ msgstr "Bail�ad"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "Power Ballad"
+#~ msgstr "Bail�ad Cumhachta"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Miotal Traise�la"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Anamcheol Rithimeach"
 
-# no "�"
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "Anime"
+#~ msgid "Freestyle"
+#~ msgstr "Saorst�l"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "JPap"
+#~ msgid "Duet"
+#~ msgstr "D�s�ad"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Popcheol sint�iseach"
+#~ msgid "Punk Rock"
+#~ msgstr "Punc-Rac"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Orduithe"
+#~ msgid "Drum Solo"
+#~ msgstr "Aonr�ad Druma"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Glaonna ar an ch�ras"
+#~ msgid "A Cappella"
+#~ msgstr "A Cappella"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Glaonna ar leabharlanna"
+#~ msgid "Euro-House"
+#~ msgstr "Eora-Teach"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Comhaid speisialta"
+#~ msgid "Dance Hall"
+#~ msgstr "Halla Damhsa"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Form�id� comhaid agus coinbhinsi�in"
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Cluich�"
+#~ msgid "Drum & Bass"
+#~ msgstr "Druma & Dord"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Coinbhinsi�in agus ruda� eile"
+#~ msgid "Club-House"
+#~ msgstr "Clubtheach"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Orduithe bainisteoireacht an ch�rais"
+#~ msgid "Hardcore"
+#~ msgstr "F�orchrua"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Feidhmeanna eithne"
+#~ msgid "Terror"
+#~ msgstr "Uaf�s"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "steiri�"
+#~ msgid "Indie"
+#~ msgstr "Neamhsple�ch"
 
-#: src/plugins/mp3_extractor.c:96
-#, fuzzy
-msgid "joint stereo"
-msgstr "steiri�"
+#~ msgid "BritPop"
+#~ msgstr "BriotPhop"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
+#~ msgid "Negerpunk"
+#~ msgstr "Negerpunk"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "mona"
+#~ msgid "Polsk Punk"
+#~ msgstr "Punc Polannach"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
+#~ msgid "Beat"
+#~ msgstr "Buille"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Rapcheol Cr�osta� Gangstaeir"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
+#~ msgid "Heavy Metal"
+#~ msgstr "Ceol Trom-Mhiotalach"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
+#~ msgid "Black Metal"
+#~ msgstr "Miotal Dubh"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
+#~ msgid "Crossover"
+#~ msgstr "Trasach"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
+#~ msgid "Contemporary Christian"
+#~ msgstr "Cr�osta� Comhaimseartha"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
+#~ msgid "Christian Rock"
+#~ msgstr "Rac-Cheol Cr�osta�"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
+#~ msgid "Merengue"
+#~ msgstr "Meireang"
 
-#: src/plugins/mp3_extractor.c:206
-#, fuzzy
-msgid "no copyright"
-msgstr "c�ipcheart"
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
+#~ msgid "Thrash Metal"
+#~ msgstr "Miotal Traise�la"
 
-#: src/plugins/mp3_extractor.c:207
-#, fuzzy
-msgid "copy"
-msgstr "comhlacht"
+# no "�"
+#~ msgid "Anime"
+#~ msgstr "Anime"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr "Gan Phrofadh"
+#~ msgid "JPop"
+#~ msgstr "JPap"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "S�nis Traidisi�nta"
+#~ msgid "Synthpop"
+#~ msgstr "Popcheol sint�iseach"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "S�nis Simplithe"
+#~ msgid "Commands"
+#~ msgstr "Orduithe"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Gearm�inis Eilv�iseach"
+#~ msgid "System calls"
+#~ msgstr "Glaonna ar an ch�ras"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "B�arla S.A.M."
+#~ msgid "Library calls"
+#~ msgstr "Glaonna ar leabharlanna"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "B�arla Sasanach"
+#~ msgid "Special files"
+#~ msgstr "Comhaid speisialta"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "B�arla Astr�lach"
+#~ msgid "File formats and conventions"
+#~ msgstr "Form�id� comhaid agus coinbhinsi�in"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr "Sp�innis Chaist�leach"
+#~ msgid "Games"
+#~ msgstr "Cluich�"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Sp�innis Mheicsiceach"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Coinbhinsi�in agus ruda� eile"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Fraincis Bheilgeach"
+#~ msgid "System management commands"
+#~ msgstr "Orduithe bainisteoireacht an ch�rais"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Fraincis Cheanadach"
+#~ msgid "Kernel routines"
+#~ msgstr "Feidhmeanna eithne"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Fraincis Eilv�iseach"
+#, fuzzy
+#~ msgid "joint stereo"
+#~ msgstr "steiri�"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Iod�ilis Eilv�iseach"
+#, fuzzy
+#~ msgid "no copyright"
+#~ msgstr "c�ipcheart"
 
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Ollainnis Bheilgeach"
+#, fuzzy
+#~ msgid "copy"
+#~ msgstr "comhlacht"
 
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Ioruais Bokm�l"
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "codec: %s, %u fss, %u ms"
 
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr "Raeta-R�m�insis"
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr "Seirbea-Chr�itis (Laidineach)"
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr "Seirbea-Chr�itis (Coireallach)"
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Fairsis"
-
-#: src/plugins/ole2_extractor.c:578
-#, fuzzy, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr "Leas� #%u: D'oibrigh �dar '%s' ar '%s'"
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "codec: %s, %u fss, %u ms"
-
 #, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%u�%u poncanna san orlach?"

Modified: Extractor/po/it.po
===================================================================
--- Extractor/po/it.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/it.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: libextractor-0.6.0\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2010-09-30 23:41+0200\n"
 "Last-Translator: Sergio Zanchetta <address@hidden>\n"
 "Language-Team: Italian <address@hidden>\n"
@@ -500,7 +500,7 @@
 msgid "description"
 msgstr "descrizione"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "copyright"
 
@@ -1507,801 +1507,403 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: l'opzione \"-W %s\" non ammette un argomento\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "GB"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "MB"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "KB"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "Byte"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blues"
-
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Rock classico"
-
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-msgid "Country"
-msgstr "Country"
-
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Dance"
-
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Disco"
-
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Funk"
-
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Grunge"
-
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hip-Hop"
-
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Jazz"
-
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Metal"
-
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "New Age"
-
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Altro"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Cinese tradizionale"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pop"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Cinese semplificato"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "R&B"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Tedesco svizzero"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "Inglese americano"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Inglese britannico"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rock"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Inglese australiano"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Techno"
-
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Industrial"
-
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Alternative"
-
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
-
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Death metal"
-
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr ""
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Spagnolo messicano"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Techno europea"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Francese belga"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Ambient"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Franco canadese"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Trip-Hop"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Francese svizzero"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr ""
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Italiano svizzero"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Jazz+Funk"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Olandese belga"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Fusion"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Bokmal norvegese"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Trance"
-
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Classica"
-
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Strumentale"
-
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Acid"
-
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "House"
-
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Gospel"
-
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Alternative rock"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Farsi"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
+#: src/plugins/ole2_extractor.c:578
+#, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Soul"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "mono"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punk"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "stereo"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr ""
+#~ msgid "GB"
+#~ msgstr "GB"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr ""
+#~ msgid "MB"
+#~ msgstr "MB"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr ""
+#~ msgid "KB"
+#~ msgstr "KB"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr ""
+#~ msgid "Bytes"
+#~ msgstr "Byte"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Etnica"
+#~ msgid "Blues"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr ""
+#~ msgid "Classic Rock"
+#~ msgstr "Rock classico"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Darkwave"
+#~ msgid "Country"
+#~ msgstr "Country"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Techno-Industrial"
+#~ msgid "Dance"
+#~ msgstr "Dance"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr ""
+#~ msgid "Disco"
+#~ msgstr "Disco"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pop-Folk"
+#~ msgid "Funk"
+#~ msgstr "Funk"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Eurodance"
+#~ msgid "Grunge"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Dream"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hip-Hop"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Southern rock"
+#~ msgid "Jazz"
+#~ msgstr "Jazz"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr ""
+#~ msgid "Metal"
+#~ msgstr "Metal"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr ""
+#~ msgid "New Age"
+#~ msgstr "New Age"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr ""
+#~ msgid "Other"
+#~ msgstr "Altro"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr ""
+#~ msgid "Pop"
+#~ msgstr "Pop"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr ""
+#~ msgid "R&B"
+#~ msgstr "R&B"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pop/Funk"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr ""
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr ""
+#~ msgid "Rock"
+#~ msgstr "Rock"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr ""
+#~ msgid "Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr ""
+#~ msgid "Industrial"
+#~ msgstr "Industrial"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Psichedelica"
+#~ msgid "Alternative"
+#~ msgstr "Alternative"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rave"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr ""
+#~ msgid "Death Metal"
+#~ msgstr "Death metal"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr ""
+#~ msgid "Euro-Techno"
+#~ msgstr "Techno europea"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr ""
+#~ msgid "Ambient"
+#~ msgstr "Ambient"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Tribal"
+#~ msgid "Trip-Hop"
+#~ msgstr "Trip-Hop"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Acid Punk"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Jazz+Funk"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#~ msgid "Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polka"
+#~ msgid "Trance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr ""
+#~ msgid "Classical"
+#~ msgstr "Classica"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Musical"
+#~ msgid "Instrumental"
+#~ msgstr "Strumentale"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rock & Roll"
+#~ msgid "Acid"
+#~ msgstr "Acid"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Hard rock"
+#~ msgid "House"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Folk"
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Folk/Rock"
+#~ msgid "Alt. Rock"
+#~ msgstr "Alternative rock"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr ""
+#~ msgid "Soul"
+#~ msgstr "Soul"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Swing"
+#~ msgid "Punk"
+#~ msgstr "Punk"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr ""
+#~ msgid "Ethnic"
+#~ msgstr "Etnica"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr ""
+#~ msgid "Darkwave"
+#~ msgstr "Darkwave"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-msgid "Latin"
-msgstr ""
+#~ msgid "Techno-Industrial"
+#~ msgstr "Techno-Industrial"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Revival"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pop-Folk"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Celtica"
+#~ msgid "Eurodance"
+#~ msgstr "Eurodance"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#~ msgid "Dream"
+#~ msgstr "Dream"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avantgarde"
+#~ msgid "Southern Rock"
+#~ msgstr "Southern rock"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Gothic Rock"
+#~ msgid "Pop/Funk"
+#~ msgstr "Pop/Funk"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Rock progressivo"
+#~ msgid "Psychedelic"
+#~ msgstr "Psichedelica"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Rock psichedelico"
+#~ msgid "Rave"
+#~ msgstr "Rave"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Rock sinfonico"
+#~ msgid "Tribal"
+#~ msgstr "Tribal"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr ""
+#~ msgid "Acid Punk"
+#~ msgstr "Acid Punk"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr ""
+#~ msgid "Acid Jazz"
+#~ msgstr "Acid Jazz"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr ""
+#~ msgid "Polka"
+#~ msgstr "Polka"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr ""
+#~ msgid "Musical"
+#~ msgstr "Musical"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr ""
+#~ msgid "Rock & Roll"
+#~ msgstr "Rock & Roll"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr ""
+#~ msgid "Hard Rock"
+#~ msgstr "Hard rock"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr ""
+#~ msgid "Folk"
+#~ msgstr "Folk"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr ""
+#~ msgid "Folk/Rock"
+#~ msgstr "Folk/Rock"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Opera"
+#~ msgid "Swing"
+#~ msgstr "Swing"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Musica da camera"
+#~ msgid "Revival"
+#~ msgstr "Revival"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr ""
+#~ msgid "Celtic"
+#~ msgstr "Celtica"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr ""
+#~ msgid "Bluegrass"
+#~ msgstr "Bluegrass"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr ""
+#~ msgid "Avantgarde"
+#~ msgstr "Avantgarde"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr ""
+#~ msgid "Gothic Rock"
+#~ msgstr "Gothic Rock"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr ""
+#~ msgid "Progressive Rock"
+#~ msgstr "Rock progressivo"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr ""
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Rock psichedelico"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr ""
+#~ msgid "Symphonic Rock"
+#~ msgstr "Rock sinfonico"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
+#~ msgid "Opera"
+#~ msgstr "Opera"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tango"
+#~ msgid "Chamber Music"
+#~ msgstr "Musica da camera"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr ""
+#~ msgid "Tango"
+#~ msgstr "Tango"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr ""
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr ""
+#~ msgid "Punk Rock"
+#~ msgstr "Punk Rock"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr ""
+#~ msgid "Dance Hall"
+#~ msgstr "Dancehall"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr ""
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr ""
+#~ msgid "Drum & Bass"
+#~ msgstr "Drum & Bass"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punk Rock"
+#~ msgid "Hardcore"
+#~ msgstr "Hardcore"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr ""
+#~ msgid "Indie"
+#~ msgstr "Indie"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr ""
+#~ msgid "BritPop"
+#~ msgstr "Britpop"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr ""
+#~ msgid "Beat"
+#~ msgstr "Beat"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Dancehall"
+#~ msgid "Heavy Metal"
+#~ msgstr "Heavy metal"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Black Metal"
+#~ msgstr "Black metal"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Drum & Bass"
+#~ msgid "Crossover"
+#~ msgstr "Crossover"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr ""
+#~ msgid "Merengue"
+#~ msgstr "Merengue"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Hardcore"
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr ""
+#~ msgid "Synthpop"
+#~ msgstr "Synthpop"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Indie"
+#~ msgid "Games"
+#~ msgstr "Giochi"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "Britpop"
+#~ msgid "Kernel routines"
+#~ msgstr "Routine del kernel"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr ""
+#~ msgid "MPEG-1"
+#~ msgstr "MPEG-1"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr ""
+#~ msgid "MPEG-2"
+#~ msgstr "MPEG-2"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Beat"
+#~ msgid "MPEG-2.5"
+#~ msgstr "MPEG-2.5"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr ""
+#~ msgid "Layer I"
+#~ msgstr "Layer I"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Heavy metal"
+#~ msgid "Layer II"
+#~ msgstr "Layer II"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Black metal"
+#~ msgid "Layer III"
+#~ msgstr "Layer III"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Crossover"
+#~ msgid "VBR"
+#~ msgstr "VBR"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr ""
+#~ msgid "CBR"
+#~ msgstr "CBR"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr ""
+#~ msgid "no copyright"
+#~ msgstr "nessun copyright"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Merengue"
+#~ msgid "original"
+#~ msgstr "originale"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "copy"
+#~ msgstr "copia"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr ""
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "codec: %s, %u fps, %u ms"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Synthpop"
-
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr ""
-
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr ""
-
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr ""
-
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr ""
-
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr ""
-
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Giochi"
-
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr ""
-
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr ""
-
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Routine del kernel"
-
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "stereo"
-
-#: src/plugins/mp3_extractor.c:96
-msgid "joint stereo"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "mono"
-
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr "MPEG-1"
-
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr "MPEG-2"
-
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr "MPEG-2.5"
-
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr "Layer I"
-
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr "Layer II"
-
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr "Layer III"
-
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr "VBR"
-
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr "CBR"
-
-#: src/plugins/mp3_extractor.c:206
-msgid "no copyright"
-msgstr "nessun copyright"
-
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr "originale"
-
-#: src/plugins/mp3_extractor.c:207
-msgid "copy"
-msgstr "copia"
-
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Cinese tradizionale"
-
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Cinese semplificato"
-
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Tedesco svizzero"
-
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "Inglese americano"
-
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Inglese britannico"
-
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Inglese australiano"
-
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Spagnolo messicano"
-
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Francese belga"
-
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Franco canadese"
-
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Francese svizzero"
-
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Italiano svizzero"
-
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Olandese belga"
-
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Bokmal norvegese"
-
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Farsi"
-
-#: src/plugins/ole2_extractor.c:578
-#, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr ""
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "codec: %s, %u fps, %u ms"
-
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u punti per pollice"
 

Modified: Extractor/po/libextractor.pot
===================================================================
--- Extractor/po/libextractor.pot       2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/libextractor.pot       2012-08-14 23:02:49 UTC (rev 23241)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <address@hidden>\n"
 "Language-Team: LANGUAGE <address@hidden>\n"
@@ -494,7 +494,7 @@
 msgid "description"
 msgstr ""
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr ""
 
@@ -1500,715 +1500,11 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr ""
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr ""
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-msgid "Country"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-msgid "Latin"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr ""
-
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr ""
-
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr ""
-
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr ""
-
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr ""
-
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr ""
-
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr ""
-
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr ""
-
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr ""
-
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:96
-msgid "joint stereo"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:206
-msgid "no copyright"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:207
-msgid "copy"
-msgstr ""
-
 #: src/plugins/ole2_extractor.c:387
 msgid "No Proofing"
 msgstr ""
@@ -2290,7 +1586,10 @@
 msgid "Revision #%u: Author `%s' worked on `%s'"
 msgstr ""
 
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
 msgstr ""
+
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr ""

Modified: Extractor/po/nl.po
===================================================================
--- Extractor/po/nl.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/nl.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: libextractor-0.5.20a\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2009-03-08 16:59+0100\n"
 "Last-Translator: Erwin Poeze <address@hidden>\n"
 "Language-Team: Dutch <address@hidden>\n"
@@ -531,7 +531,7 @@
 msgid "description"
 msgstr "omschrijving"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "copyright"
 
@@ -1608,806 +1608,600 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: optie '-W %s' staat geen argument toe\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "GB"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "MB"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "KB"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "bytes"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blues"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr "geen controle"
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Classic rock"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Traditioneel Chinees"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "Country"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Vereenvoudigd Chinees"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Dance"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Zwitserduits"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Disco"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "Amerikaans Engels"
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Funk"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Brits Engels"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Grunge"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Australisch Engels"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hiphop"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr "Castilliaans Spaans"
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Jazz"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Mexicaans Spaans"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Metal"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Waals"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "New age"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Canadees Frans"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Gouwe ouwe"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Zwitsers Frans"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Overige"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Zwitsers Italiaans"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pop"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Vlaams"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "R&B"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Noors Bokmål"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr "Reto-Romaans"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr "Servo-Kroatisch (latijns schrift)"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rock"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr "Servo-Kroatisch (cyrillisch schrift)"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Techno"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Perzisch"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Industrial"
+#: src/plugins/ole2_extractor.c:578
+#, fuzzy, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr "Revisie #%u: Auteur '%s' werkte aan '%s'"
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Alternatief"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "mono"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "stereo"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Death metal"
+#~ msgid "GB"
+#~ msgstr "GB"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Pranks"
+#~ msgid "MB"
+#~ msgstr "MB"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Soundtrack"
+#~ msgid "KB"
+#~ msgstr "KB"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Eurotechno"
+#~ msgid "Bytes"
+#~ msgstr "bytes"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Ambient"
+#~ msgid "Blues"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Triphop"
+#~ msgid "Classic Rock"
+#~ msgstr "Classic rock"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Vocaal"
+#, fuzzy
+#~ msgid "Country"
+#~ msgstr "Country"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Jazz+Funk"
+#~ msgid "Dance"
+#~ msgstr "Dance"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Fusion"
+#~ msgid "Disco"
+#~ msgstr "Disco"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Trance"
+#~ msgid "Funk"
+#~ msgstr "Funk"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Klassiek"
+#~ msgid "Grunge"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Instrumenteel"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hiphop"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Acid house"
+#~ msgid "Jazz"
+#~ msgstr "Jazz"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "House"
+#~ msgid "Metal"
+#~ msgstr "Metal"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Spel"
+#~ msgid "New Age"
+#~ msgstr "New age"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Soundclip"
+#~ msgid "Oldies"
+#~ msgstr "Gouwe ouwe"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Gospel"
+#~ msgid "Other"
+#~ msgstr "Overige"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Noise"
+#~ msgid "Pop"
+#~ msgstr "Pop"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Alternatieve rock"
+#~ msgid "R&B"
+#~ msgstr "R&B"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Bass"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Soul"
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punk"
+#~ msgid "Rock"
+#~ msgstr "Rock"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Ruimte"
+#~ msgid "Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "New-age"
+#~ msgid "Industrial"
+#~ msgstr "Industrial"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Instrumentele pop"
+#~ msgid "Alternative"
+#~ msgstr "Alternatief"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Instrumentele rock"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Etnisch"
+#~ msgid "Death Metal"
+#~ msgstr "Death metal"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gothic"
+#~ msgid "Pranks"
+#~ msgstr "Pranks"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Darkwave"
+#~ msgid "Soundtrack"
+#~ msgstr "Soundtrack"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Techno-Industrial"
+#~ msgid "Euro-Techno"
+#~ msgstr "Eurotechno"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Elektronisch"
+#~ msgid "Ambient"
+#~ msgstr "Ambient"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pop-folk"
+#~ msgid "Trip-Hop"
+#~ msgstr "Triphop"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Eurodance"
+#~ msgid "Vocal"
+#~ msgstr "Vocaal"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Dreampop"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Jazz+Funk"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Southern rock"
+#~ msgid "Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Komedie"
+#~ msgid "Trance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Cult"
+#~ msgid "Classical"
+#~ msgstr "Klassiek"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Gangsta rap"
+#~ msgid "Instrumental"
+#~ msgstr "Instrumenteel"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Top 40"
+#~ msgid "Acid"
+#~ msgstr "Acid house"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Christelijke rap"
+#~ msgid "House"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pop/funk"
+#~ msgid "Game"
+#~ msgstr "Spel"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Jungle"
+#~ msgid "Sound Clip"
+#~ msgstr "Soundclip"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Indiaans"
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Cabaret"
+#~ msgid "Noise"
+#~ msgstr "Noise"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "New wave"
+#~ msgid "Alt. Rock"
+#~ msgstr "Alternatieve rock"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Psychedelisch"
+#~ msgid "Bass"
+#~ msgstr "Bass"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rave"
+#~ msgid "Soul"
+#~ msgstr "Soul"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Showtunes"
+#~ msgid "Punk"
+#~ msgstr "Punk"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Trailer"
+#~ msgid "Space"
+#~ msgstr "Ruimte"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "Lo-Fi"
+#~ msgid "Meditative"
+#~ msgstr "New-age"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Tribal"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Instrumentele pop"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Acid punk"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Instrumentele rock"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Acid jazz"
+#~ msgid "Ethnic"
+#~ msgstr "Etnisch"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polka"
+#~ msgid "Gothic"
+#~ msgstr "Gothic"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Retro"
+#~ msgid "Darkwave"
+#~ msgstr "Darkwave"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Musical"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Techno-Industrial"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rock-'n-roll"
+#~ msgid "Electronic"
+#~ msgstr "Elektronisch"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Hardrock"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pop-folk"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Folk"
+#~ msgid "Eurodance"
+#~ msgstr "Eurodance"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Folk/rock"
+#~ msgid "Dream"
+#~ msgstr "Dreampop"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "Nationale folk"
+#~ msgid "Southern Rock"
+#~ msgstr "Southern rock"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Swing"
+#~ msgid "Comedy"
+#~ msgstr "Komedie"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Fast-Fusion"
+#~ msgid "Cult"
+#~ msgstr "Cult"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bop"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Gangsta rap"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-#, fuzzy
-msgid "Latin"
-msgstr "Latin"
+#~ msgid "Top 40"
+#~ msgstr "Top 40"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Revival"
+#~ msgid "Christian Rap"
+#~ msgstr "Christelijke rap"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Keltisch"
+#~ msgid "Pop/Funk"
+#~ msgstr "Pop/funk"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#~ msgid "Jungle"
+#~ msgstr "Jungle"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avant-garde"
+#~ msgid "Native American"
+#~ msgstr "Indiaans"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Gothic rock"
+#~ msgid "Cabaret"
+#~ msgstr "Cabaret"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Progressieve rock"
+#~ msgid "New Wave"
+#~ msgstr "New wave"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Psychedelische rock"
+#~ msgid "Psychedelic"
+#~ msgstr "Psychedelisch"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Symfonische rock"
+#~ msgid "Rave"
+#~ msgstr "Rave"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Langzame rock"
+#~ msgid "Showtunes"
+#~ msgstr "Showtunes"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Bigband"
+#~ msgid "Trailer"
+#~ msgstr "Trailer"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Koor"
+#~ msgid "Lo-Fi"
+#~ msgstr "Lo-Fi"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "Easy listening"
+#~ msgid "Tribal"
+#~ msgstr "Tribal"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Akoestisch"
+#~ msgid "Acid Punk"
+#~ msgstr "Acid punk"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Humor"
+#~ msgid "Acid Jazz"
+#~ msgstr "Acid jazz"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Spraak"
+#~ msgid "Polka"
+#~ msgstr "Polka"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Chanson"
+#~ msgid "Retro"
+#~ msgstr "Retro"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Opera"
+#~ msgid "Musical"
+#~ msgstr "Musical"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Kamermuziek"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rock-'n-roll"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Sonata"
+#~ msgid "Hard Rock"
+#~ msgstr "Hardrock"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Symfonie"
+#~ msgid "Folk"
+#~ msgstr "Folk"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Booty Bass"
+#~ msgid "Folk/Rock"
+#~ msgstr "Folk/rock"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Primus"
+#~ msgid "National Folk"
+#~ msgstr "Nationale folk"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Porn Groove"
+#~ msgid "Swing"
+#~ msgstr "Swing"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Satire"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Fast-Fusion"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Slow Jam"
+#~ msgid "Bebob"
+#~ msgstr "Bop"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
+#, fuzzy
+#~ msgid "Latin"
+#~ msgstr "Latin"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tango"
+#~ msgid "Revival"
+#~ msgstr "Revival"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
+#~ msgid "Celtic"
+#~ msgstr "Keltisch"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Folklore"
+#~ msgid "Bluegrass"
+#~ msgstr "Bluegrass"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Ballad"
+#~ msgid "Avantgarde"
+#~ msgstr "Avant-garde"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Power ballad"
+#~ msgid "Gothic Rock"
+#~ msgstr "Gothic rock"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Ritmische soul"
+#~ msgid "Progressive Rock"
+#~ msgstr "Progressieve rock"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Freestyle"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Psychedelische rock"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Duet"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Symfonische rock"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punkrock"
+#~ msgid "Slow Rock"
+#~ msgstr "Langzame rock"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Drumsolo"
+#~ msgid "Big Band"
+#~ msgstr "Bigband"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "A capella"
+#~ msgid "Chorus"
+#~ msgstr "Koor"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Eurohouse"
+#~ msgid "Easy Listening"
+#~ msgstr "Easy listening"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Dancehall"
+#~ msgid "Acoustic"
+#~ msgstr "Akoestisch"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Humour"
+#~ msgstr "Humor"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Drum & Bass"
+#~ msgid "Speech"
+#~ msgstr "Spraak"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Clubhouse"
+#~ msgid "Chanson"
+#~ msgstr "Chanson"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Hardcore"
+#~ msgid "Opera"
+#~ msgstr "Opera"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Terrorcore"
+#~ msgid "Chamber Music"
+#~ msgstr "Kamermuziek"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Indie"
+#~ msgid "Sonata"
+#~ msgstr "Sonata"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "Britpop"
+#~ msgid "Symphony"
+#~ msgstr "Symfonie"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Negerpunk"
+#~ msgid "Booty Bass"
+#~ msgstr "Booty Bass"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Poolse punk"
+#~ msgid "Primus"
+#~ msgstr "Primus"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Beat"
+#~ msgid "Porn Groove"
+#~ msgstr "Porn Groove"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Christelijke gangsta rap"
+#~ msgid "Satire"
+#~ msgstr "Satire"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Heavy metal"
+#~ msgid "Slow Jam"
+#~ msgstr "Slow Jam"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Black metal"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Cross-over"
+#~ msgid "Tango"
+#~ msgstr "Tango"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Modern christelijk"
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Christelijke rock"
+#~ msgid "Folklore"
+#~ msgstr "Folklore"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Merengue"
+#~ msgid "Ballad"
+#~ msgstr "Ballad"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "Power Ballad"
+#~ msgstr "Power ballad"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Thrash metal"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Ritmische soul"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "Anime"
+#~ msgid "Freestyle"
+#~ msgstr "Freestyle"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "J-pop"
+#~ msgid "Duet"
+#~ msgstr "Duet"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Synthipop"
+#~ msgid "Punk Rock"
+#~ msgstr "Punkrock"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Commando's"
+#~ msgid "Drum Solo"
+#~ msgstr "Drumsolo"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Systeemaanroepen"
+#~ msgid "A Cappella"
+#~ msgstr "A capella"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Bibliotheekaanroepen"
+#~ msgid "Euro-House"
+#~ msgstr "Eurohouse"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Speciale bestanden"
+#~ msgid "Dance Hall"
+#~ msgstr "Dancehall"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Bestandsindelingen en -conventies"
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Spellen"
+#~ msgid "Drum & Bass"
+#~ msgstr "Drum & Bass"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Conventies en overigen"
+#~ msgid "Club-House"
+#~ msgstr "Clubhouse"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Systeembeheercommando's"
+#~ msgid "Hardcore"
+#~ msgstr "Hardcore"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Kernelroutines"
+#~ msgid "Terror"
+#~ msgstr "Terrorcore"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "stereo"
+#~ msgid "Indie"
+#~ msgstr "Indie"
 
-#: src/plugins/mp3_extractor.c:96
-#, fuzzy
-msgid "joint stereo"
-msgstr "stereo"
+#~ msgid "BritPop"
+#~ msgstr "Britpop"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
+#~ msgid "Negerpunk"
+#~ msgstr "Negerpunk"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "mono"
+#~ msgid "Polsk Punk"
+#~ msgstr "Poolse punk"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
+#~ msgid "Beat"
+#~ msgstr "Beat"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Christelijke gangsta rap"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
+#~ msgid "Heavy Metal"
+#~ msgstr "Heavy metal"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
+#~ msgid "Black Metal"
+#~ msgstr "Black metal"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
+#~ msgid "Crossover"
+#~ msgstr "Cross-over"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
+#~ msgid "Contemporary Christian"
+#~ msgstr "Modern christelijk"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
+#~ msgid "Christian Rock"
+#~ msgstr "Christelijke rock"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
+#~ msgid "Merengue"
+#~ msgstr "Merengue"
 
-#: src/plugins/mp3_extractor.c:206
-#, fuzzy
-msgid "no copyright"
-msgstr "copyright"
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
+#~ msgid "Thrash Metal"
+#~ msgstr "Thrash metal"
 
-#: src/plugins/mp3_extractor.c:207
-#, fuzzy
-msgid "copy"
-msgstr "firma"
+#~ msgid "Anime"
+#~ msgstr "Anime"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr "geen controle"
+#~ msgid "JPop"
+#~ msgstr "J-pop"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Traditioneel Chinees"
+#~ msgid "Synthpop"
+#~ msgstr "Synthipop"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Vereenvoudigd Chinees"
+#~ msgid "Commands"
+#~ msgstr "Commando's"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Zwitserduits"
+#~ msgid "System calls"
+#~ msgstr "Systeemaanroepen"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "Amerikaans Engels"
+#~ msgid "Library calls"
+#~ msgstr "Bibliotheekaanroepen"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Brits Engels"
+#~ msgid "Special files"
+#~ msgstr "Speciale bestanden"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Australisch Engels"
+#~ msgid "File formats and conventions"
+#~ msgstr "Bestandsindelingen en -conventies"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr "Castilliaans Spaans"
+#~ msgid "Games"
+#~ msgstr "Spellen"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Mexicaans Spaans"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Conventies en overigen"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Waals"
+#~ msgid "System management commands"
+#~ msgstr "Systeembeheercommando's"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Canadees Frans"
+#~ msgid "Kernel routines"
+#~ msgstr "Kernelroutines"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Zwitsers Frans"
+#, fuzzy
+#~ msgid "joint stereo"
+#~ msgstr "stereo"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Zwitsers Italiaans"
+#, fuzzy
+#~ msgid "no copyright"
+#~ msgstr "copyright"
 
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Vlaams"
+#, fuzzy
+#~ msgid "copy"
+#~ msgstr "firma"
 
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Noors Bokmål"
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "codec: %s, %u fps, %u ms"
 
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr "Reto-Romaans"
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr "Servo-Kroatisch (latijns schrift)"
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr "Servo-Kroatisch (cyrillisch schrift)"
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Perzisch"
-
-#: src/plugins/ole2_extractor.c:578
-#, fuzzy, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr "Revisie #%u: Auteur '%s' werkte aan '%s'"
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "codec: %s, %u fps, %u ms"
-
 #, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u dots per inch?"

Modified: Extractor/po/ro.po
===================================================================
--- Extractor/po/ro.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/ro.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.5.3\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2005-08-16 12:00-0500\n"
 "Last-Translator: Laurentiu Buzdugan <address@hidden>\n"
 "Language-Team: Romanian <address@hidden>\n"
@@ -529,7 +529,7 @@
 msgid "description"
 msgstr "descriere"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "copyright"
 
@@ -1615,807 +1615,592 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: op�iunea `-W %s' nu permite un argument\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
+#: src/plugins/flac_extractor.c:314
+#, c-format
+msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
 msgstr ""
 
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
 msgstr ""
 
-#: src/plugins/applefile_extractor.c:168
-#, fuzzy
-msgid "Bytes"
-msgstr "Blues"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr ""
 
-#: src/plugins/flac_extractor.c:314
-#, c-format
-msgid "%u Hz, %u channels"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blues"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Rock clasic"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "�ar�"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Dance"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Disco"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Funk"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Grunge"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hip-Hop"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Jazz"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Metal"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "New Age"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Oldies"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Altele"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pop"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "R&B"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:578
+#, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr ""
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "mono"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rock"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "stereo"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Techno"
+#, fuzzy
+#~ msgid "Bytes"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Industrial"
+#~ msgid "Blues"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Alternative"
+#~ msgid "Classic Rock"
+#~ msgstr "Rock clasic"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#, fuzzy
+#~ msgid "Country"
+#~ msgstr "�ar�"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Death Metal"
+#~ msgid "Dance"
+#~ msgstr "Dance"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Pranks"
+#~ msgid "Disco"
+#~ msgstr "Disco"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Soundtrack"
+#~ msgid "Funk"
+#~ msgstr "Funk"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Euro-Techno"
+#~ msgid "Grunge"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Ambient"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hip-Hop"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Trip-Hop"
+#~ msgid "Jazz"
+#~ msgstr "Jazz"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Vocal"
+#~ msgid "Metal"
+#~ msgstr "Metal"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Jazz+Funk"
+#~ msgid "New Age"
+#~ msgstr "New Age"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Fusion"
+#~ msgid "Oldies"
+#~ msgstr "Oldies"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Trance"
+#~ msgid "Other"
+#~ msgstr "Altele"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Clasic�"
+#~ msgid "Pop"
+#~ msgstr "Pop"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Instrumental"
+#~ msgid "R&B"
+#~ msgstr "R&B"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Acid"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "House"
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Joc"
+#~ msgid "Rock"
+#~ msgstr "Rock"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Clip sonor"
+#~ msgid "Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Gospel"
+#~ msgid "Industrial"
+#~ msgstr "Industrial"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Zgomot"
+#~ msgid "Alternative"
+#~ msgstr "Alternative"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Rock Alternativ"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Bass"
+#~ msgid "Death Metal"
+#~ msgstr "Death Metal"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Soul"
+#~ msgid "Pranks"
+#~ msgstr "Pranks"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punk"
+#~ msgid "Soundtrack"
+#~ msgstr "Soundtrack"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Spa�iu"
+#~ msgid "Euro-Techno"
+#~ msgstr "Euro-Techno"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "Meditativ"
+#~ msgid "Ambient"
+#~ msgstr "Ambient"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Instrumental Pop"
+#~ msgid "Trip-Hop"
+#~ msgstr "Trip-Hop"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Instrumental Rock"
+#~ msgid "Vocal"
+#~ msgstr "Vocal"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Ethnic"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Jazz+Funk"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gothic"
+#~ msgid "Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Darkwave"
+#~ msgid "Trance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Techno-Industrial"
+#~ msgid "Classical"
+#~ msgstr "Clasic�"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Electronic"
+#~ msgid "Instrumental"
+#~ msgstr "Instrumental"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pop-Folk"
+#~ msgid "Acid"
+#~ msgstr "Acid"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Eurodance"
+#~ msgid "House"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Dream"
+#~ msgid "Game"
+#~ msgstr "Joc"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Southern Rock"
+#~ msgid "Sound Clip"
+#~ msgstr "Clip sonor"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Comedy"
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Cult"
+#~ msgid "Noise"
+#~ msgstr "Zgomot"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Gangsta Rap"
+#~ msgid "Alt. Rock"
+#~ msgstr "Rock Alternativ"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Top 40"
+#~ msgid "Bass"
+#~ msgstr "Bass"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Christian Rap"
+#~ msgid "Soul"
+#~ msgstr "Soul"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pop/Funk"
+#~ msgid "Punk"
+#~ msgstr "Punk"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Jungle"
+#~ msgid "Space"
+#~ msgstr "Spa�iu"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Native American"
+#~ msgid "Meditative"
+#~ msgstr "Meditativ"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Cabaret"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Instrumental Pop"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "New Wave"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Instrumental Rock"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Psychedelic"
+#~ msgid "Ethnic"
+#~ msgstr "Ethnic"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rave"
+#~ msgid "Gothic"
+#~ msgstr "Gothic"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Showtunes"
+#~ msgid "Darkwave"
+#~ msgstr "Darkwave"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Trailer"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Techno-Industrial"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "Lo-Fi"
+#~ msgid "Electronic"
+#~ msgstr "Electronic"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Tribal"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pop-Folk"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Acid Punk"
+#~ msgid "Eurodance"
+#~ msgstr "Eurodance"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#~ msgid "Dream"
+#~ msgstr "Dream"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polka"
+#~ msgid "Southern Rock"
+#~ msgstr "Southern Rock"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Retro"
+#~ msgid "Comedy"
+#~ msgstr "Comedy"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Musical"
+#~ msgid "Cult"
+#~ msgstr "Cult"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rock & Roll"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Gangsta Rap"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Hard Rock"
+#~ msgid "Top 40"
+#~ msgstr "Top 40"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Folk"
+#~ msgid "Christian Rap"
+#~ msgstr "Christian Rap"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Folk/Rock"
+#~ msgid "Pop/Funk"
+#~ msgstr "Pop/Funk"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "National Folk"
+#~ msgid "Jungle"
+#~ msgstr "Jungle"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Swing"
+#~ msgid "Native American"
+#~ msgstr "Native American"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Fast-Fusion"
+#~ msgid "Cabaret"
+#~ msgstr "Cabaret"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bebob"
+#~ msgid "New Wave"
+#~ msgstr "New Wave"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-#, fuzzy
-msgid "Latin"
-msgstr "Latin"
+#~ msgid "Psychedelic"
+#~ msgstr "Psychedelic"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Revival"
+#~ msgid "Rave"
+#~ msgstr "Rave"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Celtic"
+#~ msgid "Showtunes"
+#~ msgstr "Showtunes"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#~ msgid "Trailer"
+#~ msgstr "Trailer"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avantgarde"
+#~ msgid "Lo-Fi"
+#~ msgstr "Lo-Fi"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Gothic Rock"
+#~ msgid "Tribal"
+#~ msgstr "Tribal"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Progressive Rock"
+#~ msgid "Acid Punk"
+#~ msgstr "Acid Punk"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Psychedelic Rock"
+#~ msgid "Acid Jazz"
+#~ msgstr "Acid Jazz"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Symphonic Rock"
+#~ msgid "Polka"
+#~ msgstr "Polka"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Slow Rock"
+#~ msgid "Retro"
+#~ msgstr "Retro"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Big Band"
+#~ msgid "Musical"
+#~ msgstr "Musical"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Chorus"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rock & Roll"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "Easy Listening"
+#~ msgid "Hard Rock"
+#~ msgstr "Hard Rock"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Acoustic"
+#~ msgid "Folk"
+#~ msgstr "Folk"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Umor"
+#~ msgid "Folk/Rock"
+#~ msgstr "Folk/Rock"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Discurs"
+#~ msgid "National Folk"
+#~ msgstr "National Folk"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Chanson"
+#~ msgid "Swing"
+#~ msgstr "Swing"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Oper�"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Fast-Fusion"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Muzic� de camer�"
+#~ msgid "Bebob"
+#~ msgstr "Bebob"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Sonet"
+#, fuzzy
+#~ msgid "Latin"
+#~ msgstr "Latin"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Simfonie"
+#~ msgid "Revival"
+#~ msgstr "Revival"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Booty Bass"
+#~ msgid "Celtic"
+#~ msgstr "Celtic"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Primus"
+#~ msgid "Bluegrass"
+#~ msgstr "Bluegrass"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Porn Groove"
+#~ msgid "Avantgarde"
+#~ msgstr "Avantgarde"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Satire"
+#~ msgid "Gothic Rock"
+#~ msgstr "Gothic Rock"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Slow Jam"
+#~ msgid "Progressive Rock"
+#~ msgstr "Progressive Rock"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Psychedelic Rock"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tango"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Symphonic Rock"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
+#~ msgid "Slow Rock"
+#~ msgstr "Slow Rock"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Folklore"
+#~ msgid "Big Band"
+#~ msgstr "Big Band"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Ballad"
+#~ msgid "Chorus"
+#~ msgstr "Chorus"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Power Ballad"
+#~ msgid "Easy Listening"
+#~ msgstr "Easy Listening"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Rhythmic Soul"
+#~ msgid "Acoustic"
+#~ msgstr "Acoustic"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Freestyle"
+#~ msgid "Humour"
+#~ msgstr "Umor"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Duet"
+#~ msgid "Speech"
+#~ msgstr "Discurs"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punk Rock"
+#~ msgid "Chanson"
+#~ msgstr "Chanson"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Drum Solo"
+#~ msgid "Opera"
+#~ msgstr "Oper�"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "A Cappella"
+#~ msgid "Chamber Music"
+#~ msgstr "Muzic� de camer�"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Euro-House"
+#~ msgid "Sonata"
+#~ msgstr "Sonet"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Dance Hall"
+#~ msgid "Symphony"
+#~ msgstr "Simfonie"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Booty Bass"
+#~ msgstr "Booty Bass"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Drum & Bass"
+#~ msgid "Primus"
+#~ msgstr "Primus"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Club-House"
+#~ msgid "Porn Groove"
+#~ msgstr "Porn Groove"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Hardcore"
+#~ msgid "Satire"
+#~ msgstr "Satire"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Terror"
+#~ msgid "Slow Jam"
+#~ msgstr "Slow Jam"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Indie"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "BritPop"
+#~ msgid "Tango"
+#~ msgstr "Tango"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Negerpunk"
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Polsk Punk"
+#~ msgid "Folklore"
+#~ msgstr "Folklore"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Beat"
+#~ msgid "Ballad"
+#~ msgstr "Ballad"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Christian Gangsta Rap"
+#~ msgid "Power Ballad"
+#~ msgstr "Power Ballad"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Heavy Metal"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Rhythmic Soul"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Black Metal"
+#~ msgid "Freestyle"
+#~ msgstr "Freestyle"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Crossover"
+#~ msgid "Duet"
+#~ msgstr "Duet"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Contemporary Christian"
+#~ msgid "Punk Rock"
+#~ msgstr "Punk Rock"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Christian Rock"
+#~ msgid "Drum Solo"
+#~ msgstr "Drum Solo"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Merengue"
+#~ msgid "A Cappella"
+#~ msgstr "A Cappella"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "Euro-House"
+#~ msgstr "Euro-House"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Thrash Metal"
+#~ msgid "Dance Hall"
+#~ msgstr "Dance Hall"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "Anime"
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "JPop"
+#~ msgid "Drum & Bass"
+#~ msgstr "Drum & Bass"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Synthpop"
+#~ msgid "Club-House"
+#~ msgstr "Club-House"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Comenzi"
+#~ msgid "Hardcore"
+#~ msgstr "Hardcore"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Apeluri sistem"
+#~ msgid "Terror"
+#~ msgstr "Terror"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Apeluri de bibliotec�"
+#~ msgid "Indie"
+#~ msgstr "Indie"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Fi�iere speciale"
+#~ msgid "BritPop"
+#~ msgstr "BritPop"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Formate de fi�iere �i conven�ii"
+#~ msgid "Negerpunk"
+#~ msgstr "Negerpunk"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Jocuri"
+#~ msgid "Polsk Punk"
+#~ msgstr "Polsk Punk"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Conven�ii �i diverse"
+#~ msgid "Beat"
+#~ msgstr "Beat"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Comenzi pentru managementul sistemului"
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Christian Gangsta Rap"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Proceduri kernel"
+#~ msgid "Heavy Metal"
+#~ msgstr "Heavy Metal"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "stereo"
+#~ msgid "Black Metal"
+#~ msgstr "Black Metal"
 
-#: src/plugins/mp3_extractor.c:96
-#, fuzzy
-msgid "joint stereo"
-msgstr "stereo"
+#~ msgid "Crossover"
+#~ msgstr "Crossover"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
+#~ msgid "Contemporary Christian"
+#~ msgstr "Contemporary Christian"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "mono"
+#~ msgid "Christian Rock"
+#~ msgstr "Christian Rock"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
+#~ msgid "Merengue"
+#~ msgstr "Merengue"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
+#~ msgid "Thrash Metal"
+#~ msgstr "Thrash Metal"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
+#~ msgid "Anime"
+#~ msgstr "Anime"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
+#~ msgid "JPop"
+#~ msgstr "JPop"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
+#~ msgid "Synthpop"
+#~ msgstr "Synthpop"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
+#~ msgid "Commands"
+#~ msgstr "Comenzi"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
+#~ msgid "System calls"
+#~ msgstr "Apeluri sistem"
 
-#: src/plugins/mp3_extractor.c:206
-#, fuzzy
-msgid "no copyright"
-msgstr "copyright"
+#~ msgid "Library calls"
+#~ msgstr "Apeluri de bibliotec�"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
+#~ msgid "Special files"
+#~ msgstr "Fi�iere speciale"
 
-#: src/plugins/mp3_extractor.c:207
-#, fuzzy
-msgid "copy"
-msgstr "copyright"
+#~ msgid "File formats and conventions"
+#~ msgstr "Formate de fi�iere �i conven�ii"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr ""
+#~ msgid "Games"
+#~ msgstr "Jocuri"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr ""
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Conven�ii �i diverse"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr ""
+#~ msgid "System management commands"
+#~ msgstr "Comenzi pentru managementul sistemului"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr ""
+#~ msgid "Kernel routines"
+#~ msgstr "Proceduri kernel"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr ""
+#, fuzzy
+#~ msgid "joint stereo"
+#~ msgstr "stereo"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr ""
+#, fuzzy
+#~ msgid "no copyright"
+#~ msgstr "copyright"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr ""
+#, fuzzy
+#~ msgid "copy"
+#~ msgstr "copyright"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr ""
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "codec: %s, %u fps, %u ms"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:578
-#, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr ""
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "codec: %s, %u fps, %u ms"
-
 #, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u puncte pe inci?"

Modified: Extractor/po/rw.po
===================================================================
--- Extractor/po/rw.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/rw.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -16,7 +16,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.4.2\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2005-04-04 10:55-0700\n"
 "Last-Translator: Steven Michael Murphy <address@hidden>\n"
 "Language-Team: Kinyarwanda <address@hidden>\n"
@@ -596,7 +596,7 @@
 msgid "description"
 msgstr "Isobanuramiterere"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 #, fuzzy
 msgid "copyright"
 msgstr "Uburenganzira bw'umuhimbyi"
@@ -1787,456 +1787,151 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s:Ihitamo Kwemerera"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr ""
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr ""
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "Igihugu"
-
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-#, fuzzy
-msgid "Dance"
-msgstr "Umwanya"
-
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Icyuma"
-
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Ikindi"
-
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-#, fuzzy
-msgid "Death Metal"
-msgstr "Icyuma"
-
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
+#: src/plugins/ole2_extractor.c:578
+#, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
 msgstr ""
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr ""
+#, fuzzy
+#~ msgid "Country"
+#~ msgstr "Igihugu"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
 #, fuzzy
-msgid "Fusion"
-msgstr "Isobanuramiterere"
+#~ msgid "Dance"
+#~ msgstr "Umwanya"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr ""
+#~ msgid "Metal"
+#~ msgstr "Icyuma"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr ""
+#~ msgid "Other"
+#~ msgstr "Ikindi"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr ""
+#, fuzzy
+#~ msgid "Death Metal"
+#~ msgstr "Icyuma"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr ""
+#, fuzzy
+#~ msgid "Fusion"
+#~ msgstr "Isobanuramiterere"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr ""
+#~ msgid "Space"
+#~ msgstr "Umwanya"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Umwanya"
-
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
 #, fuzzy
-msgid "Ethnic"
-msgstr "Ikinyagotike"
+#~ msgid "Ethnic"
+#~ msgstr "Ikinyagotike"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Ikinyagotike"
+#~ msgid "Gothic"
+#~ msgstr "Ikinyagotike"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr ""
+#~ msgid "Electronic"
+#~ msgstr "elegitoroniki"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "elegitoroniki"
-
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
 #, fuzzy
-msgid "Swing"
-msgstr "Iburira"
+#~ msgid "Swing"
+#~ msgstr "Iburira"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
 #, fuzzy
-msgid "Latin"
-msgstr "Ikiratini"
+#~ msgid "Latin"
+#~ msgstr "Ikiratini"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
 #, fuzzy
-msgid "Gothic Rock"
-msgstr "Ikinyagotike"
+#~ msgid "Gothic Rock"
+#~ msgstr "Ikinyagotike"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
 #, fuzzy
-msgid "Opera"
-msgstr "Ikindi"
+#~ msgid "Opera"
+#~ msgstr "Ikindi"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr ""
-
 # ***** BEGIN LICENSE BLOCK *****
 # Version: MPL 1.1/GPL 2.0/LGPL 2.1
 #
@@ -2274,375 +1969,69 @@
 #
 # ***** END LICENSE BLOCK *****
 # Box Headings
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
 #, fuzzy
-msgid "Sonata"
-msgstr "Umuntu"
+#~ msgid "Sonata"
+#~ msgstr "Umuntu"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
 #, fuzzy
-msgid "Satire"
-msgstr "Itariki"
+#~ msgid "Satire"
+#~ msgstr "Itariki"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
 #, fuzzy
-msgid "A Cappella"
-msgstr "A"
+#~ msgid "A Cappella"
+#~ msgstr "A"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
 #, fuzzy
-msgid "Terror"
-msgstr "Nta kosa"
+#~ msgid "Terror"
+#~ msgstr "Nta kosa"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
 #, fuzzy
-msgid "Heavy Metal"
-msgstr "Icyuma"
+#~ msgid "Heavy Metal"
+#~ msgstr "Icyuma"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
 #, fuzzy
-msgid "Black Metal"
-msgstr "Icyuma"
+#~ msgid "Black Metal"
+#~ msgstr "Icyuma"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr ""
-
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
 #, fuzzy
-msgid "Anime"
-msgstr "umutwe"
+#~ msgid "Anime"
+#~ msgstr "umutwe"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr ""
+#~ msgid "Commands"
+#~ msgstr "amabwiriza"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr ""
-
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "amabwiriza"
-
-#: src/plugins/man_extractor.c:165
 #, fuzzy
-msgid "System calls"
-msgstr "Amahamagara:"
+#~ msgid "System calls"
+#~ msgstr "Amahamagara:"
 
-#: src/plugins/man_extractor.c:169
 #, fuzzy
-msgid "Library calls"
-msgstr "Amahamagara:"
+#~ msgid "Library calls"
+#~ msgstr "Amahamagara:"
 
-#: src/plugins/man_extractor.c:173
 #, fuzzy
-msgid "Special files"
-msgstr "Idosiye"
+#~ msgid "Special files"
+#~ msgstr "Idosiye"
 
-#: src/plugins/man_extractor.c:177
 #, fuzzy
-msgid "File formats and conventions"
-msgstr "Idosiye Imiterere Na"
+#~ msgid "File formats and conventions"
+#~ msgstr "Idosiye Imiterere Na"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr ""
-
-#: src/plugins/man_extractor.c:185
 #, fuzzy
-msgid "Conventions and miscellaneous"
-msgstr "Na Binyuranye"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Na Binyuranye"
 
-#: src/plugins/man_extractor.c:189
 #, fuzzy
-msgid "System management commands"
-msgstr "Amabwiriza"
+#~ msgid "System management commands"
+#~ msgstr "Amabwiriza"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:96
-msgid "joint stereo"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:206
 #, fuzzy
-msgid "no copyright"
-msgstr "Uburenganzira bw'umuhimbyi"
+#~ msgid "no copyright"
+#~ msgstr "Uburenganzira bw'umuhimbyi"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr ""
-
-#: src/plugins/mp3_extractor.c:207
 #, fuzzy
-msgid "copy"
-msgstr "Uburenganzira bw'umuhimbyi"
+#~ msgid "copy"
+#~ msgstr "Uburenganzira bw'umuhimbyi"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr ""
-
-#: src/plugins/ole2_extractor.c:578
-#, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr ""
-
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr ""
-
 #, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%uUtudomo Inci"

Modified: Extractor/po/sv.po
===================================================================
--- Extractor/po/sv.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/sv.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.5.22\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2009-05-12 17:45+0100\n"
 "Last-Translator: Daniel Nylander <address@hidden>\n"
 "Language-Team: Swedish <address@hidden>\n"
@@ -526,7 +526,7 @@
 msgid "description"
 msgstr "beskrivning"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "copyright"
 
@@ -1611,806 +1611,630 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: flagga \"-W %s\" tillåter inte ett argument\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "GB"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "MB"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "KB"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "Byte"
-
 #: src/plugins/flac_extractor.c:314
 #, fuzzy, c-format
 msgid "%u Hz, %u channels"
 msgstr "dual channel"
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blues"
+# Hjälp! Rätt översättning?
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr "Ingen korrekturläsning"
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Klassisk rock"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Traditionell kinesiska"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-#, fuzzy
-msgid "Country"
-msgstr "Country"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Förenklad kinesiska"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Dans"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Schweizisk tyska"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Disco"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "Amerikansk engelska"
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Funk"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Brittisk engelska"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Grunge"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Australisk engelska"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hip-Hop"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr "Kastiliansk spanska"
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Jazz"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Mexikansk spanska"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Metal"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Belgisk franska"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "New Age"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Kanadensisk franska"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Gamla godingar"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Schweizisk franska"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Övrigt"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Schweizisk italienska"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pop"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Belgisk holländska"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "R&B"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Norska (Bokmål)"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr "Rätoromanska"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Reggae"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr "Kroatoserbiska (Latin)"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rock"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr "Serbokroatiska (Kyrillisk)"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Techno"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Farsi"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Industriell"
+#: src/plugins/ole2_extractor.c:578
+#, fuzzy, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr "Revision %u: Upphovsmannen \"%s\" arbetade på \"%s\""
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Alternativ"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "mono"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "stereo"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Death Metal"
+#~ msgid "GB"
+#~ msgstr "GB"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Skämt"
+#~ msgid "MB"
+#~ msgstr "MB"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Soundtrack"
+#~ msgid "KB"
+#~ msgstr "KB"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Euro-Techno"
+#~ msgid "Bytes"
+#~ msgstr "Byte"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Ambient"
+#~ msgid "Blues"
+#~ msgstr "Blues"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Trip-Hop"
+#~ msgid "Classic Rock"
+#~ msgstr "Klassisk rock"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Vocal"
+#, fuzzy
+#~ msgid "Country"
+#~ msgstr "Country"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Jazz+Funk"
+#~ msgid "Dance"
+#~ msgstr "Dans"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Fusion"
+#~ msgid "Disco"
+#~ msgstr "Disco"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Trance"
+#~ msgid "Funk"
+#~ msgstr "Funk"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Klassisk"
+#~ msgid "Grunge"
+#~ msgstr "Grunge"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Instrumental"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hip-Hop"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Acid"
+#~ msgid "Jazz"
+#~ msgstr "Jazz"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "House"
+#~ msgid "Metal"
+#~ msgstr "Metal"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Spel"
+#~ msgid "New Age"
+#~ msgstr "New Age"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Ljudklipp"
+#~ msgid "Oldies"
+#~ msgstr "Gamla godingar"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Gospel"
+#~ msgid "Other"
+#~ msgstr "Övrigt"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Noise"
+#~ msgid "Pop"
+#~ msgstr "Pop"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Alt. Rock"
+#~ msgid "R&B"
+#~ msgstr "R&B"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Bas"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Soul"
+#~ msgid "Reggae"
+#~ msgstr "Reggae"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Punk"
+#~ msgid "Rock"
+#~ msgstr "Rock"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Space"
+#~ msgid "Techno"
+#~ msgstr "Techno"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "Meditativ"
+#~ msgid "Industrial"
+#~ msgstr "Industriell"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Instrumental Pop"
+#~ msgid "Alternative"
+#~ msgstr "Alternativ"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Instrumental Rock"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Ethnic"
+#~ msgid "Death Metal"
+#~ msgstr "Death Metal"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gothic"
+#~ msgid "Pranks"
+#~ msgstr "Skämt"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Darkwave"
+#~ msgid "Soundtrack"
+#~ msgstr "Soundtrack"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Techno-Industrial"
+#~ msgid "Euro-Techno"
+#~ msgstr "Euro-Techno"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Elektronisk"
+#~ msgid "Ambient"
+#~ msgstr "Ambient"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pop-Folk"
+#~ msgid "Trip-Hop"
+#~ msgstr "Trip-Hop"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Eurodance"
+#~ msgid "Vocal"
+#~ msgstr "Vocal"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Dream"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Jazz+Funk"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Southern Rock"
+#~ msgid "Fusion"
+#~ msgstr "Fusion"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Komedi"
+#~ msgid "Trance"
+#~ msgstr "Trance"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Kult"
+#~ msgid "Classical"
+#~ msgstr "Klassisk"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Gangsta Rap"
+#~ msgid "Instrumental"
+#~ msgstr "Instrumental"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Topp 40"
+#~ msgid "Acid"
+#~ msgstr "Acid"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Kristen rap"
+#~ msgid "House"
+#~ msgstr "House"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pop/Funk"
+#~ msgid "Game"
+#~ msgstr "Spel"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Jungle"
+#~ msgid "Sound Clip"
+#~ msgstr "Ljudklipp"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Native American"
+#~ msgid "Gospel"
+#~ msgstr "Gospel"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Kabaret"
+#~ msgid "Noise"
+#~ msgstr "Noise"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "New Wave"
+#~ msgid "Alt. Rock"
+#~ msgstr "Alt. Rock"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Psykadelisk"
+#~ msgid "Bass"
+#~ msgstr "Bas"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rave"
+#~ msgid "Soul"
+#~ msgstr "Soul"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Showtunes"
+#~ msgid "Punk"
+#~ msgstr "Punk"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Trailer"
+#~ msgid "Space"
+#~ msgstr "Space"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "Lo-Fi"
+#~ msgid "Meditative"
+#~ msgstr "Meditativ"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Tribal"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Instrumental Pop"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Acid Punk"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Instrumental Rock"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#~ msgid "Ethnic"
+#~ msgstr "Ethnic"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Polka"
+#~ msgid "Gothic"
+#~ msgstr "Gothic"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Retro"
+#~ msgid "Darkwave"
+#~ msgstr "Darkwave"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Musikal"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Techno-Industrial"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rock & Roll"
+#~ msgid "Electronic"
+#~ msgstr "Elektronisk"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Hårdrock"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pop-Folk"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Folk"
+#~ msgid "Eurodance"
+#~ msgstr "Eurodance"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Folk/Rock"
+#~ msgid "Dream"
+#~ msgstr "Dream"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "National Folk"
+#~ msgid "Southern Rock"
+#~ msgstr "Southern Rock"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Swing"
+#~ msgid "Comedy"
+#~ msgstr "Komedi"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Fast-Fusion"
+#~ msgid "Cult"
+#~ msgstr "Kult"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bebob"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Gangsta Rap"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-#, fuzzy
-msgid "Latin"
-msgstr "Latin"
+#~ msgid "Top 40"
+#~ msgstr "Topp 40"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Revival"
+#~ msgid "Christian Rap"
+#~ msgstr "Kristen rap"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Keltisk"
+#~ msgid "Pop/Funk"
+#~ msgstr "Pop/Funk"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#~ msgid "Jungle"
+#~ msgstr "Jungle"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Avantgarde"
+#~ msgid "Native American"
+#~ msgstr "Native American"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Gothisk rock"
+#~ msgid "Cabaret"
+#~ msgstr "Kabaret"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Progressiv rock"
+#~ msgid "New Wave"
+#~ msgstr "New Wave"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Psykedelisk rock"
+#~ msgid "Psychedelic"
+#~ msgstr "Psykadelisk"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Symfonisk rock"
+#~ msgid "Rave"
+#~ msgstr "Rave"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Långsam rock"
+#~ msgid "Showtunes"
+#~ msgstr "Showtunes"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Storband"
+#~ msgid "Trailer"
+#~ msgstr "Trailer"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Chorus"
+#~ msgid "Lo-Fi"
+#~ msgstr "Lo-Fi"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "Lättsam lyssning"
+#~ msgid "Tribal"
+#~ msgstr "Tribal"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Ackustisk"
+#~ msgid "Acid Punk"
+#~ msgstr "Acid Punk"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Humor"
+#~ msgid "Acid Jazz"
+#~ msgstr "Acid Jazz"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Tal"
+#~ msgid "Polka"
+#~ msgstr "Polka"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Chanson"
+#~ msgid "Retro"
+#~ msgstr "Retro"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Opera"
+#~ msgid "Musical"
+#~ msgstr "Musikal"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Kammarmusik"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rock & Roll"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Sonata"
+#~ msgid "Hard Rock"
+#~ msgstr "Hårdrock"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Symfoni"
+#~ msgid "Folk"
+#~ msgstr "Folk"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Booty Bass"
+#~ msgid "Folk/Rock"
+#~ msgstr "Folk/Rock"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Primus"
+#~ msgid "National Folk"
+#~ msgstr "National Folk"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Porn Groove"
+#~ msgid "Swing"
+#~ msgstr "Swing"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Satir"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Fast-Fusion"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Slow Jam"
+#~ msgid "Bebob"
+#~ msgstr "Bebob"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Club"
+#, fuzzy
+#~ msgid "Latin"
+#~ msgstr "Latin"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tango"
+#~ msgid "Revival"
+#~ msgstr "Revival"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Samba"
+#~ msgid "Celtic"
+#~ msgstr "Keltisk"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Folklore"
+#~ msgid "Bluegrass"
+#~ msgstr "Bluegrass"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Ballad"
+#~ msgid "Avantgarde"
+#~ msgstr "Avantgarde"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Power Ballad"
+#~ msgid "Gothic Rock"
+#~ msgstr "Gothisk rock"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Rhythmic Soul"
+#~ msgid "Progressive Rock"
+#~ msgstr "Progressiv rock"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Freestyle"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Psykedelisk rock"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Duet"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Symfonisk rock"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Punk Rock"
+#~ msgid "Slow Rock"
+#~ msgstr "Långsam rock"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Trumsolo"
+#~ msgid "Big Band"
+#~ msgstr "Storband"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "A cappella"
+#~ msgid "Chorus"
+#~ msgstr "Chorus"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Euro-House"
+#~ msgid "Easy Listening"
+#~ msgstr "Lättsam lyssning"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Dance Hall"
+#~ msgid "Acoustic"
+#~ msgstr "Ackustisk"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Humour"
+#~ msgstr "Humor"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Drum & Bass"
+#~ msgid "Speech"
+#~ msgstr "Tal"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Club-House"
+#~ msgid "Chanson"
+#~ msgstr "Chanson"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Hardcore"
+#~ msgid "Opera"
+#~ msgstr "Opera"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Terror"
+#~ msgid "Chamber Music"
+#~ msgstr "Kammarmusik"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Indie"
+#~ msgid "Sonata"
+#~ msgstr "Sonata"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "BritPop"
+#~ msgid "Symphony"
+#~ msgstr "Symfoni"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Negerpunk"
+#~ msgid "Booty Bass"
+#~ msgstr "Booty Bass"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Polsk Punk"
+#~ msgid "Primus"
+#~ msgstr "Primus"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Beat"
+#~ msgid "Porn Groove"
+#~ msgstr "Porn Groove"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Christian Gangsta Rap"
+#~ msgid "Satire"
+#~ msgstr "Satir"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Heavy Metal"
+#~ msgid "Slow Jam"
+#~ msgstr "Slow Jam"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Black Metal"
+#~ msgid "Club"
+#~ msgstr "Club"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Crossover"
+#~ msgid "Tango"
+#~ msgstr "Tango"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Contemporary Christian"
+#~ msgid "Samba"
+#~ msgstr "Samba"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Kristen rock"
+#~ msgid "Folklore"
+#~ msgstr "Folklore"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Merengue"
+#~ msgid "Ballad"
+#~ msgstr "Ballad"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Salsa"
+#~ msgid "Power Ballad"
+#~ msgstr "Power Ballad"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Thrash Metal"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Rhythmic Soul"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "Anime"
+#~ msgid "Freestyle"
+#~ msgstr "Freestyle"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "JPop"
+#~ msgid "Duet"
+#~ msgstr "Duet"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Synthpop"
+#~ msgid "Punk Rock"
+#~ msgstr "Punk Rock"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Kommandon"
+#~ msgid "Drum Solo"
+#~ msgstr "Trumsolo"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Systemanrop"
+#~ msgid "A Cappella"
+#~ msgstr "A cappella"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Biblioteksanrop"
+#~ msgid "Euro-House"
+#~ msgstr "Euro-House"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Specialfiler"
+#~ msgid "Dance Hall"
+#~ msgstr "Dance Hall"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Filformat och konventioner"
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Spel"
+#~ msgid "Drum & Bass"
+#~ msgstr "Drum & Bass"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Konventioner och diverse"
+#~ msgid "Club-House"
+#~ msgstr "Club-House"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Kommandon för systemhantering"
+#~ msgid "Hardcore"
+#~ msgstr "Hardcore"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Kärnrutiner"
+#~ msgid "Terror"
+#~ msgstr "Terror"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "stereo"
+#~ msgid "Indie"
+#~ msgstr "Indie"
 
-#: src/plugins/mp3_extractor.c:96
-msgid "joint stereo"
-msgstr "joint stereo"
+#~ msgid "BritPop"
+#~ msgstr "BritPop"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr "dual channel"
+#~ msgid "Negerpunk"
+#~ msgstr "Negerpunk"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "mono"
+#~ msgid "Polsk Punk"
+#~ msgstr "Polsk Punk"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr "MPEG-1"
+#~ msgid "Beat"
+#~ msgstr "Beat"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr "MPEG-2"
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Christian Gangsta Rap"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr "MPEG-2.5"
+#~ msgid "Heavy Metal"
+#~ msgstr "Heavy Metal"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr "Layer I"
+#~ msgid "Black Metal"
+#~ msgstr "Black Metal"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr "Layer II"
+#~ msgid "Crossover"
+#~ msgstr "Crossover"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr "Layer III"
+#~ msgid "Contemporary Christian"
+#~ msgstr "Contemporary Christian"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr "VBR"
+#~ msgid "Christian Rock"
+#~ msgstr "Kristen rock"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr "CBR"
+#~ msgid "Merengue"
+#~ msgstr "Merengue"
 
-#: src/plugins/mp3_extractor.c:206
-msgid "no copyright"
-msgstr "ingen copyright"
+#~ msgid "Salsa"
+#~ msgstr "Salsa"
 
-#: src/plugins/mp3_extractor.c:207
-#, fuzzy
-msgid "original"
-msgstr "original"
+#~ msgid "Thrash Metal"
+#~ msgstr "Thrash Metal"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "copy"
-msgstr "kopia"
+#~ msgid "Anime"
+#~ msgstr "Anime"
 
-# Hjälp! Rätt översättning?
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr "Ingen korrekturläsning"
+#~ msgid "JPop"
+#~ msgstr "JPop"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Traditionell kinesiska"
+#~ msgid "Synthpop"
+#~ msgstr "Synthpop"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Förenklad kinesiska"
+#~ msgid "Commands"
+#~ msgstr "Kommandon"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Schweizisk tyska"
+#~ msgid "System calls"
+#~ msgstr "Systemanrop"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "Amerikansk engelska"
+#~ msgid "Library calls"
+#~ msgstr "Biblioteksanrop"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Brittisk engelska"
+#~ msgid "Special files"
+#~ msgstr "Specialfiler"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Australisk engelska"
+#~ msgid "File formats and conventions"
+#~ msgstr "Filformat och konventioner"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr "Kastiliansk spanska"
+#~ msgid "Games"
+#~ msgstr "Spel"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Mexikansk spanska"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Konventioner och diverse"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Belgisk franska"
+#~ msgid "System management commands"
+#~ msgstr "Kommandon för systemhantering"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Kanadensisk franska"
+#~ msgid "Kernel routines"
+#~ msgstr "Kärnrutiner"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Schweizisk franska"
+#~ msgid "joint stereo"
+#~ msgstr "joint stereo"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Schweizisk italienska"
+#~ msgid "dual channel"
+#~ msgstr "dual channel"
 
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Belgisk holländska"
+#~ msgid "MPEG-1"
+#~ msgstr "MPEG-1"
 
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Norska (Bokmål)"
+#~ msgid "MPEG-2"
+#~ msgstr "MPEG-2"
 
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr "Rätoromanska"
+#~ msgid "MPEG-2.5"
+#~ msgstr "MPEG-2.5"
 
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr "Kroatoserbiska (Latin)"
+#~ msgid "Layer I"
+#~ msgstr "Layer I"
 
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr "Serbokroatiska (Kyrillisk)"
+#~ msgid "Layer II"
+#~ msgstr "Layer II"
 
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Farsi"
+#~ msgid "Layer III"
+#~ msgstr "Layer III"
 
-#: src/plugins/ole2_extractor.c:578
-#, fuzzy, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr "Revision %u: Upphovsmannen \"%s\" arbetade på \"%s\""
+#~ msgid "VBR"
+#~ msgstr "VBR"
 
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "kodek: %s, %u bilder/s, %u ms"
+#~ msgid "CBR"
+#~ msgstr "CBR"
 
+#~ msgid "no copyright"
+#~ msgstr "ingen copyright"
+
 #, fuzzy
+#~ msgid "original"
+#~ msgstr "original"
+
+#~ msgid "copy"
+#~ msgstr "kopia"
+
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "kodek: %s, %u bilder/s, %u ms"
+
+#, fuzzy
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%u×%u punkter per tum?"
 

Modified: Extractor/po/uk.po
===================================================================
--- Extractor/po/uk.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/uk.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.6.2\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2011-07-22 16:22+0300\n"
 "Last-Translator: Yuri Chornoivan <address@hidden>\n"
 "Language-Team: Ukrainian <address@hidden>\n"
@@ -515,7 +515,7 @@
 msgid "description"
 msgstr "опис"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "захищено авторськими правами"
 
@@ -1528,801 +1528,625 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: параметр «-W %s» не повинен мати аргументу\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "ГБ"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "МБ"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "КБ"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "байтів"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr "%u Гц, %u каналів"
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Блюз"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr "Без перевірки"
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Класичний рок"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Традиційна китайська"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-msgid "Country"
-msgstr "Кантрі"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Спрощена китайська"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Танцювальна"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Швейцарська німецька"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Диско"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "Американська англійська"
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Фанк"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Британська англійська"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Ґрандж"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Австралійська англійська"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Хіп-хоп"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr "Кастильська іспанська"
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Джаз"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Мексиканська іспанська"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Метал"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Бельгійська французька"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "Нью-ейдж"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Канадська французька"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Ретро"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Швейцарська французька"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Інша"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Швейцарська італійська"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Поп"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Бельгійська голландська"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "Ритм-енд-блюз"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Норвезька (бокмал)"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Реп"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr "Ретороманська"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Регі"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr "Хорвато-сербська (латиниця)"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Рок"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr "Сербо-хорватська (кирилиця)"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Техно"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Фарсі"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Індастріал"
+#: src/plugins/ole2_extractor.c:578
+#, fuzzy, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr "Модифікація %u: автор «%s», співробітник «%s»"
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Альтернативна"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "моно"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ска"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "стерео"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Деф-метал"
+#~ msgid "GB"
+#~ msgstr "ГБ"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Жарти-розиграші"
+#~ msgid "MB"
+#~ msgstr "МБ"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Звукова доріжка"
+#~ msgid "KB"
+#~ msgstr "КБ"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Євротехно"
+#~ msgid "Bytes"
+#~ msgstr "байтів"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Ембієнт"
+#~ msgid "Blues"
+#~ msgstr "Блюз"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Тріп-хоп"
+#~ msgid "Classic Rock"
+#~ msgstr "Класичний рок"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Вокал"
+#~ msgid "Country"
+#~ msgstr "Кантрі"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Джаз+Фанк"
+#~ msgid "Dance"
+#~ msgstr "Танцювальна"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Ф’южн"
+#~ msgid "Disco"
+#~ msgstr "Диско"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Транс"
+#~ msgid "Funk"
+#~ msgstr "Фанк"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Класика"
+#~ msgid "Grunge"
+#~ msgstr "Ґрандж"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Інструментальна"
+#~ msgid "Hip-Hop"
+#~ msgstr "Хіп-хоп"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Ейсід"
+#~ msgid "Jazz"
+#~ msgstr "Джаз"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "Хаус"
+#~ msgid "Metal"
+#~ msgstr "Метал"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Гра"
+#~ msgid "New Age"
+#~ msgstr "Нью-ейдж"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Звуковий уривок"
+#~ msgid "Oldies"
+#~ msgstr "Ретро"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Ґоспел"
+#~ msgid "Other"
+#~ msgstr "Інша"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Шум"
+#~ msgid "Pop"
+#~ msgstr "Поп"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Альт. рок"
+#~ msgid "R&B"
+#~ msgstr "Ритм-енд-блюз"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Бейс"
+#~ msgid "Rap"
+#~ msgstr "Реп"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Душа"
+#~ msgid "Reggae"
+#~ msgstr "Регі"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Панк"
+#~ msgid "Rock"
+#~ msgstr "Рок"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Простір"
+#~ msgid "Techno"
+#~ msgstr "Техно"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "Медитативна"
+#~ msgid "Industrial"
+#~ msgstr "Індастріал"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Інструментальний поп"
+#~ msgid "Alternative"
+#~ msgstr "Альтернативна"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Інструментальний рок"
+#~ msgid "Ska"
+#~ msgstr "Ска"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Етнічна"
+#~ msgid "Death Metal"
+#~ msgstr "Деф-метал"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Готична"
+#~ msgid "Pranks"
+#~ msgstr "Жарти-розиграші"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Дарквейв"
+#~ msgid "Soundtrack"
+#~ msgstr "Звукова доріжка"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Техно-індастріал"
+#~ msgid "Euro-Techno"
+#~ msgstr "Євротехно"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Електронна"
+#~ msgid "Ambient"
+#~ msgstr "Ембієнт"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Поп-фолк"
+#~ msgid "Trip-Hop"
+#~ msgstr "Тріп-хоп"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Євроденс"
+#~ msgid "Vocal"
+#~ msgstr "Вокал"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Дрім"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Джаз+Фанк"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Південний рок"
+#~ msgid "Fusion"
+#~ msgstr "Ф’южн"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Комедія"
+#~ msgid "Trance"
+#~ msgstr "Транс"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Культова"
+#~ msgid "Classical"
+#~ msgstr "Класика"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Гангста-реп"
+#~ msgid "Instrumental"
+#~ msgstr "Інструментальна"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "Топ-40"
+#~ msgid "Acid"
+#~ msgstr "Ейсід"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Християнський реп"
+#~ msgid "House"
+#~ msgstr "Хаус"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Поп/фанк"
+#~ msgid "Game"
+#~ msgstr "Гра"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Джангл"
+#~ msgid "Sound Clip"
+#~ msgstr "Звуковий уривок"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Індіанська"
+#~ msgid "Gospel"
+#~ msgstr "Ґоспел"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Кабаре"
+#~ msgid "Noise"
+#~ msgstr "Шум"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "Нью-вейв"
+#~ msgid "Alt. Rock"
+#~ msgstr "Альт. рок"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Психоделіка"
+#~ msgid "Bass"
+#~ msgstr "Бейс"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Рейв"
+#~ msgid "Soul"
+#~ msgstr "Душа"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Шоу-мелодії"
+#~ msgid "Punk"
+#~ msgstr "Панк"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Трейлер"
+#~ msgid "Space"
+#~ msgstr "Простір"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "Лоу-фай"
+#~ msgid "Meditative"
+#~ msgstr "Медитативна"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Племенна"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Інструментальний поп"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Ейсід-панк"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Інструментальний рок"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Ейсід-джаз"
+#~ msgid "Ethnic"
+#~ msgstr "Етнічна"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Полька"
+#~ msgid "Gothic"
+#~ msgstr "Готична"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Ретро"
+#~ msgid "Darkwave"
+#~ msgstr "Дарквейв"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Музична"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Техно-індастріал"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Рок-н-рол"
+#~ msgid "Electronic"
+#~ msgstr "Електронна"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Хардрок"
+#~ msgid "Pop-Folk"
+#~ msgstr "Поп-фолк"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Фольклор"
+#~ msgid "Eurodance"
+#~ msgstr "Євроденс"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Фольклор/рок"
+#~ msgid "Dream"
+#~ msgstr "Дрім"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "Народний фольклор"
+#~ msgid "Southern Rock"
+#~ msgstr "Південний рок"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Свінг"
+#~ msgid "Comedy"
+#~ msgstr "Комедія"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Фаст-ф’южн"
+#~ msgid "Cult"
+#~ msgstr "Культова"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Бібоб"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Гангста-реп"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-msgid "Latin"
-msgstr "Латинська"
+#~ msgid "Top 40"
+#~ msgstr "Топ-40"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Ривайвл"
+#~ msgid "Christian Rap"
+#~ msgstr "Християнський реп"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Кельтська"
+#~ msgid "Pop/Funk"
+#~ msgstr "Поп/фанк"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Блюграс"
+#~ msgid "Jungle"
+#~ msgstr "Джангл"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Авангард"
+#~ msgid "Native American"
+#~ msgstr "Індіанська"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Готичний рок"
+#~ msgid "Cabaret"
+#~ msgstr "Кабаре"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Прогресивний рок"
+#~ msgid "New Wave"
+#~ msgstr "Нью-вейв"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Психоделічний рок"
+#~ msgid "Psychedelic"
+#~ msgstr "Психоделіка"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Симфонічний рок"
+#~ msgid "Rave"
+#~ msgstr "Рейв"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Повільний рок"
+#~ msgid "Showtunes"
+#~ msgstr "Шоу-мелодії"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Біг-бенд"
+#~ msgid "Trailer"
+#~ msgstr "Трейлер"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Хорова"
+#~ msgid "Lo-Fi"
+#~ msgstr "Лоу-фай"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "Легка музика"
+#~ msgid "Tribal"
+#~ msgstr "Племенна"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Акустична"
+#~ msgid "Acid Punk"
+#~ msgstr "Ейсід-панк"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Гумор"
+#~ msgid "Acid Jazz"
+#~ msgstr "Ейсід-джаз"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Мова"
+#~ msgid "Polka"
+#~ msgstr "Полька"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Шансон"
+#~ msgid "Retro"
+#~ msgstr "Ретро"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Опера"
+#~ msgid "Musical"
+#~ msgstr "Музична"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Камерна музика"
+#~ msgid "Rock & Roll"
+#~ msgstr "Рок-н-рол"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Соната"
+#~ msgid "Hard Rock"
+#~ msgstr "Хардрок"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Симфонія"
+#~ msgid "Folk"
+#~ msgstr "Фольклор"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Буті-бейс"
+#~ msgid "Folk/Rock"
+#~ msgstr "Фольклор/рок"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Примас"
+#~ msgid "National Folk"
+#~ msgstr "Народний фольклор"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Порн-рів"
+#~ msgid "Swing"
+#~ msgstr "Свінг"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Сатира"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Фаст-ф’южн"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Повільний джем"
+#~ msgid "Bebob"
+#~ msgstr "Бібоб"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Клуб"
+#~ msgid "Latin"
+#~ msgstr "Латинська"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Танго"
+#~ msgid "Revival"
+#~ msgstr "Ривайвл"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Самба"
+#~ msgid "Celtic"
+#~ msgstr "Кельтська"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Фольклор"
+#~ msgid "Bluegrass"
+#~ msgstr "Блюграс"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Балада"
+#~ msgid "Avantgarde"
+#~ msgstr "Авангард"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Пауер-балада"
+#~ msgid "Gothic Rock"
+#~ msgstr "Готичний рок"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Ритмічний соул"
+#~ msgid "Progressive Rock"
+#~ msgstr "Прогресивний рок"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Вільний стиль"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Психоделічний рок"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Дует"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Симфонічний рок"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Панк-рок"
+#~ msgid "Slow Rock"
+#~ msgstr "Повільний рок"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Соло ударних"
+#~ msgid "Big Band"
+#~ msgstr "Біг-бенд"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "А капелла"
+#~ msgid "Chorus"
+#~ msgstr "Хорова"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Єврохаус"
+#~ msgid "Easy Listening"
+#~ msgstr "Легка музика"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Танцмайданчик"
+#~ msgid "Acoustic"
+#~ msgstr "Акустична"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Гоа"
+#~ msgid "Humour"
+#~ msgstr "Гумор"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Драм-енд-бейс"
+#~ msgid "Speech"
+#~ msgstr "Мова"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Клаб-хаус"
+#~ msgid "Chanson"
+#~ msgstr "Шансон"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Хардкор"
+#~ msgid "Opera"
+#~ msgstr "Опера"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Терор"
+#~ msgid "Chamber Music"
+#~ msgstr "Камерна музика"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "Інді"
+#~ msgid "Sonata"
+#~ msgstr "Соната"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "Бритпоп"
+#~ msgid "Symphony"
+#~ msgstr "Симфонія"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Негритянський панк"
+#~ msgid "Booty Bass"
+#~ msgstr "Буті-бейс"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Польський панк"
+#~ msgid "Primus"
+#~ msgstr "Примас"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Біт"
+#~ msgid "Porn Groove"
+#~ msgstr "Порн-рів"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Християнський гангста-реп"
+#~ msgid "Satire"
+#~ msgstr "Сатира"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Важкий метал"
+#~ msgid "Slow Jam"
+#~ msgstr "Повільний джем"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Блек-метал"
+#~ msgid "Club"
+#~ msgstr "Клуб"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Перетин"
+#~ msgid "Tango"
+#~ msgstr "Танго"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Сучасна християнська"
+#~ msgid "Samba"
+#~ msgstr "Самба"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Християнський рок"
+#~ msgid "Folklore"
+#~ msgstr "Фольклор"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Меренга"
+#~ msgid "Ballad"
+#~ msgstr "Балада"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "Сальса"
+#~ msgid "Power Ballad"
+#~ msgstr "Пауер-балада"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Треш-метал"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Ритмічний соул"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "Аніме"
+#~ msgid "Freestyle"
+#~ msgstr "Вільний стиль"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "Джей-поп"
+#~ msgid "Duet"
+#~ msgstr "Дует"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Синтез-поп"
+#~ msgid "Punk Rock"
+#~ msgstr "Панк-рок"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Команди"
+#~ msgid "Drum Solo"
+#~ msgstr "Соло ударних"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Системні виклики"
+#~ msgid "A Cappella"
+#~ msgstr "А капелла"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Виклики бібліотек"
+#~ msgid "Euro-House"
+#~ msgstr "Єврохаус"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Спеціальні файли"
+#~ msgid "Dance Hall"
+#~ msgstr "Танцмайданчик"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Формати файлів та правила"
+#~ msgid "Goa"
+#~ msgstr "Гоа"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Ігри"
+#~ msgid "Drum & Bass"
+#~ msgstr "Драм-енд-бейс"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Угоди та інше"
+#~ msgid "Club-House"
+#~ msgstr "Клаб-хаус"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Команди керування системою"
+#~ msgid "Hardcore"
+#~ msgstr "Хардкор"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Процедури ядра"
+#~ msgid "Terror"
+#~ msgstr "Терор"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "стерео"
+#~ msgid "Indie"
+#~ msgstr "Інді"
 
-#: src/plugins/mp3_extractor.c:96
-msgid "joint stereo"
-msgstr "об'єднане стерео"
+#~ msgid "BritPop"
+#~ msgstr "Бритпоп"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr "два канали"
+#~ msgid "Negerpunk"
+#~ msgstr "Негритянський панк"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "моно"
+#~ msgid "Polsk Punk"
+#~ msgstr "Польський панк"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr "MPEG-1"
+#~ msgid "Beat"
+#~ msgstr "Біт"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr "MPEG-2"
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Християнський гангста-реп"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr "MPEG-2.5"
+#~ msgid "Heavy Metal"
+#~ msgstr "Важкий метал"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr "Layer I"
+#~ msgid "Black Metal"
+#~ msgstr "Блек-метал"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr "Layer II"
+#~ msgid "Crossover"
+#~ msgstr "Перетин"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr "Layer III"
+#~ msgid "Contemporary Christian"
+#~ msgstr "Сучасна християнська"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr "VBR"
+#~ msgid "Christian Rock"
+#~ msgstr "Християнський рок"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr "CBR"
+#~ msgid "Merengue"
+#~ msgstr "Меренга"
 
-#: src/plugins/mp3_extractor.c:206
-msgid "no copyright"
-msgstr "без захисту авторськими правами"
+#~ msgid "Salsa"
+#~ msgstr "Сальса"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr "оригінал"
+#~ msgid "Thrash Metal"
+#~ msgstr "Треш-метал"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "copy"
-msgstr "копія"
+#~ msgid "Anime"
+#~ msgstr "Аніме"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr "Без перевірки"
+#~ msgid "JPop"
+#~ msgstr "Джей-поп"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Традиційна китайська"
+#~ msgid "Synthpop"
+#~ msgstr "Синтез-поп"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Спрощена китайська"
+#~ msgid "Commands"
+#~ msgstr "Команди"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Швейцарська німецька"
+#~ msgid "System calls"
+#~ msgstr "Системні виклики"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "Американська англійська"
+#~ msgid "Library calls"
+#~ msgstr "Виклики бібліотек"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Британська англійська"
+#~ msgid "Special files"
+#~ msgstr "Спеціальні файли"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Австралійська англійська"
+#~ msgid "File formats and conventions"
+#~ msgstr "Формати файлів та правила"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr "Кастильська іспанська"
+#~ msgid "Games"
+#~ msgstr "Ігри"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Мексиканська іспанська"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Угоди та інше"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Бельгійська французька"
+#~ msgid "System management commands"
+#~ msgstr "Команди керування системою"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Канадська французька"
+#~ msgid "Kernel routines"
+#~ msgstr "Процедури ядра"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Швейцарська французька"
+#~ msgid "joint stereo"
+#~ msgstr "об'єднане стерео"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Швейцарська італійська"
+#~ msgid "dual channel"
+#~ msgstr "два канали"
 
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Бельгійська голландська"
+#~ msgid "MPEG-1"
+#~ msgstr "MPEG-1"
 
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Норвезька (бокмал)"
+#~ msgid "MPEG-2"
+#~ msgstr "MPEG-2"
 
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr "Ретороманська"
+#~ msgid "MPEG-2.5"
+#~ msgstr "MPEG-2.5"
 
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr "Хорвато-сербська (латиниця)"
+#~ msgid "Layer I"
+#~ msgstr "Layer I"
 
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr "Сербо-хорватська (кирилиця)"
+#~ msgid "Layer II"
+#~ msgstr "Layer II"
 
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Фарсі"
+#~ msgid "Layer III"
+#~ msgstr "Layer III"
 
-#: src/plugins/ole2_extractor.c:578
-#, fuzzy, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr "Модифікація %u: автор «%s», співробітник «%s»"
+#~ msgid "VBR"
+#~ msgstr "VBR"
 
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "кодек: %s, %u кд/с, %u мс"
+#~ msgid "CBR"
+#~ msgstr "CBR"
 
+#~ msgid "no copyright"
+#~ msgstr "без захисту авторськими правами"
+
+#~ msgid "original"
+#~ msgstr "оригінал"
+
+#~ msgid "copy"
+#~ msgstr "копія"
+
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "кодек: %s, %u кд/с, %u мс"
+
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u точок на дюйм"
 

Modified: Extractor/po/vi.po
===================================================================
--- Extractor/po/vi.po  2012-08-14 22:58:15 UTC (rev 23240)
+++ Extractor/po/vi.po  2012-08-14 23:02:49 UTC (rev 23241)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: libextractor 0.6.0\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2012-08-14 17:23+0200\n"
+"POT-Creation-Date: 2012-08-15 01:02+0200\n"
 "PO-Revision-Date: 2010-02-11 00:13+0930\n"
 "Last-Translator: Clytie Siddall <address@hidden>\n"
 "Language-Team: Vietnamese <address@hidden>\n"
@@ -512,7 +512,7 @@
 msgid "description"
 msgstr "mô tả"
 
-#: src/main/extractor_metatypes.c:149 src/plugins/mp3_extractor.c:206
+#: src/main/extractor_metatypes.c:149
 msgid "copyright"
 msgstr "bản quyền"
 
@@ -1528,801 +1528,625 @@
 msgid "%s: option `-W %s' doesn't allow an argument\n"
 msgstr "%s: tùy chọn « -W %s » không cho phép đối số\n"
 
-#: src/plugins/applefile_extractor.c:162
-msgid "GB"
-msgstr "GB"
-
-#: src/plugins/applefile_extractor.c:164
-msgid "MB"
-msgstr "MB"
-
-#: src/plugins/applefile_extractor.c:166
-msgid "KB"
-msgstr "KB"
-
-#: src/plugins/applefile_extractor.c:168
-msgid "Bytes"
-msgstr "Byte"
-
 #: src/plugins/flac_extractor.c:314
 #, c-format
 msgid "%u Hz, %u channels"
 msgstr "%u Hz, %u kênh"
 
-#: src/plugins/id3_extractor.c:46 src/plugins/qt_extractor.c:30
-msgid "Blues"
-msgstr "Blu"
+#: src/plugins/ole2_extractor.c:387
+msgid "No Proofing"
+msgstr "Đừng bắt lỗi"
 
-#: src/plugins/id3_extractor.c:47 src/plugins/qt_extractor.c:31
-msgid "Classic Rock"
-msgstr "Rốc cổ điển"
+#: src/plugins/ole2_extractor.c:395
+msgid "Traditional Chinese"
+msgstr "Tiếng Hoa truyền thống"
 
-#: src/plugins/id3_extractor.c:48 src/plugins/qt_extractor.c:32
-msgid "Country"
-msgstr "Quốc gia"
+#: src/plugins/ole2_extractor.c:397
+msgid "Simplified Chinese"
+msgstr "Tiếng Hoa giản thể"
 
-#: src/plugins/id3_extractor.c:49 src/plugins/qt_extractor.c:33
-msgid "Dance"
-msgstr "Khiêu vũ"
+#: src/plugins/ole2_extractor.c:405
+msgid "Swiss German"
+msgstr "Đức Thụy Sĩ"
 
-#: src/plugins/id3_extractor.c:50 src/plugins/qt_extractor.c:34
-msgid "Disco"
-msgstr "Đít-xcô"
+#: src/plugins/ole2_extractor.c:409
+msgid "U.S. English"
+msgstr "Tiếng Anh (Mỹ)"
 
-#: src/plugins/id3_extractor.c:51 src/plugins/qt_extractor.c:35
-msgid "Funk"
-msgstr "Sôi nổi"
+#: src/plugins/ole2_extractor.c:411
+msgid "U.K. English"
+msgstr "Tiếng Anh (Quốc Anh)"
 
-#: src/plugins/id3_extractor.c:52 src/plugins/qt_extractor.c:36
-msgid "Grunge"
-msgstr "Vỡ mộng"
+#: src/plugins/ole2_extractor.c:413
+msgid "Australian English"
+msgstr "Tiếng Anh (Úc)"
 
-#: src/plugins/id3_extractor.c:53 src/plugins/qt_extractor.c:37
-msgid "Hip-Hop"
-msgstr "Hít-họt"
+#: src/plugins/ole2_extractor.c:415
+msgid "Castilian Spanish"
+msgstr "Tây Ban Nha (Căt-tín)"
 
-#: src/plugins/id3_extractor.c:54 src/plugins/qt_extractor.c:38
-msgid "Jazz"
-msgstr "Ja"
+#: src/plugins/ole2_extractor.c:417
+msgid "Mexican Spanish"
+msgstr "Tây Ban Nha (Mê-hi-cô)"
 
-#: src/plugins/id3_extractor.c:55 src/plugins/qt_extractor.c:39
-msgid "Metal"
-msgstr "Kim"
+#: src/plugins/ole2_extractor.c:423
+msgid "Belgian French"
+msgstr "Pháp (Bỉ)"
 
-#: src/plugins/id3_extractor.c:56 src/plugins/qt_extractor.c:40
-msgid "New Age"
-msgstr "Thời kỳ mới"
+#: src/plugins/ole2_extractor.c:425
+msgid "Canadian French"
+msgstr "Pháp (Ca-na-đa)"
 
-#: src/plugins/id3_extractor.c:57 src/plugins/qt_extractor.c:41
-msgid "Oldies"
-msgstr "Cũ"
+#: src/plugins/ole2_extractor.c:427
+msgid "Swiss French"
+msgstr "Pháp (Thuỵ sĩ)"
 
-#: src/plugins/id3_extractor.c:58 src/plugins/qt_extractor.c:42
-msgid "Other"
-msgstr "Khác"
+#: src/plugins/ole2_extractor.c:437
+msgid "Swiss Italian"
+msgstr "Ý (Thuỵ sĩ)"
 
-#: src/plugins/id3_extractor.c:59 src/plugins/qt_extractor.c:43
-msgid "Pop"
-msgstr "Pốp"
+#: src/plugins/ole2_extractor.c:445
+msgid "Belgian Dutch"
+msgstr "Hoà Lan (Bỉ)"
 
-#: src/plugins/id3_extractor.c:60 src/plugins/qt_extractor.c:44
-msgid "R&B"
-msgstr "Nhịp điệu và blu"
+#: src/plugins/ole2_extractor.c:447
+msgid "Norwegian Bokmal"
+msgstr "Na Uy (Bóc-măn)"
 
-#: src/plugins/id3_extractor.c:61 src/plugins/qt_extractor.c:45
-msgid "Rap"
-msgstr "Rap"
+#: src/plugins/ole2_extractor.c:457
+msgid "Rhaeto-Romanic"
+msgstr "Rai-tô-Rô-ma-ni"
 
-#: src/plugins/id3_extractor.c:62 src/plugins/qt_extractor.c:46
-msgid "Reggae"
-msgstr "Re-gê"
+#: src/plugins/ole2_extractor.c:463
+msgid "Croato-Serbian (Latin)"
+msgstr "Xéc-bi Cợ-rô-a-ti-a (La-tinh)"
 
-#: src/plugins/id3_extractor.c:63 src/plugins/qt_extractor.c:47
-msgid "Rock"
-msgstr "Rốc"
+#: src/plugins/ole2_extractor.c:465
+msgid "Serbo-Croatian (Cyrillic)"
+msgstr "Xéc-bi Cợ-rô-a-ti-a (Ki-rin)"
 
-#: src/plugins/id3_extractor.c:64 src/plugins/qt_extractor.c:48
-msgid "Techno"
-msgstr "Kỹ thuật"
+#: src/plugins/ole2_extractor.c:493
+msgid "Farsi"
+msgstr "Pha-xi"
 
-#: src/plugins/id3_extractor.c:65 src/plugins/qt_extractor.c:49
-msgid "Industrial"
-msgstr "Công nghiệp"
+#: src/plugins/ole2_extractor.c:578
+#, fuzzy, c-format
+msgid "Revision #%u: Author `%s' worked on `%s'"
+msgstr "Bản sửa đổi #%u: Tác giả « %s » đã làm việc « %s »."
 
-#: src/plugins/id3_extractor.c:66 src/plugins/qt_extractor.c:50
-msgid "Alternative"
-msgstr "Sự chọn khác"
+#: src/plugins/wav_extractor.c:120
+msgid "mono"
+msgstr "một nguồn"
 
-#: src/plugins/id3_extractor.c:67 src/plugins/qt_extractor.c:51
-msgid "Ska"
-msgstr "Ska"
+#: src/plugins/wav_extractor.c:120
+msgid "stereo"
+msgstr "âm lập thể"
 
-#: src/plugins/id3_extractor.c:68 src/plugins/qt_extractor.c:52
-msgid "Death Metal"
-msgstr "Kim chết"
+#~ msgid "GB"
+#~ msgstr "GB"
 
-#: src/plugins/id3_extractor.c:69 src/plugins/qt_extractor.c:53
-msgid "Pranks"
-msgstr "Trò chơi ác"
+#~ msgid "MB"
+#~ msgstr "MB"
 
-#: src/plugins/id3_extractor.c:70 src/plugins/qt_extractor.c:54
-msgid "Soundtrack"
-msgstr "Nhạc của phím"
+#~ msgid "KB"
+#~ msgstr "KB"
 
-#: src/plugins/id3_extractor.c:71 src/plugins/qt_extractor.c:55
-msgid "Euro-Techno"
-msgstr "Kỹ thuật Âu"
+#~ msgid "Bytes"
+#~ msgstr "Byte"
 
-#: src/plugins/id3_extractor.c:72 src/plugins/qt_extractor.c:56
-msgid "Ambient"
-msgstr "Chung quanh"
+#~ msgid "Blues"
+#~ msgstr "Blu"
 
-#: src/plugins/id3_extractor.c:73 src/plugins/qt_extractor.c:57
-msgid "Trip-Hop"
-msgstr "Tợ-rít-Hot"
+#~ msgid "Classic Rock"
+#~ msgstr "Rốc cổ điển"
 
-#: src/plugins/id3_extractor.c:74 src/plugins/qt_extractor.c:58
-msgid "Vocal"
-msgstr "Thanh nhạc"
+#~ msgid "Country"
+#~ msgstr "Quốc gia"
 
-#: src/plugins/id3_extractor.c:75 src/plugins/qt_extractor.c:59
-msgid "Jazz+Funk"
-msgstr "Ja và Sôi nổi"
+#~ msgid "Dance"
+#~ msgstr "Khiêu vũ"
 
-#: src/plugins/id3_extractor.c:76 src/plugins/qt_extractor.c:60
-msgid "Fusion"
-msgstr "Nóng chảy"
+#~ msgid "Disco"
+#~ msgstr "Đít-xcô"
 
-#: src/plugins/id3_extractor.c:77 src/plugins/qt_extractor.c:61
-msgid "Trance"
-msgstr "Hôn mê"
+#~ msgid "Funk"
+#~ msgstr "Sôi nổi"
 
-#: src/plugins/id3_extractor.c:78 src/plugins/qt_extractor.c:62
-msgid "Classical"
-msgstr "Cổ điển"
+#~ msgid "Grunge"
+#~ msgstr "Vỡ mộng"
 
-#: src/plugins/id3_extractor.c:79 src/plugins/qt_extractor.c:63
-msgid "Instrumental"
-msgstr "Bằng nhạc khí"
+#~ msgid "Hip-Hop"
+#~ msgstr "Hít-họt"
 
-#: src/plugins/id3_extractor.c:80 src/plugins/qt_extractor.c:64
-msgid "Acid"
-msgstr "Axit"
+#~ msgid "Jazz"
+#~ msgstr "Ja"
 
-#: src/plugins/id3_extractor.c:81 src/plugins/qt_extractor.c:65
-msgid "House"
-msgstr "Nhà"
+#~ msgid "Metal"
+#~ msgstr "Kim"
 
-#: src/plugins/id3_extractor.c:82 src/plugins/qt_extractor.c:66
-msgid "Game"
-msgstr "Trò chơi"
+#~ msgid "New Age"
+#~ msgstr "Thời kỳ mới"
 
-#: src/plugins/id3_extractor.c:83 src/plugins/qt_extractor.c:67
-msgid "Sound Clip"
-msgstr "Trích đoạn âm thanh"
+#~ msgid "Oldies"
+#~ msgstr "Cũ"
 
-#: src/plugins/id3_extractor.c:84 src/plugins/qt_extractor.c:68
-msgid "Gospel"
-msgstr "Phúc âm"
+#~ msgid "Other"
+#~ msgstr "Khác"
 
-#: src/plugins/id3_extractor.c:85 src/plugins/qt_extractor.c:69
-msgid "Noise"
-msgstr "Ồn"
+#~ msgid "Pop"
+#~ msgstr "Pốp"
 
-#: src/plugins/id3_extractor.c:86 src/plugins/qt_extractor.c:70
-msgid "Alt. Rock"
-msgstr "Rốc thay thế"
+#~ msgid "R&B"
+#~ msgstr "Nhịp điệu và blu"
 
-#: src/plugins/id3_extractor.c:87 src/plugins/qt_extractor.c:71
-msgid "Bass"
-msgstr "Trầm"
+#~ msgid "Rap"
+#~ msgstr "Rap"
 
-#: src/plugins/id3_extractor.c:88 src/plugins/qt_extractor.c:72
-msgid "Soul"
-msgstr "Hồn"
+#~ msgid "Reggae"
+#~ msgstr "Re-gê"
 
-#: src/plugins/id3_extractor.c:89 src/plugins/qt_extractor.c:73
-msgid "Punk"
-msgstr "Rốc dữ dội"
+#~ msgid "Rock"
+#~ msgstr "Rốc"
 
-#: src/plugins/id3_extractor.c:90 src/plugins/qt_extractor.c:74
-msgid "Space"
-msgstr "Khoảng"
+#~ msgid "Techno"
+#~ msgstr "Kỹ thuật"
 
-#: src/plugins/id3_extractor.c:91 src/plugins/qt_extractor.c:75
-msgid "Meditative"
-msgstr "Tĩnh tọa"
+#~ msgid "Industrial"
+#~ msgstr "Công nghiệp"
 
-#: src/plugins/id3_extractor.c:92 src/plugins/qt_extractor.c:76
-msgid "Instrumental Pop"
-msgstr "Pốp bằng nhac khí"
+#~ msgid "Alternative"
+#~ msgstr "Sự chọn khác"
 
-#: src/plugins/id3_extractor.c:93 src/plugins/qt_extractor.c:77
-msgid "Instrumental Rock"
-msgstr "Rốc bằng nhạc khí"
+#~ msgid "Ska"
+#~ msgstr "Ska"
 
-#: src/plugins/id3_extractor.c:94 src/plugins/qt_extractor.c:78
-msgid "Ethnic"
-msgstr "Dân tộc"
+#~ msgid "Death Metal"
+#~ msgstr "Kim chết"
 
-#: src/plugins/id3_extractor.c:95 src/plugins/qt_extractor.c:79
-msgid "Gothic"
-msgstr "Gô-tích"
+#~ msgid "Pranks"
+#~ msgstr "Trò chơi ác"
 
-#: src/plugins/id3_extractor.c:96 src/plugins/qt_extractor.c:80
-msgid "Darkwave"
-msgstr "Sóng bóng"
+#~ msgid "Soundtrack"
+#~ msgstr "Nhạc của phím"
 
-#: src/plugins/id3_extractor.c:97 src/plugins/qt_extractor.c:81
-msgid "Techno-Industrial"
-msgstr "Kỹ thuật - Công nghiệp"
+#~ msgid "Euro-Techno"
+#~ msgstr "Kỹ thuật Âu"
 
-#: src/plugins/id3_extractor.c:98 src/plugins/qt_extractor.c:82
-msgid "Electronic"
-msgstr "Điện"
+#~ msgid "Ambient"
+#~ msgstr "Chung quanh"
 
-#: src/plugins/id3_extractor.c:99 src/plugins/qt_extractor.c:83
-msgid "Pop-Folk"
-msgstr "Pốp - Dân ca"
+#~ msgid "Trip-Hop"
+#~ msgstr "Tợ-rít-Hot"
 
-#: src/plugins/id3_extractor.c:100 src/plugins/qt_extractor.c:84
-msgid "Eurodance"
-msgstr "Khiêu vũ Âu"
+#~ msgid "Vocal"
+#~ msgstr "Thanh nhạc"
 
-#: src/plugins/id3_extractor.c:101 src/plugins/qt_extractor.c:85
-msgid "Dream"
-msgstr "Mơ mộng"
+#~ msgid "Jazz+Funk"
+#~ msgstr "Ja và Sôi nổi"
 
-#: src/plugins/id3_extractor.c:102 src/plugins/qt_extractor.c:86
-msgid "Southern Rock"
-msgstr "Rốc Nam"
+#~ msgid "Fusion"
+#~ msgstr "Nóng chảy"
 
-#: src/plugins/id3_extractor.c:103 src/plugins/qt_extractor.c:87
-msgid "Comedy"
-msgstr "Kịch vui"
+#~ msgid "Trance"
+#~ msgstr "Hôn mê"
 
-#: src/plugins/id3_extractor.c:104 src/plugins/qt_extractor.c:88
-msgid "Cult"
-msgstr "Giáo phái"
+#~ msgid "Classical"
+#~ msgstr "Cổ điển"
 
-#: src/plugins/id3_extractor.c:105 src/plugins/qt_extractor.c:89
-msgid "Gangsta Rap"
-msgstr "Rap Kẻ cướp"
+#~ msgid "Instrumental"
+#~ msgstr "Bằng nhạc khí"
 
-#: src/plugins/id3_extractor.c:106 src/plugins/qt_extractor.c:90
-msgid "Top 40"
-msgstr "40 tốt nhất"
+#~ msgid "Acid"
+#~ msgstr "Axit"
 
-#: src/plugins/id3_extractor.c:107 src/plugins/qt_extractor.c:91
-msgid "Christian Rap"
-msgstr "Ráp Cơ-đốc"
+#~ msgid "House"
+#~ msgstr "Nhà"
 
-#: src/plugins/id3_extractor.c:108 src/plugins/qt_extractor.c:92
-msgid "Pop/Funk"
-msgstr "Pốp/Sôi nổi"
+#~ msgid "Game"
+#~ msgstr "Trò chơi"
 
-#: src/plugins/id3_extractor.c:109 src/plugins/qt_extractor.c:93
-msgid "Jungle"
-msgstr "Rừng"
+#~ msgid "Sound Clip"
+#~ msgstr "Trích đoạn âm thanh"
 
-#: src/plugins/id3_extractor.c:110 src/plugins/qt_extractor.c:94
-msgid "Native American"
-msgstr "Mỹ bản xứ"
+#~ msgid "Gospel"
+#~ msgstr "Phúc âm"
 
-#: src/plugins/id3_extractor.c:111 src/plugins/qt_extractor.c:95
-msgid "Cabaret"
-msgstr "Ca-ba-rê"
+#~ msgid "Noise"
+#~ msgstr "Ồn"
 
-#: src/plugins/id3_extractor.c:112 src/plugins/qt_extractor.c:96
-msgid "New Wave"
-msgstr "Sóng mới"
+#~ msgid "Alt. Rock"
+#~ msgstr "Rốc thay thế"
 
-#: src/plugins/id3_extractor.c:113 src/plugins/qt_extractor.c:97
-msgid "Psychedelic"
-msgstr "Tạo ảo giác"
+#~ msgid "Bass"
+#~ msgstr "Trầm"
 
-#: src/plugins/id3_extractor.c:114 src/plugins/qt_extractor.c:98
-msgid "Rave"
-msgstr "Rít"
+#~ msgid "Soul"
+#~ msgstr "Hồn"
 
-#: src/plugins/id3_extractor.c:115 src/plugins/qt_extractor.c:99
-msgid "Showtunes"
-msgstr "Điệu kịch"
+#~ msgid "Punk"
+#~ msgstr "Rốc dữ dội"
 
-#: src/plugins/id3_extractor.c:116 src/plugins/qt_extractor.c:100
-msgid "Trailer"
-msgstr "Quảng cáo trước phím"
+#~ msgid "Space"
+#~ msgstr "Khoảng"
 
-#: src/plugins/id3_extractor.c:117 src/plugins/qt_extractor.c:101
-msgid "Lo-Fi"
-msgstr "Độ trung thực thấp"
+#~ msgid "Meditative"
+#~ msgstr "Tĩnh tọa"
 
-#: src/plugins/id3_extractor.c:118 src/plugins/qt_extractor.c:102
-msgid "Tribal"
-msgstr "Bộ lạc"
+#~ msgid "Instrumental Pop"
+#~ msgstr "Pốp bằng nhac khí"
 
-#: src/plugins/id3_extractor.c:119 src/plugins/qt_extractor.c:103
-msgid "Acid Punk"
-msgstr "Rốc dữ dội axit"
+#~ msgid "Instrumental Rock"
+#~ msgstr "Rốc bằng nhạc khí"
 
-#: src/plugins/id3_extractor.c:120 src/plugins/qt_extractor.c:104
-msgid "Acid Jazz"
-msgstr "Ja axit"
+#~ msgid "Ethnic"
+#~ msgstr "Dân tộc"
 
-#: src/plugins/id3_extractor.c:121 src/plugins/qt_extractor.c:105
-msgid "Polka"
-msgstr "Pôn-ca"
+#~ msgid "Gothic"
+#~ msgstr "Gô-tích"
 
-#: src/plugins/id3_extractor.c:122 src/plugins/qt_extractor.c:106
-msgid "Retro"
-msgstr "Lại sau"
+#~ msgid "Darkwave"
+#~ msgstr "Sóng bóng"
 
-#: src/plugins/id3_extractor.c:123 src/plugins/qt_extractor.c:107
-msgid "Musical"
-msgstr "Kịch nhạc"
+#~ msgid "Techno-Industrial"
+#~ msgstr "Kỹ thuật - Công nghiệp"
 
-#: src/plugins/id3_extractor.c:124 src/plugins/qt_extractor.c:108
-msgid "Rock & Roll"
-msgstr "Rốc en rôn"
+#~ msgid "Electronic"
+#~ msgstr "Điện"
 
-#: src/plugins/id3_extractor.c:125 src/plugins/qt_extractor.c:109
-msgid "Hard Rock"
-msgstr "Rốc cứng"
+#~ msgid "Pop-Folk"
+#~ msgstr "Pốp - Dân ca"
 
-#: src/plugins/id3_extractor.c:126 src/plugins/qt_extractor.c:110
-msgid "Folk"
-msgstr "Dân ca"
+#~ msgid "Eurodance"
+#~ msgstr "Khiêu vũ Âu"
 
-#: src/plugins/id3_extractor.c:127 src/plugins/qt_extractor.c:111
-msgid "Folk/Rock"
-msgstr "Dân ca/Rốc"
+#~ msgid "Dream"
+#~ msgstr "Mơ mộng"
 
-#: src/plugins/id3_extractor.c:128 src/plugins/qt_extractor.c:112
-msgid "National Folk"
-msgstr "Dân ca quốc gia"
+#~ msgid "Southern Rock"
+#~ msgstr "Rốc Nam"
 
-#: src/plugins/id3_extractor.c:129 src/plugins/qt_extractor.c:113
-msgid "Swing"
-msgstr "Xuynh"
+#~ msgid "Comedy"
+#~ msgstr "Kịch vui"
 
-#: src/plugins/id3_extractor.c:130 src/plugins/qt_extractor.c:114
-msgid "Fast-Fusion"
-msgstr "Nóng chạy nhanh"
+#~ msgid "Cult"
+#~ msgstr "Giáo phái"
 
-#: src/plugins/id3_extractor.c:131 src/plugins/qt_extractor.c:115
-msgid "Bebob"
-msgstr "Bí-bọt"
+#~ msgid "Gangsta Rap"
+#~ msgstr "Rap Kẻ cướp"
 
-#: src/plugins/id3_extractor.c:132 src/plugins/qt_extractor.c:116
-msgid "Latin"
-msgstr "Dân tộc Tây-ban-nha"
+#~ msgid "Top 40"
+#~ msgstr "40 tốt nhất"
 
-#: src/plugins/id3_extractor.c:133 src/plugins/qt_extractor.c:117
-msgid "Revival"
-msgstr "Phục âm nhấn mạnh"
+#~ msgid "Christian Rap"
+#~ msgstr "Ráp Cơ-đốc"
 
-#: src/plugins/id3_extractor.c:134 src/plugins/qt_extractor.c:118
-msgid "Celtic"
-msgstr "Xen-tơ"
+#~ msgid "Pop/Funk"
+#~ msgstr "Pốp/Sôi nổi"
 
-#: src/plugins/id3_extractor.c:135 src/plugins/qt_extractor.c:119
-msgid "Bluegrass"
-msgstr "Cỏ xanh"
+#~ msgid "Jungle"
+#~ msgstr "Rừng"
 
-#: src/plugins/id3_extractor.c:136 src/plugins/qt_extractor.c:120
-msgid "Avantgarde"
-msgstr "Đi tiên phong"
+#~ msgid "Native American"
+#~ msgstr "Mỹ bản xứ"
 
-#: src/plugins/id3_extractor.c:137 src/plugins/qt_extractor.c:121
-msgid "Gothic Rock"
-msgstr "Rốc Gô-tích"
+#~ msgid "Cabaret"
+#~ msgstr "Ca-ba-rê"
 
-#: src/plugins/id3_extractor.c:138 src/plugins/qt_extractor.c:122
-msgid "Progressive Rock"
-msgstr "Rốc tiến lên"
+#~ msgid "New Wave"
+#~ msgstr "Sóng mới"
 
-#: src/plugins/id3_extractor.c:139 src/plugins/qt_extractor.c:123
-msgid "Psychedelic Rock"
-msgstr "Rốc tạo ảo giác"
+#~ msgid "Psychedelic"
+#~ msgstr "Tạo ảo giác"
 
-#: src/plugins/id3_extractor.c:140 src/plugins/qt_extractor.c:124
-msgid "Symphonic Rock"
-msgstr "Rốc giao hưởng"
+#~ msgid "Rave"
+#~ msgstr "Rít"
 
-#: src/plugins/id3_extractor.c:141 src/plugins/qt_extractor.c:125
-msgid "Slow Rock"
-msgstr "Rốc chậm"
+#~ msgid "Showtunes"
+#~ msgstr "Điệu kịch"
 
-#: src/plugins/id3_extractor.c:142 src/plugins/qt_extractor.c:126
-msgid "Big Band"
-msgstr "Dàn nhạc To"
+#~ msgid "Trailer"
+#~ msgstr "Quảng cáo trước phím"
 
-#: src/plugins/id3_extractor.c:143 src/plugins/qt_extractor.c:127
-msgid "Chorus"
-msgstr "Hợp xướng"
+#~ msgid "Lo-Fi"
+#~ msgstr "Độ trung thực thấp"
 
-#: src/plugins/id3_extractor.c:144 src/plugins/qt_extractor.c:128
-msgid "Easy Listening"
-msgstr "Nghe dễ dàng"
+#~ msgid "Tribal"
+#~ msgstr "Bộ lạc"
 
-#: src/plugins/id3_extractor.c:145 src/plugins/qt_extractor.c:129
-msgid "Acoustic"
-msgstr "Độ trung thực âm thanh"
+#~ msgid "Acid Punk"
+#~ msgstr "Rốc dữ dội axit"
 
-#: src/plugins/id3_extractor.c:146 src/plugins/qt_extractor.c:130
-msgid "Humour"
-msgstr "Hài hước"
+#~ msgid "Acid Jazz"
+#~ msgstr "Ja axit"
 
-#: src/plugins/id3_extractor.c:147 src/plugins/qt_extractor.c:131
-msgid "Speech"
-msgstr "Nói tiếng"
+#~ msgid "Polka"
+#~ msgstr "Pôn-ca"
 
-#: src/plugins/id3_extractor.c:148 src/plugins/qt_extractor.c:132
-msgid "Chanson"
-msgstr "Bài hát kiểu Pháp"
+#~ msgid "Retro"
+#~ msgstr "Lại sau"
 
-#: src/plugins/id3_extractor.c:149 src/plugins/qt_extractor.c:133
-msgid "Opera"
-msgstr "Hát kịch"
+#~ msgid "Musical"
+#~ msgstr "Kịch nhạc"
 
-#: src/plugins/id3_extractor.c:150 src/plugins/qt_extractor.c:134
-msgid "Chamber Music"
-msgstr "Nhạc phòng"
+#~ msgid "Rock & Roll"
+#~ msgstr "Rốc en rôn"
 
-#: src/plugins/id3_extractor.c:151 src/plugins/qt_extractor.c:135
-msgid "Sonata"
-msgstr "Bản xô-nat"
+#~ msgid "Hard Rock"
+#~ msgstr "Rốc cứng"
 
-#: src/plugins/id3_extractor.c:152 src/plugins/qt_extractor.c:136
-msgid "Symphony"
-msgstr "Giao hưởng"
+#~ msgid "Folk"
+#~ msgstr "Dân ca"
 
-#: src/plugins/id3_extractor.c:153 src/plugins/qt_extractor.c:137
-msgid "Booty Bass"
-msgstr "Trầm Booty"
+#~ msgid "Folk/Rock"
+#~ msgstr "Dân ca/Rốc"
 
-#: src/plugins/id3_extractor.c:154 src/plugins/qt_extractor.c:138
-msgid "Primus"
-msgstr "Pri-mus"
+#~ msgid "National Folk"
+#~ msgstr "Dân ca quốc gia"
 
-#: src/plugins/id3_extractor.c:155 src/plugins/qt_extractor.c:139
-msgid "Porn Groove"
-msgstr "Porn Groove"
+#~ msgid "Swing"
+#~ msgstr "Xuynh"
 
-#: src/plugins/id3_extractor.c:156 src/plugins/qt_extractor.c:140
-msgid "Satire"
-msgstr "Châm biếm"
+#~ msgid "Fast-Fusion"
+#~ msgstr "Nóng chạy nhanh"
 
-#: src/plugins/id3_extractor.c:157 src/plugins/qt_extractor.c:141
-msgid "Slow Jam"
-msgstr "Ứng tác chậm"
+#~ msgid "Bebob"
+#~ msgstr "Bí-bọt"
 
-#: src/plugins/id3_extractor.c:158 src/plugins/qt_extractor.c:142
-msgid "Club"
-msgstr "Hội"
+#~ msgid "Latin"
+#~ msgstr "Dân tộc Tây-ban-nha"
 
-#: src/plugins/id3_extractor.c:159 src/plugins/qt_extractor.c:143
-msgid "Tango"
-msgstr "Tan-gô"
+#~ msgid "Revival"
+#~ msgstr "Phục âm nhấn mạnh"
 
-#: src/plugins/id3_extractor.c:160 src/plugins/qt_extractor.c:144
-msgid "Samba"
-msgstr "Sam-ba"
+#~ msgid "Celtic"
+#~ msgstr "Xen-tơ"
 
-#: src/plugins/id3_extractor.c:161 src/plugins/qt_extractor.c:145
-msgid "Folklore"
-msgstr "Truyền thống dân gian"
+#~ msgid "Bluegrass"
+#~ msgstr "Cỏ xanh"
 
-#: src/plugins/id3_extractor.c:162 src/plugins/qt_extractor.c:146
-msgid "Ballad"
-msgstr "Khúc balat"
+#~ msgid "Avantgarde"
+#~ msgstr "Đi tiên phong"
 
-#: src/plugins/id3_extractor.c:163 src/plugins/qt_extractor.c:147
-msgid "Power Ballad"
-msgstr "Khúc balat năng lực"
+#~ msgid "Gothic Rock"
+#~ msgstr "Rốc Gô-tích"
 
-#: src/plugins/id3_extractor.c:164 src/plugins/qt_extractor.c:148
-msgid "Rhythmic Soul"
-msgstr "Hồn nhịp nhàng"
+#~ msgid "Progressive Rock"
+#~ msgstr "Rốc tiến lên"
 
-#: src/plugins/id3_extractor.c:165 src/plugins/qt_extractor.c:149
-msgid "Freestyle"
-msgstr "Kiểu tự do"
+#~ msgid "Psychedelic Rock"
+#~ msgstr "Rốc tạo ảo giác"
 
-#: src/plugins/id3_extractor.c:166 src/plugins/qt_extractor.c:150
-msgid "Duet"
-msgstr "Bản nhạc cho bộ đôi"
+#~ msgid "Symphonic Rock"
+#~ msgstr "Rốc giao hưởng"
 
-#: src/plugins/id3_extractor.c:167 src/plugins/qt_extractor.c:151
-msgid "Punk Rock"
-msgstr "Rốc - rốc dữ dội"
+#~ msgid "Slow Rock"
+#~ msgstr "Rốc chậm"
 
-#: src/plugins/id3_extractor.c:168 src/plugins/qt_extractor.c:152
-msgid "Drum Solo"
-msgstr "Trống diễn đơn"
+#~ msgid "Big Band"
+#~ msgstr "Dàn nhạc To"
 
-#: src/plugins/id3_extractor.c:169 src/plugins/qt_extractor.c:153
-msgid "A Cappella"
-msgstr "Hát không có nhạc hỗ trợ"
+#~ msgid "Chorus"
+#~ msgstr "Hợp xướng"
 
-#: src/plugins/id3_extractor.c:170 src/plugins/qt_extractor.c:154
-msgid "Euro-House"
-msgstr "Nhà Âu"
+#~ msgid "Easy Listening"
+#~ msgstr "Nghe dễ dàng"
 
-#: src/plugins/id3_extractor.c:171 src/plugins/qt_extractor.c:155
-msgid "Dance Hall"
-msgstr "Phòng khiêu vũ"
+#~ msgid "Acoustic"
+#~ msgstr "Độ trung thực âm thanh"
 
-#: src/plugins/id3_extractor.c:172 src/plugins/qt_extractor.c:156
-msgid "Goa"
-msgstr "Goa"
+#~ msgid "Humour"
+#~ msgstr "Hài hước"
 
-#: src/plugins/id3_extractor.c:173 src/plugins/qt_extractor.c:157
-msgid "Drum & Bass"
-msgstr "Trống và Trầm"
+#~ msgid "Speech"
+#~ msgstr "Nói tiếng"
 
-#: src/plugins/id3_extractor.c:174 src/plugins/qt_extractor.c:158
-msgid "Club-House"
-msgstr "Nhà hội"
+#~ msgid "Chanson"
+#~ msgstr "Bài hát kiểu Pháp"
 
-#: src/plugins/id3_extractor.c:175 src/plugins/qt_extractor.c:159
-msgid "Hardcore"
-msgstr "Lõi cứng"
+#~ msgid "Opera"
+#~ msgstr "Hát kịch"
 
-#: src/plugins/id3_extractor.c:176 src/plugins/qt_extractor.c:160
-msgid "Terror"
-msgstr "Kinh hãi"
+#~ msgid "Chamber Music"
+#~ msgstr "Nhạc phòng"
 
-#: src/plugins/id3_extractor.c:177 src/plugins/qt_extractor.c:161
-msgid "Indie"
-msgstr "In-đi"
+#~ msgid "Sonata"
+#~ msgstr "Bản xô-nat"
 
-#: src/plugins/id3_extractor.c:178 src/plugins/qt_extractor.c:162
-msgid "BritPop"
-msgstr "Pốp quốc Anh"
+#~ msgid "Symphony"
+#~ msgstr "Giao hưởng"
 
-#: src/plugins/id3_extractor.c:179 src/plugins/qt_extractor.c:163
-msgid "Negerpunk"
-msgstr "Rốc dữ dội đen"
+#~ msgid "Booty Bass"
+#~ msgstr "Trầm Booty"
 
-#: src/plugins/id3_extractor.c:180 src/plugins/qt_extractor.c:164
-msgid "Polsk Punk"
-msgstr "Rốc dữ dội Ba-lan"
+#~ msgid "Primus"
+#~ msgstr "Pri-mus"
 
-#: src/plugins/id3_extractor.c:181 src/plugins/qt_extractor.c:165
-msgid "Beat"
-msgstr "Nhịp phách"
+#~ msgid "Porn Groove"
+#~ msgstr "Porn Groove"
 
-#: src/plugins/id3_extractor.c:182 src/plugins/qt_extractor.c:166
-msgid "Christian Gangsta Rap"
-msgstr "Rap kẻ cướp Cơ đốc"
+#~ msgid "Satire"
+#~ msgstr "Châm biếm"
 
-#: src/plugins/id3_extractor.c:183 src/plugins/qt_extractor.c:167
-msgid "Heavy Metal"
-msgstr "Kim nặng"
+#~ msgid "Slow Jam"
+#~ msgstr "Ứng tác chậm"
 
-#: src/plugins/id3_extractor.c:184 src/plugins/qt_extractor.c:168
-msgid "Black Metal"
-msgstr "Kim đen"
+#~ msgid "Club"
+#~ msgstr "Hội"
 
-#: src/plugins/id3_extractor.c:185 src/plugins/qt_extractor.c:169
-msgid "Crossover"
-msgstr "Xuyên chéo"
+#~ msgid "Tango"
+#~ msgstr "Tan-gô"
 
-#: src/plugins/id3_extractor.c:186 src/plugins/qt_extractor.c:170
-msgid "Contemporary Christian"
-msgstr "Cơ-đốc đương thời"
+#~ msgid "Samba"
+#~ msgstr "Sam-ba"
 
-#: src/plugins/id3_extractor.c:187 src/plugins/qt_extractor.c:171
-msgid "Christian Rock"
-msgstr "Rốc Cơ-đốc"
+#~ msgid "Folklore"
+#~ msgstr "Truyền thống dân gian"
 
-#: src/plugins/id3_extractor.c:188 src/plugins/qt_extractor.c:172
-msgid "Merengue"
-msgstr "Me-ren-gê"
+#~ msgid "Ballad"
+#~ msgstr "Khúc balat"
 
-#: src/plugins/id3_extractor.c:189 src/plugins/qt_extractor.c:173
-msgid "Salsa"
-msgstr "San-sa"
+#~ msgid "Power Ballad"
+#~ msgstr "Khúc balat năng lực"
 
-#: src/plugins/id3_extractor.c:190 src/plugins/qt_extractor.c:174
-msgid "Thrash Metal"
-msgstr "Kim quẫy đập"
+#~ msgid "Rhythmic Soul"
+#~ msgstr "Hồn nhịp nhàng"
 
-#: src/plugins/id3_extractor.c:191 src/plugins/qt_extractor.c:175
-msgid "Anime"
-msgstr "A-ni-mê"
+#~ msgid "Freestyle"
+#~ msgstr "Kiểu tự do"
 
-#: src/plugins/id3_extractor.c:192 src/plugins/qt_extractor.c:176
-msgid "JPop"
-msgstr "JPốp"
+#~ msgid "Duet"
+#~ msgstr "Bản nhạc cho bộ đôi"
 
-#: src/plugins/id3_extractor.c:193 src/plugins/qt_extractor.c:177
-msgid "Synthpop"
-msgstr "Pốp tổng hợp"
+#~ msgid "Punk Rock"
+#~ msgstr "Rốc - rốc dữ dội"
 
-#: src/plugins/man_extractor.c:161
-msgid "Commands"
-msgstr "Lệnh"
+#~ msgid "Drum Solo"
+#~ msgstr "Trống diễn đơn"
 
-#: src/plugins/man_extractor.c:165
-msgid "System calls"
-msgstr "Cuộc gọi hệ thống"
+#~ msgid "A Cappella"
+#~ msgstr "Hát không có nhạc hỗ trợ"
 
-#: src/plugins/man_extractor.c:169
-msgid "Library calls"
-msgstr "Cuộc gọi thư viện"
+#~ msgid "Euro-House"
+#~ msgstr "Nhà Âu"
 
-#: src/plugins/man_extractor.c:173
-msgid "Special files"
-msgstr "Tập tin đặc biệt"
+#~ msgid "Dance Hall"
+#~ msgstr "Phòng khiêu vũ"
 
-#: src/plugins/man_extractor.c:177
-msgid "File formats and conventions"
-msgstr "Khuôn dang tập tin và quy ước"
+#~ msgid "Goa"
+#~ msgstr "Goa"
 
-#: src/plugins/man_extractor.c:181
-msgid "Games"
-msgstr "Trò chơi"
+#~ msgid "Drum & Bass"
+#~ msgstr "Trống và Trầm"
 
-#: src/plugins/man_extractor.c:185
-msgid "Conventions and miscellaneous"
-msgstr "Quy ước và linh tinh"
+#~ msgid "Club-House"
+#~ msgstr "Nhà hội"
 
-#: src/plugins/man_extractor.c:189
-msgid "System management commands"
-msgstr "Lệnh quản lý hệ thống"
+#~ msgid "Hardcore"
+#~ msgstr "Lõi cứng"
 
-#: src/plugins/man_extractor.c:193
-msgid "Kernel routines"
-msgstr "Thao tác hạt nhân"
+#~ msgid "Terror"
+#~ msgstr "Kinh hãi"
 
-#: src/plugins/mp3_extractor.c:95 src/plugins/wav_extractor.c:120
-msgid "stereo"
-msgstr "âm lập thể"
+#~ msgid "Indie"
+#~ msgstr "In-đi"
 
-#: src/plugins/mp3_extractor.c:96
-msgid "joint stereo"
-msgstr "âm lập thể chung"
+#~ msgid "BritPop"
+#~ msgstr "Pốp quốc Anh"
 
-#: src/plugins/mp3_extractor.c:97
-msgid "dual channel"
-msgstr "kênh đôi"
+#~ msgid "Negerpunk"
+#~ msgstr "Rốc dữ dội đen"
 
-#: src/plugins/mp3_extractor.c:98 src/plugins/wav_extractor.c:120
-msgid "mono"
-msgstr "một nguồn"
+#~ msgid "Polsk Punk"
+#~ msgstr "Rốc dữ dội Ba-lan"
 
-#: src/plugins/mp3_extractor.c:101
-msgid "MPEG-1"
-msgstr "MPEG-1"
+#~ msgid "Beat"
+#~ msgstr "Nhịp phách"
 
-#: src/plugins/mp3_extractor.c:102
-msgid "MPEG-2"
-msgstr "MPEG-2"
+#~ msgid "Christian Gangsta Rap"
+#~ msgstr "Rap kẻ cướp Cơ đốc"
 
-#: src/plugins/mp3_extractor.c:103
-msgid "MPEG-2.5"
-msgstr "MPEG-2.5"
+#~ msgid "Heavy Metal"
+#~ msgstr "Kim nặng"
 
-#: src/plugins/mp3_extractor.c:106
-msgid "Layer I"
-msgstr "Lớp 1"
+#~ msgid "Black Metal"
+#~ msgstr "Kim đen"
 
-#: src/plugins/mp3_extractor.c:107
-msgid "Layer II"
-msgstr "Lớp 2"
+#~ msgid "Crossover"
+#~ msgstr "Xuyên chéo"
 
-#: src/plugins/mp3_extractor.c:108
-msgid "Layer III"
-msgstr "Lớp 3"
+#~ msgid "Contemporary Christian"
+#~ msgstr "Cơ-đốc đương thời"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "VBR"
-msgstr "VBR"
+#~ msgid "Christian Rock"
+#~ msgstr "Rốc Cơ-đốc"
 
-#: src/plugins/mp3_extractor.c:203
-msgid "CBR"
-msgstr "CBR"
+#~ msgid "Merengue"
+#~ msgstr "Me-ren-gê"
 
-#: src/plugins/mp3_extractor.c:206
-msgid "no copyright"
-msgstr "không có tác quyền"
+#~ msgid "Salsa"
+#~ msgstr "San-sa"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "original"
-msgstr "gốc"
+#~ msgid "Thrash Metal"
+#~ msgstr "Kim quẫy đập"
 
-#: src/plugins/mp3_extractor.c:207
-msgid "copy"
-msgstr "chép"
+#~ msgid "Anime"
+#~ msgstr "A-ni-mê"
 
-#: src/plugins/ole2_extractor.c:387
-msgid "No Proofing"
-msgstr "Đừng bắt lỗi"
+#~ msgid "JPop"
+#~ msgstr "JPốp"
 
-#: src/plugins/ole2_extractor.c:395
-msgid "Traditional Chinese"
-msgstr "Tiếng Hoa truyền thống"
+#~ msgid "Synthpop"
+#~ msgstr "Pốp tổng hợp"
 
-#: src/plugins/ole2_extractor.c:397
-msgid "Simplified Chinese"
-msgstr "Tiếng Hoa giản thể"
+#~ msgid "Commands"
+#~ msgstr "Lệnh"
 
-#: src/plugins/ole2_extractor.c:405
-msgid "Swiss German"
-msgstr "Đức Thụy Sĩ"
+#~ msgid "System calls"
+#~ msgstr "Cuộc gọi hệ thống"
 
-#: src/plugins/ole2_extractor.c:409
-msgid "U.S. English"
-msgstr "Tiếng Anh (Mỹ)"
+#~ msgid "Library calls"
+#~ msgstr "Cuộc gọi thư viện"
 
-#: src/plugins/ole2_extractor.c:411
-msgid "U.K. English"
-msgstr "Tiếng Anh (Quốc Anh)"
+#~ msgid "Special files"
+#~ msgstr "Tập tin đặc biệt"
 
-#: src/plugins/ole2_extractor.c:413
-msgid "Australian English"
-msgstr "Tiếng Anh (Úc)"
+#~ msgid "File formats and conventions"
+#~ msgstr "Khuôn dang tập tin và quy ước"
 
-#: src/plugins/ole2_extractor.c:415
-msgid "Castilian Spanish"
-msgstr "Tây Ban Nha (Căt-tín)"
+#~ msgid "Games"
+#~ msgstr "Trò chơi"
 
-#: src/plugins/ole2_extractor.c:417
-msgid "Mexican Spanish"
-msgstr "Tây Ban Nha (Mê-hi-cô)"
+#~ msgid "Conventions and miscellaneous"
+#~ msgstr "Quy ước và linh tinh"
 
-#: src/plugins/ole2_extractor.c:423
-msgid "Belgian French"
-msgstr "Pháp (Bỉ)"
+#~ msgid "System management commands"
+#~ msgstr "Lệnh quản lý hệ thống"
 
-#: src/plugins/ole2_extractor.c:425
-msgid "Canadian French"
-msgstr "Pháp (Ca-na-đa)"
+#~ msgid "Kernel routines"
+#~ msgstr "Thao tác hạt nhân"
 
-#: src/plugins/ole2_extractor.c:427
-msgid "Swiss French"
-msgstr "Pháp (Thuỵ sĩ)"
+#~ msgid "joint stereo"
+#~ msgstr "âm lập thể chung"
 
-#: src/plugins/ole2_extractor.c:437
-msgid "Swiss Italian"
-msgstr "Ý (Thuỵ sĩ)"
+#~ msgid "dual channel"
+#~ msgstr "kênh đôi"
 
-#: src/plugins/ole2_extractor.c:445
-msgid "Belgian Dutch"
-msgstr "Hoà Lan (Bỉ)"
+#~ msgid "MPEG-1"
+#~ msgstr "MPEG-1"
 
-#: src/plugins/ole2_extractor.c:447
-msgid "Norwegian Bokmal"
-msgstr "Na Uy (Bóc-măn)"
+#~ msgid "MPEG-2"
+#~ msgstr "MPEG-2"
 
-#: src/plugins/ole2_extractor.c:457
-msgid "Rhaeto-Romanic"
-msgstr "Rai-tô-Rô-ma-ni"
+#~ msgid "MPEG-2.5"
+#~ msgstr "MPEG-2.5"
 
-#: src/plugins/ole2_extractor.c:463
-msgid "Croato-Serbian (Latin)"
-msgstr "Xéc-bi Cợ-rô-a-ti-a (La-tinh)"
+#~ msgid "Layer I"
+#~ msgstr "Lớp 1"
 
-#: src/plugins/ole2_extractor.c:465
-msgid "Serbo-Croatian (Cyrillic)"
-msgstr "Xéc-bi Cợ-rô-a-ti-a (Ki-rin)"
+#~ msgid "Layer II"
+#~ msgstr "Lớp 2"
 
-#: src/plugins/ole2_extractor.c:493
-msgid "Farsi"
-msgstr "Pha-xi"
+#~ msgid "Layer III"
+#~ msgstr "Lớp 3"
 
-#: src/plugins/ole2_extractor.c:578
-#, fuzzy, c-format
-msgid "Revision #%u: Author `%s' worked on `%s'"
-msgstr "Bản sửa đổi #%u: Tác giả « %s » đã làm việc « %s »."
+#~ msgid "VBR"
+#~ msgstr "VBR"
 
-#: src/plugins/riff_extractor.c:114
-#, c-format
-msgid "codec: %s, %u fps, %u ms"
-msgstr "codec: %s, %u khung/giây, %u miligiây"
+#~ msgid "CBR"
+#~ msgstr "CBR"
 
+#~ msgid "no copyright"
+#~ msgstr "không có tác quyền"
+
+#~ msgid "original"
+#~ msgstr "gốc"
+
+#~ msgid "copy"
+#~ msgstr "chép"
+
+#~ msgid "codec: %s, %u fps, %u ms"
+#~ msgstr "codec: %s, %u khung/giây, %u miligiây"
+
 #~ msgid "%ux%u dots per inch"
 #~ msgstr "%ux%u chấm trên mỗi insơ"
 

Deleted: Extractor/src/plugins/applefile_extractor.c
===================================================================
--- Extractor/src/plugins/applefile_extractor.c 2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/applefile_extractor.c 2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,250 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright (C) 2008 Heikki Lindholm
-
-     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.
- */
-
-/*
- * handles AppleSingle and AppleDouble header files
- * see RFC 1740
- */
-#include "platform.h"
-#include "extractor.h"
-#include "pack.h"
-
-#define DEBUG 0
-
-#define APPLESINGLE_SIGNATURE "\x00\x05\x16\x00"
-#define APPLEDOUBLE_SIGNATURE "\x00\x05\x16\x07"
-
-typedef struct
-{
-  unsigned char magic[4];
-  unsigned int version;
-  char homeFileSystem[16]; /* v1: in ASCII v2: zero filler */
-  unsigned short entries;
-} ApplefileHeader;
-
-#define APPLEFILE_HEADER_SIZE 26
-#define APPLEFILE_HEADER_SPEC "4bW16bH"
-#define APPLEFILE_HEADER_FIELDS(p) \
- &(p)->magic, \
- &(p)->version, \
- &(p)->homeFileSystem, \
- &(p)->entries
-
-typedef struct
-{
-  unsigned int id;
-  unsigned int offset;
-  unsigned int length;
-} ApplefileEntryDescriptor;
-
-#define APPLEFILE_ENTRY_DESCRIPTOR_SIZE 12
-#define APPLEFILE_ENTRY_DESCRIPTOR_SPEC "WWW"
-#define APPLEFILE_ENTRY_DESCRIPTOR_FIELDS(p) \
- &(p)->id, \
- &(p)->offset, \
- &(p)->length
-
-#define AED_ID_DATA_FORK           1
-#define AED_ID_RESOURCE_FORK       2
-#define AED_ID_REAL_NAME           3
-#define AED_ID_COMMENT             4
-#define AED_ID_ICON_BW             5
-#define AED_ID_ICON_COLOUR         6
-#define AED_ID_FILE_DATES_INFO     8
-#define AED_ID_FINDER_INFO         9
-#define AED_ID_MACINTOSH_FILE_INFO 10
-#define AED_ID_PRODOS_FILE_INFO    11
-#define AED_ID_MSDOS_FILE_INFO     12
-#define AED_ID_SHORT_NAME          13
-#define AED_ID_AFP_FILE_INFO       14
-#define AED_ID_DIRECTORY_ID        15
-
-static int readApplefileHeader(const unsigned char *data,
-                               size_t *offset,
-                               size_t size,
-                               ApplefileHeader *hdr)
-{
-  if ((*offset + APPLEFILE_HEADER_SIZE) > size)
-    return -1;
-
-  EXTRACTOR_common_cat_unpack(data + *offset,
-             APPLEFILE_HEADER_SPEC,
-             APPLEFILE_HEADER_FIELDS(hdr));
-  *offset += APPLEFILE_HEADER_SIZE;
-  return 0;
-}
-
-static int readEntryDescriptor(const unsigned char *data,
-                               size_t *offset,
-                               size_t size,
-                               ApplefileEntryDescriptor *dsc)
-{
-  if ((*offset + APPLEFILE_ENTRY_DESCRIPTOR_SIZE) > size)
-    return -1;
-
-  EXTRACTOR_common_cat_unpack(data + *offset,
-             APPLEFILE_ENTRY_DESCRIPTOR_SPEC,
-             APPLEFILE_ENTRY_DESCRIPTOR_FIELDS(dsc));
-  *offset += APPLEFILE_ENTRY_DESCRIPTOR_SIZE;
-  return 0;
-}
-
-/* mimetype = application/applefile */
-int 
-EXTRACTOR_applefile_extract (const char *sdata,
-                            size_t size,
-                            EXTRACTOR_MetaDataProcessor proc,
-                            void *proc_cls,
-                            const char *options)
-{
-  const unsigned char *data = (const unsigned char*) sdata;
-  size_t offset;
-  ApplefileHeader header;
-  ApplefileEntryDescriptor dsc;
-  int i;
-
-  offset = 0;
-  if (readApplefileHeader(data, &offset, size, &header) == -1)
-    return 0;
-  if ( (memcmp(header.magic, APPLESINGLE_SIGNATURE, 4) != 0) &&
-       (memcmp(header.magic, APPLEDOUBLE_SIGNATURE, 4) != 0) )
-    return 0;
-  if (0 != proc (proc_cls, 
-                "applefile",
-                EXTRACTOR_METATYPE_MIMETYPE,
-                EXTRACTOR_METAFORMAT_UTF8,
-                "text/plain",
-                "application/applefile",
-                strlen ("application/applefile")+1))
-    return 1;
-#if DEBUG
-  fprintf(stderr,
-         "applefile header: %08x %d\n", header.version, header.entries);
-#endif
-  if ( (header.version != 0x00010000) && 
-       (header.version != 0x00020000) )
-    return 0;
-
-  for (i = 0; i < header.entries; i++) {
-    if (readEntryDescriptor(data, &offset, size, &dsc) == -1)
-      break;
-
-#if DEBUG
-    fprintf(stderr,
-           "applefile entry: %u %u %u\n", dsc.id, dsc.offset, dsc.length);
-#endif
-    switch (dsc.id) 
-      {
-      case AED_ID_DATA_FORK:
-        {
-         /* same as in filenameextractor.c */
-         char s[14];
-
-        if (dsc.length >= 1000000000)
-          snprintf (s, 13, "%.2f %s", dsc.length / 1000000000.0,
-                    _("GB"));
-        else if (dsc.length >= 1000000)
-          snprintf (s, 13, "%.2f %s", dsc.length / 1000000.0, _("MB"));
-        else if (dsc.length >= 1000)
-          snprintf (s, 13, "%.2f %s", dsc.length / 1000.0, _("KB"));
-        else
-          snprintf (s, 13, "%.2f %s", (double) dsc.length, _("Bytes"));
-
-       if (0 != proc (proc_cls, 
-                      "applefile",
-                      EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE,
-                      EXTRACTOR_METAFORMAT_UTF8,
-                      "text/plain",
-                      s,
-                      strlen (s) + 1))
-         return 1;
-       }
-       break;      
-      case AED_ID_REAL_NAME:
-       {
-         char s[2048];
-         if ( (dsc.length < sizeof(s)) && 
-              ((dsc.offset + dsc.length) < size) ) {
-           memcpy(s, data + dsc.offset, dsc.length);
-           s[dsc.length] = '\0';
-           if (0 != proc (proc_cls, 
-                          "applefile",
-                          EXTRACTOR_METATYPE_FILENAME,
-                          EXTRACTOR_METAFORMAT_UTF8,
-                          "text/plain",
-                          s,
-                          dsc.length + 1))
-             return 1; 
-         }
-       }
-       break;
-      case AED_ID_COMMENT:
-        if ( (dsc.length < 65536) && ((dsc.offset + dsc.length) < size) ) {
-         char *s = malloc(dsc.length + 1);
-         if (s != NULL) {
-            memcpy(s, data + dsc.offset, dsc.length);
-           s[dsc.length] = '\0';
-           if (0 != proc (proc_cls, 
-                          "applefile",
-                          EXTRACTOR_METATYPE_COMMENT,
-                          EXTRACTOR_METAFORMAT_UTF8,
-                          "text/plain",
-                          s,
-                          dsc.length + 1))
-             {
-               free (s);
-               return 1;       
-             }
-           free (s);       
-         }
-       }      
-       break;
-      case AED_ID_FINDER_INFO:
-        if (dsc.length >= 16 && (dsc.offset + dsc.length) < size) {
-          char s[5];
-         memcpy(s, data + dsc.offset, 4);
-         s[4] = '\0';
-         if (0 != proc (proc_cls, 
-                        "applefile",
-                        EXTRACTOR_METATYPE_FINDER_FILE_TYPE,
-                        EXTRACTOR_METAFORMAT_C_STRING,
-                        "text/plain",
-                        s,
-                        strlen(s) + 1))
-           return 1;   
-          
-         memcpy(s, data + dsc.offset + 4, 4);
-         s[4] = '\0';
-         if (0 != proc (proc_cls, 
-                        "applefile",
-                        EXTRACTOR_METATYPE_FINDER_FILE_CREATOR,
-                        EXTRACTOR_METAFORMAT_C_STRING,
-                        "text/plain",
-                        s,
-                        strlen(s) + 1))
-           return 1;   
-        }
-        break;
-      default:
-        break;
-    }
-  }
-  return 0;
-}

Deleted: Extractor/src/plugins/asf_extractor.c
===================================================================
--- Extractor/src/plugins/asf_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/asf_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,587 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2011 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 file is based on demux_asf from the xine project (copyright follows).
- *
- * Copyright (C) 2000-2002 the xine project
- *
- * This file is part of xine, a free video player.
- *
- * xine 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 of the License, or
- * (at your option) any later version.
- *
- * xine 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
- *
- * $Id: asfextractor.c,v 1.6 2004/10/05 20:02:08 grothoff Exp $
- *
- * demultiplexer for asf streams
- *
- * based on ffmpeg's
- * ASF compatible encoder and decoder.
- * Copyright (c) 2000, 2001 Gerard Lantau.
- *
- * GUID list from avifile
- * some other ideas from MPlayer
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include "convert.h"
-#include <stdint.h>
-
-#define DEMUX_FINISHED 0
-#define DEMUX_START 1
-
-
-/*
- * define asf GUIDs (list from avifile)
- */
-#define GUID_ERROR                              0
-#define GUID_ASF_HEADER                         1
-#define GUID_ASF_DATA                           2
-#define GUID_ASF_SIMPLE_INDEX                   3
-#define GUID_ASF_FILE_PROPERTIES                4
-#define GUID_ASF_STREAM_PROPERTIES              5
-#define GUID_ASF_STREAM_BITRATE_PROPERTIES      6
-#define GUID_ASF_CONTENT_DESCRIPTION            7
-#define GUID_ASF_EXTENDED_CONTENT_ENCRYPTION    8
-#define GUID_ASF_SCRIPT_COMMAND                 9
-#define GUID_ASF_MARKER                        10
-#define GUID_ASF_HEADER_EXTENSION              11
-#define GUID_ASF_BITRATE_MUTUAL_EXCLUSION      12
-#define GUID_ASF_CODEC_LIST                    13
-#define GUID_ASF_EXTENDED_CONTENT_DESCRIPTION  14
-#define GUID_ASF_ERROR_CORRECTION              15
-#define GUID_ASF_PADDING                       16
-#define GUID_ASF_AUDIO_MEDIA                   17
-#define GUID_ASF_VIDEO_MEDIA                   18
-#define GUID_ASF_COMMAND_MEDIA                 19
-#define GUID_ASF_NO_ERROR_CORRECTION           20
-#define GUID_ASF_AUDIO_SPREAD                  21
-#define GUID_ASF_MUTEX_BITRATE                 22
-#define GUID_ASF_MUTEX_UKNOWN                  23
-#define GUID_ASF_RESERVED_1                    24
-#define GUID_ASF_RESERVED_SCRIPT_COMMNAND      25
-#define GUID_ASF_RESERVED_MARKER               26
-#define GUID_ASF_AUDIO_CONCEAL_NONE            27
-#define GUID_ASF_CODEC_COMMENT1_HEADER         28
-#define GUID_ASF_2_0_HEADER                    29
-
-#define GUID_END                               30
-
-
-typedef struct
-{
-  uint32_t v1;
-  uint16_t v2;
-  uint16_t v3;
-  uint8_t v4[8];
-} LE_GUID;
-
-
-static const struct
-{
-  const char *name;
-  const LE_GUID guid;
-} guids[] =
-{
-  {
-    "error",
-    {
-  0x0,}},
-    /* base ASF objects */
-  {
-    "header",
-    {
-      0x75b22630, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "data",
-    {
-      0x75b22636, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "simple index",
-    {
-      0x33000890, 0xe5b1, 0x11cf,
-      {
-  0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}},
-    /* header ASF objects */
-  {
-    "file properties",
-    {
-      0x8cabdca1, 0xa947, 0x11cf,
-      {
-  0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "stream header",
-    {
-      0xb7dc0791, 0xa9b7, 0x11cf,
-      {
-  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "stream bitrate properties",        /* (http://get.to/sdp) */
-    {
-      0x7bf875ce, 0x468d, 0x11d1,
-      {
-  0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}},
-  {
-    "content description",
-    {
-      0x75b22633, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "extended content encryption",
-    {
-      0x298ae614, 0x2622, 0x4c17,
-      {
-  0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c}}},
-  {
-    "script command",
-    {
-      0x1efb1a30, 0x0b62, 0x11d0,
-      {
-  0xa3, 0x9b, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "marker",
-    {
-      0xf487cd01, 0xa951, 0x11cf,
-      {
-  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "header extension",
-    {
-      0x5fbf03b5, 0xa92e, 0x11cf,
-      {
-  0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "bitrate mutual exclusion",
-    {
-      0xd6e229dc, 0x35da, 0x11d1,
-      {
-  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
-  {
-    "codec list",
-    {
-      0x86d15240, 0x311d, 0x11d0,
-      {
-  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "extended content description",
-    {
-      0xd2d0a440, 0xe307, 0x11d2,
-      {
-  0x97, 0xf0, 0x00, 0xa0, 0xc9, 0x5e, 0xa8, 0x50}}},
-  {
-    "error correction",
-    {
-      0x75b22635, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "padding",
-    {
-      0x1806d474, 0xcadf, 0x4509,
-      {
-  0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8}}},
-    /* stream properties object stream type */
-  {
-    "audio media",
-    {
-      0xf8699e40, 0x5b4d, 0x11cf,
-      {
-  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
-  {
-    "video media",
-    {
-      0xbc19efc0, 0x5b4d, 0x11cf,
-      {
-  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
-  {
-    "command media",
-    {
-      0x59dacfc0, 0x59e6, 0x11d0,
-      {
-  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-    /* stream properties object error correction */
-  {
-    "no error correction",
-    {
-      0x20fb5700, 0x5b55, 0x11cf,
-      {
-  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
-  {
-    "audio spread",
-    {
-      0xbfc3cd50, 0x618f, 0x11cf,
-      {
-  0x8b, 0xb2, 0x00, 0xaa, 0x00, 0xb4, 0xe2, 0x20}}},
-    /* mutual exclusion object exlusion type */
-  {
-    "mutex bitrate",
-    {
-      0xd6e22a01, 0x35da, 0x11d1,
-      {
-  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
-  {
-    "mutex unknown",
-    {
-      0xd6e22a02, 0x35da, 0x11d1,
-      {
-  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
-    /* header extension */
-  {
-    "reserved_1",
-    {
-      0xabd3d211, 0xa9ba, 0x11cf,
-      {
-  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-    /* script command */
-  {
-    "reserved script command",
-    {
-      0x4B1ACBE3, 0x100B, 0x11D0,
-      {
-  0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6}}},
-    /* marker object */
-  {
-    "reserved marker",
-    {
-      0x4CFEDB20, 0x75F6, 0x11CF,
-      {
-  0x9C, 0x0F, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB}}},
-    /* various */
-    /* Already defined (reserved_1)
-       { "head2",
-       { 0xabd3d211, 0xa9ba, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 
0x53, 0x65 }} },
-     */
-  {
-    "audio conceal none",
-    {
-      0x49f1a440, 0x4ece, 0x11d0,
-      {
-  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "codec comment1 header",
-    {
-      0x86d15241, 0x311d, 0x11d0,
-      {
-  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "asf 2.0 header",
-    {
-      0xd6e229d1, 0x35da, 0x11d1,
-      {
-0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},};
-
-
-struct demux_asf_s
-{
-  /* pointer to the stream data */
-  const char *input;
-  /* current position in stream */
-  size_t inputPos;
-
-  size_t inputLen;
-
-  uint32_t length;
-
-  int status;
-
-  char *title;
-  char *author;
-  char *copyright;
-  char *comment;
-  char *rating;
-};
-
-static int
-readBuf (struct demux_asf_s * this, void *buf, int len)
-{
-  int min;
-
-  min = len;
-  if (this->inputLen - this->inputPos < min)
-    min = this->inputLen - this->inputPos;
-  memcpy (buf, &this->input[this->inputPos], min);
-  this->inputPos += min;
-  return min;
-}
-
-static uint8_t
-get_byte (struct demux_asf_s * this)
-{
-  uint8_t buf;
-  int i;
-
-  i = readBuf (this, &buf, 1);
-  if (i != 1)
-    this->status = DEMUX_FINISHED;
-  return buf;
-}
-
-static uint16_t
-get_le16 (struct demux_asf_s * this)
-{
-  uint8_t buf[2];
-  int i;
-
-  i = readBuf (this, buf, 2);
-  if (i != 2)
-    this->status = DEMUX_FINISHED;
-  return buf[0] | (buf[1] << 8);
-}
-
-static uint32_t
-get_le32 (struct demux_asf_s * this)
-{
-  uint8_t buf[4];
-  int i;
-
-  i = readBuf (this, buf, 4);
-  if (i != 4)
-    this->status = DEMUX_FINISHED;
-  return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
-}
-
-static uint64_t
-get_le64 (struct demux_asf_s * this)
-{
-  uint8_t buf[8];
-  int i;
-
-  i = readBuf (this, buf, 8);
-  if (i != 8)
-    this->status = DEMUX_FINISHED;
-  return (uint64_t) buf[0]
-    | ((uint64_t) buf[1] << 8)
-    | ((uint64_t) buf[2] << 16)
-    | ((uint64_t) buf[3] << 24)
-    | ((uint64_t) buf[4] << 32)
-    | ((uint64_t) buf[5] << 40)
-    | ((uint64_t) buf[6] << 48) | ((uint64_t) buf[7] << 54);
-}
-
-static int
-get_guid (struct demux_asf_s * this)
-{
-  int i;
-  LE_GUID g;
-
-  g.v1 = get_le32 (this);
-  g.v2 = get_le16 (this);
-  g.v3 = get_le16 (this);
-  for (i = 0; i < 8; i++)
-    g.v4[i] = get_byte (this);
-  if (this->status == DEMUX_FINISHED)
-    return GUID_ERROR;
-  for (i = 1; i < GUID_END; i++)
-    if (!memcmp (&g, &guids[i].guid, sizeof (LE_GUID)))
-      return i;
-
-  return GUID_ERROR;
-}
-
-
-static int
-asf_read_header (struct demux_asf_s * this)
-{
-  int guid;
-  uint64_t gsize;
-  uint16_t len1, len2, len3, len4, len5;
-
-  guid = get_guid (this);
-  if (guid != GUID_ASF_HEADER)
-    return 0;
-  get_le64 (this); /* object size */
-  get_le32 (this); /* number of header objects */
-  get_byte (this); /* reserved 1 */
-  get_byte (this); /* reserved 2 */                
-  while (this->status != DEMUX_FINISHED)
-    {
-      guid = get_guid (this); /* object ID */
-      gsize = get_le64 (this); /* object size */
-      if (gsize < 24)
-        goto fail;
-      switch (guid)
-        {
-        case GUID_ASF_FILE_PROPERTIES:
-         guid = get_guid (this); /* file ID */
-         get_le64 (this);    /* file size */
-         get_le64 (this);    /* creation date */
-         get_le64 (this);    /* nb_packets */
-         this->length = get_le64 (this); /* play duration in 100 ns units */
-         get_le64 (this); /* send duration */
-         get_le64 (this); /* preroll */
-         get_le32 (this);    /* flags */
-         get_le32 (this);    /* min size */
-         get_le32 (this);        /* max size */
-         get_le32 (this);    /* max bitrate */          
-          break;
-        case GUID_ASF_DATA:
-          goto headers_ok;
-          break;
-        case GUID_ASF_CONTENT_DESCRIPTION:
-         len1 = get_le16 (this);
-         len2 = get_le16 (this);
-         len3 = get_le16 (this);
-         len4 = get_le16 (this);
-         len5 = get_le16 (this);
-         this->title = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
-                                                         len1,
-                                                         "UTF-16");
-         this->inputPos += len1;
-         this->author = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
-                                                          len2,
-                                                          "UTF-16");
-         this->inputPos += len2;
-         this->copyright = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
-                                                             len3,
-                                                             "UTF-16");
-         this->inputPos += len3;
-         this->comment = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
-                                                           len4,
-                                                           "UTF-16");
-         this->inputPos += len4;
-         this->rating = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
-                                                          len5,
-                                                          "UTF-16");
-         this->inputPos += len5;
-          break;
-        default:
-          this->inputPos += gsize - 24;
-        }
-    }
-
-headers_ok:
-  this->inputPos += sizeof (LE_GUID) + 10;
-  return 1;
-fail:
-  return 0;
-}
-
-
-/* mimetypes:
-   video/x-ms-asf: asf: ASF stream;
-   video/x-ms-wmv: wmv: Windows Media Video;
-   video/x-ms-wma: wma: Windows Media Audio;
-   application/vnd.ms-asf: asf: ASF stream;
-   application/x-mplayer2: asf,asx,asp: mplayer2;
-   video/x-ms-asf-plugin: asf,asx,asp: mms animation;
-   video/x-ms-wvx: wvx: wmv metafile;
-   video/x-ms-wax: wva: wma metafile; */
-
-/* mimetype = application/applefile */
-int 
-EXTRACTOR_asf_extract (const char *data,
-                      size_t size,
-                      EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls,
-                      const char *options)
-{
-  struct demux_asf_s this;
-  size_t slen;
-  char duration_str[30];
-  int ret;
-
-  memset (&this, 0, sizeof (struct demux_asf_s));
-  this.input = data;
-  this.inputLen = size;
-  this.status = DEMUX_START;
-  ret = 0;
-  if (1 == asf_read_header (&this))
-  {
-    snprintf (duration_str, 
-             sizeof (duration_str),
-             "%llu ms", (unsigned long long) (this.length / 10000LL));
-    if ( ( (this.title != NULL) &&
-          (0 < (slen = strlen(this.title))) &&
-          (0 != proc (proc_cls, 
-                      "asf",
-                      EXTRACTOR_METATYPE_TITLE,
-                      EXTRACTOR_METAFORMAT_C_STRING,
-                      "text/plain",
-                      this.title,
-                      slen + 1)) ) ||
-        ( (this.author != NULL) &&
-          (0 < (slen = strlen(this.author))) &&
-          (0 != proc (proc_cls, 
-                      "asf",
-                      EXTRACTOR_METATYPE_AUTHOR_NAME,
-                      EXTRACTOR_METAFORMAT_C_STRING,
-                      "text/plain",
-                      this.author,
-                      slen + 1)) ) ||
-        ( (this.comment != NULL)  &&
-          (0 < (slen = strlen(this.comment))) &&
-          (0 != proc (proc_cls, 
-                      "asf",
-                      EXTRACTOR_METATYPE_COMMENT,
-                      EXTRACTOR_METAFORMAT_C_STRING,
-                      "text/plain",
-                      this.comment,
-                      slen + 1)) ) ||
-        ( (this.copyright != NULL) &&
-          (0 < (slen = strlen(this.copyright))) &&
-          (0 != proc (proc_cls, 
-                      "asf",
-                      EXTRACTOR_METATYPE_COPYRIGHT,
-                      EXTRACTOR_METAFORMAT_C_STRING,
-                      "text/plain",
-                      this.copyright,
-                      slen + 1)) ) ||
-        (0 != proc (proc_cls, 
-                    "asf",
-                    EXTRACTOR_METATYPE_MIMETYPE,
-                    EXTRACTOR_METAFORMAT_C_STRING,
-                    "text/plain",
-                    "video/x-ms-asf",
-                    strlen("video/x-ms-asf") + 1)) ||
-        (0 != proc (proc_cls, 
-                    "asf",
-                    EXTRACTOR_METATYPE_DURATION,
-                    EXTRACTOR_METAFORMAT_C_STRING,
-                    "text/plain",
-                    duration_str,
-                    strlen(duration_str) + 1)) ) 
-      ret = 1; 
-  }
-  free (this.title);
-  free (this.author);
-  free (this.copyright);
-  free (this.comment);
-  free (this.rating);
-  return ret;
-}
-
-/*  end of asf_extractor.c */

Deleted: Extractor/src/plugins/dvi_extractor.c
===================================================================
--- Extractor/src/plugins/dvi_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/dvi_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,247 +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"
-
-typedef struct
-{
-  char *text;
-  enum EXTRACTOR_MetaType type;
-} Matches;
-
-static Matches tmap[] = {
-  {"/Title (",    EXTRACTOR_METATYPE_TITLE},
-  {"/Subject (",  EXTRACTOR_METATYPE_SUBJECT},
-  {"/Author (",   EXTRACTOR_METATYPE_AUTHOR_NAME},
-  {"/Keywords (", EXTRACTOR_METATYPE_KEYWORDS},
-  {"/Creator (",  EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE },
-  {"/Producer (", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE},
-  {NULL, 0},
-};
-
-static int
-parseZZZ (const char *data,
-          size_t pos, size_t len,
-         EXTRACTOR_MetaDataProcessor proc,
-         void *proc_cls)
-{
-  size_t slen;
-  size_t end;
-  int i;
-
-  end = pos + len;
-  slen = strlen ("ps:SDict begin [");
-  if (len <= slen)
-    return 0;
-  if (0 != strncmp ("ps:SDict begin [ ", &data[pos], slen))
-    return 0;
-  pos += slen;
-  while (pos < end)
-    {
-      i = 0;
-      while (tmap[i].text != NULL)
-        {
-          slen = strlen (tmap[i].text);
-          if (pos + slen < end)
-            {
-              if (0 == strncmp (&data[pos], tmap[i].text, slen))
-                {
-                  pos += slen;
-                  slen = pos;
-                  while ((slen < end) && (data[slen] != ')'))
-                    slen++;
-                  slen = slen - pos;
-                 {
-                   char value[slen + 1];
-                   value[slen] = '\0';
-                   memcpy (value, &data[pos], slen);
-                   if (0 != proc (proc_cls, 
-                                  "dvi",
-                                  tmap[i].type,
-                                  EXTRACTOR_METAFORMAT_C_STRING,
-                                  "text/plain",
-                                  value,
-                                  slen +1))
-                     {
-                       return 1;
-                     }
-                 }
-                  pos += slen + 1;
-                }
-            }
-          i++;
-        }
-      pos++;
-    }
-  return 0;
-}
-
-static unsigned int
-getIntAt (const void *data)
-{
-  char p[4];
-
-  memcpy (p, data, 4);          /* ensure alignment! */
-  return *(unsigned int *) &p[0];
-}
-
-static unsigned int
-getShortAt (const void *data)
-{
-  char p[2];
-
-  memcpy (p, data, 2);          /* ensure alignment! */
-  return *(unsigned short *) &p[0];
-}
-
-
-int 
-EXTRACTOR_dvi_extract (const unsigned char *data,
-                      size_t size,
-                      EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls,
-                      const char *options)
-{
-  unsigned int klen;
-  uint32_t pos;
-  uint32_t opos;
-  unsigned int len;
-  unsigned int pageCount;
-  char pages[16];
-
-  if (size < 40)
-    return 0;
-  if ((data[0] != 247) || (data[1] != 2))
-    return 0;                /* cannot be dvi or unsupported version */
-  klen = data[14];
-
-  pos = size - 1;
-  while ((data[pos] == 223) && (pos > 0))
-    pos--;
-  if ((data[pos] != 2) || (pos < 40))
-    return 0;
-  pos--;
-  pos -= 4;
-  /* assert pos at 'post_post tag' */
-  if (data[pos] != 249)
-    return 0;
-  opos = pos;
-  pos = ntohl (getIntAt (&data[opos + 1]));
-  if (pos + 25 > size)
-    return 0;
-  /* assert pos at 'post' command */
-  if (data[pos] != 248)
-    return 0;
-  pageCount = 0;
-  opos = pos;
-  pos = ntohl (getIntAt (&data[opos + 1]));
-  while (1)
-    {
-      if (pos == UINT32_MAX)
-        break;
-      if (pos + 45 > size)
-        return 0;
-      if (data[pos] != 139)     /* expect 'bop' */
-        return 0;
-      pageCount++;
-      opos = pos;
-      pos = ntohl (getIntAt (&data[opos + 41]));
-      if (pos == UINT32_MAX)
-        break;
-      if (pos >= opos)
-        return 0;            /* invalid! */
-    }
-  /* ok, now we believe it's a dvi... */
-  snprintf (pages, sizeof(pages), "%u", pageCount);
-  if (0 != proc (proc_cls, 
-                "dvi",
-                EXTRACTOR_METATYPE_PAGE_COUNT,
-                EXTRACTOR_METAFORMAT_UTF8,
-                "text/plain",
-                pages,
-                strlen (pages) +1))
-    return 1;
-  if (0 != proc (proc_cls, 
-                "dvi",
-                EXTRACTOR_METATYPE_MIMETYPE,
-                EXTRACTOR_METAFORMAT_UTF8,
-                "text/plain",
-                "application/x-dvi",
-                strlen ("application/x-dvi") +1))
-    return 1;
-  {
-    char comment[klen + 1];
-    
-    comment[klen] = '\0';
-    memcpy (comment, &data[15], klen);
-    if (0 != proc (proc_cls, 
-                  "dvi",
-                  EXTRACTOR_METATYPE_COMMENT,
-                  EXTRACTOR_METAFORMAT_UTF8,
-                  "text/plain",
-                  comment,
-                  klen +1))
-      return 1;
-  }
-  /* try to find PDF/ps special */
-  pos = opos;
-  while (pos < size - 100)
-    {
-      switch (data[pos])
-        {
-        case 139:              /* begin page 'bop', we typically have to skip 
that one to
-                                   find the zzz's */
-          pos += 45;            /* skip bop */
-          break;
-        case 239:              /* zzz1 */
-          len = data[pos + 1];
-          if (pos + 2 + len < size)
-            if (0 != parseZZZ ((const char *) data, pos + 2, len, proc, 
proc_cls))
-             return 1;
-          pos += len + 2;
-          break;
-        case 240:              /* zzz2 */
-          len = ntohs (getShortAt (&data[pos + 1]));
-          if (pos + 3 + len < size)
-            if (0 != parseZZZ ((const char *) data, pos + 3, len, proc, 
proc_cls))
-             return 1;
-          pos += len + 3;
-          break;
-        case 241:              /* zzz3, who uses that? */
-          len = (ntohs (getShortAt (&data[pos + 1]))) + 65536 * data[pos + 3];
-          if (pos + 4 + len < size)
-            if (0 != parseZZZ ((const char *) data, pos + 4, len, proc, 
proc_cls))
-             return 1;
-          pos += len + 4;
-          break;
-        case 242:              /* zzz4, hurray! */
-          len = ntohl (getIntAt (&data[pos + 1]));
-          if (pos + 1 + len < size)
-            if (0 != parseZZZ ((const char *) data, pos + 5, len, proc, 
proc_cls))
-             return 1;
-          pos += len + 5;
-          break;
-        default:               /* unsupported opcode, abort scan */
-          return 0;
-        }
-    }
-  return 0;
-}

Deleted: Extractor/src/plugins/ebml_extractor.c
===================================================================
--- Extractor/src/plugins/ebml_extractor.c      2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/ebml_extractor.c      2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,2290 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2004, 2005, 2006, 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.
- */
-
- /*
-  * Made by Gabriel Peixoto
-  * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin.
-  * Nearly complete rewrite by LRN, Copyright (c) 2012
-  */
-
-#include "platform.h"
-#include "extractor.h"
-#include <stdint.h>
-
-#include "le_architecture.h"
-
-#ifndef DEBUG_EBML
-# define DEBUG_EBML 0
-#endif
-
-#if WINDOWS
-/* According to 
http://old.nabble.com/Porting-localtime_r-and-gmtime_r-td15282276.html
- * msvcrt.dll does have thread-safe gmtime implementation,
- * even though the documentation says otherwise.
- * Should be easy to check - spawn 2 threads, run _gmtime64 in each one
- * and see if they return the same pointer.
- */
-struct tm *
-gmtime_undocumented_64_r (const __time64_t *timer, struct tm *result)
-{
-   struct tm *local_result = NULL;//_gmtime64 (timer);
-
-   if (local_result == NULL || result == NULL)
-     return NULL;
-
-   memcpy (result, local_result, sizeof (*result));
-   return result;
-}
-#endif
-
-#include "extractor_plugins.h"
-
-#define ADD_EBML(s,t) do { proc (proc_cls, "ebml", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1); } while (0)
-#define ADD_MATROSKA(s,t) do { proc (proc_cls, "matroska", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1); } while (0)
-
-/**
- * String length limit. The spec does not limit the strings,
- * but we don't want to allocate 2^56 bytes
- * just because some EBML file says it has a string of that length!
- * This also must be <= of the number of bytes LE gives us in one go
- * (the code doesn't know how to "read a part of string, request a seek,
- * then read some more, and repeat until the whole string is read").
- * If it isn't, the code will loop forever, requesting the same
- * seek position (beginning of the string) over and over.
- * FIXME: find a way to fix that condition in LE itself?
- * TODO: rewrite string reading code to allocate strings on the heap,
- * that will allow us to greatly increase max string size. Right now
- * strings are allocated on the stack, and can't be too long because
- * of that.
- */
-#define MAX_STRING_SIZE 1024
-
-struct MatroskaTrackType
-{
-  unsigned char code;
-  const char *name;
-  char video_must_be_valid;
-  char audio_must_be_valid;
-};
-
-struct MatroskaTrackType track_types[] = {
-  {0x01, "video", 1, -1},
-  {0x02, "audio", -1, 1},
-  {0x03, "complex", -1, -1},
-  {0x10, "logo", -1, -1},
-  {0x11, "subtitle", -1, -1},
-  {0x12, "buttons", -1, -1},
-  {0x20, "control", -1, -1},
-  {0x00, NULL}
-};
-
-struct MatroskaTagMap
-{
-  const char *name;
-  enum EXTRACTOR_MetaType id;
-};
-
-/* TODO: Add TargetLevel parsing, and use it to correctly set:
- * "track number" and "disk number" from PART_NUMBER,
- * "author email" from EMAIL,
- * "publisher address" from ADDRESS,
- * "
- */
-struct MatroskaTagMap tag_map[] = {
-  {"COUNTRY", EXTRACTOR_METATYPE_LOCATION_COUNTRY_CODE},
-  {"TITLE", EXTRACTOR_METATYPE_TITLE},
-  {"SUBTITLE", EXTRACTOR_METATYPE_SUBTITLE},
-  {"URL", EXTRACTOR_METATYPE_URL},
-  {"ARTIST", EXTRACTOR_METATYPE_ARTIST},
-  {"LEAD_PERFORMER", EXTRACTOR_METATYPE_PERFORMER},
-  {"ACCOMPANIMENT", EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST}, /* not sure if 
it's correct */
-  {"COMPOSER", EXTRACTOR_METATYPE_COMPOSER},
-  {"LYRICS", EXTRACTOR_METATYPE_LYRICS},
-  /* LYRICIST */
-  {"CONDUCTOR", EXTRACTOR_METATYPE_CONDUCTOR},
-  /* DIRECTOR UTF-8 This is akin to the IART tag in RIFF.
-     ASSISTANT_DIRECTOR UTF-8 The name of the assistant director.
-     DIRECTOR_OF_PHOTOGRAPHY UTF-8 The name of the director of photography, 
also known as cinematographer. This is akin to the ICNM tag in Extended RIFF.
-     SOUND_ENGINEER UTF-8 The name of the sound engineer or sound recordist.
-     ART_DIRECTOR UTF-8 The person who oversees the artists and craftspeople 
who build the sets.
-     PRODUCTION_DESIGNER UTF-8 Artist responsible for designing the overall 
visual appearance of a movie.
-     CHOREGRAPHER UTF-8 The name of the choregrapher
-     COSTUME_DESIGNER UTF-8 The name of the costume designer
-     ACTOR UTF-8 An actor or actress playing a role in this movie. This is the 
person's real name, not the character's name the person is playing.
-     CHARACTER UTF-8 The name of the character an actor or actress
-  */
-  {"WRITTEN_BY", EXTRACTOR_METATYPE_WRITER},
-  /*
-    SCREENPLAY_BY UTF-8 The author of the screenplay or scenario (used for 
movies and TV shows).
-    EDITED_BY UTF-8 This is akin to the IEDT tag in Extended RIFF.
-    PRODUCER UTF-8 Produced by. This is akin to the IPRO tag in Extended RIFF. 
(NOT EXTRACTOR_METATYPE_PRODUCER!)
-    COPRODUCER UTF-8 The name of a co-producer.
-    EXECUTIVE_PRODUCER UTF-8 The name of an executive producer.
-    DISTRIBUTED_BY UTF-8 This is akin to the IDST tag in Extended RIFF.
-    MASTERED_BY UTF-8 The engineer who mastered the content for a physical 
medium or for digital distribution.
-  */
-  {"ENCODED_BY", EXTRACTOR_METATYPE_ENCODED_BY},
-  /*
-    MIXED_BY UTF-8 DJ mix by the artist specified
-    REMIXED_BY UTF-8 Interpreted, remixed, or otherwise modified by. This is 
akin to the TPE4 tag in ID3.
-    PRODUCTION_STUDIO UTF-8 This is akin to the ISTD tag in Extended RIFF.
-    THANKS_TO UTF-8 A very general tag for everyone else that wants to be 
listed.
-  */
-  {"PUBLISHER", EXTRACTOR_METATYPE_PUBLISHER},
-  /*
-    LABEL UTF-8 The record label or imprint on the disc.
-  */
-  {"GENRE", EXTRACTOR_METATYPE_GENRE},
-  {"MOOD", EXTRACTOR_METATYPE_MOOD},
-  /*
-    ORIGINAL_MEDIA_TYPE UTF-8 Describes the original type of the media, such 
as, "DVD", "CD", "computer image," "drawing," "lithograph," and so forth. This 
is akin to the TMED tag in ID3.
-    CONTENT_TYPE UTF-8 The type of the item. e.g. Documentary, Feature Film, 
Cartoon, Music Video, Music, Sound FX, ...
-  */
-  {"SUBJECT", EXTRACTOR_METATYPE_SUBJECT},
-  {"DESCRIPTION", EXTRACTOR_METATYPE_DESCRIPTION},
-  {"KEYWORDS", EXTRACTOR_METATYPE_KEYWORDS},
-  {"SUMMARY", EXTRACTOR_METATYPE_SUMMARY},
-  /*
-    SYNOPSIS UTF-8 A description of the story line of the item. 
-    INITIAL_KEY UTF-8 The initial key that a musical track starts in. The 
format is identical to ID3.
-    PERIOD UTF-8 Describes the period that the piece is from or about. For 
example, "Renaissance". 
-    LAW_RATING UTF-8 Depending on the country it's the format of the rating of 
a movie (P, R, X in the USA, an age in other countries or a URI defining a 
logo).
-    ICRA binary        The ICRA content rating for parental control. 
(Previously RSACi)
-  */
-  {"DATE_RELEASED", EXTRACTOR_METATYPE_PUBLICATION_DATE},
-  {"DATE_RECORDED", EXTRACTOR_METATYPE_CREATION_DATE},
-  {"DATE_ENCODED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  {"DATE_TAGGED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  {"DATE_DIGITIZED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  {"DATE_WRITTEN", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  {"DATE_PURCHASED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  /*
-    RECORDING_LOCATION UTF-8 The location where the item was recorded. The 
countries corresponding to the string, same 2 octets as in Internet domains, or 
possibly ISO-3166. This code is followed by a comma, then more detailed 
information such as state/province, another comma, and then city. For example, 
"US, Texas, Austin". This will allow for easy sorting. It is okay to only store 
the country, or the country and the state/province. More detailed information 
can be added after the city through the use of additional commas. In cases 
where the province/state is unknown, but you want to store the city, simply 
leave a space between the two commas. For example, "US, , Austin". 
-    COMPOSITION_LOCATION UTF-8 Location that the item was originaly 
designed/written. The countries corresponding to the string, same 2 octets as 
in Internet domains, or possibly ISO-3166. This code is followed by a comma, 
then more detailed information such as state/province, another comma, and then 
city. For example, "US, Texas, Austin". This will allow for easy sorting. It is 
okay to only store the country, or the country and the state/province. More 
detailed information can be added after the city through the use of additional 
commas. In cases where the province/state is unknown, but you want to store the 
city, simply leave a space between the two commas. For example, "US, , Austin".
-    COMPOSER_NATIONALITY UTF-8 Nationality of the main composer of the item, 
mostly for classical music. The countries corresponding to the string, same 2 
octets as in Internet domains, or possibly ISO-3166.
-  */
-  /* Matroska considers "COMMENT", "PLAY_COUNTER" and "RATING" to be personal. 
Should we extract them? */
-  {"COMMENT", EXTRACTOR_METATYPE_COMMENT},
-  {"PLAY_COUNTER", EXTRACTOR_METATYPE_PLAY_COUNTER},
-  {"RATING", EXTRACTOR_METATYPE_POPULARITY_METER},
-  /*
-    ENCODER UTF-8 The software or hardware used to encode this item. ("LAME" 
or "XviD")
-    ENCODER_SETTINGS UTF-8 A list of the settings used for encoding this item. 
No specific format.
-    BPS UTF-8 The average bits per second of the specified item. This is only 
the data in the Blocks, and excludes headers and any container overhead.
-    FPS UTF-8 The average frames per second of the specified item. This is 
typically the average number of Blocks per second. In the event that lacing is 
used, each laced chunk is to be counted as a seperate frame. 
-  */
-  {"BPM", EXTRACTOR_METATYPE_BEATS_PER_MINUTE},
-  /*
-    MEASURE UTF-8 In music, a measure is a unit of time in Western music like 
"4/4". It represents a regular grouping of beats, a meter, as indicated in 
musical notation by the time signature.. The majority of the contemporary rock 
and pop music you hear on the radio these days is written in the 4/4 time 
signature.
-    TUNING UTF-8 It is saved as a frequency in hertz to allow near-perfect 
tuning of instruments to the same tone as the musical piece (e.g. "441.34" in 
Hertz). The default value is 440.0 Hz.
-    REPLAYGAIN_GAIN binary The gain to apply to reach 89dB SPL on playback. 
This is based on the Replay Gain standard. Note that ReplayGain information can 
be found at all TargetType levels (track, album, etc).
-    REPLAYGAIN_PEAK binary The maximum absolute peak value of the item. This 
is based on the Replay Gain standard.
-  */
-  {"ISRC", EXTRACTOR_METATYPE_ISRC},
-  /*
-    MCDI binary This is a binary dump of the TOC of the CDROM that this item 
was taken from. This holds the same information as the MCDI in ID3.
-    ISBN UTF-8 International Standard Book Number
-    BARCODE UTF-8 EAN-13 (European Article Numbering) or UPC-A (Universal 
Product Code) bar code identifier 
-    CATALOG_NUMBER UTF-8 A label-specific string used to identify the release 
(TIC 01 for example).
-    LABEL_CODE UTF-8 A 4-digit or 5-digit number to identify the record label, 
typically printed as (LC) xxxx or (LC) 0xxxx on CDs medias or covers (only the 
number is stored).
-    LCCN UTF-8 Library of Congress Control Number
-  */
-  /*
-    PURCHASE_ITEM UTF-8 URL to purchase this file. This is akin to the WPAY 
tag in ID3.
-    PURCHASE_INFO UTF-8 Information on where to purchase this album. This is 
akin to the WCOM tag in ID3.
-    PURCHASE_OWNER UTF-8 Information on the person who purchased the file. 
This is akin to the TOWN tag in ID3.
-    PURCHASE_PRICE UTF-8 The amount paid for entity. There should only be a 
numeric value in here. Only numbers, no letters or symbols other than ".". For 
instance, you would store "15.59" instead of "$15.59USD".
-    PURCHASE_CURRENCY UTF-8 The currency type used to pay for the entity. Use 
ISO-4217 for the 3 letter currency code.
-  */
-  {"COPYRIGHT", EXTRACTOR_METATYPE_COPYRIGHT},
-  {"PRODUCTION_COPYRIGHT", EXTRACTOR_METATYPE_COPYRIGHT},
-  {"LICENSE", EXTRACTOR_METATYPE_LICENSE},
-  /* TERMS_OF_USE UTF-8 The terms of use for this item. This is akin to the 
USER tag in ID3. */
-  {NULL, EXTRACTOR_METATYPE_RESERVED}
-};
-
-/**
- * FIXME: document
- */
-enum
-{
-  EBMLID_FILE_BEGIN = 0x1A, /* First byte of EBMLID_EBML */
-  EBMLID_EBML = 0x1A45DFA3,
-  EBMLID_VERSION = 0x4286,
-  EBMLID_READ_VERSION = 0x42f7,
-  EBMLID_MAX_ID_LENGTH = 0x42f2,
-  EBMLID_MAX_SIZE_LENGTH = 0x42f3,
-  EBMLID_DOCTYPE = 0x4282,
-  EBMLID_DOCTYPE_VERSION = 0x4287,
-  EBMLID_DOCTYPE_READ_VERSION = 0x4285,
-
-  /*EBMLID_CRC32 = 0xC3, FIXME: support this! Need some magical logic to skip 
it, unlike MatroskaID_CRC32 = 0xBF. That is, files with 0xC3 are completely 
unreadable at the moment. */
-
-  MatroskaID_Segment = 0x18538067,
-
-  MatroskaID_SeekHead = 0x114D9B74,
-
-  MatroskaID_Seek = 0x4DBB, /* mandatory, may appear more than once. Contains 
a single seek entry to an EBML element. */
-
-  MatroskaID_SeekID = 0x53AB, /* mandatory, BINARY. The binary ID 
corresponding to the element name. */
-  MatroskaID_SeekPosition = 0x53AC, /* mandatory, UINT. The position of the 
element in the segment in octets (0 = first level 1 element). */
-
-  MatroskaID_Info = 0x1549A966,
-
-  MatroskaID_Info_TimecodeScale = 0x2AD7B1, /* defaults to 1000000, UINT. 
Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are 
expressed in milliseconds). */
-  MatroskaID_Info_Duration = 0x4489, /* must be >0, FLOAT. Duration of the 
segment (based on TimecodeScale). */
-  MatroskaID_Info_DateUTC = 0x4461, /* DATE. Date of the origin of timecode 
(value 0), i.e. production date. */
-  MatroskaID_Info_Title = 0x7BA9, /* UTF-8-encoded. General name of the 
segment. */
-  MatroskaID_Info_MuxingApp = 0x4D80, /* mandatory, UTF-8-encoded. Muxing 
application or library ("libmatroska-0.4.3"). */
-  MatroskaID_Info_WritingApp = 0x5741, /* mandatory, UTF-8-encoded. Writing 
application ("mkvmerge-0.3.3"). */
-
-  MatroskaID_Tracks = 0x1654AE6B,
-
-  MatroskaID_Tracks_TrackEntry = 0xAE,
-
-  MatroskaID_Tracks_TrackType = 0x83, /* mandatory, 1-254, UINT. A set of 
track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: 
subtitle, 0x12: buttons, 0x20: control). */
-  MatroskaID_Tracks_Name = 0x536E, /* UTF-8-encoded. A human-readable track 
name. */
-  MatroskaID_Tracks_Language = 0x22B59C, /* defaults to 'eng', string. 
Specifies the language of the track in the Matroska languages form. */
-  MatroskaID_Tracks_CodecID = 0x86, /* mandatory, string. An ID corresponding 
to the codec, see the codec page ( 
http://matroska.org/technical/specs/codecid/index.html ) for more info. */
-  MatroskaID_Tracks_CodecName = 0x258688, /* UTF-8-encoded. A human-readable 
string specifying the codec. */
-
-  MatroskaID_Tracks_Video = 0xE0, /* Video settings. */
-  MatroskaID_Tracks_Video_FlagInterlaced = 0x9A, /* mandatory, 0-1, defaults 
to 0, UINT. Set if the video is interlaced. (1 bit) */
-  MatroskaID_Tracks_Video_StereoMode = 0x53B8, /* defaults to 0, UINT. 
Stereo-3D video mode (0: mono, 1: side by side (left eye is first), 2: 
top-bottom (right eye is first), 3: top-bottom (left eye is first), 4: 
checkboard (right is first), 5: checkboard (left is first), 6: row interleaved 
(right is first), 7: row interleaved (left is first), 8: column interleaved 
(right is first), 9: column interleaved (left is first), 10: anaglyph 
(cyan/red), 11: side by side (right eye is first), 12: anaglyph 
(green/magenta), 13 both eyes laced in one Block (left eye is first), 14 both 
eyes laced in one Block (right eye is first)) . There are some more details on 
3D support in the Specification Notes ( 
http://matroska.org/technical/specs/notes.html#3D ). */
-  MatroskaID_Tracks_Video_PixelWidth = 0xB0, /* mandatory, not 0, UINT. Width 
of the encoded video frames in pixels. */
-  MatroskaID_Tracks_Video_PixelHeight = 0xBA, /* mandatory, not 0, UINT. 
Height of the encoded video frames in pixels. */
-  MatroskaID_Tracks_Video_DisplayWidth = 0x54B0, /* not 0, defaults to 
PixelWidth, UINT. Width of the video frames to display. The default value is 
only valid when DisplayUnit is 0. */
-  MatroskaID_Tracks_Video_DisplayHeight = 0x54BA, /* not 0, defaults to 
PixelHeight, UINT. Height of the video frames to display. The default value is 
only valid when DisplayUnit is 0. */
-  MatroskaID_Tracks_Video_DisplayUnit = 0x54B2, /* defaults to 0, UINT. How 
DisplayWidth & DisplayHeight should be interpreted (0: pixels, 1: centimeters, 
2: inches, 3: Display Aspect Ratio). */
-
-  MatroskaID_Tracks_Audio = 0xE1, /* Audio settings. */
-  MatroskaID_Tracks_Audio_SamplingFrequency = 0xB5, /* mandatory, > 0, 
defaults to 8000.0, FLOAT. Sampling frequency in Hz. */
-  MatroskaID_Tracks_Audio_OutputSamplingFrequency = 0x78B5, /* > 0, defaults 
to SamplingFrequency, FLOAT. Real output sampling frequency in Hz (used for SBR 
techniques). */
-  MatroskaID_Tracks_Audio_Channels = 0x9F, /* mandatory, not 0, defaults to 1, 
UINT. Numbers of channels in the track. */
-  MatroskaID_Tracks_Audio_BitDepth = 0x6264, /* not 0, UINT. Bits per sample, 
mostly used for PCM. */
-
-
-
-  MatroskaID_Tags = 0x1254C367, /* can appear more than once. Element 
containing elements specific to Tracks/Chapters. A list of valid tags can be 
found here. */
-  MatroskaID_Tags_Tag = 0x7373, /* mandatory, can appear more than once. 
Element containing elements specific to Tracks/Chapters. */
-  MatroskaID_Tags_Tag_SimpleTag = 0x67C8, /* mandatory, can appear more than 
once, recursive. Contains general information about the target. */
-  MatroskaID_Tags_Tag_SimpleTag_TagName = 0x45A3, /* mandatory, UTF8-encoded. 
The name of the Tag that is going to be stored. */
-  MatroskaID_Tags_Tag_SimpleTag_TagLanguage = 0x447A, /* mandatory, defaults 
to 'und', string. Specifies the language of the tag specified, in the Matroska 
languages form. */
-  MatroskaID_Tags_Tag_SimpleTag_TagDefault = 0x4484, /* mandatory, 0-1, 
defaults to 1, UINT. Indication to know if this is the default/original 
language to use for the given tag. (1 bit) */
-  MatroskaID_Tags_Tag_SimpleTag_TagString = 0x4487, /* UTF-8-encoded. The 
value of the Tag. */
-  MatroskaID_Tags_Tag_SimpleTag_TagBinary = 0x4485 /* BINARY. The values of 
the Tag if it is binary. Note that this cannot be used in the same SimpleTag as 
TagString. */
-};
-
-
-enum VINTParseMode
-{
-  VINT_READ_ID = 0,
-  VINT_READ_SIZE = 1,
-  VINT_READ_UINT = 2,
-  VINT_READ_SINT = 3
-};
-
-/**
- * Reads an EBML integer from the buffer
- *
- * @param buffer array of bytes to read from
- * @param start the position in buffer at which to start reading
- * @param end first invalid index in buffer (i.e. buffer size)
- * @param result receives the integer.
- * @param mode (see VINTParseMode)
- * @return number of bytes occupied by the integer (the integer itself
- *         is always put into 64-bit long buffer),
- *         -1 if there is not enough bytes to read the integer
- */
-static ssize_t
-VINTparse (struct EXTRACTOR_PluginList *plugin,
-           int64_t * result, enum VINTParseMode mode)
-{
-  /* 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001 */
-  static const unsigned char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 
0x02, 0x01 };
-  /* 01111111 00111111 00011111 00001111 00000111 00000011 00000001 00000000 */
-  static const unsigned char imask[8] = { 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 
0x01, 0x00 };
-  static const int64_t int_negative_limits[8] = {
-    -0x00000000000040LL, /*  7-bit integer */
-    -0x00000000002000LL, /* 14-bit integer */
-    -0x00000000100000LL, /* 21-bit integer */
-    -0x00000008000000LL, /* 28-bit integer */
-    -0x00000400000000LL, /* 35-bit integer */
-    -0x00020000000000LL, /* 42-bit integer */
-    -0x01000000000000LL, /* 49-bit integer */
-    -0x80000000000000LL, /* 56-bit integer */
-  };
-  static const int64_t int_positive_limits[8] = {
-    0x00000000000040ULL - 1LL, /*  7-bit integer */
-    0x00000000002000ULL - 1LL, /* 14-bit integer */
-    0x00000000100000ULL - 1LL, /* 21-bit integer */
-    0x00000008000000ULL - 1LL, /* 28-bit integer */
-    0x00000400000000ULL - 1LL, /* 35-bit integer */
-    0x00020000000000ULL - 1LL, /* 42-bit integer */
-    0x01000000000000ULL - 1LL, /* 49-bit integer */
-    0x80000000000000ULL - 1LL, /* 56-bit integer */
-  };
-  static const uint64_t uint_positive_limits[8] = {
-    0x0000000000000080ULL - 1LL, /*  7-bit integer */
-    0x0000000000004000ULL - 1LL, /* 14-bit integer */
-    0x0000000000200000ULL - 1LL, /* 21-bit integer */
-    0x0000000010000000ULL - 1LL, /* 28-bit integer */
-    0x0000000800000000ULL - 1LL, /* 35-bit integer */
-    0x0000040000000000ULL - 1LL, /* 42-bit integer */
-    0x0002000000000000ULL - 1LL, /* 49-bit integer */
-    0x0100000000000000ULL - 1LL, /* 56-bit integer */
-  };
-  int vint_width;
-  unsigned int c;
-  uint64_t result_u;
-  int64_t result_s;
-  uint64_t temp;
-  unsigned char *data;
-  unsigned char first_byte;
-  unsigned char int_bytes[8];
-
-  /* Minimal integer size is 1 byte */
-  if (1 != pl_read (plugin, &data, 1))
-    return -1;
-  first_byte = data[0];
-
-  /* An integer begins with zero or more 0-bits. Number of 0-bits indicates the
-   * width of the integer, zero 0-bits means a 1-byte long integer; 8 0-bits
-   * indicate a 8-byte (64-bit) integer.
-   * 0-bits are followed by a mandatory 1-bit. Then - by the bits of the 
integer
-   * itself. Integers are stored in big-endian order. Because of the width 
prefix
-   * and the mandatory 1-bit, integers are relatively short:
-   * 1-byte integer has 2^7 different values,
-   * 2-byte integer has 2^14 different values,
-   * etc
-   */
-  /*
-   * Examine the first byte and see how many 0-bytes are at its beginning.
-   */
-  vint_width = 0;
-  for (c = 0; c < 8; c++)
-    if (!(first_byte & mask[c]))
-      vint_width++;
-    else
-      break;
-  /* vint_width now contains the number of 0-bytes. That is also the number
-   * of extra bytes occupied by the integer (beyond the one that we've just
-   * partially read).
-   */
-  if (vint_width != pl_read (plugin, &data, vint_width))
-    return -1;
-
-  if ((vint_width >= 8))
-    return 0;
-
-  memcpy (&int_bytes[1], data, vint_width);
-  int_bytes[0] = first_byte;
-
-  /* OK, signedness is a PITA. Here's a small scale example to illustrate
-   * the point:
-   * 4-bit unsigned integer:
-   * 0 1 2 3 4 5 6 7  8  9  10  11  12  13  14   15
-   * 4-bit signed integer:
-   * 0 1 2 3 4 5 6 7 -8 -7  -6  -5  -4  -3  -2   -1
-   * 
-   * 3 here is 0011b, and -3 is 1101b
-   * However, writing 1101b into int8_t memory location will NOT make
-   * the machine interpret it as -3, it will be interpreted as 00001101b,
-   * which is 13. To be -3 in int8_t it has to be 11111101b. That is,
-   * it must be padded with extra 1s to the left, but only if its first
-   * bit is set (which means a negative integer)!
-   * Easier way (without looking closesly at the bits):
-   * 1) get it as unsigned integer (say, 1010b, which is 10 for a 4-bit 
unsigned
-   * integer, and is 10 for any large unsigned integer, so this interpretation 
is
-   * always correct).
-   * 2) see if it's more than what a signed integer would hold (it is - a
-   * signed integer only holds up to 7). At this point we will need an array 
of 8
-   * different maximums for signed integers, indexed by vint_width.
-   * 3) do the following math: 10 - 8 = 2 ; -8 + 2 = -6
-   * That is, the minimal signed value (-8) and the number (10) should be 
summed,
-   * and the sum (2) should be added to the minimal signed value (-8)
-   * to get the signed counterpart (-6) of the number (10)
-   * 13 - 8 = 5; -8 + 5 = -3
-   * It's better to do that in two separate steps, because combining it into 
one step
-   * boils down to -8 + -8 + 13, which might confuse the compiler, because -8 
+ -8 = -16,
-   * which is outside of the signed integer range (remember, we're in 4-bit 
space here).
-   * on the other hand, 5 and -3 both are within the range.
-   * 4) if the number does not exceed the signed integer maximum (7), store it 
as-is
-   */
-
-  result_u = 0;
-  /* Copy the extra bytes into a temporary buffer, in the right order */
-  for (c = 0; c < vint_width; c++)
-    result_u += ((uint64_t) int_bytes[vint_width - c]) << (c * 8);
-
-  /* Add the first byte, do mode-dependent adjustment, then copy the result */
-  switch (mode)
-  {
-  case VINT_READ_UINT:
-    /* Unset the 1-bit marker */
-    result_u += ((uint64_t) int_bytes[0] & imask[vint_width]) << (vint_width * 
8);
-    memcpy (result, &result_u, sizeof (uint64_t));
-    break;
-  case VINT_READ_ID:
-    /* Do not unset the 1-bit marker*/
-    result_u += ((uint64_t) int_bytes[0]) << (vint_width * 8);
-    memcpy (result, &result_u, sizeof (uint64_t));
-    break;
-  case VINT_READ_SIZE:
-    /* Unset the 1-bit marker */
-    result_u += ((uint64_t) int_bytes[0] & imask[vint_width]) << (vint_width * 
8);
-    /* Special case: all-1 size means "size is unknown". We indicate this
-     * in the return value by setting it to UINT64_MAX.
-     */
-    if (result_u == uint_positive_limits[vint_width])
-      result_u = 0xFFFFFFFFFFFFFFFFULL;
-    memcpy (result, &result_u, sizeof (uint64_t));
-    break;
-  case VINT_READ_SINT:
-    /* Unset the 1-bit marker */
-    result_u += ((uint64_t) int_bytes[0] & imask[vint_width]) << (vint_width * 
8);
-    /* Interpret large values as negative signed values */
-    if (result_u > int_positive_limits[vint_width])
-    {
-      /* Pray that the compiler won't optimize this */
-      temp = result_u + int_negative_limits[vint_width];
-      result_s = int_negative_limits[vint_width] + temp;
-    }
-    else
-      result_s = result_u;
-    memcpy (result, &result_s, sizeof (int64_t));
-    break;
-  }
-  return vint_width + 1;
-}
-
-
-/**
- * Reads an EBML element header. Only supports 32-bit IDs and 64-bit sizes.
- * (EBML might specify that IDs larger than 32 bits are allowed, or that
- * sizes larger than 64 bits are allowed).
- *
- * @param buffer array of bytes to read the header from
- * @param start index at which start to read
- * @param end first invalid index in the array (i.e. array size)
- * @param id receives the element id
- * @param size receives the element size
- * @return number of bytes occupied by the header,
- *         0 if buffer doesn't contain a header at 'start',
- *         -1 if buffer doesn't contain a complete header
- */
-static ssize_t
-elementRead (struct EXTRACTOR_PluginList *plugin,
-             uint32_t *id, int64_t * size)
-{
-  int64_t tempID;
-  int64_t tempsize;
-  ssize_t id_offset;
-  ssize_t size_offset;
-
-  tempID = 0;
-
-  id_offset = VINTparse (plugin, &tempID, VINT_READ_ID);
-  if (id_offset <= 0)
-    return id_offset;
-  if (id_offset > 4)
-    /* Interpret unsupported long IDs as file corruption */
-    return 0;
-  /* VINTparse takes care of returning 0 when size is > 8 bytes */
-  size_offset = VINTparse (plugin, &tempsize, VINT_READ_SIZE);
-  if (size_offset <= 0)
-    return size_offset;
-  *id = (uint32_t) tempID;
-  *size = tempsize;
-#if DEBUG_EBML
-  printf ("EL 0x%06X %llu\n", *id, *size);
-#endif
-  return id_offset + size_offset;
-}
-
-static ssize_t
-idRead (struct EXTRACTOR_PluginList *plugin,
-        uint64_t length, uint32_t *id)
-{
-  int64_t tempID;
-  ssize_t id_offset;
-
-  tempID = 0;
-
-  id_offset = VINTparse (plugin, &tempID, VINT_READ_ID);
-  if (id_offset <= 0)
-    return id_offset;
-  if (id_offset > 4)
-    return 0;
-  *id = (uint32_t) tempID;
-  return id_offset;
-}
-
-static ssize_t
-uintRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, uint64_t 
*result)
-{
-  size_t c;
-  unsigned char *data;
-
-  if (length != pl_read (plugin, &data, length))
-    return -1;
-
-  *result = 0;
-  for (c = 1; c <= length; c++)
-    *result += ((uint64_t) data[c - 1]) << (8 * (length - c));
-  return (ssize_t) length;
-}
-
-static ssize_t
-sintRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, int64_t 
*result)
-{
-  size_t c;
-  uint64_t tmp;
-  unsigned char *data;
-
-  if (length != pl_read (plugin, &data, length))
-    return -1;
-
-  tmp = 0;
-  for (c = 1; c <= length; c++)
-    tmp += ((uint64_t) data[c - 1]) << (8 * (length - c));
-  if (0x80 == (0x80 & data[0]))
-  {
-    /* OK, i'm just too tired to think... If sign bit is set, pad the rest of 
the
-     * uint64_t with 0xFF. Unlike variable-length integers, these have normal
-     * multiple-of-8 length, and will fit well. They just need to be padded.
-     */
-    int i;
-    for (i = length; i < 8; i++)
-      tmp += ((uint64_t) 0xFF) << (8 * i);
-  }
-  memcpy (result, &tmp, sizeof (uint64_t));
-  return (ssize_t) length;
-}
-
-static ssize_t
-stringRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, char *result)
-{
-  uint64_t read_length;
-  unsigned char *data;
-
-  read_length = length;
-  if (length > MAX_STRING_SIZE)
-    read_length = MAX_STRING_SIZE;
-
-  if (read_length != pl_read (plugin, &data, read_length))
-    return -1;
-
-  memcpy (result, data, read_length);
-  result[read_length] = '\0';
-  if (read_length < length)
-    if ((length - read_length) != pl_read (plugin, &data, length - 
read_length))
-      return -1;
-  /* Can't return uint64_t - need it to be signed */
-  return 1;
-}
-
-static ssize_t
-floatRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, long double 
*result)
-{
-  size_t c;
-  unsigned char t[8];
-  unsigned char *data;
-
-  if (length != pl_read (plugin, &data, length))
-    return -1;
-
-  /* we don't support 10-byte floats, because not all C compilers will 
guarantee that long double is stored in 10 bytes in a IEEE-conformant format */
-  if (length != 4 && length != 8 /* && length != 10 */)
-    return 0;
-
-  for (c = 0; c < length; c++)
-  {
-#if __BYTE_ORDER == __BIG_ENDIAN
-    t[c] = data[c];
-#else
-    t[c] = data[length - 1 - c];
-#endif
-  }
-  if (length == 4)
-    *result = * ((float *) t);
-  else if (length == 8)
-    *result = * ((double *) t);
-  else
-    *result = * ((long double *) t);
-  return (ssize_t) length;
-}
-
-static const char stream_type_letters[] = "?vat";      /*[0]-no, 
[1]-video,[2]-audio,[3]-text */
-
-enum EBMLState
-{
-  EBML_BAD_STATE = -1,
-  EBML_LOOKING_FOR_HEADER = 0,
-  EBML_READING_HEADER = 1,
-  EBML_READING_ELEMENTS = 2,
-  EBML_READ_ELEMENT = 3,
-  EBML_READING_HEADER_ELEMENTS = 4,
-  EBML_FINISHED_READING_HEADER = 5,
-  EBML_READ_UINT,
-  EBML_READ_ID,
-  EBML_READ_SINT,
-  EBML_READ_FLOAT,
-  EBML_READ_STRING,
-  EBML_READING_HEADER_ELEMENT_VALUE,
-  EBML_SKIP_UNTIL_NEXT_HEADER,
-  EBML_READING_MATROSKA_SEGMENT,
-  EBML_READING_MATROSKA_SEGMENT_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_SEGMENT_CONTENTS,
-  EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_SEEK_HEAD_CONTENTS,
-  EBML_READING_MATROSKA_SEEK_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_SEEK_CONTENTS,
-  EBML_READING_MATROSKA_SEEK_CONTENTS_VALUE,
-  EBML_READING_MATROSKA_INFO_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_INFO_CONTENTS,
-  EBML_READING_MATROSKA_TRACKS_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_TRACKS_CONTENTS,
-  EBML_READING_MATROSKA_TAGS_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_TAGS_CONTENTS,
-  EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_CONTENTS,
-  EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS_VALUE,
-  EBML_READING_MATROSKA_INFO_CONTENTS_VALUE,
-  EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS,
-  EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS_VALUE,
-  EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS,
-  EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS_VALUE,
-  EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS,
-  EBML_READING_MATROSKA_TAG_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_TAG_CONTENTS,
-  EBML_READING_MATROSKA_SIMPLETAG_CONTENTS,
-  EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS,
-  EBML_READING_MATROSKA_SIMPLETAG_CONTENTS_VALUE
-};
-
-struct ebml_element
-{
-  uint64_t position;
-  uint64_t header_size;
-  uint32_t id;
-  uint64_t size;
-  struct ebml_element *parent;
-  int finish_state;
-  int prev_state;
-  int bail_state;
-  int bail_next_state;
-};
-
-struct matroska_seek_list
-{
-  struct matroska_seek_list *next;
-  uint32_t id;
-  uint64_t position;
-};
-
-struct matroska_simpletag
-{
-  struct matroska_simpletag *next;
-  struct matroska_simpletag *child;
-  struct matroska_simpletag *parent;
-  char *name;
-  char *string;
-};
-
-struct ebml_state
-{
-  enum EBMLState state;
-
-  struct ebml_element *stack_top;
-
-  enum EBMLState next_state;
-
-  int reported_ebml;
-  int valid_ebml;
-  uint64_t ebml_version;
-  uint64_t ebml_read_version;
-  uint64_t ebml_max_id_length;
-  uint64_t ebml_max_size_length;
-  char *doctype;
-  uint64_t doctype_version;
-  uint64_t doctype_read_version;
-
-  int64_t segment_contents_start;
-
-  struct matroska_seek_list *matroska_seeks;
-  struct matroska_seek_list *matroska_seeks_tail;
-  struct matroska_seek_list *matroska_pos;
-  uint32_t matroska_seek_id;
-  uint64_t matroska_seek_position;
-
-  int reported_matroska_info;
-  int valid_matroska_info;
-  uint64_t matroska_info_timecode_scale;
-  double matroska_info_duration;
-  int matroska_info_date_utc_is_set;
-  int64_t matroska_info_date_utc;
-  char *matroska_info_title;
-  char *matroska_info_muxing_app;
-  char *matroska_info_writing_app;
-
-  int reported_matroska_track;
-  int valid_matroska_track;
-  uint64_t matroska_track_type;
-  char *matroska_track_name;
-  char *matroska_track_language;
-  char *matroska_track_codec_id;
-  char *matroska_track_codec_name;
-
-  int valid_matroska_track_video;
-  uint64_t matroska_track_video_flag_interlaced;
-  uint64_t matroska_track_video_stereo_mode;
-  uint64_t matroska_track_video_pixel_width;
-  uint64_t matroska_track_video_pixel_height;
-  uint64_t matroska_track_video_display_width;
-  uint64_t matroska_track_video_display_height;
-  uint64_t matroska_track_video_display_unit;
-
-  int valid_matroska_track_audio;
-  double matroska_track_audio_sampling_frequency;
-  double matroska_track_audio_output_sampling_frequency;
-  uint64_t matroska_track_audio_channels;
-  uint64_t matroska_track_audio_bit_depth;
-
-  struct matroska_simpletag *tag_tree;
-  struct matroska_simpletag *tag_last;
-  struct matroska_simpletag *tag_current;
-};
-
-static void
-clean_ebml_state_ebml (struct ebml_state *state)
-{
-  if (state->doctype != NULL)
-    free (state->doctype);
-  state->doctype = NULL;
-  state->reported_ebml = 0;
-  state->valid_ebml = 0;
-  state->ebml_version = 1;
-  state->ebml_read_version = 1;
-  state->ebml_max_id_length = 4;
-  state->ebml_max_size_length = 8;
-  state->doctype = NULL;
-  state->doctype_version = 0;
-  state->doctype_read_version = 0;
-}
-
-static void
-clean_ebml_state_matroska_simpletags (struct ebml_state *state)
-{
-  struct matroska_simpletag *el, *parent, *next;
-  for (el = state->tag_tree; el;)
-  {
-    if (el->child != NULL)
-    {
-      el = el->child;
-      continue;
-    }
-    parent = el->parent;
-    next = el->next;
-    if (el->name != NULL)
-      free (el->name);
-    if (el->string != NULL)
-      free (el->string);
-    free (el);
-    if (parent != NULL && parent->child == el)
-      parent->child = next;
-    el = next;
-    if (next == NULL)
-      el = parent;
-  }
-  state->tag_tree = NULL;
-  state->tag_last = NULL;
-  state->tag_current = NULL;
-}
-
-void
-matroska_add_tag (struct ebml_state *state, struct matroska_simpletag *parent, 
char *name, char *string)
-{
-  struct matroska_simpletag *el = malloc (sizeof (struct matroska_simpletag));
-  el->parent = parent;
-  el->next = NULL;
-  el->child = NULL;
-  el->name = name;
-  el->string = string;
-  if (state->tag_last != NULL)
-  {
-    if (state->tag_last == parent)
-      state->tag_last->child = el;
-    else
-      state->tag_last->next = el;
-  }
-  state->tag_last = el;
-}
-
-static void
-clean_ebml_state_matroska_seeks (struct ebml_state *state)
-{
-  struct matroska_seek_list *seek_head, *next;
-  for (seek_head = state->matroska_seeks; seek_head != NULL; seek_head = next)
-  {
-    next = seek_head->next;
-    free (seek_head);
-  }
-  state->matroska_seeks = NULL;
-  state->matroska_seeks_tail = NULL;
-}
-
-static void
-clean_ebml_state_matroska_segment (struct ebml_state *state)
-{
-  state->segment_contents_start = 0;
-  state->matroska_pos = NULL;
-
-  clean_ebml_state_matroska_seeks (state);
-  clean_ebml_state_matroska_simpletags (state);
-}
-
-static void
-clean_ebml_state_matroska_seek (struct ebml_state *state)
-{
-  state->matroska_seek_id = 0;
-  state->matroska_seek_position = 0;
-}
-
-static void
-clean_ebml_state_matroska_info (struct ebml_state *state)
-{
-  state->reported_matroska_info = 0;
-  state->valid_matroska_info = -1;
-  state->matroska_info_timecode_scale = 1000000;
-  state->matroska_info_duration = -1.0;
-  state->matroska_info_date_utc_is_set = 0;
-  state->matroska_info_date_utc = 0;
-  if (state->matroska_info_title != NULL)
-    free (state->matroska_info_title);
-  state->matroska_info_title = NULL;
-  if (state->matroska_info_muxing_app != NULL)
-    free (state->matroska_info_muxing_app);
-  state->matroska_info_muxing_app = NULL;
-  if (state->matroska_info_writing_app != NULL)
-    free (state->matroska_info_writing_app);
-  state->matroska_info_writing_app = NULL;
-}
-
-static void
-clean_ebml_state_matroska_track_video (struct ebml_state *state)
-{
-  state->valid_matroska_track_video = -1;
-  state->matroska_track_video_flag_interlaced = 0;
-  state->matroska_track_video_stereo_mode = 0;
-  state->matroska_track_video_pixel_width = 0;
-  state->matroska_track_video_pixel_height = 0;
-  state->matroska_track_video_display_width = 0;
-  state->matroska_track_video_display_height = 0;
-  state->matroska_track_video_display_unit = 0;
-}
-
-static void
-clean_ebml_state_matroska_track_audio (struct ebml_state *state)
-{
-  state->valid_matroska_track_audio = -1;
-  state->matroska_track_audio_sampling_frequency = 8000.0;
-  state->matroska_track_audio_output_sampling_frequency = 0;
-  state->matroska_track_audio_channels = 1;
-  state->matroska_track_audio_bit_depth = 0;
-}
-
-static void
-clean_ebml_state_matroska_track (struct ebml_state *state)
-{
-  state->reported_matroska_track = 0;
-  state->valid_matroska_track = -1;
-  state->matroska_track_type = 0;
-  if (state->matroska_track_name != NULL)
-    free (state->matroska_track_name);
-  state->matroska_track_name = NULL;
-  if (state->matroska_track_language != NULL)
-    free (state->matroska_track_language);
-  state->matroska_track_language = strdup ("eng");
-  if (state->matroska_track_codec_id != NULL)
-    free (state->matroska_track_codec_id);
-  state->matroska_track_codec_id = NULL;
-  if (state->matroska_track_codec_name != NULL)
-    free (state->matroska_track_codec_name);
-  state->matroska_track_codec_name = NULL;
-
-  clean_ebml_state_matroska_track_video (state);
-  clean_ebml_state_matroska_track_audio (state);
-}
-
-static struct ebml_state *
-EXTRACTOR_ebml_init_state_method ()
-{
-  struct ebml_state *state;
-  state = malloc (sizeof (struct ebml_state));
-  if (state == NULL)
-    return NULL;
-  memset (state, 0, sizeof (struct ebml_state));
-
-  state->next_state = EBML_BAD_STATE;
-
-  clean_ebml_state_ebml (state);
-  clean_ebml_state_matroska_info (state);
-  clean_ebml_state_matroska_track (state);
-  return state;
-}
-
-static void
-report_simpletag (struct ebml_state *state, EXTRACTOR_MetaDataProcessor proc, 
void *proc_cls)
-{
-  struct matroska_simpletag *el, *next;
-  char format[MAX_STRING_SIZE + 1];
-  for (el = state->tag_tree; el != NULL; el = next)
-  {
-    if (el->name != NULL && el->name[0] != '\0' && el->string != NULL && 
el->string[0] != '\0')
-    {
-      enum EXTRACTOR_MetaType metatype = EXTRACTOR_METATYPE_RESERVED;
-      struct MatroskaTagMap *map_item;
-      for (map_item = &tag_map[0]; map_item->name != NULL; map_item++)
-      {
-        if (strcmp (map_item->name, el->name) == 0)
-        {
-          metatype = map_item->id;
-          break;
-        }
-      }
-      if (metatype == EXTRACTOR_METATYPE_RESERVED)
-      {
-        snprintf (format, MAX_STRING_SIZE, "%s=%s", el->name, el->string);
-        format[MAX_STRING_SIZE] = '\0';
-        ADD_MATROSKA(format, EXTRACTOR_METATYPE_UNKNOWN);
-      }
-      else
-        ADD_MATROSKA(el->string, metatype);
-    }
-    next = el->child;
-    while (next == NULL && el != NULL)
-    {
-      next = el->next;
-      if (next == NULL)
-        el = el->parent;
-    }
-  }
-  clean_ebml_state_matroska_simpletags (state);
-}
-
-static void
-report_state (struct ebml_state *state, EXTRACTOR_MetaDataProcessor proc, void 
*proc_cls)
-{
-  char format[MAX_STRING_SIZE + 1];
-  report_simpletag (state, proc, proc_cls);
-  if (state->valid_ebml && !state->reported_ebml)
-  {
-    state->reported_ebml = 1;
-    snprintf (format, MAX_STRING_SIZE, "%llu", (unsigned long long) 
state->ebml_version);
-    format[MAX_STRING_SIZE] = '\0';
-    ADD_EBML(format, EXTRACTOR_METATYPE_FORMAT_VERSION);
-    snprintf (format, MAX_STRING_SIZE, "%s %llu (EBML %llu)", state->doctype, 
-              (unsigned long long) state->doctype_version,
-              (unsigned long long) state->ebml_version);
-    format[MAX_STRING_SIZE] = '\0';
-    ADD_EBML (format, EXTRACTOR_METATYPE_RESOURCE_TYPE);
-  }
-  if (state->valid_ebml)
-    clean_ebml_state_ebml (state);
-  if (state->valid_matroska_info == -1)
-  {
-    if ((state->matroska_info_duration > 0 || state->matroska_info_duration == 
-1.0) &&
-        state->matroska_info_muxing_app != NULL && 
state->matroska_info_writing_app != NULL)
-      state->valid_matroska_info = 1;
-    else
-      state->valid_matroska_info = 0;
-  }
-  if (state->valid_matroska_info == 1 && !state->reported_matroska_info)
-  {
-    state->reported_matroska_info = 1;
-    if (state->matroska_info_duration != -1.0)
-    {
-      uint64_t seconds = (uint64_t) ((state->matroska_info_duration * (float) 
state->matroska_info_timecode_scale) / 1e+9);
-      snprintf (format, MAX_STRING_SIZE, "%llus", (unsigned long long) 
seconds);
-      format[MAX_STRING_SIZE] = '\0';
-      ADD_MATROSKA(format, EXTRACTOR_METATYPE_DURATION);
-    }
-    if (state->matroska_info_date_utc_is_set)
-    {
-      struct tm millenium_start;
-      struct tm matroska_date;
-      int64_t millenium_start_stamp;
-      int64_t matroska_date_stamp;
-#if WINDOWS
-      __time64_t matroska_date_stamp_time_t;
-#else
-      time_t matroska_date_stamp_time_t;
-#endif
-      millenium_start.tm_sec = 0;
-      millenium_start.tm_min = 0;
-      millenium_start.tm_hour = 0;
-      millenium_start.tm_mday = 1;
-      millenium_start.tm_mon = 1;
-      millenium_start.tm_year = 2001 - 1900;
-      millenium_start.tm_isdst = -1;
-      putenv ("TZ=GMT0");
-      /* If no matter what is the size of the returned value, it fits 32-bit 
integer
-       * (in fact, i could have just used a constant here, since the start of 
Matroska
-       * millenium is known and never changes), but we want to use 64-bit 
integer to
-       * manipulate time. If it gets trimmed later, when assigning back to a 
TIME_TYPE
-       * that happens to be 32-bit long - well, tough luck.
-       */
-      errno = 0;
-#if WINDOWS
-      millenium_start_stamp = _mktime64 (&millenium_start);
-#else
-      millenium_start_stamp = (time_t) mktime (&millenium_start);
-#endif
-      if (millenium_start_stamp == -1)
-        printf ("Failed to convert time: %d\n", errno);
-      matroska_date_stamp = millenium_start_stamp * 1000000000 + 
state->matroska_info_date_utc;
-      /* Now matroska_date_stamp is the number of nanoseconds since UNIX Epoch 
*/
-      matroska_date_stamp_time_t = matroska_date_stamp / 1000000000;
-      /* Now matroska_date_stamp_time_t is the number of seconds since UNIX 
Epoch */
-#if WINDOWS
-      if (NULL != gmtime_undocumented_64_r (&matroska_date_stamp_time_t, 
&matroska_date))
-#else
-      /* We want to be thread-safe. If you have no gmtime_r(), think of 
something! */
-      if (NULL != gmtime_r (&matroska_date_stamp_time_t, &matroska_date))
-#endif
-      {
-        if (0 != strftime (format, MAX_STRING_SIZE, "%Y.%m.%d %H:%M:%S UTC", 
&matroska_date))
-          ADD_MATROSKA(format, EXTRACTOR_METATYPE_CREATION_DATE);
-      }
-    }
-    if (state->matroska_info_title != NULL)
-      ADD_MATROSKA(state->matroska_info_title, EXTRACTOR_METATYPE_TITLE);
-    if (strcmp (state->matroska_info_writing_app, 
state->matroska_info_muxing_app) == 0)
-      snprintf (format, MAX_STRING_SIZE, "Written and muxed with %s", 
state->matroska_info_writing_app);
-    else
-      snprintf (format, MAX_STRING_SIZE, "Written with %s, muxed with %s", 
state->matroska_info_writing_app, state->matroska_info_muxing_app);
-    format[MAX_STRING_SIZE] = '\0';
-    ADD_MATROSKA(format, EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE);
-  }
-  if (state->valid_matroska_info == 1)
-    clean_ebml_state_matroska_info (state);
-  if (state->valid_matroska_track == -1)
-  {
-    if ((state->matroska_track_type > 0 && state->matroska_track_type < 255) &&
-        state->matroska_track_codec_id != NULL)
-      state->valid_matroska_track = 1;
-    else
-      state->valid_matroska_track = 0;
-  }
-  if (state->valid_matroska_track_video == -1)
-  {
-    if ((state->matroska_track_video_flag_interlaced == 0 || 
state->matroska_track_video_flag_interlaced == 1) &&
-        (state->matroska_track_video_stereo_mode >= 0 && 
state->matroska_track_video_stereo_mode <= 14) &&
-        state->matroska_track_video_pixel_width > 0 && 
state->matroska_track_video_pixel_height > 0)
-      state->valid_matroska_track_video = 1;
-    else
-      state->valid_matroska_track_video = 0;
-  }
-  if (state->valid_matroska_track_audio == -1)
-  {
-    if (state->matroska_track_audio_sampling_frequency > 0 &&
-        state->matroska_track_audio_channels > 0)
-      state->valid_matroska_track_audio = 1;
-    else
-      state->valid_matroska_track_audio = 0;
-  }
-  if (state->valid_matroska_track == 1 && !state->reported_matroska_track)
-  {
-    char name_part[MAX_STRING_SIZE + 1];
-    char codec_part[MAX_STRING_SIZE + 1];
-    char bit_part[MAX_STRING_SIZE + 1];
-    char hz_part[MAX_STRING_SIZE + 1];
-    struct MatroskaTrackType *tt;
-    const char *track_type_string = NULL;
-    char use_video = 0;
-    char use_audio = 0;
-
-    state->reported_matroska_track = 1;
-    for (tt = track_types; tt->code > 0; tt++)
-    {
-      if (tt->code == state->matroska_track_type)
-      {
-        track_type_string = tt->name;
-        if (tt->video_must_be_valid == 1)
-          use_video = 1;
-        else if (tt->audio_must_be_valid == 1)
-          use_audio = 1;
-        break;
-      }
-    }
-    if (track_type_string == NULL)
-      track_type_string = "unknown";
-
-    if (state->matroska_track_name == NULL)
-      snprintf (name_part, MAX_STRING_SIZE, "%s", "");
-    else
-      snprintf (name_part, MAX_STRING_SIZE, "`%s' ", 
state->matroska_track_name);
-    name_part[MAX_STRING_SIZE] = '\0';
-
-    if (state->matroska_track_codec_name == NULL)
-      snprintf (codec_part, MAX_STRING_SIZE, "%s", 
state->matroska_track_codec_id);
-    else
-      snprintf (codec_part, MAX_STRING_SIZE, "%s [%s]", 
state->matroska_track_codec_id, state->matroska_track_codec_name);
-    codec_part[MAX_STRING_SIZE] = '\0';
-
-    if (use_video && state->valid_matroska_track_video == 1)
-    {
-      /* Ignore Display* for now. Aspect ratio correction could be
-       * done either way (stretching horizontally or squishing vertically),
-       * so let's stick to hard cold pixel counts.
-       */
-      snprintf (format, MAX_STRING_SIZE, "%llux%llu", 
-                (unsigned long long) state->matroska_track_video_pixel_width,
-                (unsigned long long) state->matroska_track_video_pixel_height);
-      format[MAX_STRING_SIZE] = '\0';
-      ADD_MATROSKA (format, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
-    }
-    if (use_audio && state->valid_matroska_track_audio == 1)
-    {
-      double freq = state->matroska_track_audio_sampling_frequency;
-      double rfreq = freq;
-      if (state->matroska_track_audio_output_sampling_frequency > 0)
-        rfreq = state->matroska_track_audio_output_sampling_frequency;
-      if (freq == rfreq)
-        snprintf (hz_part, MAX_STRING_SIZE, "%.0fHz", freq);
-      else
-        snprintf (hz_part, MAX_STRING_SIZE, "%.0fHz (%.0fHz SBR)", freq, 
rfreq);
-      hz_part[MAX_STRING_SIZE] = '\0';
-
-      if (state->matroska_track_audio_bit_depth > 0)
-        snprintf (bit_part, MAX_STRING_SIZE, "%llu-bit ", (unsigned long long) 
state->matroska_track_audio_bit_depth);
-      else
-        bit_part[0] = '\0';
-      bit_part[MAX_STRING_SIZE] = '\0';
-
-      snprintf (format, MAX_STRING_SIZE, "%s track %s(%s, %llu-channel %sat 
%s) [%s]",
-          track_type_string, name_part, codec_part, 
-          (unsigned long long) state->matroska_track_audio_channels,
-          bit_part, hz_part, state->matroska_track_language);
-    }
-    else
-    {
-      snprintf (format, MAX_STRING_SIZE, "%s track %s(%s) [%s]",
-          track_type_string, name_part, codec_part, 
state->matroska_track_language);
-    }
-    format[MAX_STRING_SIZE] = '\0';
-    ADD_EBML (format, EXTRACTOR_METATYPE_RESOURCE_TYPE);
-  }
-  if (state->valid_matroska_track)
-    clean_ebml_state_matroska_track (state);
-}
-
-
-static int 
-EXTRACTOR_ebml_discard_state_method (struct ebml_state *state)
-{
-  if (state != NULL)
-  {
-    if (state->doctype != NULL)
-      free (state->doctype);
-    clean_ebml_state_matroska_segment (state);
-    clean_ebml_state_matroska_info (state);
-    clean_ebml_state_matroska_track (state);
-    free (state);
-  }
-  return 1;
-}
-
-static struct ebml_element *
-ebml_stack_pop (struct ebml_state *state)
-{
-  struct ebml_element *result;
-  if (state->stack_top == NULL)
-    return NULL;
-  result = state->stack_top;
-  state->stack_top = result->parent;
-  return result;
-}
-
-
-static void
-ebml_stack_push_new (struct ebml_state *state, uint64_t position, uint32_t id, 
uint64_t size, uint64_t header_size, int finish_state, int prev_state, int 
bail_state, int bail_next_state)
-{
-  struct ebml_element *element = malloc (sizeof (struct ebml_element));
-  element->parent = state->stack_top;
-  state->stack_top = element;
-  element->position = position - header_size;
-  element->header_size = header_size;
-  element->id = id;
-  element->size = size;
-  element->finish_state = finish_state;
-  element->prev_state = prev_state;
-  element->bail_state = bail_state;
-  element->bail_next_state = bail_next_state;
-}
-
-static int
-check_result (struct EXTRACTOR_PluginList *plugin, ssize_t read_result, struct 
ebml_state *state)
-{
-  if (read_result == 0)
-  {
-    int64_t offset;
-    struct ebml_element *parent = ebml_stack_pop (state);
-    if (parent == NULL)
-    {
-      /* But this shouldn't really happen */
-      state->state = EBML_LOOKING_FOR_HEADER;
-      return 0;
-    }
-    offset = parent->position + parent->header_size + parent->size;
-    if (offset < 0 || offset != pl_seek (plugin, offset, SEEK_SET))
-    {
-      state->state = EBML_BAD_STATE;
-      return 0;
-    }
-    state->state = parent->bail_state;
-    state->next_state = parent->bail_next_state;
-    free (parent);
-    return 0;
-  }
-  return 1;
-}
-
-static int
-maybe_rise_up (struct EXTRACTOR_PluginList *plugin, struct ebml_state *state, 
int *do_break, int64_t read_result)
-{
-  int64_t offset;
-  offset = pl_get_pos (plugin) - read_result;
-  if (state->stack_top != NULL && offset >= state->stack_top->position + 
state->stack_top->header_size + state->stack_top->size)
-  {
-    state->state = state->stack_top->finish_state;
-    pl_seek (plugin, -read_result, SEEK_CUR);
-    *do_break = 1;
-    return 1;
-  }
-  return 0;
-}
-
-static void
-rise_up_after_value (struct EXTRACTOR_PluginList *plugin, struct ebml_state 
*state, int next_state)
-{
-  int64_t offset;
-  state->state = EBML_READ_ELEMENT;
-  offset = state->stack_top->position + state->stack_top->header_size + 
state->stack_top->size;
-  free (ebml_stack_pop (state));
-  state->next_state = next_state;
-  pl_seek (plugin, offset, SEEK_SET);
-}
-
-static void
-try_to_find_pos (struct EXTRACTOR_PluginList *plugin, struct ebml_state *state)
-{
-  if (state->matroska_seeks != NULL)
-  {
-    struct matroska_seek_list *el, *pos = NULL;
-    int64_t segment_position = pl_get_pos (plugin) - 
state->segment_contents_start;
-    for (el = state->matroska_seeks; el != NULL; el = el->next)
-    {
-      if (el->position <= segment_position)
-        pos = el;
-      else
-        break;
-    }
-    if (pos != NULL)
-      state->matroska_pos = pos;
-  }
-}
-
-static void
-maybe_seek_to_something_interesting (struct EXTRACTOR_PluginList *plugin, 
struct ebml_state *state)
-{
-  int64_t offset;
-  struct matroska_seek_list *el;
-  try_to_find_pos (plugin, state);
-  if (state->matroska_pos == NULL)
-    return;
-  offset = pl_get_pos (plugin);
-  for (el = state->matroska_pos; el != NULL; el = el->next)
-  {
-    char do_break = 0;
-    switch (el->id)
-    {
-    case MatroskaID_Info:
-    case MatroskaID_Tracks:
-    case MatroskaID_Tags:
-    /* Some files will have more than one seek head */
-    case MatroskaID_SeekHead:
-      if (el->position + state->segment_contents_start >= offset)
-        do_break = 1;
-      break;
-    default:
-      break;
-    }
-    if (do_break)
-      break;
-  }
-  if (el == NULL)
-    el = state->matroska_seeks_tail;
-  if (el->position + state->segment_contents_start > offset)
-  {
-    /* TODO: add a separate stage after seeking that checks the ID of the 
element against
-     * the one we've got from seek table. If it doesn't match - stop parsing 
the file.
-     */
-#if DEBUG_EBML
-    printf ("Seeking from %llu to %llu\n", offset, el->position + 
state->segment_contents_start);
-#endif
-    pl_seek (plugin, el->position + state->segment_contents_start, SEEK_SET);
-  }
-}
-
-static void
-sort_seeks (struct ebml_state *state)
-{
-  uint32_t id;
-  int64_t position;
-  struct matroska_seek_list *el;
-  char sorted = 0;
-  while (!sorted)
-  {
-    sorted = 1;
-    for (el = state->matroska_seeks; el != NULL; el = el->next)
-    {
-      if (el->next == NULL)
-        break;
-      id = el->next->id;
-      position = el->next->position;
-      if (position < el->position)
-      {
-        el->next->position = el->position;
-        el->next->id = el->id;
-        el->position = position;
-        el->id = id;
-        sorted = 0;
-      }
-    }
-  }
-}
-
-
-int
-EXTRACTOR_ebml_extract_method (struct EXTRACTOR_PluginList *plugin, 
EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
-{
-  uint64_t offset = 0;
-  ssize_t read_result;
-  unsigned char *data;
-  struct ebml_state *state;
-
-  const unsigned char *start;
-  uint32_t eID;
-  uint64_t eSize;
-  int do_break;
-
-  uint64_t uint_value;
-  int64_t sint_value;
-  char string_value[MAX_STRING_SIZE + 1];
-  long double float_value;
-  uint32_t id_value;
-
-  if (plugin == NULL)
-    return 1;
-  
-  state = EXTRACTOR_ebml_init_state_method ();
-  if (state == NULL)
-    return 1;
-
-  while (1)
-  {
-    switch (state->state)
-    {
-    default:
-    case EBML_BAD_STATE:
-      report_state (state, proc, proc_cls);
-      return EXTRACTOR_ebml_discard_state_method (state);
-    case EBML_LOOKING_FOR_HEADER:
-      offset = pl_get_pos (plugin);
-      sint_value = pl_read (plugin, &data, 1024*1024);
-      if (sint_value < 4)
-        return EXTRACTOR_ebml_discard_state_method (state);
-      start = NULL;
-      while (start == NULL)
-      {
-        start = memchr (data, EBMLID_FILE_BEGIN, sint_value);
-        if (start == NULL)
-        {
-          offset = pl_get_pos (plugin) - 3;
-          if (offset != pl_seek (plugin, offset, SEEK_SET))
-            return EXTRACTOR_ebml_discard_state_method (state);
-          sint_value = pl_read (plugin, &data, 1024*1024);
-          if (sint_value < 4)
-            return EXTRACTOR_ebml_discard_state_method (state);
-        }
-      }
-      if (offset + start - data != pl_seek (plugin, offset + start - data, 
SEEK_SET))
-        return EXTRACTOR_ebml_discard_state_method (state);
-      state->state = EBML_READING_HEADER;
-      break;
-    case EBML_READING_HEADER:
-      if (0 > (read_result = elementRead (plugin, &eID, (int64_t*) &eSize)))
-        return EXTRACTOR_ebml_discard_state_method (state);
-      if (EBMLID_EBML != eID)
-      {
-        /* Not a header (happens easily, 0x1A is not uncommon), look further. 
*/
-        offset = pl_get_pos (plugin) - 3;
-        if (offset < 0)
-          offset = 0;
-        if (offset != pl_seek (plugin, offset, SEEK_SET))
-          return EXTRACTOR_ebml_discard_state_method (state);
-        state->state = EBML_LOOKING_FOR_HEADER;
-        break;
-      }
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = EBML_READING_HEADER_ELEMENTS;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_HEADER, EBML_BAD_STATE, 
EBML_FINISHED_READING_HEADER, EBML_BAD_STATE);
-      break;
-    case EBML_READ_ELEMENT:
-#if DEBUG_EBML
-      printf ("Reading at %lld\n", pl_get_pos (plugin));
-#endif
-      /* The following code generates some odd compiled instructions - instead 
of being getting the next state,
-       * state->state gets 0xfeeefeee.
-       */
-      /*
-      if (0 > (read_result = elementRead (plugin, &eID, &eSize)))
-      {
-        state->state = -1;
-        break;
-      }
-      state->state = state->next_state;
-      break;
-      */
-      /* while the following code crashes with SIGILL.
-       */
-      /*
-      read_result = elementRead (plugin, &eID, &eSize);
-      state->state = state->next_state;
-      if (read_result < 0)
-        state->state = EBML_BAD_STATE;
-      break;
-      */
-      /* but the following code works as intended */
-      /* All three code snippets were compiled with -O0 */
-      {
-        enum EBMLState next_state = state->next_state;
-        state->state = EBML_BAD_STATE;
-        read_result = elementRead (plugin, &eID, (int64_t*) &eSize);
-        if (read_result >= 0)
-          state->state = next_state;
-      }
-      break;
-    case EBML_READ_UINT:
-      if (state->stack_top->size == 0)
-      {
-        /* Special case - zero-size uint means zero */
-        uint_value = 0;
-        read_result = 1; /* 0 means error */
-      }
-      else if (state->stack_top->size > 8)
-        read_result = 0;
-      else
-      {
-        if (0 > (read_result = uintRead (plugin, state->stack_top->size, 
&uint_value)))
-        {
-          state->state = EBML_BAD_STATE;
-          break;
-        }
-      }
-      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
-      state->state = state->next_state;
-      break;
-    case EBML_READ_ID:
-      if (0 > (read_result = idRead (plugin, state->stack_top->size, 
&id_value)))
-      {
-        state->state = EBML_BAD_STATE;
-        break;
-      }
-      state->state = state->next_state;
-      break;
-    case EBML_READ_SINT:
-      if (state->stack_top->size == 0)
-      {
-        /* Special case - zero-size sint means zero */
-        sint_value = 0;
-        read_result = 1; /* 0 means error */
-      }
-      else if (state->stack_top->size > 8)
-        read_result = 0;
-      else
-      {
-        if (0 > (read_result = sintRead (plugin, state->stack_top->size, 
&sint_value)))
-        {
-          state->state = EBML_BAD_STATE;
-          break;
-        }
-      }
-      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
-      state->state = state->next_state;
-      break;
-    case EBML_READ_FLOAT:
-      if (state->stack_top->size == 0)
-      {
-        /* Special case - zero-size float means zero */
-        float_value = 0.0;
-        read_result = 1; /* 0 means error */
-      }
-      else if (state->stack_top->size > 10)
-        read_result = 0;
-      else
-      {
-        if (0 > (read_result = floatRead (plugin, state->stack_top->size, 
&float_value)))
-        {
-          state->state = EBML_BAD_STATE;
-          break;
-        }
-      }
-      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
-      state->state = state->next_state;
-      break;
-    case EBML_READ_STRING:
-      if (state->stack_top->size == 0)
-      {
-        string_value[0] = '\0';
-        read_result = 1; /* 0 means error */
-      }
-      else
-      {
-        if (0 > (read_result = stringRead (plugin, state->stack_top->size, 
(char *) &string_value)))
-        {
-          state->state = EBML_BAD_STATE;
-          break;
-        }
-      }
-      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
-      state->state = state->next_state;
-      break;
-    case EBML_READING_HEADER_ELEMENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-      do_break = 0;
-      switch (eID)
-      {
-      case EBMLID_VERSION:
-      case EBMLID_READ_VERSION:
-      case EBMLID_MAX_ID_LENGTH:
-      case EBMLID_MAX_SIZE_LENGTH:
-      case EBMLID_DOCTYPE_VERSION:
-      case EBMLID_DOCTYPE_READ_VERSION:
-        state->state = EBML_READ_UINT;
-        break;
-      case EBMLID_DOCTYPE:
-        state->state = EBML_READ_STRING;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        /* Unknown element in EBML header - skip over it */
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_HEADER_ELEMENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-      }
-      if (do_break)
-        break;
-      state->next_state = EBML_READING_HEADER_ELEMENT_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_HEADER_ELEMENTS, EBML_READ_ELEMENT, 
EBML_READING_HEADER_ELEMENTS);
-      break;
-    case EBML_READING_HEADER_ELEMENT_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      switch (state->stack_top->id)
-      {
-      case EBMLID_VERSION:
-        state->ebml_version = uint_value;
-        break;
-      case EBMLID_READ_VERSION:
-        state->ebml_read_version = uint_value;
-        if (uint_value > 1)
-        {
-          /* We don't support EBML versions > 1 */
-          state->state = EBML_BAD_STATE;
-          /* State remains invalid, and is not reported. That is probably OK,
-           * since we barely read anything (we only know that this is
-           * _probably_ EBML version X, that's all).
-           * We also stop right here and do not assume that somewhere further
-           * in the file there's another EBML header that is, maybe, readable
-           * by us. If you think this is worth correcting - patches are 
welcome.
-           */
-          continue;
-        }
-        break;
-      case EBMLID_MAX_ID_LENGTH:
-        state->ebml_max_id_length = uint_value;
-        break;
-      case EBMLID_MAX_SIZE_LENGTH:
-        state->ebml_max_size_length = uint_value;
-        break;
-      case EBMLID_DOCTYPE_VERSION:
-        state->doctype_version = uint_value;
-        break;
-      case EBMLID_DOCTYPE_READ_VERSION:
-        state->doctype_read_version = uint_value;
-        break;
-      case EBMLID_DOCTYPE:
-        if (state->doctype != NULL)
-          free (state->doctype);
-        state->doctype = strdup (string_value);
-        state->valid_ebml = 1;
-        break;
-      }
-      rise_up_after_value (plugin, state, EBML_READING_HEADER_ELEMENTS);
-      break;
-    case EBML_FINISHED_READING_HEADER:
-      if (!state->valid_ebml)
-      {
-        /* Header was invalid (lacking doctype). */
-        state->next_state = EBML_SKIP_UNTIL_NEXT_HEADER;
-        break;
-      }
-      else
-      {
-        char *doctype = strdup (state->doctype);
-        report_state (state, proc, proc_cls);
-        state->state = EBML_READ_ELEMENT;
-        if (strcmp (doctype, "matroska") == 0)
-        {
-          state->next_state = EBML_READING_MATROSKA_SEGMENT;
-        }
-        else if (strcmp (doctype, "webm") == 0)
-        {
-          /* Webm is a strict subset of Matroska. However, since strictness
-           * means nothing to us (we don't validate the container, we extract
-           * metadata from it!), we do not care about these differences
-           * (which means that this code will happily read webm files that do
-           * not conform to Webm spec, but conform to Matroska spec).
-           */
-          state->next_state = EBML_READING_MATROSKA_SEGMENT;
-        }
-        else
-        {
-          /* Header was valid, but doctype is unknown. */
-          state->next_state = EBML_SKIP_UNTIL_NEXT_HEADER;
-        }
-        free (doctype);
-      }
-      break;
-    case EBML_SKIP_UNTIL_NEXT_HEADER:
-      if (read_result == 0)
-      {
-        state->state = EBML_LOOKING_FOR_HEADER;
-        break;
-      }
-      if (eID != EBMLID_EBML)
-      {
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_SKIP_UNTIL_NEXT_HEADER;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        break;
-      }
-      state->state = EBML_READING_HEADER;
-      break;
-    case EBML_READING_MATROSKA_SEGMENT:
-      if (read_result == 0)
-      {
-        state->state = EBML_LOOKING_FOR_HEADER;
-        break;
-      }
-      if (eID == EBMLID_EBML)
-      {
-        state->state = EBML_READING_HEADER;
-        break;
-      }
-      if (eID != MatroskaID_Segment)
-      {
-        pl_seek (plugin, eSize, SEEK_CUR);
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_SEGMENT;
-        break;
-      }
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = EBML_READING_MATROSKA_SEGMENT_CONTENTS;
-      clean_ebml_state_matroska_segment (state);
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SEGMENT_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT);
-      state->segment_contents_start = pl_get_pos (plugin);
-      break;
-    case EBML_READING_MATROSKA_SEGMENT_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      state->state = EBML_READ_ELEMENT;
-      switch (eID)
-      {
-      case MatroskaID_SeekHead:
-        state->next_state = EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS;
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SEEK_HEAD_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
-        break;
-      case MatroskaID_Info:
-        state->next_state = EBML_READING_MATROSKA_INFO_CONTENTS;
-        clean_ebml_state_matroska_info (state);
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_INFO_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
-        break;
-      case MatroskaID_Tracks:
-        state->next_state = EBML_READING_MATROSKA_TRACKS_CONTENTS;
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACKS_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
-        break;
-      case MatroskaID_Tags:
-        state->next_state = EBML_READING_MATROSKA_TAGS_CONTENTS;
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TAGS_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        maybe_seek_to_something_interesting (plugin, state);
-        state->next_state = EBML_READING_MATROSKA_SEGMENT_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-      }
-      break;
-    case EBML_READING_MATROSKA_TAGS_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-      state->state = EBML_READ_ELEMENT;
-      switch (eID)
-      {
-      case MatroskaID_Tags_Tag:
-        state->next_state = EBML_READING_MATROSKA_TAG_CONTENTS;
-        clean_ebml_state_matroska_seek (state);
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TAG_CONTENTS, 
EBML_READING_MATROSKA_TAGS_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TAGS_CONTENTS);
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->next_state = EBML_READING_MATROSKA_TAGS_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-      }
-      break;
-    case EBML_READING_MATROSKA_TAG_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      state->state = EBML_READ_ELEMENT;
-      switch (eID)
-      {
-      case MatroskaID_Tags_Tag_SimpleTag:
-        state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS;
-        clean_ebml_state_matroska_simpletags (state);
-        matroska_add_tag (state, NULL, NULL, NULL);
-        state->tag_current = state->tag_last;
-        state->tag_tree = state->tag_current;
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS, 
EBML_READING_MATROSKA_TAG_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TAG_CONTENTS);
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->next_state = EBML_READING_MATROSKA_TAG_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-      }
-      break;
-    case EBML_READING_MATROSKA_SIMPLETAG_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      do_break = 0;
-      switch (eID)
-      {
-      case MatroskaID_Tags_Tag_SimpleTag_TagName:
-        state->state = EBML_READ_STRING;
-        break; /* mandatory, UTF8-encoded. The name of the Tag that is going 
to be stored. */
-      case MatroskaID_Tags_Tag_SimpleTag_TagString:
-        state->state = EBML_READ_STRING;
-        break; /* UTF-8-encoded. The value of the Tag. */
-      case MatroskaID_Tags_Tag_SimpleTag:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        /* Oh joy, simpletags are recursive! */
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS;
-        matroska_add_tag (state, state->tag_current, NULL, NULL);
-        state->tag_current = state->tag_last;
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS, 
EBML_READING_MATROSKA_SIMPLETAG_CONTENTS, EBML_READ_ELEMENT, 
EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS);
-        do_break = 1;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-        break;
-      }
-      if (do_break)
-        break;
-      state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_SIMPLETAG_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_SIMPLETAG_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_SIMPLETAG_CONTENTS_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      /* This breaks the specs, as there should be only one instance of each
-       * element (at most). We ignore that and remember the latest value,
-       * dropping previous ones.
-       */
-      switch (state->stack_top->id)
-      {
-      case MatroskaID_Tags_Tag_SimpleTag_TagName:
-        if (state->tag_current->name != NULL)
-          free (state->tag_current->name);
-        state->tag_current->name = strdup (string_value);
-        break;
-      case MatroskaID_Tags_Tag_SimpleTag_TagString:
-        if (state->tag_current->string != NULL)
-          free (state->tag_current->string);
-        state->tag_current->string = strdup (string_value);
-        break;
-      }
-      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_SIMPLETAG_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      state->state = EBML_READ_ELEMENT;
-      switch (eID)
-      {
-      case MatroskaID_Seek:
-        state->next_state = EBML_READING_MATROSKA_SEEK_CONTENTS;
-        clean_ebml_state_matroska_seek (state);
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SEEK_CONTENTS, 
EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS);
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->next_state = EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-      }
-      break;
-    case EBML_READING_MATROSKA_SEEK_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      do_break = 0;
-      switch (eID)
-      {
-      case MatroskaID_SeekID:
-        state->state = EBML_READ_ID;
-        break;
-      case MatroskaID_SeekPosition:
-        state->state = EBML_READ_UINT;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_SEEK_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-        break;
-      }
-      if (do_break)
-        break;
-      state->next_state = EBML_READING_MATROSKA_SEEK_CONTENTS_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_SEEK_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_SEEK_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_SEEK_CONTENTS_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      /* This breaks the specs, as there should be only one instance of each
-       * element (at most). We ignore that and remember the latest value,
-       * dropping previous ones.
-       */
-      switch (state->stack_top->id)
-      {
-      case MatroskaID_SeekID:
-        state->matroska_seek_id = id_value;
-        break;
-      case MatroskaID_SeekPosition:
-        state->matroska_seek_position = uint_value;
-        break;
-      }
-      rise_up_after_value (plugin, state, EBML_READING_MATROSKA_SEEK_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_TRACKS_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      state->state = EBML_READ_ELEMENT;
-      switch (eID)
-      {
-      case MatroskaID_Tracks_TrackEntry:
-        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS;
-        clean_ebml_state_matroska_track (state);
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_CONTENTS, 
EBML_READING_MATROSKA_TRACKS_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TRACKS_CONTENTS);
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->next_state = EBML_READING_MATROSKA_TRACKS_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-      }
-      break;
-    case EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      do_break = 0;
-      switch (eID)
-      {
-      case MatroskaID_Tracks_TrackType:
-        state->state = EBML_READ_UINT;
-        break;
-      case MatroskaID_Tracks_Name:
-      case MatroskaID_Tracks_Language:
-      case MatroskaID_Tracks_CodecID:
-      case MatroskaID_Tracks_CodecName:
-        state->state = EBML_READ_STRING;
-        break;
-      case MatroskaID_Tracks_Video:
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS;
-        clean_ebml_state_matroska_track_video (state);
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
-        do_break = 1;
-        break;
-      case MatroskaID_Tracks_Audio:
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS;
-        clean_ebml_state_matroska_track_audio (state);
-        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
-        do_break = 1;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-        break;
-      }
-      if (do_break)
-        break;
-      state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      do_break = 0;
-      switch (eID)
-      {
-      case MatroskaID_Tracks_Audio_SamplingFrequency:
-      case MatroskaID_Tracks_Audio_OutputSamplingFrequency:
-        state->state = EBML_READ_FLOAT;
-        break;
-      case MatroskaID_Tracks_Audio_Channels:
-      case MatroskaID_Tracks_Audio_BitDepth:
-        state->state = EBML_READ_UINT;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-        break;
-      }
-      if (do_break)
-        break;
-      state->next_state = 
EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      /* This breaks the specs, as there should be only one instance of each
-       * element (at most). We ignore that and remember the latest value,
-       * dropping previous ones.
-       */
-      switch (state->stack_top->id)
-      {
-      case MatroskaID_Tracks_Audio_SamplingFrequency:
-        state->matroska_track_audio_sampling_frequency = float_value;
-        break;
-      case MatroskaID_Tracks_Audio_OutputSamplingFrequency:
-        state->matroska_track_audio_output_sampling_frequency = float_value;
-        break;
-      case MatroskaID_Tracks_Audio_Channels:
-        state->matroska_track_audio_channels = uint_value;
-        break;
-      case MatroskaID_Tracks_Audio_BitDepth:
-        state->matroska_track_audio_bit_depth = uint_value;
-        break;
-      }
-      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      do_break = 0;
-      switch (eID)
-      {
-      case MatroskaID_Tracks_Video_FlagInterlaced:
-      case MatroskaID_Tracks_Video_StereoMode:
-      case MatroskaID_Tracks_Video_PixelWidth:
-      case MatroskaID_Tracks_Video_PixelHeight:
-      case MatroskaID_Tracks_Video_DisplayWidth:
-      case MatroskaID_Tracks_Video_DisplayHeight:
-      case MatroskaID_Tracks_Video_DisplayUnit:
-        state->state = EBML_READ_UINT;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-        break;
-      }
-      if (do_break)
-        break;
-      state->next_state = 
EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      /* This breaks the specs, as there should be only one instance of each
-       * element (at most). We ignore that and remember the latest value,
-       * dropping previous ones.
-       */
-      switch (state->stack_top->id)
-      {
-      case MatroskaID_Tracks_Video_FlagInterlaced:
-        state->matroska_track_video_flag_interlaced = uint_value;
-        break;
-      case MatroskaID_Tracks_Video_StereoMode:
-        state->matroska_track_video_stereo_mode = uint_value;
-        break;
-      case MatroskaID_Tracks_Video_PixelWidth:
-        state->matroska_track_video_pixel_width = uint_value;
-        break;
-      case MatroskaID_Tracks_Video_PixelHeight:
-        state->matroska_track_video_pixel_height = uint_value;
-        break;
-      case MatroskaID_Tracks_Video_DisplayWidth:
-        state->matroska_track_video_display_width = uint_value;
-        break;
-      case MatroskaID_Tracks_Video_DisplayHeight:
-        state->matroska_track_video_display_height = uint_value;
-        break;
-      case MatroskaID_Tracks_Video_DisplayUnit:
-        state->matroska_track_video_display_unit = uint_value;
-        break;
-      }
-      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      /* This breaks the specs, as there should be only one instance of each
-       * element (at most). We ignore that and remember the latest value,
-       * dropping previous ones.
-       */
-      switch (state->stack_top->id)
-      {
-      case MatroskaID_Tracks_TrackType:
-        state->matroska_track_type = uint_value;
-        break;
-      case MatroskaID_Tracks_Name:
-        if (state->matroska_track_name != NULL)
-          free (state->matroska_track_name);
-        state->matroska_track_name = strdup (string_value);
-        break; /* UTF-8-encoded. A human-readable track name. */
-      case MatroskaID_Tracks_Language:
-        if (state->matroska_track_language != NULL)
-          free (state->matroska_track_language);
-        state->matroska_track_language = strdup (string_value);
-        break; /* defaults to 'eng', string. Specifies the language of the 
track in the Matroska languages form. */
-      case MatroskaID_Tracks_CodecID:
-        if (state->matroska_track_codec_id != NULL)
-          free (state->matroska_track_codec_id);
-        state->matroska_track_codec_id = strdup (string_value);
-        break; /* mandatory, string. An ID corresponding to the codec, see the 
codec page ( http://matroska.org/technical/specs/codecid/index.html ) for more 
info. */
-      case MatroskaID_Tracks_CodecName:
-        if (state->matroska_track_codec_name != NULL)
-          free (state->matroska_track_codec_name);
-        state->matroska_track_codec_name = strdup (string_value);
-        break; /* UTF-8-encoded. A human-readable string specifying the codec. 
*/
-      }
-      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_INFO_CONTENTS:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      do_break = 0;
-      switch (eID)
-      {
-      case MatroskaID_Info_Title:
-      case MatroskaID_Info_MuxingApp:
-      case MatroskaID_Info_WritingApp:
-        state->state = EBML_READ_STRING;
-        break;
-      case MatroskaID_Info_TimecodeScale:
-        state->state = EBML_READ_UINT;
-        break;
-      case MatroskaID_Info_Duration:
-        state->state = EBML_READ_FLOAT;
-        break;
-      case MatroskaID_Info_DateUTC:
-        state->state = EBML_READ_SINT;
-        break;
-      default:
-        if (maybe_rise_up (plugin, state, &do_break, read_result))
-          break;
-        /* Unknown element in MatroskaInfo - skip over it */
-        state->state = EBML_READ_ELEMENT;
-        state->next_state = EBML_READING_MATROSKA_INFO_CONTENTS;
-        pl_seek (plugin, eSize, SEEK_CUR);
-        do_break = 1;
-      }
-      if (do_break)
-        break;
-      state->next_state = EBML_READING_MATROSKA_INFO_CONTENTS_VALUE;
-      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_INFO_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_INFO_CONTENTS);
-      break;
-    case EBML_READING_MATROSKA_INFO_CONTENTS_VALUE:
-      if (!check_result (plugin, read_result, state))
-        break;
-
-      /* This breaks the specs, as there should be only one instance of each
-       * element (at most). We ignore that and remember the latest value,
-       * dropping previous ones.
-       */
-      switch (state->stack_top->id)
-      {
-      case MatroskaID_Info_Title:
-        if (state->matroska_info_title != NULL)
-          free (state->matroska_info_title);
-        state->matroska_info_title = strdup (string_value);
-        break;
-      case MatroskaID_Info_MuxingApp:
-        if (state->matroska_info_muxing_app != NULL)
-          free (state->matroska_info_muxing_app);
-        state->matroska_info_muxing_app = strdup (string_value);
-        break;
-      case MatroskaID_Info_WritingApp:
-        if (state->matroska_info_writing_app != NULL)
-          free (state->matroska_info_writing_app);
-        state->matroska_info_writing_app = strdup (string_value);
-        break;
-      case MatroskaID_Info_TimecodeScale:
-        state->matroska_info_timecode_scale = uint_value;
-        break;
-      case MatroskaID_Info_Duration:
-        state->matroska_info_duration = float_value;
-        break;
-      case MatroskaID_Info_DateUTC:
-        state->matroska_info_date_utc_is_set = 1;
-        state->matroska_info_date_utc = sint_value;
-        break;
-      }
-      rise_up_after_value (plugin, state, EBML_READING_MATROSKA_INFO_CONTENTS);
-      break;
-    case EBML_FINISHED_READING_MATROSKA_INFO_CONTENTS:
-      if (state->stack_top != NULL && pl_get_pos (plugin) >= 
state->stack_top->position + state->stack_top->header_size + 
state->stack_top->size)
-        report_state (state, proc, proc_cls);
-      maybe_seek_to_something_interesting (plugin, state);
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    case EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_CONTENTS:
-      if (state->stack_top != NULL && pl_get_pos (plugin) >= 
state->stack_top->position + state->stack_top->header_size + 
state->stack_top->size)
-        report_state (state, proc, proc_cls);
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    case EBML_FINISHED_READING_MATROSKA_SEEK_CONTENTS:
-      if ((state->matroska_seek_id != 0) &&
-          ((state->matroska_seek_position > 0) || state->matroska_seeks_tail 
== NULL))
-      {
-        struct matroska_seek_list *el;
-        el = malloc (sizeof (struct matroska_seek_list));
-        el->next = NULL;
-        el->id = state->matroska_seek_id;
-        el->position = state->matroska_seek_position;
-        if (state->matroska_seeks_tail != NULL)
-        {
-          state->matroska_seeks_tail->next = el;
-          state->matroska_seeks_tail = el;
-        }
-        else
-          state->matroska_seeks_tail = state->matroska_seeks = el;
-      }
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    case EBML_FINISHED_READING_MATROSKA_TRACKS_CONTENTS:
-    case EBML_FINISHED_READING_MATROSKA_TAGS_CONTENTS:
-      maybe_seek_to_something_interesting (plugin, state);
-    case EBML_FINISHED_READING_MATROSKA_SEGMENT_CONTENTS:
-    case EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS:
-    case EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS:
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    case EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS:
-      state->tag_current = state->tag_current->parent;
-      if (state->tag_current == NULL)
-        report_simpletag (state, proc, proc_cls);
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    case EBML_FINISHED_READING_MATROSKA_TAG_CONTENTS:
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    case EBML_FINISHED_READING_MATROSKA_SEEK_HEAD_CONTENTS:
-      sort_seeks (state);
-      try_to_find_pos (plugin, state);
-      state->state = EBML_READ_ELEMENT;
-      state->next_state = state->stack_top->prev_state;
-      free (ebml_stack_pop (state));
-      break;
-    }
-  }
-  return EXTRACTOR_ebml_discard_state_method (state);
-}

Deleted: Extractor/src/plugins/elf_extractor.c
===================================================================
--- Extractor/src/plugins/elf_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/elf_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,655 +0,0 @@
-/*
-     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.
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include "pack.h"
-#include <stdint.h>
-
-typedef uint32_t Elf32_Addr;
-typedef uint16_t Elf32_Half;
-typedef uint32_t Elf32_Off;
-typedef int32_t  Elf32_Sword;
-typedef uint32_t Elf32_Word;
-
-typedef uint16_t Elf64_Half;
-typedef uint32_t Elf64_Word;
-typedef uint64_t Elf64_Addr;
-typedef uint64_t Elf64_Off;
-
-/* first 4 bytes of the ELF header */
-static char elfMagic[] = { 0x7f, 'E', 'L', 'F' };
-
-#define EI_CLASS 4
-#define EI_DATA 5
-#define EI_VERSION 6
-#define EI_OSABI 7
-#define EI_NIDENT 16
-
-typedef struct
-{
-  Elf32_Half e_type;
-  Elf32_Half e_machine;
-  Elf32_Word e_version;
-  Elf32_Addr e_entry;
-  Elf32_Off e_phoff;
-  Elf32_Off e_shoff;            /* offset of the section header table */
-  Elf32_Word e_flags;
-  Elf32_Half e_ehsize;
-  Elf32_Half e_phensize;
-  Elf32_Half e_phnum;
-  Elf32_Half e_shentsize;       /* size of each entry in SH table */
-  Elf32_Half e_shnum;           /* how many entries in section header table */
-  Elf32_Half e_shstrndx;        /* section header's sh_name member is index 
into this string table! */
-} Elf32_Ehdr;
-
-/* elf-header minus e_ident */
-#define ELF_HEADER_SIZE sizeof (Elf32_Ehdr)
-
-#define ELF_HEADER_FIELDS(p) \
-  &(p)->e_type,                     \
-    &(p)->e_machine,        \
-    &(p)->e_version,        \
-    &(p)->e_entry,          \
-    &(p)->e_phoff,          \
-    &(p)->e_shoff,          \
-    &(p)->e_flags,          \
-    &(p)->e_ehsize,         \
-    &(p)->e_phensize,       \
-    &(p)->e_phnum,          \
-    &(p)->e_shentsize,      \
-    &(p)->e_shnum,          \
-    &(p)->e_shstrndx
-static char *ELF_HEADER_SPECS[] = {
-  "hhwwwwwhhhhhh",
-  "HHWWWWWHHHHHH",
-};
-
-typedef struct {
-        Elf64_Half      e_type;
-        Elf64_Half      e_machine;
-        Elf64_Word      e_version;
-        Elf64_Addr      e_entry;
-        Elf64_Off       e_phoff;
-        Elf64_Off       e_shoff;
-        Elf64_Word      e_flags;
-        Elf64_Half      e_ehsize;
-        Elf64_Half      e_phensize;
-        Elf64_Half      e_phnum;
-        Elf64_Half      e_shentsize;
-        Elf64_Half      e_shnum;
-        Elf64_Half      e_shstrndx;
-} Elf64_Ehdr;
-
-/* elf-header minus e_ident */
-#define ELF64_HEADER_SIZE sizeof (Elf64_Ehdr)
-
-#define ELF64_HEADER_FIELDS(p) \
-    &(p)->e_type,                   \
-    &(p)->e_machine,        \
-    &(p)->e_version,        \
-    &(p)->e_entry,          \
-    &(p)->e_phoff,          \
-    &(p)->e_shoff,          \
-    &(p)->e_flags,          \
-    &(p)->e_ehsize,         \
-    &(p)->e_phensize,       \
-    &(p)->e_phnum,          \
-    &(p)->e_shentsize,      \
-    &(p)->e_shnum,          \
-    &(p)->e_shstrndx
-static char *ELF64_HEADER_SPECS[] = {
-  "hhwxxxwhhhhhh",
-  "HHWXXXWHHHHHH",
-};
-
-
-typedef struct
-{
-  Elf32_Word sh_name;
-  Elf32_Word sh_type;
-  Elf32_Word sh_flags;
-  Elf32_Addr sh_addr;           /* where loaded */
-  Elf32_Off sh_offset;          /* where in image (! sh_type==SHT_NOBITS) */
-  Elf32_Word sh_size;           /* section size in bytes */
-  Elf32_Word sh_link;           /* for symbol table: section header index of 
the associated string table! */
-  Elf32_Word sh_info;           /* "one greater than the symbol table index of 
the last local symbol _STB_LOCAL_" */
-  Elf32_Word sh_addralign;
-  Elf32_Word sh_entsize;
-} Elf32_Shdr;
-#define ELF_SECTION_SIZE 40
-
-#define ELF_SECTION_FIELDS(p) \
-  &(p)->sh_name,             \
-    &(p)->sh_type,           \
-    &(p)->sh_flags,          \
-    &(p)->sh_addr,           \
-    &(p)->sh_offset,         \
-    &(p)->sh_size,           \
-    &(p)->sh_link,           \
-    &(p)->sh_info,           \
-    &(p)->sh_addralign,              \
-    &(p)->sh_entsize
-static char *ELF_SECTION_SPECS[] = {
-  "wwwwwwwwww",
-  "WWWWWWWWWW",
-};
-
-typedef struct
-{
-  Elf32_Word p_type;
-  Elf32_Off p_offset;
-  Elf32_Addr p_vaddr;
-  Elf32_Addr p_paddr;
-  Elf32_Word p_filesz;
-  Elf32_Word p_memsz;
-  Elf32_Word p_flags;
-  Elf32_Word p_align;
-} Elf32_Phdr;
-#define ELF_PDHR_SIZE 32
-#define ELF_PHDR_FIELDS(p)        \
-  &(p)->p_type,                           \
-    &(p)->p_offset,               \
-    &(p)->p_vaddr,                \
-    &(p)->p_paddr,                \
-    &(p)->p_filesz,               \
-    &(p)->p_memsz,                \
-    &(p)->p_flags,                \
-    &(p)->p_align
-static char *ELF_PHDR_SPECS[] = {
-  "wwwwwwww",
-  "WWWWWWWW",
-};
-
-typedef struct
-{
-  Elf32_Sword d_tag;
-  union
-  {
-    Elf32_Word d_val;
-    Elf32_Addr d_ptr;
-  } d_un;
-} Elf32_Dyn;
-#define ELF_DYN_SIZE 8
-#define ELF_DYN_FIELDS(p)                      \
-  &(p)->d_tag,                                 \
-    &(p)->d_un
-static char *ELF_DYN_SPECS[] = {
-  "ww",
-  "WW",
-};
-
-#define ET_NONE 0
-#define ET_REL 1
-#define ET_EXEC 2
-#define ET_DYN 3
-#define ET_CORE 4
-#define ET_LOPROC 0xff00
-#define ET_HIPROC 0xffff
-
-#define EM_NONE 0
-#define EM_M32 1
-#define EM_SPARC 2
-#define EM_386 3
-#define EM_68K 4
-#define EM_88K 5
-#define EM_860 7
-#define EM_MIPS 8
-#define EM_PPC 20
-#define EM_PPC64 21
-#define EM_S390 22
-#define EM_ARM 40
-#define EM_ALPHA 41
-#define EM_IA_64 50
-#define EM_X86_64 62
-#define EM_CUDA 190
-
-#define ELFOSABI_NETBSD 2
-#define ELFOSABI_LINUX 3
-#define ELFOSABI_IRIX 8
-#define ELFOSABI_FREEBSD 9
-#define ELFOSABI_OPENBSD 12
-
-#define EV_NONE 0
-#define EV_CURRENT 1
-
-#define SHT_NULL 0
-#define SHT_PROGBITS 1
-#define SHT_SYMTAB 2
-/* string table! */
-#define SHT_STRTAB 3
-#define SHT_RELA 4
-#define SHT_HASH 5
-/* dynamic linking info! */
-#define SHT_DYNAMIC 6
-#define SHT_NOTE 7
-#define SHT_NOBITS 8
-#define SHT_REL 9
-#define SHT_SHLIB 10
-#define SHT_DYNSYM 11
-#define SHT_LOPROC 0x70000000
-#define SHT_HIPROC 0x7fffffff
-#define SHT_LOUSER 0x80000000
-#define SHT_HIUSER 0xffffffff
-
-#define SHF_WRITE 0x1
-#define SHF_ALLOC 0x2
-#define SHF_EXECINSTR 0x4
-#define SHF_MASKPROC 0xf000000
-
-#define DT_NULL 0
-/* name of a needed library, offset into table
-   recorded in DT_STRTAB entry */
-#define DT_NEEDED 1
-#define DT_PLTRELSZ 2
-#define DT_PLTGOT 3
-#define DT_HASH 4
-/* address of the string table from where symbol
-   names, library names, etc for this DT come from */
-#define DT_STRTAB 5
-#define DT_SYMTAB 6
-#define DT_SYMENT 7
-#define DT_RELA 7
-#define DT_RELASZ 8
-#define DT_RELAENT 9
-/* size of the string-table in bytes */
-#define DT_STRSZ 10
-/* fixme 11 */
-#define DT_INIT 12
-#define DT_FINI 13
-/* string-table offset giving the name of the shared object */
-#define DT_SONAME 14
-/* string-table offset of a null-terminated library search path */
-#define DT_RPATH 15
-#define DT_SYMBOLIC 16
-
-
-#define PT_NULL 0
-#define PT_LOAD 1
-#define PT_DYNAMIC 2
-#define PT_INTERP 3
-#define PT_NOTE 4
-#define PT_SHLIB 5
-#define PT_PHDR 6
-#define PT_LOPROC 0x70000000
-#define PT_HIPROC 0x7fffffff
-
-
-
-
-#define ELFCLASSNONE 0
-#define ELFCLASS32 1
-#define ELFCLASS64 2
-
-#define ELFDATANONE 0
-/* little endian */
-#define ELFDATA2LSB 1
-/* big endian */
-#define ELFDATA2MSB 2
-
-/**
- * @param ei_data ELFDATA2LSB or ELFDATA2MSB
- * @return 1 if we need to convert, 0 if not
- */
-static int
-getByteorder (char ei_data)
-{
-  if (ei_data == ELFDATA2LSB)
-    {
-#if __BYTE_ORDER == __BIG_ENDIAN
-      return 1;
-#else
-      return 0;
-#endif
-    }
-  else
-    {
-#if __BYTE_ORDER == __BIG_ENDIAN
-      return 0;
-#else
-      return 1;
-#endif
-    }
-}
-
-/**
- *
- * @return 0 on success, -1 on error
- */
-static int
-getSectionHdr (const char *data,
-               size_t size,
-               Elf32_Ehdr * ehdr, Elf32_Half idx, Elf32_Shdr * ret)
-{
-  if (ehdr->e_shnum <= idx)
-    return -1;
-
-  EXTRACTOR_common_cat_unpack (&data[ehdr->e_shoff + ehdr->e_shentsize * idx],
-              ELF_SECTION_SPECS[getByteorder (data[EI_CLASS])],
-              ELF_SECTION_FIELDS (ret));
-  return 0;
-}
-
-/**
- *
- * @return 0 on success, -1 on error
- */
-static int
-getDynTag (const char *data,
-           size_t size,
-           Elf32_Ehdr * ehdr,
-           Elf32_Off off, Elf32_Word osize, unsigned int idx, Elf32_Dyn * ret)
-{
-  if ((off + osize > size) || ((idx + 1) * ELF_DYN_SIZE > osize))
-    return -1;
-  EXTRACTOR_common_cat_unpack (&data[off + idx * ELF_DYN_SIZE],
-                              ELF_DYN_SPECS[getByteorder (data[EI_CLASS])],
-                              ELF_DYN_FIELDS (ret));
-  return 0;
-}
-
-/**
- *
- * @return 0 on success, -1 on error
- */
-static int
-getProgramHdr (const char *data,
-               size_t size,
-               Elf32_Ehdr * ehdr, Elf32_Half idx, Elf32_Phdr * ret)
-{
-  if (ehdr->e_phnum <= idx)
-    return -1;
-
-  EXTRACTOR_common_cat_unpack (&data[ehdr->e_phoff + ehdr->e_phensize * idx],
-              ELF_PHDR_SPECS[getByteorder (data[EI_CLASS])],
-              ELF_PHDR_FIELDS (ret));
-  return 0;
-}
-
-/**
- * Parse ELF header.
- * @return 0 on success for 32 bit, 1 on success for 64 bit, -1 on error
- */
-static int
-getELFHdr (const char *data, 
-          size_t size,
-          Elf32_Ehdr * ehdr,
-          Elf64_Ehdr * ehdr64)
-{
-  /* catlib */
-  if (size < EI_NIDENT)
-    return -1;
-  if (0 != strncmp (data, elfMagic, sizeof (elfMagic)))
-    return -1;                  /* not an elf */
-
-  switch (data[EI_CLASS])
-    {
-    case ELFCLASS32:
-      if (size < sizeof (Elf32_Ehdr) + EI_NIDENT)
-       return -1;
-      EXTRACTOR_common_cat_unpack (&data[EI_NIDENT],
-                                  ELF_HEADER_SPECS[getByteorder 
(data[EI_DATA])],
-                                  ELF_HEADER_FIELDS (ehdr));
-      if (ehdr->e_shoff + ehdr->e_shentsize * ehdr->e_shnum > size)
-       return -1;                  /* invalid offsets... */
-      if (ehdr->e_shentsize < ELF_SECTION_SIZE)
-       return -1;                  /* huh? */
-      if (ehdr->e_phoff + ehdr->e_phensize * ehdr->e_phnum > size)
-       return -1;
-      return 0;
-    case ELFCLASS64:
-      if (size < sizeof (Elf64_Ehdr) + EI_NIDENT)
-       return -1;
-      EXTRACTOR_common_cat_unpack (&data[EI_NIDENT],
-                                  ELF64_HEADER_SPECS[getByteorder 
(data[EI_DATA])],
-                                  ELF64_HEADER_FIELDS (ehdr64));
-      if (ehdr64->e_shoff + ((uint32_t) ehdr64->e_shentsize * ehdr64->e_shnum) 
> size)
-       return -1;                  /* invalid offsets... */
-      if (ehdr64->e_phoff + ((uint32_t) ehdr64->e_phensize * ehdr64->e_phnum) 
> size)
-       return -1;
-      return 1;
-    default:
-      return -1;
-    }
-}
-
-/**
- * @return the string (offset into data, do NOT free), NULL on error
- */
-static const char *
-readStringTable (const char *data,
-                 size_t size,
-                 Elf32_Ehdr * ehdr,
-                 Elf32_Half strTableOffset, Elf32_Word sh_name)
-{
-  Elf32_Shdr shrd;
-  if (-1 == getSectionHdr (data, size, ehdr, strTableOffset, &shrd))
-    return NULL;
-  if ((shrd.sh_type != SHT_STRTAB) ||
-      (shrd.sh_offset + shrd.sh_size > size) ||
-      (shrd.sh_size <= sh_name) ||
-      (data[shrd.sh_offset + shrd.sh_size - 1] != '\0'))
-    return NULL;
-  return &data[shrd.sh_offset + sh_name];
-}
-
-#define ADD(s, type) do { if (0!=proc(proc_cls, "elf", type, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0)
-
-/* application/x-executable, ELF */
-int 
-EXTRACTOR_elf_extract (const char *data,
-                      size_t size,
-                      EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls,
-                      const char *options)
-{
-  Elf32_Ehdr ehdr;
-  Elf32_Half idx;
-  Elf64_Ehdr ehdr64;
-  int ret;
-
-  ret = getELFHdr (data, size, &ehdr, &ehdr64);
-  if (ret == -1)
-    return 0;
-  ADD ("application/x-executable", EXTRACTOR_METATYPE_MIMETYPE);
-  switch ( ((unsigned char*) data)[EI_OSABI])
-    {
-    case ELFOSABI_LINUX:
-      ADD ("Linux", EXTRACTOR_METATYPE_TARGET_OS);
-      break;
-    case ELFOSABI_FREEBSD:
-      ADD ("FreeBSD", EXTRACTOR_METATYPE_TARGET_OS);
-      break;
-    case ELFOSABI_NETBSD:
-      ADD ("NetBSD", EXTRACTOR_METATYPE_TARGET_OS);
-      break;
-    case ELFOSABI_OPENBSD:
-      ADD ("OpenBSD", EXTRACTOR_METATYPE_TARGET_OS);
-      break;
-    case ELFOSABI_IRIX:
-      ADD ("IRIX", EXTRACTOR_METATYPE_TARGET_OS);
-      break;
-    default:
-      break;
-    }
-  switch ( (ret == 0) ? ehdr.e_type : ehdr64.e_type) 
-    {
-    case ET_REL:
-      ADD ("Relocatable file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
-      break;
-    case ET_EXEC:
-      ADD ("Executable file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
-      break;
-    case ET_DYN:
-      ADD ("Shared object file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
-      break;
-    case ET_CORE:
-      ADD ("Core file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
-      break;
-    default:
-      break;                    /* unknown */
-    }
-  switch ( (ret == 0) ? ehdr.e_machine : ehdr64.e_machine)
-    {
-    case EM_M32:
-      ADD ("M32", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_386:
-      ADD ("i386", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_68K:
-      ADD ("68K", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_88K:
-      ADD ("88K", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_SPARC:
-      ADD ("Sparc", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_860:
-      ADD ("960", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_MIPS:
-      ADD ("MIPS", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_PPC:
-      ADD ("PPC", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_PPC64:
-      ADD ("PPC64", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_S390:
-      ADD ("S390", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_ARM:
-      ADD ("ARM", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_ALPHA:
-      ADD ("ALPHA", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_IA_64:
-      ADD ("IA-64", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_X86_64:
-      ADD ("x86_64", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    case EM_CUDA:
-      ADD ("NVIDIA CUDA", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
-      break;
-    default:
-      break;                    /* oops */
-    }
-
-  if (ret != 0)
-    return 0; /* FIXME: full support for 64-bit ELF... */
-  for (idx = 0; idx < ehdr.e_phnum; idx++)
-    {
-      Elf32_Phdr phdr;
-
-      if (0 != getProgramHdr (data, size, &ehdr, idx, &phdr))
-        return 0;
-      if (phdr.p_type == PT_DYNAMIC)
-        {
-          unsigned int dc = phdr.p_filesz / ELF_DYN_SIZE;
-          unsigned int id;
-          Elf32_Addr stringPtr;
-          Elf32_Half stringIdx;
-          Elf32_Half six;
-
-          stringPtr = 0;
-
-          for (id = 0; id < dc; id++)
-            {
-              Elf32_Dyn dyn;
-              if (0 != getDynTag (data,
-                                  size,
-                                  &ehdr,
-                                  phdr.p_offset, phdr.p_filesz, id, &dyn))
-                return 0;
-              if (DT_STRTAB == dyn.d_tag)
-                {
-                  stringPtr = dyn.d_un.d_ptr;
-                  break;
-                }
-            }
-          if (stringPtr == 0)
-            return 0;
-          for (six = 0; six < ehdr.e_shnum; six++)
-            {
-              Elf32_Shdr sec;
-              if (-1 == getSectionHdr (data, size, &ehdr, six, &sec))
-                return 0;
-              if ((sec.sh_addr == stringPtr) && (sec.sh_type == SHT_STRTAB))
-                {
-                  stringIdx = six;
-                  break;
-                }
-            }
-         if (six == ehdr.e_shnum)
-           return 0; /* stringIdx not found */
-
-          for (id = 0; id < dc; id++)
-            {
-              Elf32_Dyn dyn;
-              if (0 != getDynTag (data,
-                                  size,
-                                  &ehdr,
-                                  phdr.p_offset, phdr.p_filesz, id, &dyn))
-                return 0;
-              switch (dyn.d_tag)
-                {
-                case DT_RPATH:
-                  {
-                    const char *rpath;
-
-                    rpath = readStringTable (data,
-                                             size,
-                                             &ehdr,
-                                             stringIdx, dyn.d_un.d_val);
-                    /* "source" of the dependencies: path
-                       to dynamic libraries */
-                    if (rpath != NULL)
-                      {
-                        ADD (rpath, EXTRACTOR_METATYPE_LIBRARY_SEARCH_PATH);
-                      }
-                    break;
-                  }
-                case DT_NEEDED:
-                  {
-                    const char *needed;
-
-                    needed = readStringTable (data,
-                                              size,
-                                              &ehdr,
-                                              stringIdx, dyn.d_un.d_val);
-                    if (needed != NULL)
-                      {
-                        ADD (needed, EXTRACTOR_METATYPE_LIBRARY_DEPENDENCY);
-                      }
-                    break;
-                  }
-                }
-            }
-
-        }
-    }
-
-  return 0;
-}

Deleted: Extractor/src/plugins/flv_extractor.c
===================================================================
--- Extractor/src/plugins/flv_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/flv_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,1235 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright (C) 2007, 2009 Heikki Lindholm
-
-     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.
- */
-
-/*
- * see http://osflash.org/flv
- *     http://osflash.org/documentation/amf
- */
-#include "platform.h"
-#include "extractor.h"
-#include "convert_numeric.h"
-#include <string.h>
-
-#define DEBUG 0
-
-#define FLV_SIGNATURE "FLV"
-
-/*
- * AMF parser
- */
-
-/* Actionscript types */
-#define ASTYPE_NUMBER       0x00
-#define ASTYPE_BOOLEAN      0x01
-#define ASTYPE_STRING       0x02
-#define ASTYPE_OBJECT       0x03
-#define ASTYPE_MOVIECLIP    0x04
-#define ASTYPE_NULL         0x05
-#define ASTYPE_UNDEFINED    0x06
-#define ASTYPE_REFERENCE    0x07
-#define ASTYPE_MIXEDARRAY   0x08
-#define ASTYPE_ENDOFOBJECT  0x09
-#define ASTYPE_ARRAY        0x0a
-#define ASTYPE_DATE         0x0b
-#define ASTYPE_LONGSTRING   0x0c
-#define ASTYPE_UNSUPPORTED  0x0d
-#define ASTYPE_RECORDSET    0x0e
-#define ASTYPE_XML          0x0f
-#define ASTYPE_TYPEDOBJECT  0x10
-#define ASTYPE_AMF3DATA     0x11
-
-typedef struct {
-  void * userdata;
-  void (*as_begin_callback)(unsigned char type, void * userdata);
-  void (*as_key_callback)(char * key, void * userdata);
-  void (*as_end_callback)(unsigned char type, void * value, void * userdata);
-} AMFParserHandler;
-
-/* core datatypes */
-
-static uint32_t readInt32(const unsigned char **data)
-{
-  const unsigned char *ptr = *data;
-  uint32_t val;
-
-  val = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
-  ptr += 4;
-  *data = ptr;
-  return val;
-}
-
-static uint32_t readInt24(const unsigned char **data)
-{
-  const unsigned char *ptr = *data;
-  uint32_t val;
-
-  val = (ptr[0] << 16) | (ptr[1] << 8) | ptr[2];
-  ptr += 3;
-  *data = ptr;
-  return val;
-}
-
-static uint16_t readInt16(const unsigned char **data)
-{
-  const unsigned char *ptr = *data;
-  uint16_t val;
-
-  val = (ptr[0] << 8) | ptr[1];
-  ptr += 2;
-  *data = ptr;
-  return val;
-}
-
-static double readDouble(const unsigned char **data)
-{
-  const unsigned char *ptr = *data;
-  double val;
-
-  
EXTRACTOR_common_floatformat_to_double(&EXTRACTOR_floatformat_ieee_double_big,
-                        (const void *)ptr,
-                        &val);
-  ptr += 8;
-  *data = ptr;
-  return val;
-}
-
-
-/* actionscript types */
-
-static int readASNumber(const unsigned char **data,
-                               size_t *len,
-                               double *retval)
-{
-  const unsigned char *ptr = *data;
-  double val;
-
-  if (*len < 8)
-    return -1;
-
-  val = readDouble(&ptr);
-  *len -= 8;
-
-  *retval = val;
-  *data = ptr;
-  return 0;
-}
-
-static int readASBoolean(const unsigned char **data,
-                                size_t *len,
-                                int *retval)
-{
-  const unsigned char *ptr = *data;
-  int val;
-
-  if (*len < 1)
-    return -1;
-
-  val = (*ptr != 0x00);
-  ptr += 1;
-  *len -= 1;
-
-  *retval = val;
-  *data = ptr;
-  return 0;
-}
-
-static int readASDate(const unsigned char **data,
-                             size_t *len,
-                             double *millis,
-                             short *zone)
-{
-  const unsigned char *ptr = *data;
-
-  if (*len < 10)
-    return -1;
-
-  *millis = readDouble(&ptr);
-  *len -= 8;
-
-  *zone = readInt16(&ptr);
-  *len -= 2;
-
-  *data = ptr;
-  return 0;
-}
-
-static int readASString(const unsigned char **data,
-                               size_t *len,
-                               char **retval)
-{
-  const unsigned char *ptr = *data;
-  char *ret;
-  int slen;
-
-  if (*len < 2)
-    return -1;
-
-  slen = readInt16(&ptr);
-
-  if (*len < (2 + slen))
-    return -1;
-
-  ret = malloc(slen+1);
-  if (ret == NULL)
-    return -1;
-  memcpy(ret, ptr, slen);
-  ret[slen] = '\0';
-  ptr += slen;
-  *len -= (2 + slen);
-
-  *retval = ret;
-  *data = ptr;
-  return 0;
-}
-
-static int parse_amf(const unsigned char **data,
-              size_t *len,
-              AMFParserHandler *handler)
-{
-  const unsigned char *ptr = *data;
-  unsigned char astype;
-  int ret;
-
-  ret = 0;
-  astype = *ptr++;
-  (*(handler->as_begin_callback))(astype, handler->userdata);
-  switch (astype) {
-    case ASTYPE_NUMBER:
-    {
-      double val;
-      ret = readASNumber(&ptr, len, &val);
-      if (ret == 0)
-        (*(handler->as_end_callback))(astype,
-                                      &val,
-                                      handler->userdata);
-      break;
-    }
-    case ASTYPE_BOOLEAN:
-    {
-      int val;
-      ret = readASBoolean(&ptr, len, &val);
-      if (ret == 0)
-        (*(handler->as_end_callback))(astype,
-                                      &val,
-                                      handler->userdata);
-      break;
-    }
-    case ASTYPE_STRING:
-    {
-      char *val;
-      ret = readASString(&ptr, len, &val);
-      if (ret == 0) {
-        (*(handler->as_end_callback))(astype,
-                                      val,
-                                      handler->userdata);
-        free(val);
-      }
-      break;
-    }
-    case ASTYPE_DATE:
-    {
-      void *tmp[2];
-      double millis;
-      short tz;
-      ret = readASDate(&ptr, len, &millis, &tz);
-      tmp[0] = &millis;
-      tmp[1] = &tz;
-      if (ret == 0)
-        (*(handler->as_end_callback))(astype,
-                                      &tmp,
-                                      handler->userdata);
-      break;
-    }
-    case ASTYPE_NULL:
-    case ASTYPE_UNDEFINED:
-    case ASTYPE_UNSUPPORTED:
-    case ASTYPE_ENDOFOBJECT:
-      (*(handler->as_end_callback))(astype, NULL, handler->userdata);
-      break;
-    case ASTYPE_ARRAY:
-    {
-      long i, alen;
-      if (*len < 4) {
-        ret = -1;
-        break;
-      }
-      alen = readInt32(&ptr);
-      *len -= 4;
-      for (i = 0; i < alen; i++) {
-        ret = parse_amf(&ptr, len, handler);
-        if (ret == -1)
-         break;
-      }
-      (*(handler->as_end_callback))(ASTYPE_ARRAY,
-                                    NULL,
-                                    handler->userdata);
-      break;
-    }
-    case ASTYPE_OBJECT:
-    {
-      char *key;
-      unsigned char type;
-
-      ret = readASString(&ptr, len, &key);
-      if (ret == -1)
-        break;
-      (*(handler->as_key_callback))(key,
-                                    handler->userdata);
-      free(key);
-      type = *ptr;
-      while (type != ASTYPE_ENDOFOBJECT) {
-        ret = parse_amf(&ptr, len, handler);
-        if (ret == -1)
-          break;
-        ret = readASString(&ptr, len, &key);
-        if (ret == -1)
-          break;
-        (*(handler->as_key_callback))(key,
-                                      handler->userdata);
-        free(key);
-        type = *ptr;
-      }
-      if (ret == 0)
-        (*(handler->as_end_callback))(ASTYPE_OBJECT,
-                                      NULL,
-                                      handler->userdata);
-      break;
-    }
-    case ASTYPE_MIXEDARRAY:
-    {
-      char *key;
-      unsigned char type;
-      
-      if (*len < 4) {
-        ret = -1;
-        break;
-      }
-      /* max_index */ readInt32(&ptr);
-      *len -= 4;
-      ret = readASString(&ptr, len, &key);
-      if (ret == -1)
-        break;
-      (*(handler->as_key_callback))(key,
-                                    handler->userdata);
-      free(key);
-      type = *ptr;
-      while (type != ASTYPE_ENDOFOBJECT) {
-        ret = parse_amf(&ptr, len, handler);
-        if (ret == -1)
-          break;
-        ret = readASString(&ptr, len, &key);
-        if (ret == -1)
-          break;
-        (*(handler->as_key_callback))(key,
-                                      handler->userdata);
-        free(key);
-        type = *ptr;
-      }
-      if (ret == 0)
-        (*(handler->as_end_callback))(astype,
-                                      NULL,
-                                      handler->userdata);
-      break;
-    }
-    default:
-      ret = -1;
-      (*(handler->as_end_callback))(astype,
-                                    NULL,
-                                    handler->userdata);
-#if DEBUG
-      printf("parse_amf: Unknown type %02x", astype);
-#endif
-      break;
-  }
-
-  *data = ptr;
-  return ret;
-}
-
-/*
- * FLV parser
- */
-
-/* from tarextractor, modified to take timezone */
-/* TODO: check that the output date is correct */
-static int
-flv_to_iso_date (double timeval, short timezone,
-                 char *rtime, unsigned int rsize)
-{
-  int retval = 0;
-
-  /*
-   * shift epoch to proleptic times
-   * to make subsequent modulo operations safer.
-   */
-  long long my_timeval = (timeval/1000)
-    + ((long long) ((1970 * 365) + 478) * (long long) 86400);
-
-  unsigned int seconds = (unsigned int) (my_timeval % 60);
-  unsigned int minutes = (unsigned int) ((my_timeval / 60) % 60);
-  unsigned int hours = (unsigned int) ((my_timeval / 3600) % 24);
-
-  int zone_sign;
-  int zone_hours;
-  unsigned int zone_minutes;
-
-  unsigned int year = 0;
-  unsigned int month = 1;
-
-  unsigned int days = (unsigned int) (my_timeval / (24 * 3600));
-
-  unsigned int days_in_month[] =
-    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
-  unsigned int diff = 0;
-
-  if ((long long) 0 > my_timeval)
-    return EDOM;
-
-  /*
-   * 400-year periods
-   */
-  year += (400 * (days / ((365 * 400) + 97)));
-  days %= ((365 * 400) + 97);
-
-  /*
-   * 100-year periods
-   */
-  diff = (days / ((365 * 100) + 24));
-  if (4 <= diff)
-    {
-      year += 399;
-      days = 364;
-    }
-  else
-    {
-      year += (100 * diff);
-      days %= ((365 * 100) + 24);
-    }
-
-  /*
-   * remaining leap years
-   */
-  year += (4 * (days / ((365 * 4) + 1)));
-  days %= ((365 * 4) + 1);
-
-  while (1)
-    {
-      if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
-        {
-          if (366 > days)
-            {
-              break;
-            }
-          else
-            {
-              days -= 366;
-              year++;
-            }
-        }
-      else
-        {
-          if (365 > days)
-            {
-              break;
-            }
-          else
-            {
-              days -= 365;
-              year++;
-            }
-        }
-    }
-
-  if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
-    days_in_month[1] = 29;
-
-  for (month = 0; (month < 12) && (days >= days_in_month[month]); month += 1)
-    days -= days_in_month[month];
-
-  zone_sign = 0;
-  if (timezone < 0)
-    {
-      zone_sign = -1;
-      timezone = -timezone;
-    }
-  zone_hours = timezone/60;
-  zone_minutes = timezone - zone_hours*60;
-
-  retval = snprintf (rtime, rsize, "%04u-%02u-%02uT%02u:%02u:%02u%c%02d:%02u",
-                     year, month + 1, days + 1, hours, minutes, seconds,
-                     ((zone_sign < 0) ? '-' : '+'), zone_hours, zone_minutes);
-
-  return (retval < rsize) ? 0 : EOVERFLOW;
-}
-
-typedef struct
-{
-  char signature[3];
-  unsigned char version;
-  unsigned char flags;
-  unsigned long offset;
-} FLVHeader;
-
-#define FLV_HEADER_SIZE 9
-
-#define FLV_TAG_TYPE_AUDIO 0x08
-#define FLV_TAG_TYPE_VIDEO 0x09
-#define FLV_TAG_TYPE_META  0x12
-
-typedef struct
-{
-  unsigned char type;
-  unsigned long bodyLength;
-  uint32_t timestamp;
-  unsigned long streamId;
-} FLVTagHeader;
-
-#define FLV_TAG_HEADER_SIZE 11
-
-static int readFLVHeader(const unsigned char **data,
-                        const unsigned char *end,
-                        FLVHeader *hdr)
-{
-  const unsigned char *ptr = *data;
-
-  if ((ptr + FLV_HEADER_SIZE) > end)
-    return -1;
-
-  memcpy(hdr->signature, ptr, 3);
-  ptr += 3;
-  hdr->version = *ptr++;
-  hdr->flags = *ptr++;
-  hdr->offset = readInt32(&ptr);
-  if (hdr->offset != FLV_HEADER_SIZE)
-    return -1;
-
-  *data = ptr;
-  return 0;
-}
-
-static int readPreviousTagSize(const unsigned char **data,
-                                const unsigned char *end,
-                                unsigned long *prev_size)
-{
-  const unsigned char *ptr = *data;
-
-  if ((ptr + 4) > end)
-    return -1;
-
-  *prev_size = readInt32(&ptr);
-
-  *data = ptr;
-  return 0;
-}
-
-static int readFLVTagHeader(const unsigned char **data,
-                          const unsigned char *end,
-                          FLVTagHeader *hdr)
-{
-  const unsigned char *ptr = *data;
-
-  if ((ptr + FLV_TAG_HEADER_SIZE) > end)
-    return -1;
-
-  hdr->type = *ptr++;
-  hdr->bodyLength = readInt24(&ptr);
-  hdr->timestamp = readInt32(&ptr);
-  hdr->streamId = readInt24(&ptr);
-
-  *data = ptr;
-  return 0;
-}
-
-typedef struct {
-  int videoCodec;
-  char *videoCodecStr;
-  int videoWidth;
-  int videoHeight;
-  double videoDataRate;
-  double videoFrameRate;
-
-  int audioCodec;
-  char *audioCodecStr;
-  double audioDataRate;
-  int audioChannels;
-  int audioSampleBits;
-  int audioRate;
-} FLVStreamInfo;
-
-typedef enum {
-  FLV_NONE = 0,
-  FLV_WIDTH,
-  FLV_HEIGHT,
-  FLV_FRAMERATE,
-  FLV_STEREO,
-  FLV_ACHANNELS,
-  FLV_VDATARATE,
-  FLV_ADATARATE,
-  FLV_VCODECID,
-  FLV_ACODECID
-} FLVStreamAttribute;
-
-typedef struct {
-  const char *key;
-  FLVStreamAttribute attribute;
-} MetaKeyToStreamAttribute;
-
-static MetaKeyToStreamAttribute key_to_attribute_map[] = {
-  { "width", FLV_WIDTH },
-  { "height", FLV_HEIGHT },
-  { "framerate", FLV_FRAMERATE },
-  { "videoframerate", FLV_FRAMERATE },
-  { "stereo", FLV_STEREO },
-  { "audiochannels", FLV_ACHANNELS },
-  { "videodatarate", FLV_VDATARATE },
-  { "audiodatarate", FLV_ADATARATE },
-  { "videocodecid", FLV_VCODECID },
-  { "audiocodecid", FLV_ACODECID },
-  { NULL, FLV_NONE }
-};
-
-typedef struct {
-  const char *key;
-  enum EXTRACTOR_MetaType type;
-} MetaKeyToExtractorItem;
-
-static MetaKeyToExtractorItem key_to_extractor_map[] = {
-  { "duration", EXTRACTOR_METATYPE_DURATION },
-  { "creator", EXTRACTOR_METATYPE_CREATOR },
-  { "metadatacreator", EXTRACTOR_METATYPE_CREATOR },
-  { "creationdate", EXTRACTOR_METATYPE_CREATION_DATE },
-  { "metadatadate", EXTRACTOR_METATYPE_MODIFICATION_DATE },
-  { NULL, EXTRACTOR_METATYPE_RESERVED }
-};
-
-typedef struct {
-  int onMetaData;
-  int parsingDepth;
-  int ret;
-  /* mixed array keys mapped to something readily usable */
-  enum EXTRACTOR_MetaType currentKeyType;
-  FLVStreamAttribute currentAttribute;
-
-  EXTRACTOR_MetaDataProcessor proc;
-  void *proc_cls;
-  FLVStreamInfo *streamInfo;
-} FLVMetaParserState;
-
-static void handleASBegin(unsigned char type, void * userdata)
-{
-  FLVMetaParserState *state = (FLVMetaParserState *)userdata;
-
-  if (state->onMetaData && state->parsingDepth == 0 &&
-      type != ASTYPE_MIXEDARRAY)
-    state->onMetaData = 0;
-
-  if (type == ASTYPE_ARRAY || type == ASTYPE_MIXEDARRAY ||
-      type == ASTYPE_OBJECT)
-    state->parsingDepth++;
-}
-
-static void handleASKey(char * key, void * userdata)
-{
-  FLVMetaParserState *state = (FLVMetaParserState *)userdata;
-  int i;
-
-  if (key == NULL)
-    return;
-
-  i = 0;
-  while ((key_to_extractor_map[i].key != NULL) &&
-         (strcasecmp(key, key_to_extractor_map[i].key) != 0))
-    i++;
-  state->currentKeyType = key_to_extractor_map[i].type;
-
-  i = 0;
-  while ((key_to_attribute_map[i].key != NULL) &&
-         (strcasecmp(key, key_to_attribute_map[i].key) != 0))
-    i++;
-  state->currentAttribute = key_to_attribute_map[i].attribute;
-}
-
-static void handleASEnd(unsigned char type, void * value, void * userdata)
-{
-  FLVMetaParserState *state = (FLVMetaParserState *)userdata;
-  const char *s;
-  char tmpstr[30];
-
-  if ((state->parsingDepth == 0) && (type == ASTYPE_STRING)) {
-    s = (const char *)value;
-    if (!strcmp(s, "onMetaData"))
-      state->onMetaData = 1;
-  }
-
-  /* we expect usable metadata to reside in a MIXEDARRAY container
-   * right after a "onMetaData" STRING */
-
-  /* stream info related metadata */
-  if (state->onMetaData && (state->parsingDepth == 1) &&
-      (state->currentAttribute != FLV_NONE) &&
-      (type == ASTYPE_NUMBER))
-  {
-    double n = *((double *)value);
-    switch (state->currentAttribute) {
-      case FLV_NONE: /* make gcc happy */
-       break;
-      case FLV_STEREO:
-        break;
-      case FLV_ACHANNELS:
-        state->streamInfo->audioChannels = n;
-        break;
-      case FLV_WIDTH:
-        if (state->streamInfo->videoWidth == -1)
-          state->streamInfo->videoWidth = n;
-        break;
-      case FLV_HEIGHT:
-        if (state->streamInfo->videoHeight == -1)
-          state->streamInfo->videoHeight = n;
-        break;
-      case FLV_FRAMERATE:
-        state->streamInfo->videoFrameRate = n;
-        break;
-      case FLV_VDATARATE:
-        state->streamInfo->videoDataRate = n;
-        break;
-      case FLV_ADATARATE:
-        state->streamInfo->audioDataRate = n;
-        break;
-      case FLV_VCODECID:
-        if (state->streamInfo->videoCodec == -1)
-          state->streamInfo->videoCodec = n;
-        /* prefer codec ids to fourcc codes */
-        if (state->streamInfo->videoCodecStr != NULL) {
-          free(state->streamInfo->videoCodecStr);
-          state->streamInfo->videoCodecStr = NULL;
-        }
-        break;
-      case FLV_ACODECID:
-        if (state->streamInfo->audioCodec == -1)
-          state->streamInfo->audioCodec = n;
-        /* prefer codec ids to fourcc codes */
-        if (state->streamInfo->audioCodecStr != NULL) {
-          free(state->streamInfo->audioCodecStr);
-          state->streamInfo->audioCodecStr = NULL;
-        }
-        break;
-    }
-  }
-
-  /* sometimes a/v codecs are as fourcc strings */
-  if (state->onMetaData && (state->parsingDepth == 1) &&
-      (state->currentAttribute != FLV_NONE) &&
-      (type == ASTYPE_STRING))
-  {
-    s = (const char *)value;
-    switch (state->currentAttribute) {
-      case FLV_VCODECID:
-        if (s != NULL && state->streamInfo->videoCodecStr == NULL &&
-            state->streamInfo->videoCodec == -1)
-          state->streamInfo->videoCodecStr = strdup(s);
-        break;
-      case FLV_ACODECID:
-        if (s != NULL && state->streamInfo->audioCodecStr == NULL &&
-            state->streamInfo->audioCodec == -1)
-          state->streamInfo->audioCodecStr = strdup(s);
-        break;
-      default:
-        break;
-    }
-  }
-
-  if (state->onMetaData && (state->parsingDepth == 1) &&
-      (state->currentAttribute == FLV_STEREO) &&
-      (type == ASTYPE_BOOLEAN))
-  {
-    int n = *((int *)value);
-    if (state->streamInfo->audioChannels == -1)
-      state->streamInfo->audioChannels = (n == 0) ? 1 : 2;
-  }
-
-  /* metadata that maps straight to extractor keys */
-  if (state->onMetaData && (state->parsingDepth == 1) &&
-      (state->currentKeyType != EXTRACTOR_METATYPE_RESERVED))
-  {
-    s = NULL;
-    switch (type) {
-      case ASTYPE_NUMBER:
-      {
-        double n = *((double *)value);
-        s = tmpstr;
-       if (state->currentKeyType == EXTRACTOR_METATYPE_DURATION)
-          snprintf(tmpstr, sizeof(tmpstr), "%.2f s", n);
-       else
-          snprintf(tmpstr, sizeof(tmpstr), "%f", n);
-       break;
-      }
-      case ASTYPE_STRING:
-      {
-        s = (char *)value;
-        break;
-      }
-      case ASTYPE_DATE:
-      {
-        void **tmp = (void **)value;
-       double *millis;
-       short *tz;
-        millis = (double *)tmp[0];
-       tz = (short *)tmp[1];
-       if (0 == flv_to_iso_date(*millis, *tz, tmpstr, sizeof(tmpstr)))
-         s = tmpstr;
-        break;
-      }
-    }
-    if ( (s != NULL) &&
-        (state->ret == 0) )
-      state->ret = state->proc (state->proc_cls,
-                               "flv",
-                               state->currentKeyType,
-                               EXTRACTOR_METAFORMAT_UTF8,
-                               "text/plain",
-                               s,
-                               strlen (s) + 1);
-  }
-  state->currentKeyType = EXTRACTOR_METATYPE_RESERVED;
-  state->currentAttribute = FLV_NONE;
-
-  if (type == ASTYPE_ARRAY || type == ASTYPE_MIXEDARRAY ||
-      type == ASTYPE_OBJECT)
-    state->parsingDepth--;
-}
-
-static int
-handleMetaBody(const unsigned char *data, size_t len,
-              FLVStreamInfo *stinfo,
-              EXTRACTOR_MetaDataProcessor proc,
-              void *proc_cls)
-{
-  AMFParserHandler handler;
-  FLVMetaParserState pstate;
-
-  pstate.onMetaData = 0;
-  pstate.currentKeyType = EXTRACTOR_METATYPE_RESERVED;
-  pstate.parsingDepth = 0;
-  pstate.streamInfo = stinfo;
-  pstate.ret = 0;
-  pstate.proc = proc;
-  pstate.proc_cls = proc_cls;
-  handler.userdata = &pstate;
-  handler.as_begin_callback = &handleASBegin;
-  handler.as_key_callback = &handleASKey;
-  handler.as_end_callback = &handleASEnd;
-
-  while (len > 0 && parse_amf(&data, &len, &handler) == 0);
-  if (pstate.ret != 0)
-    return 1;
-  return 0;
-}
-
-static char *FLVAudioCodecs[] = {
-  "Uncompressed",
-  "ADPCM",
-  "MP3",
-  NULL,
-  NULL,
-  "Nellymoser 8kHz mono",
-  "Nellymoser",
-  NULL,
-  NULL,
-  NULL,
-  "AAC",
-  "Speex"
-};
-
-static char *FLVAudioChannels[] = {
-  "mono",
-  "stereo"
-};
-
-static char *FLVAudioSampleSizes[] = {
-  "8-bit",
-  "16-bit"
-};
-
-static char *FLVAudioSampleRates[] = {
-  "5512.5",
-  "11025",
-  "22050",
-  "44100"
-};
-
-static void
-handleAudioBody(const unsigned char *data, size_t len,
-                FLVStreamInfo *stinfo)
-{
-  stinfo->audioChannels = (*data & 0x01) + 1;
-  stinfo->audioSampleBits = (*data & 0x02) >> 1;
-  stinfo->audioRate = (*data & 0x0C) >> 2;
-  stinfo->audioCodec = (*data & 0xF0) >> 4;
-  if (stinfo->audioCodecStr != NULL) {
-    free(stinfo->audioCodecStr);
-    stinfo->audioCodecStr = NULL;
-  }
-}
-
-static char *FLVVideoCodecs[] = {
-  NULL,
-  NULL,
-  "Sorenson Spark",
-  "ScreenVideo",
-  "On2 TrueMotion VP6",
-  "On2 TrueMotion VP6 Alpha",
-  "ScreenVideo 2",
-  "H.264" /* XXX not found in docs */
-};
-
-static int sorenson_predefined_res[][2] = {
-  { -1, -1 },
-  { -1, -1 },
-  { 352, 288 },
-  { 176, 144 },
-  { 128, 96 },
-  { 320, 240 },
-  { 160, 120 },
-  { -1, -1 }
-};
-
-static void
-handleVideoBody(const unsigned char *data, size_t len,
-                FLVStreamInfo *stinfo)
-{
-  int codecId, frameType;
-
-  codecId = *data & 0x0F;
-  frameType = (*data & 0xF0) >> 4;
-  data++;
-
-  /* try to get video dimensions */
-  switch (codecId) {
-    case 0x02: /* Sorenson */
-      if (len < 9)
-        break;
-      if (frameType == 1) {
-        int start_code = (data[0] << 9) | (data[1] << 1) | ((data[2] >> 
7)&0x1);
-        int version = (data[2] & 0x7C) >> 2;
-        int frame_size = ((data[3] & 0x03) << 1) | (data[4] >> 7);
-        if (start_code != 0x00000001)
-          break;
-        if (!(version == 0 || version == 1))
-          break;
-        if (frame_size == 0) {
-          stinfo->videoWidth = ((data[4] & 0x7F) >> 1) | (data[5] >> 7);
-          stinfo->videoHeight = ((data[5] & 0x7F) >> 1) | (data[6] >> 7);
-        }
-        else if (frame_size == 1) {
-          stinfo->videoWidth = ((data[4] & 0x7F) << 9) | (data[5] << 1) |
-                               (data[6] >> 7);
-          stinfo->videoHeight = ((data[6] & 0x7F) << 9) | (data[7] << 1) |
-                                (data[8] >> 7);
-        }
-        else {
-          stinfo->videoWidth = sorenson_predefined_res[frame_size][0];
-          stinfo->videoHeight = sorenson_predefined_res[frame_size][1];
-        }
-      }
-      break;
-    case 0x03: /* ScreenVideo */
-      if (len < 5)
-        break;
-      stinfo->videoWidth = readInt16(&data) & 0x0FFF;
-      stinfo->videoHeight = readInt16(&data) & 0x0FFF;
-      break;
-    case 0x04: /* On2 VP6 */
-    case 0x05:
-    {
-      unsigned char dim_adj;
-      if (len < 10)
-        break;
-      dim_adj = *data++;
-      if ((frameType == 1) && ((data[0] & 0x80) == 0)) {
-        /* see ffmpeg vp6 decoder */
-        int separated_coeff = data[0] & 0x01;
-        int filter_header = data[1] & 0x06;
-        /*int interlaced = data[1] & 0x01; TODO: used in flv ever? */
-        if (separated_coeff || !filter_header) {
-          data += 2;
-        }
-        /* XXX encoded/displayed dimensions might vary, but which are the
-         * right ones? */
-        stinfo->videoWidth = (data[3]*16) - (dim_adj>>4);
-        stinfo->videoHeight = (data[2]*16) - (dim_adj&0x0F);
-      }
-      break;
-    }
-    default:
-      break;
-  }
-
-  stinfo->videoCodec = codecId;
-  if (stinfo->videoCodecStr != NULL) {
-    free(stinfo->videoCodecStr);
-    stinfo->videoCodecStr = NULL;
-  }
-}
-
-static int readFLVTag(const unsigned char **data,
-                      const unsigned char *end,
-                      FLVStreamInfo *stinfo,
-                     EXTRACTOR_MetaDataProcessor proc,
-                     void *proc_cls)
-{
-  const unsigned char *ptr = *data;
-  FLVTagHeader header;
-  int ret = 0;
-
-  if (readFLVTagHeader(&ptr, end, &header) == -1)
-    return -1;
-
-  if ((ptr + header.bodyLength) > end)
-    return -1;
-
-  switch (header.type)
-  {
-    case FLV_TAG_TYPE_AUDIO:
-      handleAudioBody(ptr, header.bodyLength, stinfo);
-      break;
-    case FLV_TAG_TYPE_VIDEO:
-      handleVideoBody(ptr, header.bodyLength, stinfo);
-      break;
-    case FLV_TAG_TYPE_META:
-      ret = handleMetaBody(ptr, header.bodyLength, stinfo, proc, proc_cls);
-      break;
-    default:
-      break;
-  }
-
-  ptr += header.bodyLength;
-  *data = ptr;
-  return ret;
-}
-
-#define MAX_FLV_FORMAT_LINE 80
-static char * printVideoFormat(FLVStreamInfo *stinfo)
-{
-  char s[MAX_FLV_FORMAT_LINE+1];
-  int n;
-  size_t len = MAX_FLV_FORMAT_LINE;
-
-  n = 0;
-  /* some files seem to specify only the width or the height, print '?' for
-   * the unknown dimension */
-  if (stinfo->videoWidth != -1 || stinfo->videoHeight != -1) {
-    if (n < len) {
-      if (stinfo->videoWidth != -1)
-        n += snprintf(s+n, len-n, "%d", stinfo->videoWidth);
-      else
-        n += snprintf(s+n, len-n, "?");
-    }
-
-    if (n < len) {
-      if (stinfo->videoHeight != -1)
-        n += snprintf(s+n, len-n, "x%d", stinfo->videoHeight);
-      else
-        n += snprintf(s+n, len-n, "x?");
-    }
-  }
-
-  if (stinfo->videoFrameRate != 0.0 && n < len) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%0.2f fps", stinfo->videoFrameRate);
-  }
-
-  if (stinfo->videoCodec > -1 && stinfo->videoCodec < 8 &&
-      FLVVideoCodecs[stinfo->videoCodec] != NULL && n < len) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%s", FLVVideoCodecs[stinfo->videoCodec]);
-  }
-  else if (stinfo->videoCodecStr != NULL && n < len) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%s", stinfo->videoCodecStr);    
-  }
-
-  if (stinfo->videoDataRate != 0.0 && n < len) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%.4f kbps", stinfo->videoDataRate);
-  }
-
-  if (n == 0)
-    return NULL;
-  return strdup(s);
-}
-
-static char * printAudioFormat(FLVStreamInfo *stinfo)
-{
-  char s[MAX_FLV_FORMAT_LINE+1];
-  int n;
-  size_t len = MAX_FLV_FORMAT_LINE;
-
-  n = 0;
-  if ( (stinfo->audioRate != -1) && (n < len)) {
-      n += snprintf(s+n, len-n, "%s Hz", 
FLVAudioSampleRates[stinfo->audioRate]);
-  }
-
-  if ((stinfo->audioSampleBits != -1) && (n < len)) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%s",
-                    FLVAudioSampleSizes[stinfo->audioSampleBits]);
-  }
-
-  if ((stinfo->audioChannels != -1) && (n < len)) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len) {
-      if (stinfo->audioChannels >= 1 && stinfo->audioChannels <= 2)
-        n += snprintf(s+n, len-n, "%s",
-                      FLVAudioChannels[stinfo->audioChannels-1]);
-      else
-        n += snprintf(s+n, len-n, "%d",
-                      stinfo->audioChannels);
-    }
-  }
-
-  if ((stinfo->audioCodec > -1) && (stinfo->audioCodec < 12) &&
-      (FLVAudioCodecs[stinfo->audioCodec] != NULL) && (n < len)) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%s", FLVAudioCodecs[stinfo->audioCodec]);
-  }
-  else if ((stinfo->audioCodecStr != NULL) && (n < len)) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%s", stinfo->audioCodecStr);    
-  }
-
-  if ((stinfo->audioDataRate != 0.0) && (n < len)) {
-    if (n > 0)
-      n += snprintf(s+n, len-n, ", ");
-    if (n < len)
-      n += snprintf(s+n, len-n, "%.4f kbps", stinfo->audioDataRate);
-  }
-
-  if (n == 0)
-    return NULL;
-  return strdup(s);
-}
-
-int 
-EXTRACTOR_flv_extract (const unsigned char *data,
-                      size_t size,
-                      EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls,
-                      const char *options)
-{
-  const unsigned char *ptr;
-  const unsigned char *end;
-  FLVStreamInfo stinfo;
-  FLVHeader header;
-  unsigned long prev_tag_size;
-  char *s;
-  int ret;
-
-  ptr = data;
-  end = ptr + size;
-
-  if (readFLVHeader(&ptr, end, &header) == -1)
-    return 0;
-
-  if (memcmp(header.signature, FLV_SIGNATURE, 3) != 0)
-    return 0;
-
-  if (0 != proc (proc_cls,
-                "flv",
-                EXTRACTOR_METATYPE_MIMETYPE, 
-                EXTRACTOR_METAFORMAT_UTF8,
-                "text/plain",
-                "video/x-flv",
-                strlen ("video/x-flv") + 1))
-    return 0;
-  if (header.version != 1)
-    return 0;
-  if (readPreviousTagSize (&ptr, end, &prev_tag_size) == -1)
-    return 0;
-
-  stinfo.videoCodec = -1;
-  stinfo.videoCodecStr = NULL;
-  stinfo.videoWidth = -1;
-  stinfo.videoHeight = -1;
-  stinfo.videoFrameRate = 0.0;
-  stinfo.videoDataRate = 0.0;
-  stinfo.audioCodec = -1;
-  stinfo.audioCodecStr = NULL;
-  stinfo.audioRate = -1;
-  stinfo.audioSampleBits = -1;
-  stinfo.audioChannels = -1;
-  stinfo.audioDataRate = 0.0;
-  ret = 0;
-  while (ptr < end) {
-    if (-1 == (ret = readFLVTag (&ptr, end, &stinfo, proc, proc_cls)))
-      break;
-    if (readPreviousTagSize (&ptr, end, &prev_tag_size) == -1)
-      break;
-  }
-  if (1 == ret)
-    return 1;
-  s = printVideoFormat (&stinfo);
-  if (s != NULL)
-    {
-      if (0 != proc (proc_cls, 
-                    "flv",
-                    EXTRACTOR_METATYPE_RESOURCE_TYPE,
-                    EXTRACTOR_METAFORMAT_UTF8,
-                    "text/plain",
-                    s,
-                    strlen (s)+1))
-       {
-         free (s);
-         return 1;
-       }
-      free (s);
-    }
-  s = printAudioFormat (&stinfo);
-  if (s != NULL)
-    {
-      if (0 != proc (proc_cls, 
-                    "flv",
-                    EXTRACTOR_METATYPE_RESOURCE_TYPE,
-                    EXTRACTOR_METAFORMAT_UTF8,
-                    "text/plain",
-                    s,
-                    strlen (s)+1))
-       {
-         free (s);
-         return 1;
-       }
-      free (s);
-    }
-  return 0;
-}

Deleted: Extractor/src/plugins/html_extractor.c
===================================================================
--- Extractor/src/plugins/html_extractor.c      2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/html_extractor.c      2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,420 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2004, 2005, 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 <string.h>
-#include "convert.h"
-
-static struct
-{
-  const char *name;
-  enum EXTRACTOR_MetaType type;
-} tagmap[] = {
-  { "author", EXTRACTOR_METATYPE_AUTHOR_NAME },
-  { "dc.author", EXTRACTOR_METATYPE_AUTHOR_NAME },
-  { "title", EXTRACTOR_METATYPE_TITLE },
-  { "dc.title", EXTRACTOR_METATYPE_TITLE},
-  { "description", EXTRACTOR_METATYPE_DESCRIPTION },
-  { "dc.description", EXTRACTOR_METATYPE_DESCRIPTION },
-  { "subject", EXTRACTOR_METATYPE_SUBJECT},
-  { "dc.subject", EXTRACTOR_METATYPE_SUBJECT},
-  { "date", EXTRACTOR_METATYPE_UNKNOWN_DATE },
-  { "dc.date", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  { "publisher", EXTRACTOR_METATYPE_PUBLISHER },
-  { "dc.publisher", EXTRACTOR_METATYPE_PUBLISHER},
-  { "rights", EXTRACTOR_METATYPE_RIGHTS },
-  { "dc.rights", EXTRACTOR_METATYPE_RIGHTS },
-  { "copyright", EXTRACTOR_METATYPE_COPYRIGHT },
-  { "language", EXTRACTOR_METATYPE_LANGUAGE },  
-  { "keywords", EXTRACTOR_METATYPE_KEYWORDS },
-  { "abstract", EXTRACTOR_METATYPE_ABSTRACT },
-  { "formatter", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE },
-  { "dc.creator", EXTRACTOR_METATYPE_CREATOR},
-  { "dc.identifier", EXTRACTOR_METATYPE_URI },
-  { "dc.format", EXTRACTOR_METATYPE_FORMAT },
-  { NULL, EXTRACTOR_METATYPE_RESERVED }
-};
-
-static const char *relevantTags[] = {
-  "title",
-  "meta",
-  NULL,
-};
-
-typedef struct TI
-{
-  struct TI *next;
-  const char *tagStart;
-  const char *tagEnd;
-  const char *dataStart;
-  const char *dataEnd;
-} TagInfo;
-
-
-
-
-/* ******************** parser helper functions ************** */
-
-static int
-tagMatch (const char *tag, const char *s, const char *e)
-{
-  return (((e - s) == strlen (tag)) && (0 == strncasecmp (tag, s, e - s)));
-}
-
-static int
-lookFor (char c, size_t * pos, const char *data, size_t size)
-{
-  size_t p = *pos;
-
-  while ((p < size) && (data[p] != c))
-    {
-      if (data[p] == '\0')
-        return 0;
-      p++;
-    }
-  *pos = p;
-  return p < size;
-}
-
-static int
-skipWhitespace (size_t * pos, const char *data, size_t size)
-{
-  size_t p = *pos;
-
-  while ((p < size) && (isspace ( (unsigned char) data[p])))
-    {
-      if (data[p] == '\0')
-        return 0;
-      p++;
-    }
-  *pos = p;
-  return p < size;
-}
-
-static int
-skipLetters (size_t * pos, const char *data, size_t size)
-{
-  size_t p = *pos;
-
-  while ((p < size) && (isalpha ( (unsigned char) data[p])))
-    {
-      if (data[p] == '\0')
-        return 0;
-      p++;
-    }
-  *pos = p;
-  return p < size;
-}
-
-static int
-lookForMultiple (const char *c, size_t * pos, const char *data, size_t size)
-{
-  size_t p = *pos;
-
-  while ((p < size) && (strchr (c, data[p]) == NULL))
-    {
-      if (data[p] == '\0')
-        return 0;
-      p++;
-    }
-  *pos = p;
-  return p < size;
-}
-
-static void
-findEntry (const char *key,
-           const char *start,
-           const char *end, const char **mstart, const char **mend)
-{
-  size_t len;
-
-  *mstart = NULL;
-  *mend = NULL;
-  len = strlen (key);
-  while (start < end - len - 1)
-    {
-      start++;
-      if (start[len] != '=')
-        continue;
-      if (0 == strncasecmp (start, key, len))
-        {
-          start += len + 1;
-          *mstart = start;
-          if ((*start == '\"') || (*start == '\''))
-            {
-              start++;
-              while ((start < end) && (*start != **mstart))
-                start++;
-              (*mstart)++;      /* skip quote */
-            }
-          else
-            {
-              while ((start < end) && (!isspace ( (unsigned char) *start)))
-                start++;
-            }
-          *mend = start;
-          return;
-        }
-    }
-}
-
-/**
- * Search all tags that correspond to "tagname".  Example:
- * If the tag is <meta name="foo" desc="bar">, and
- * tagname == "meta", keyname="name", keyvalue="foo",
- * and searchname="desc", then this function returns a
- * copy (!) of "bar".  Easy enough?
- *
- * @return NULL if nothing is found
- */
-static char *
-findInTags (TagInfo * t,
-            const char *tagname,
-            const char *keyname, const char *keyvalue, const char *searchname)
-{
-  const char *pstart;
-  const char *pend;
-
-  while (t != NULL)
-    {
-      if (tagMatch (tagname, t->tagStart, t->tagEnd))
-        {
-          findEntry (keyname, t->tagEnd, t->dataStart, &pstart, &pend);
-          if ((pstart != NULL) && (tagMatch (keyvalue, pstart, pend)))
-            {
-              findEntry (searchname, t->tagEnd, t->dataStart, &pstart, &pend);
-              if (pstart != NULL)
-                {
-                  char *ret = malloc (pend - pstart + 1);
-                 if (ret == NULL)
-                   return NULL;
-                  memcpy (ret, pstart, pend - pstart);
-                  ret[pend - pstart] = '\0';
-                  return ret;
-                }
-            }
-        }
-      t = t->next;
-    }
-  return NULL;
-}
-
-
-/* mimetype = text/html */
-int 
-EXTRACTOR_html_extract (const char *data,
-                       size_t size,
-                       EXTRACTOR_MetaDataProcessor proc,
-                       void *proc_cls,
-                       const char *options)
-{
-  size_t xsize;
-  TagInfo *tags;
-  TagInfo *t;
-  TagInfo tag;
-  size_t pos;
-  size_t tpos;
-  int i;
-  char *charset;
-  char *tmp;
-  char *xtmp;
-  int ret;
-
-  ret = 0;
-  if (size == 0)
-    return 0;
-  /* only scan first 32k */
-  if (size > 1024 * 32)
-    xsize = 1024 * 32;
-  else
-    xsize = size;
-  tags = NULL;
-  tag.next = NULL;
-  pos = 0;
-  while (pos < xsize)
-    {
-      if (!lookFor ('<', &pos, data, size))
-        break;
-      tag.tagStart = &data[++pos];
-      if (!skipLetters (&pos, data, size))
-        break;
-      tag.tagEnd = &data[pos];
-      if (!skipWhitespace (&pos, data, size))
-        break;
-    STEP3:
-      if (!lookForMultiple (">\"\'", &pos, data, size))
-        break;
-      if (data[pos] != '>')
-        {
-          /* find end-quote, ignore escaped quotes (\') */
-          do
-            {
-              tpos = pos;
-              pos++;
-              if (!lookFor (data[tpos], &pos, data, size))
-                break;
-            }
-          while (data[pos - 1] == '\\');
-          pos++;
-          goto STEP3;
-        }
-      pos++;
-      if (!skipWhitespace (&pos, data, size))
-        break;
-      tag.dataStart = &data[pos];
-      if (!lookFor ('<', &pos, data, size))
-        break;
-      tag.dataEnd = &data[pos];
-      i = 0;
-      while (relevantTags[i] != NULL)
-        {
-          if ((strlen (relevantTags[i]) == tag.tagEnd - tag.tagStart) &&
-              (0 == strncasecmp (relevantTags[i],
-                                 tag.tagStart, tag.tagEnd - tag.tagStart)))
-            {
-              t = malloc (sizeof (TagInfo));
-             if (t == NULL)
-               return 0;
-              *t = tag;
-              t->next = tags;
-              tags = t;
-              break;
-            }
-          i++;
-        }
-      /* abort early if we hit the body tag */
-      if (tagMatch ("body", tag.tagStart, tag.tagEnd))
-        break;
-    }
-
-  /* fast exit */
-  if (tags == NULL)
-    return 0;
-
-  charset = NULL;
-  /* first, try to determine mime type and/or character set */
-  tmp = findInTags (tags, "meta", "http-equiv", "content-type", "content");
-  if (tmp != NULL)
-    {
-      /* ideally, tmp == "test/html; charset=ISO-XXXX-Y" or something like 
that;
-         if text/html is present, we take that as the mime-type; if charset=
-         is present, we try to use that for character set conversion. */
-      if (0 == strncasecmp (tmp, "text/html", strlen ("text/html")))
-        ret = proc (proc_cls, 
-                   "html",
-                   EXTRACTOR_METATYPE_MIMETYPE,
-                   EXTRACTOR_METAFORMAT_UTF8,
-                   "text/plain",
-                   "text/html",
-                   strlen ("text/html")+1);
-      charset = strcasestr (tmp, "charset=");
-      if (charset != NULL)
-        charset = strdup (&charset[strlen ("charset=")]);
-      free (tmp);
-    }
-  i = 0;
-  while (tagmap[i].name != NULL)
-    {
-      tmp = findInTags (tags, "meta", "name", tagmap[i].name, "content");
-      if ( (tmp != NULL) &&
-          (ret == 0) )
-        {
-         if (charset == NULL)
-           {
-             ret = proc (proc_cls,
-                         "html",
-                         tagmap[i].type,
-                         EXTRACTOR_METAFORMAT_C_STRING,
-                         "text/plain",
-                         tmp,
-                         strlen (tmp) + 1);
-           }
-         else
-           {
-             xtmp = EXTRACTOR_common_convert_to_utf8 (tmp,
-                                                      strlen (tmp),
-                                                      charset);
-             if (xtmp != NULL)
-               {
-                 ret = proc (proc_cls,
-                             "html",
-                             tagmap[i].type,
-                             EXTRACTOR_METAFORMAT_UTF8,
-                             "text/plain",
-                             xtmp,
-                             strlen (xtmp) + 1);
-                 free (xtmp);
-               }
-           }
-        }
-      if (tmp != NULL)
-       free (tmp);
-      i++;
-    }
-  while (tags != NULL) 
-    {
-      t = tags;
-      if ( (tagMatch ("title", t->tagStart, t->tagEnd)) &&
-          (ret == 0) )
-       {
-         if (charset == NULL)
-           {
-             xtmp = malloc (t->dataEnd - t->dataStart + 1);
-             if (xtmp != NULL)
-               {
-                 memcpy (xtmp, t->dataStart, t->dataEnd - t->dataStart);
-                 xtmp[t->dataEnd - t->dataStart] = '\0';
-                 ret = proc (proc_cls,
-                             "html",
-                             EXTRACTOR_METATYPE_TITLE,
-                             EXTRACTOR_METAFORMAT_C_STRING,
-                             "text/plain",
-                             xtmp,
-                             strlen (xtmp) + 1);
-                 free (xtmp);
-               }
-           }
-         else
-           {
-             xtmp = EXTRACTOR_common_convert_to_utf8 (t->dataStart,
-                                                      t->dataEnd - 
t->dataStart,
-                                                      charset);
-             if (xtmp != NULL)
-               {
-                 ret = proc (proc_cls,
-                             "html",
-                             EXTRACTOR_METATYPE_TITLE,
-                             EXTRACTOR_METAFORMAT_UTF8,
-                             "text/plain",
-                             xtmp,
-                             strlen (xtmp) + 1);
-                 free (xtmp);
-               }
-           }
-       }
-      tags = t->next;
-      free (t);
-    }
-  if (charset != NULL)
-    free (charset);
-  return ret;
-}

Deleted: Extractor/src/plugins/id3_extractor.c
===================================================================
--- Extractor/src/plugins/id3_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/id3_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,306 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2004, 2006, 2009, 2010 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 "convert.h"
-#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-#include "extractor_plugins.h"
-
-typedef struct
-{
-  char *title;
-  char *artist;
-  char *album;
-  char *year;
-  char *comment;
-  const char *genre;
-  unsigned int track_number;
-} id3tag;
-
-static const char *const genre_names[] = {
-  gettext_noop ("Blues"),
-  gettext_noop ("Classic Rock"),
-  gettext_noop ("Country"),
-  gettext_noop ("Dance"),
-  gettext_noop ("Disco"),
-  gettext_noop ("Funk"),
-  gettext_noop ("Grunge"),
-  gettext_noop ("Hip-Hop"),
-  gettext_noop ("Jazz"),
-  gettext_noop ("Metal"),
-  gettext_noop ("New Age"),
-  gettext_noop ("Oldies"),
-  gettext_noop ("Other"),
-  gettext_noop ("Pop"),
-  gettext_noop ("R&B"),
-  gettext_noop ("Rap"),
-  gettext_noop ("Reggae"),
-  gettext_noop ("Rock"),
-  gettext_noop ("Techno"),
-  gettext_noop ("Industrial"),
-  gettext_noop ("Alternative"),
-  gettext_noop ("Ska"),
-  gettext_noop ("Death Metal"),
-  gettext_noop ("Pranks"),
-  gettext_noop ("Soundtrack"),
-  gettext_noop ("Euro-Techno"),
-  gettext_noop ("Ambient"),
-  gettext_noop ("Trip-Hop"),
-  gettext_noop ("Vocal"),
-  gettext_noop ("Jazz+Funk"),
-  gettext_noop ("Fusion"),
-  gettext_noop ("Trance"),
-  gettext_noop ("Classical"),
-  gettext_noop ("Instrumental"),
-  gettext_noop ("Acid"),
-  gettext_noop ("House"),
-  gettext_noop ("Game"),
-  gettext_noop ("Sound Clip"),
-  gettext_noop ("Gospel"),
-  gettext_noop ("Noise"),
-  gettext_noop ("Alt. Rock"),
-  gettext_noop ("Bass"),
-  gettext_noop ("Soul"),
-  gettext_noop ("Punk"),
-  gettext_noop ("Space"),
-  gettext_noop ("Meditative"),
-  gettext_noop ("Instrumental Pop"),
-  gettext_noop ("Instrumental Rock"),
-  gettext_noop ("Ethnic"),
-  gettext_noop ("Gothic"),
-  gettext_noop ("Darkwave"),
-  gettext_noop ("Techno-Industrial"),
-  gettext_noop ("Electronic"),
-  gettext_noop ("Pop-Folk"),
-  gettext_noop ("Eurodance"),
-  gettext_noop ("Dream"),
-  gettext_noop ("Southern Rock"),
-  gettext_noop ("Comedy"),
-  gettext_noop ("Cult"),
-  gettext_noop ("Gangsta Rap"),
-  gettext_noop ("Top 40"),
-  gettext_noop ("Christian Rap"),
-  gettext_noop ("Pop/Funk"),
-  gettext_noop ("Jungle"),
-  gettext_noop ("Native American"),
-  gettext_noop ("Cabaret"),
-  gettext_noop ("New Wave"),
-  gettext_noop ("Psychedelic"),
-  gettext_noop ("Rave"),
-  gettext_noop ("Showtunes"),
-  gettext_noop ("Trailer"),
-  gettext_noop ("Lo-Fi"),
-  gettext_noop ("Tribal"),
-  gettext_noop ("Acid Punk"),
-  gettext_noop ("Acid Jazz"),
-  gettext_noop ("Polka"),
-  gettext_noop ("Retro"),
-  gettext_noop ("Musical"),
-  gettext_noop ("Rock & Roll"),
-  gettext_noop ("Hard Rock"),
-  gettext_noop ("Folk"),
-  gettext_noop ("Folk/Rock"),
-  gettext_noop ("National Folk"),
-  gettext_noop ("Swing"),
-  gettext_noop ("Fast-Fusion"),
-  gettext_noop ("Bebob"),
-  gettext_noop ("Latin"),
-  gettext_noop ("Revival"),
-  gettext_noop ("Celtic"),
-  gettext_noop ("Bluegrass"),
-  gettext_noop ("Avantgarde"),
-  gettext_noop ("Gothic Rock"),
-  gettext_noop ("Progressive Rock"),
-  gettext_noop ("Psychedelic Rock"),
-  gettext_noop ("Symphonic Rock"),
-  gettext_noop ("Slow Rock"),
-  gettext_noop ("Big Band"),
-  gettext_noop ("Chorus"),
-  gettext_noop ("Easy Listening"),
-  gettext_noop ("Acoustic"),
-  gettext_noop ("Humour"),
-  gettext_noop ("Speech"),
-  gettext_noop ("Chanson"),
-  gettext_noop ("Opera"),
-  gettext_noop ("Chamber Music"),
-  gettext_noop ("Sonata"),
-  gettext_noop ("Symphony"),
-  gettext_noop ("Booty Bass"),
-  gettext_noop ("Primus"),
-  gettext_noop ("Porn Groove"),
-  gettext_noop ("Satire"),
-  gettext_noop ("Slow Jam"),
-  gettext_noop ("Club"),
-  gettext_noop ("Tango"),
-  gettext_noop ("Samba"),
-  gettext_noop ("Folklore"),
-  gettext_noop ("Ballad"),
-  gettext_noop ("Power Ballad"),
-  gettext_noop ("Rhythmic Soul"),
-  gettext_noop ("Freestyle"),
-  gettext_noop ("Duet"),
-  gettext_noop ("Punk Rock"),
-  gettext_noop ("Drum Solo"),
-  gettext_noop ("A Cappella"),
-  gettext_noop ("Euro-House"),
-  gettext_noop ("Dance Hall"),
-  gettext_noop ("Goa"),
-  gettext_noop ("Drum & Bass"),
-  gettext_noop ("Club-House"),
-  gettext_noop ("Hardcore"),
-  gettext_noop ("Terror"),
-  gettext_noop ("Indie"),
-  gettext_noop ("BritPop"),
-  gettext_noop ("Negerpunk"),
-  gettext_noop ("Polsk Punk"),
-  gettext_noop ("Beat"),
-  gettext_noop ("Christian Gangsta Rap"),
-  gettext_noop ("Heavy Metal"),
-  gettext_noop ("Black Metal"),
-  gettext_noop ("Crossover"),
-  gettext_noop ("Contemporary Christian"),
-  gettext_noop ("Christian Rock"),
-  gettext_noop ("Merengue"),
-  gettext_noop ("Salsa"),
-  gettext_noop ("Thrash Metal"),
-  gettext_noop ("Anime"),
-  gettext_noop ("JPop"),
-  gettext_noop ("Synthpop"),
-};
-
-#define GENRE_NAME_COUNT \
-    ((unsigned int)(sizeof genre_names / sizeof (const char *const)))
-
-
-
-#define OK         0
-#define INVALID_ID3 1
-
-static void
-trim (char *k)
-{
-  if (k == NULL)
-    return;
-  while ((strlen (k) > 0) && (isspace ((unsigned char) k[strlen (k) - 1])))
-    k[strlen (k) - 1] = '\0';
-}
-
-static int
-get_id3 (const char *data, int64_t offset, int64_t size, id3tag *id3)
-{
-  const char *pos;
-
-  if (size < 128)
-    return INVALID_ID3;
-
-  pos = &data[offset];
-  if (0 != strncmp ("TAG", pos, 3))
-    return INVALID_ID3;
-  pos += 3;
-
-  id3->title = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
-  trim (id3->title);
-  pos += 30;
-  id3->artist = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
-  trim (id3->artist);
-  pos += 30;
-  id3->album = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
-  trim (id3->album);
-  pos += 30;
-  id3->year = EXTRACTOR_common_convert_to_utf8 (pos, 4, "ISO-8859-1");
-  trim (id3->year);
-  pos += 4;
-  id3->comment = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
-  trim (id3->comment);
-  if ( (pos[28] == '\0') &&
-       (pos[29] != '\0') )
-    {
-      /* ID3v1.1 */
-      id3->track_number = pos[29];
-    }
-  else
-    {
-      id3->track_number = 0;
-    }
-  pos += 30;
-  id3->genre = "";
-  if (pos[0] < GENRE_NAME_COUNT)
-    id3->genre = dgettext (PACKAGE, genre_names[(unsigned) pos[0]]);
-  return OK;
-}
-
-
-#define ADD(s,t) do { if ( (s != NULL) && (strlen(s) > 0) && (0 != proc 
(proc_cls, "id3", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) 
return 1; } while (0)
-
-
-int
-EXTRACTOR_id3_extract_method (struct EXTRACTOR_PluginList *plugin,
-    EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
-{
-  id3tag info;
-  int64_t fsize;
-  unsigned char *data;
-  char track[16];
-
-  if (plugin == NULL)
-    return 1;
-
-  pl_seek (plugin, -128, SEEK_END);
-  fsize = pl_get_fsize (plugin);
-  if (fsize <= 0)
-    return 1;
-
-  if (128 != pl_read (plugin, &data, 128))
-    return 1;
-
-  memset (&info, 0, sizeof (info));
-
-  if (OK != get_id3 ((const char *) data, 0, 128, &info))
-    return 1;
-  ADD (info.title, EXTRACTOR_METATYPE_TITLE);
-  ADD (info.artist, EXTRACTOR_METATYPE_ARTIST);
-  ADD (info.album, EXTRACTOR_METATYPE_ALBUM);
-  ADD (info.year, EXTRACTOR_METATYPE_PUBLICATION_YEAR);
-  ADD (info.genre, EXTRACTOR_METATYPE_GENRE);
-  ADD (info.comment, EXTRACTOR_METATYPE_COMMENT);
-  if (info.track_number != 0)
-  {
-    snprintf (track, sizeof(track), "%u", info.track_number);
-    ADD (track, EXTRACTOR_METATYPE_TRACK_NUMBER);
-  }
-
-  if (info.title != NULL) free (info.title);
-  if (info.year != NULL) free (info.year);
-  if (info.album != NULL) free (info.album);
-  if (info.artist != NULL) free (info.artist);
-  if (info.comment != NULL) free (info.comment);
-  
-  return 1;
-}
-
-/* end of id3_extractor.c */

Deleted: Extractor/src/plugins/id3v2_extractor.c
===================================================================
--- Extractor/src/plugins/id3v2_extractor.c     2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/id3v2_extractor.c     2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,753 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2004, 2006, 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"
-#ifndef MINGW
-#include <sys/mman.h>
-#endif
-#include "convert.h"
-
-#include "extractor_plugins.h"
-
-#define DEBUG_EXTRACT_ID3v2 0
-
-enum Id3v2Fmt
-  {
-    T, /* simple, 0-terminated string, prefixed by encoding */
-    U, /* 0-terminated ASCII string, no encoding */
-    UL, /* unsync'ed lyrics */
-    SL, /* sync'ed lyrics */
-    L, /* string with language prefix */
-    I /* image */
-  };
-
-typedef struct
-{
-  const char *text;
-  enum EXTRACTOR_MetaType type;
-  enum Id3v2Fmt fmt;
-} Matches;
-
-static Matches tmap[] = {
-  /* skipping UFI */
-  {"TT1 ", EXTRACTOR_METATYPE_SECTION, T},
-  {"TT2 ", EXTRACTOR_METATYPE_TITLE, T},
-  {"TT3 ", EXTRACTOR_METATYPE_SONG_VERSION, T},
-  {"TP1 ", EXTRACTOR_METATYPE_ARTIST, T},
-  {"TP2 ", EXTRACTOR_METATYPE_PERFORMER, T},
-  {"TP3 ", EXTRACTOR_METATYPE_CONDUCTOR, T},
-  {"TP4 ", EXTRACTOR_METATYPE_INTERPRETATION, T},
-  {"TCM ", EXTRACTOR_METATYPE_COMPOSER, T},
-  {"TXT ", EXTRACTOR_METATYPE_WRITER, T},
-  {"TLA ", EXTRACTOR_METATYPE_LANGUAGE, T},
-  {"TCO ", EXTRACTOR_METATYPE_GENRE, T},
-  {"TAL ", EXTRACTOR_METATYPE_ALBUM, T},
-  {"TPA ", EXTRACTOR_METATYPE_DISC_NUMBER, T},
-  {"TRK ", EXTRACTOR_METATYPE_TRACK_NUMBER, T},
-  {"TRC ", EXTRACTOR_METATYPE_ISRC, T},
-  {"TYE ", EXTRACTOR_METATYPE_PUBLICATION_YEAR, T},
-  /*
-    FIXME: these two and TYE should be combined into
-    the actual publication date (if TRD is missing)
-  {"TDA ", EXTRACTOR_METATYPE_PUBLICATION_DATE},
-  {"TIM ", EXTRACTOR_METATYPE_PUBLICATION_DATE},
-  */
-  {"TRD ", EXTRACTOR_METATYPE_CREATION_TIME, T},
-  {"TMT ", EXTRACTOR_METATYPE_SOURCE, T},
-  {"TFT ", EXTRACTOR_METATYPE_FORMAT_VERSION, T},
-  {"TBP ", EXTRACTOR_METATYPE_BEATS_PER_MINUTE, T},
-  {"TCR ", EXTRACTOR_METATYPE_COPYRIGHT, T},
-  {"TPB ", EXTRACTOR_METATYPE_PUBLISHER, T},
-  {"TEN ", EXTRACTOR_METATYPE_ENCODED_BY, T},
-  {"TSS ", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE, T},
-  {"TOF ", EXTRACTOR_METATYPE_FILENAME, T},
-  {"TLE ", EXTRACTOR_METATYPE_DURATION, T}, /* FIXME: should append 'ms' as 
unit */
-  {"TSI ", EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE, T},
-  /* skipping TDY, TKE */
-  {"TOT ", EXTRACTOR_METATYPE_ORIGINAL_TITLE, T},
-  {"TOA ", EXTRACTOR_METATYPE_ORIGINAL_ARTIST, T},
-  {"TOL ", EXTRACTOR_METATYPE_ORIGINAL_WRITER, T},
-  {"TOR ", EXTRACTOR_METATYPE_ORIGINAL_RELEASE_YEAR, T},
-  /* skipping TXX */
-
-  {"WAF ", EXTRACTOR_METATYPE_URL, U},
-  {"WAR ", EXTRACTOR_METATYPE_URL, U},
-  {"WAS ", EXTRACTOR_METATYPE_URL, U},
-  {"WCM ", EXTRACTOR_METATYPE_URL, U},
-  {"WCP ", EXTRACTOR_METATYPE_RIGHTS, U},
-  {"WCB ", EXTRACTOR_METATYPE_URL, U},
-  /* skipping WXX */
-  {"IPL ", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME, T},
-  /* skipping MCI */
-  /* skipping ETC */
-  /* skipping MLL */
-  /* skipping STC */
-  {"ULT ", EXTRACTOR_METATYPE_LYRICS, UL},
-  {"SLT ", EXTRACTOR_METATYPE_LYRICS, SL},
-  {"COM ", EXTRACTOR_METATYPE_COMMENT, L},
-  /* skipping RVA */
-  /* skipping EQU */
-  /* skipping REV */
-  {"PIC ", EXTRACTOR_METATYPE_PICTURE, I},
-  /* skipping GEN */
-  /* {"CNT ", EXTRACTOR_METATYPE_PLAY_COUNTER, XXX}, */
-  /* {"POP ", EXTRACTOR_METATYPE_POPULARITY_METER, XXX}, */
-  /* skipping BUF */
-  /* skipping CRM */
-  /* skipping CRA */
-  /* {"LNK ", EXTRACTOR_METATYPE_URL, XXX}, */
-
-
-  {"TALB", EXTRACTOR_METATYPE_ALBUM, T},
-  {"TBPM", EXTRACTOR_METATYPE_BEATS_PER_MINUTE, T},
-  {"TCOM", EXTRACTOR_METATYPE_COMPOSER, T},
-  {"TCON", EXTRACTOR_METATYPE_SONG_VERSION, T},
-  {"TCOP", EXTRACTOR_METATYPE_COPYRIGHT, T},
-  {"TDAT", EXTRACTOR_METATYPE_CREATION_DATE, T}, /* idv23 only */
-  /* TDLY */
-  {"TENC", EXTRACTOR_METATYPE_ENCODED_BY, T},
-  {"TEXT", EXTRACTOR_METATYPE_WRITER, T},  
-  {"TFLT", EXTRACTOR_METATYPE_FORMAT_VERSION, T},
-  /* TIME, idv23 only */
-  {"TIT1", EXTRACTOR_METATYPE_SECTION, T},
-  {"TIT2", EXTRACTOR_METATYPE_TITLE, T},
-  {"TIT3", EXTRACTOR_METATYPE_SONG_VERSION, T},
-  /* TKEY */
-  {"TLAN", EXTRACTOR_METATYPE_LANGUAGE, T},
-  {"TLEN", EXTRACTOR_METATYPE_DURATION, T}, /* FIXME: should append 'ms' as 
unit */
-  {"TMED", EXTRACTOR_METATYPE_SOURCE, T}, 
-  {"TOAL", EXTRACTOR_METATYPE_ORIGINAL_TITLE, T},
-  {"TOFN", EXTRACTOR_METATYPE_ORIGINAL_ARTIST, T},
-  {"TOLY", EXTRACTOR_METATYPE_ORIGINAL_WRITER, T},
-  {"TOPE", EXTRACTOR_METATYPE_ORIGINAL_PERFORMER, T},
-  {"TORY", EXTRACTOR_METATYPE_ORIGINAL_RELEASE_YEAR, T}, /* idv23 only */
-  {"TOWN", EXTRACTOR_METATYPE_LICENSEE, T},
-  {"TPE1", EXTRACTOR_METATYPE_ARTIST, T},
-  {"TPE2", EXTRACTOR_METATYPE_PERFORMER, T},
-  {"TPE3", EXTRACTOR_METATYPE_CONDUCTOR, T},
-  {"TPE4", EXTRACTOR_METATYPE_INTERPRETATION, T}, 
-  {"TPOS", EXTRACTOR_METATYPE_DISC_NUMBER, T},
-  {"TPUB", EXTRACTOR_METATYPE_PUBLISHER, T},
-  {"TRCK", EXTRACTOR_METATYPE_TRACK_NUMBER, T},
-  /* TRDA, idv23 only */
-  {"TRSN", EXTRACTOR_METATYPE_NETWORK_NAME, T},
-  /* TRSO */
-  {"TSIZ", EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE, T}, /* idv23 only */
-  {"TSRC", EXTRACTOR_METATYPE_ISRC, T},
-  /* TSSE */
-  {"TYER", EXTRACTOR_METATYPE_PUBLICATION_YEAR, T}, /* idv23 only */
-  {"WCOM", EXTRACTOR_METATYPE_URL, U},
-  {"WCOP", EXTRACTOR_METATYPE_URL, U},
-  {"WOAF", EXTRACTOR_METATYPE_URL, U},
-  {"WOAS", EXTRACTOR_METATYPE_URL, U},
-  {"WORS", EXTRACTOR_METATYPE_URL, U},
-  {"WPAY", EXTRACTOR_METATYPE_URL, U},
-  {"WPUB", EXTRACTOR_METATYPE_URL, U},
-  {"WXXX", EXTRACTOR_METATYPE_URL, T},
-  {"IPLS", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME, T}, /* idv23 only */
-  /* ... */
-  {"USLT", EXTRACTOR_METATYPE_LYRICS, UL },
-  {"SYLT", EXTRACTOR_METATYPE_LYRICS, SL },
-  {"COMM", EXTRACTOR_METATYPE_COMMENT, L},
-  /* ... */
-  {"APIC", EXTRACTOR_METATYPE_PICTURE, I},
-  /* ... */
-  {"LINK", EXTRACTOR_METATYPE_URL, U},
-  /* ... */
-  {"USER", EXTRACTOR_METATYPE_LICENSE, T},
-  /* ... */
-
-  /* new frames in id3v24 */
-  /* ASPI, EQU2, RVA2, SEEK, SIGN, TDEN */
-  {"TDOR", EXTRACTOR_METATYPE_PUBLICATION_DATE, T},
-  /* TDRC, TDRL, TDTG */
-  {"TIPL", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME, T},
-  {"TMCL", EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST, T},
-  {"TMOO", EXTRACTOR_METATYPE_MOOD, T},
-  {"TPRO", EXTRACTOR_METATYPE_COPYRIGHT, T},
-  {"TSOA", EXTRACTOR_METATYPE_ALBUM, T},
-  {"TSOP", EXTRACTOR_METATYPE_PERFORMER, T},
-  {"TSOT", EXTRACTOR_METATYPE_TITLE, T},
-  {"TSST", EXTRACTOR_METATYPE_SUBTITLE, T},
-
-  {NULL, 0, T},
-};
-
-struct id3v2_state
-{
-  int state;
-  unsigned int tsize;
-  size_t csize;
-  char id[4];
-  int32_t ti;
-  char ver;
-  char extended_header;
-  uint16_t frame_flags;
-  char *mime;
-};
-
-enum ID3v2State
-{
-  ID3V2_INVALID = -1,
-  ID3V2_READING_HEADER = 0,
-  ID3V2_READING_FRAME_HEADER,
-  ID3V23_READING_EXTENDED_HEADER,
-  ID3V24_READING_EXTENDED_HEADER,
-  ID3V2_READING_FRAME
-};
-
-struct id3v2_state *
-EXTRACTOR_id3v2_init_state_method ()
-{
-  struct id3v2_state *state;
-  state = malloc (sizeof (struct id3v2_state));
-  if (state == NULL)
-    return NULL;
-  memset (state, 0, sizeof (struct id3v2_state));
-  state->state = ID3V2_READING_HEADER;
-  state->ti = -1;
-  state->mime = NULL;
-  return state;
-}
-
-static int
-EXTRACTOR_id3v2_discard_state_method (struct id3v2_state *state)
-{
-  if (state != NULL)
-  {
-    if (state->mime != NULL)
-      free (state->mime);
-    free (state);
-  }
-  return 1;
-}
-
-static int
-find_type (const char *id, size_t len)
-{
-  int i;
-  for (i = 0; tmap[i].text != NULL; i++)
-    if (0 == strncmp (tmap[i].text, id, len))
-      return i;
-  return -1;
-}
-
-int
-EXTRACTOR_id3v2_extract_method (struct EXTRACTOR_PluginList *plugin,
-    EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
-{
-  int64_t offset = 0;
-  struct id3v2_state *state;
-  unsigned char *data;
-  char *word = NULL;
-  unsigned int off;
-  enum EXTRACTOR_MetaType type;
-  unsigned char picture_type;
-
-  if (plugin == NULL)
-    return 1;
-
-  state = EXTRACTOR_id3v2_init_state_method ();
-  if (state == NULL)
-    return 1;
-
-  while (1)
-  {
-    switch (state->state)
-    {
-    case ID3V2_INVALID:
-      plugin->seek_request = -1;
-      return EXTRACTOR_id3v2_discard_state_method (state);
-    case ID3V2_READING_HEADER:
-      /* TODO: support id3v24 tags at the end of file. Here's a quote from id3 
faq:
-       * Q: Where is an ID3v2 tag located in an MP3 file?
-       * A: It is most likely located at the beginning of the file. Look for 
the
-       *    marker "ID3" in the first 3 bytes of the file. If it's not there, 
it
-       *    could be at the end of the file (if the tag is ID3v2.4). Look for 
the
-       *    marker "3DI" 10 bytes from the end of the file, or 10 bytes before 
the
-       *    beginning of an ID3v1 tag. Finally it is possible to embed ID3v2 
tags
-       *    in the actual MPEG stream, on an MPEG frame boundry. Almost nobody 
does
-       *    this.
-       * Parsing of such tags will not be completely correct, because we can't
-       * seek backwards. (OK, now we CAN seek backwards, but we still need to 
mind the
-       * chunk size). We will have to seek to file_size - chunk_size instead
-       * (by the way, chunk size is theoretically unknown, LE is free to use 
any chunk
-       * size, even though plugins often make assumptions about chunk size 
being large
-       * enough to make one atomic read without seeking, if offset == 0) and 
search
-       * for id3v1 at -128 offset, then look if there's a 3DI marker 10 bytes 
before
-       *  it (or 10 bytes before the end of file, if id3v1 is not there; not 
sure
-       * about APETAGs; we should probably just scan byte-by-byte from the end 
of file,
-       * until we hit 3DI, or reach the offset == 0), and use it set offset to 
the
-       * start of ID3v24 header, adjust the following file_position check and 
data
-       * indices (use offset), and otherwise proceed as normal (maybe file 
size checks
-       * along the way will have to be adjusted by -1, or made ">" instead of 
">=";
-       * these problems do not arise for tags at the beginning of the file, 
since
-       * audio itself is usually at least 1-byte long; when the tag is at the 
end of
-       * file, these checks will have to be 100% correct).
-       * If there are two tags (at the beginning and at the end of the file),
-       * a SEEK in the one at the beginning of the file can be used to seek to 
the
-       * one at the end.
-       */
-      /* TODO: merge id3v1 and id3v2 parsers. There's an "update" flag in 
id3v2 that
-       * tells the parser to augument id3v1 values with the values from id3v2 
(if this
-       * flag is not set, id3v2 parser must discard id3v1 data).
-       * At the moment id3v1 and id3v2 are parsed separately, and update flag 
is ignored.
-       */
-      if (10 != pl_read (plugin, &data, 10))
-      {
-        state->state = ID3V2_INVALID;
-        break;
-      }
-      if ((data[0] != 0x49) || (data[1] != 0x44) || (data[2] != 0x33) || 
((data[3] != 0x02) && (data[3] != 0x03) && (data[3] != 0x04))/* || (data[4] != 
0x00) minor verisons are backward-compatible*/)
-      {
-        state->state = ID3V2_INVALID;
-        break;
-      }
-      state->ver = data[3];
-      if (state->ver == 0x02)
-      {
-        state->extended_header = 0;
-      }
-      else if ((state->ver == 0x03) || (state->ver == 0x04))
-      {
-        if ((data[5] & 0x80) > 0)
-        {
-          /* unsync is not supported in id3v23 or id3v24*/
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        state->extended_header = (data[5] & 0x40) > 0;
-        if ((data[5] & 0x20) > 0)
-        {
-          /* experimental is not supported in id3v23 or id3v24*/
-          state->state = ID3V2_INVALID;
-          break;
-        }
-      }
-      state->tsize = (((data[6] & 0x7F) << 21) | ((data[7] & 0x7F) << 14) | 
((data[8] & 0x7F) << 07) | ((data[9] & 0x7F) << 00));
-      if (state->ver == 0x03 && state->extended_header)
-        state->state = ID3V23_READING_EXTENDED_HEADER;
-      else if (state->ver == 0x04 && state->extended_header)
-        state->state = ID3V24_READING_EXTENDED_HEADER;
-      else
-        state->state = ID3V2_READING_FRAME_HEADER;
-      break;
-    case ID3V23_READING_EXTENDED_HEADER:
-      if (10 != pl_read (plugin, &data, 10))
-      {
-        state->state = ID3V2_INVALID;
-        break;
-      }
-      if (state->ver == 0x03 && state->extended_header)
-      {
-        uint32_t extended_header_size;
-        extended_header_size = (((data[0]) << 24) | ((data[1]) << 16) | 
((data[2]) << 8) | ((data[3]) << 0));
-        // padding = (((data[6]) << 24) | ((data[7]) << 16) | ((data[8]) << 8) 
| ((data[9]) << 0));
-        if (extended_header_size - 6 != pl_read (plugin, &data, 
extended_header_size - 6))
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-      }
-      break;
-    case ID3V24_READING_EXTENDED_HEADER:
-      if (4 != pl_read (plugin, &data, 4))
-      {
-        state->state = ID3V2_INVALID;
-        break;
-      }
-      if ((state->ver == 0x04) && (state->extended_header))
-      {
-       uint32_t extended_header_size;
-
-        extended_header_size = (((data[0]) << 24) | 
-                               ((data[1]) << 16) | 
-                               ((data[2]) << 8) | 
-                               ((data[3]) << 0));
-        if (extended_header_size != pl_read (plugin, &data, 
extended_header_size))
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-      }
-      break;
-    case ID3V2_READING_FRAME_HEADER:
-      if (state->ver == 0x02)
-      {
-        if (6 != pl_read (plugin, &data, 6))
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-      }
-      else if ((state->ver == 0x03) || (state->ver == 0x04))
-      {
-        if (10 != pl_read (plugin, &data, 10))
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-      }
-      if (state->ver == 0x02)
-      {
-        memcpy (state->id, &data[0], 3);
-        state->csize = (data[3] << 16) + (data[4] << 8) + data[5];
-        if (state->csize == 0)
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        state->frame_flags = 0;
-      }
-      else if ((state->ver == 0x03) || (state->ver == 0x04))
-      {
-        memcpy (state->id, &data[0], 4);
-        if (state->ver == 0x03)
-          state->csize = (data[4] << 24) + (data[5] << 16) + (data[6] << 8) + 
data[7];
-        else if (state->ver == 0x04)
-          state->csize = ((data[4] & 0x7F) << 21) | ((data[5] & 0x7F) << 14) | 
((data[6] & 0x7F) << 07) | ((data[7] & 0x7F) << 00);
-        if (state->csize == 0)
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        state->frame_flags = (data[8] << 8) + data[9];
-        if (state->ver == 0x03)
-        {
-          if (((state->frame_flags & 0x80) > 0) /* compressed, not yet 
supported */ ||
-              ((state->frame_flags & 0x40) > 0) /* encrypted, not supported */)
-          {
-            /* Skip to next frame header */
-            if (state->csize != pl_read (plugin, &data, state->csize))
-              state->state = ID3V2_INVALID;
-            break;
-          }
-        }
-        else if (state->ver == 0x04)
-        {
-          if (((state->frame_flags & 0x08) > 0) /* compressed, not yet 
supported */ ||
-              ((state->frame_flags & 0x04) > 0) /* encrypted, not supported */ 
||
-              ((state->frame_flags & 0x02) > 0) /* unsynchronization, not 
supported */)
-          {
-            /* Skip to next frame header */
-            if (state->csize != pl_read (plugin, &data, state->csize))
-              state->state = ID3V2_INVALID;
-            break;
-          }
-          if ((state->frame_flags & 0x01) > 0)
-          {
-            /* Skip data length indicator */
-            state->csize -= 4;
-            if (4 != pl_read (plugin, &data, 4))
-            {
-              state->state = ID3V2_INVALID;
-              break;
-            }
-          }
-        }
-      }
-
-      state->ti = find_type ((const char *) state->id, (state->ver == 0x02) ? 
3 : (((state->ver == 0x03) || (state->ver == 0x04)) ? 4 : 0));
-      if (state->ti == -1)
-      {
-        if (state->csize != pl_read (plugin, &data, state->csize))
-          state->state = ID3V2_INVALID;
-        break;
-      }
-      state->state = ID3V2_READING_FRAME;
-      break;
-    case ID3V2_READING_FRAME:
-      if (0 > (offset = pl_get_pos (plugin)))
-      {
-        state->state = ID3V2_INVALID;
-        break;
-      }
-      word = NULL;
-      if (((state->ver == 0x03) && ((state->frame_flags & 0x20) > 0)) ||
-          ((state->ver == 0x04) && ((state->frame_flags & 0x40) > 0)))
-      {
-        /* "group" identifier, skip a byte */
-        if (1 != pl_read (plugin, &data, 1))
-        {
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        state->csize--;
-      }
-      if (state->csize != pl_read (plugin, &data, state->csize))
-      {
-        state->state = ID3V2_INVALID;
-        break;
-      }
-      switch (tmap[state->ti].fmt)
-      {
-      case T:
-        if (data[0] == 0x00)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
-              state->csize - 1, "ISO-8859-1");
-        else if (data[0] == 0x01)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
-              state->csize - 1, "UCS-2");
-        else if ((state->ver == 0x04) && (data[0] == 0x02))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
-              state->csize - 1, "UTF-16BE");
-        else if ((state->ver == 0x04) && (data[0] == 0x03))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
-              state->csize - 1, "UTF-8");
-        else
-          /* bad encoding byte, try to convert from iso-8859-1 */
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
-              state->csize - 1, "ISO-8859-1");
-        break;
-      case U:
-        word = EXTRACTOR_common_convert_to_utf8 ((const char *) data,
-            state->csize, "ISO-8859-1");
-        break;
-      case UL:
-        if (state->csize < 6)
-        {
-          /* malformed */
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        /* find end of description */
-        off = 4;
-        while ((off < state->csize) && (data[off] != '\0'))
-          off++;
-        if ((off >= state->csize) || (data[off] != '\0'))
-        {
-          /* malformed */
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        off++;
-        if (data[0] == 0x00)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "ISO-8859-1");
-        else if (data[0] == 0x01)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "UCS-2");
-        else if ((state->ver == 0x04) && (data[0] == 0x02))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "UTF-16BE");
-        else if ((state->ver == 0x04) && (data[0] == 0x03))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "UTF-8");
-        else
-          /* bad encoding byte, try to convert from iso-8859-1 */
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "ISO-8859-1");
-        break;
-      case SL:
-        if (state->csize < 7)
-        {
-          /* malformed */
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        if (data[0] == 0x00)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
-              state->csize - 6, "ISO-8859-1");
-        else if (data[0] == 0x01)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
-              state->csize - 6, "UCS-2");
-        else if ((state->ver == 0x04) && (data[0] == 0x02))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
-              state->csize - 6, "UTF-16BE");
-        else if ((state->ver == 0x04) && (data[0] == 0x03))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
-              state->csize - 6, "UTF-8");
-        else
-          /* bad encoding byte, try to convert from iso-8859-1 */
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
-              state->csize - 6, "ISO-8859-1");
-        break;
-      case L:
-        if (state->csize < 5)
-        {
-          /* malformed */
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        /* find end of description */
-        off = 4;
-        while ((off < state->csize) && (data[off] != '\0'))
-          off++;
-        if ((off >= state->csize) || (data[off] != '\0'))
-        {
-          /* malformed */
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        off++;
-
-        if (data[0] == 0x00)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "ISO-8859-1");
-        else if (data[0] == 0x01)
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "UCS-2");
-        else if ((state->ver == 0x04) && (data[0] == 0x02))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "UTF-1offBE");
-        else if ((state->ver == 0x04) && (data[0] == 0x03))
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "UTF-8");
-        else
-          /* bad encoding byte, try to convert from iso-8859-1 */
-          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
-              state->csize - off, "ISO-8859-1");
-        break;
-      case I:
-        if ( ( (state->ver == 0x02) && 
-              (state->csize < 7) ) ||
-            ( ( (state->ver == 0x03) || 
-                (state->ver == 0x04)) && (state->csize < 5)) )
-        {
-          /* malformed */
-          state->state = ID3V2_INVALID;
-          break;
-        }
-        if (state->mime != NULL)
-          free (state->mime);
-        state->mime = NULL;
-        if (state->ver == 0x02)
-        {
-          off = 5;
-          picture_type = data[4];
-        }
-        else if ((state->ver == 0x03) || (state->ver == 0x04))
-        {
-          off = 1;
-          while ((off < state->csize) && (data[off] != '\0'))
-            off++;
-          if ((off >= state->csize) || (data[off] != '\0'))
-          {
-            /* malformed */
-            state->state = ID3V2_INVALID;
-            break;
-          }
-          state->mime = malloc (off);
-          memcpy (state->mime, &data[1], off - 1);
-          state->mime[off - 1] = '\0';
-          off += 1;
-          picture_type = data[off];
-          off += 1;
-          /* find end of mime type*/
-          while ((off < state->csize) && (data[off] != '\0'))
-            off++;
-          if ((off >= state->csize) || (data[off] != '\0'))
-          {
-            free (state->mime);
-            state->mime = NULL;
-            /* malformed */
-            state->state = ID3V2_INVALID;
-            break;
-          }
-          off++;
-        }
-        switch (picture_type)
-        {
-        case 0x03:
-        case 0x04:
-          type = EXTRACTOR_METATYPE_COVER_PICTURE;
-          break;
-        case 0x07:
-        case 0x08:
-        case 0x09:
-        case 0x0A:
-        case 0x0B:
-        case 0x0C:
-          type = EXTRACTOR_METATYPE_CONTRIBUTOR_PICTURE;
-          break;
-        case 0x0D:
-        case 0x0E:
-        case 0x0F:
-          type = EXTRACTOR_METATYPE_EVENT_PICTURE;
-          break;
-        case 0x14:
-          type = EXTRACTOR_METATYPE_LOGO;
-          type = EXTRACTOR_METATYPE_LOGO;
-          break;
-        default:
-          type = EXTRACTOR_METATYPE_PICTURE;
-          break;
-        }
-        if (state->ver == 0x02)
-        {
-          if (0 == strncasecmp ("PNG", (const char *) &data[1], 3))
-            state->mime = strdup ("image/png");
-          else if (0 == strncasecmp ("JPG", (const char *) &data[1], 3))
-            state->mime = strdup ("image/jpeg");
-          else
-            state->mime = NULL;
-        }
-        else if (((state->ver == 0x03) || (state->ver == 0x04)) && (strchr 
(state->mime, '/') == NULL))
-        {
-          size_t mime_len = strlen (state->mime);
-          char *type_mime = malloc (mime_len + 6 + 1);
-          snprintf (type_mime, mime_len + 6 + 1, "image/%s", state->mime);
-          free (state->mime);
-          state->mime = type_mime;
-        }
-        if ((state->mime != NULL) && (0 == strcmp (state->mime, "-->")))
-        {
-          /* not supported */
-          free (state->mime);
-          state->mime = NULL;
-        }
-        else
-        {
-          if (0 != proc (proc_cls, "id3v2", type, EXTRACTOR_METAFORMAT_BINARY, 
state->mime, (const char*) &data[off], state->csize - off))
-          {
-            if (state->mime != NULL)
-              free (state->mime);
-            state->mime = NULL;
-            return 1;
-          }
-          if (state->mime != NULL)
-            free (state->mime);
-          state->mime = NULL;
-        }
-        word = NULL;
-        break;
-      default:
-        return 1;
-      }
-      if ((word != NULL) && (strlen (word) > 0))
-      {
-        if (0 != proc (proc_cls, "id3v2", tmap[state->ti].type, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", word, strlen (word) + 1))
-        {
-          free (word);
-          return 1;
-        }
-      }
-      if (word != NULL)
-        free (word);
-      state->state = ID3V2_READING_FRAME_HEADER;
-    break;
-    }
-  }
-  return 1;
-}
-
-/* end of id3v2_extractor.c */

Deleted: Extractor/src/plugins/man_extractor.c
===================================================================
--- Extractor/src/plugins/man_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/man_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,232 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 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.
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include <ctype.h>
-
-static char *
-stndup (const char *str, size_t n)
-{
-  char *tmp;
-  tmp = malloc (n + 1);
-  if (tmp == NULL)
-    return NULL;
-  tmp[n] = '\0';
-  memcpy (tmp, str, n);
-  return tmp;
-}
-
-static int
-addKeyword (enum EXTRACTOR_MetaType type,
-            char *keyword, 
-           EXTRACTOR_MetaDataProcessor proc,
-           void *proc_cls)
-{
-  int ret;
-  if (keyword == NULL)
-    return 0;
-  if (strlen (keyword) == 0)
-    {
-      free (keyword);
-      return 0;
-    }
-  if ((keyword[0] == '\"') && (keyword[strlen (keyword) - 1] == '\"'))
-    {
-      char *tmp;
-
-      keyword[strlen (keyword) - 1] = '\0';
-      tmp = strdup (&keyword[1]);
-      free (keyword);
-      if (tmp == NULL)
-       return 0;
-      keyword = tmp;
-    }
-  if (strlen (keyword) == 0)
-    {
-      free (keyword);
-      return 0;
-    }
-  ret = proc (proc_cls, 
-             "man",
-             type,
-             EXTRACTOR_METAFORMAT_UTF8,
-             "text/plain",
-             keyword,
-             strlen (keyword)+1);
-  free (keyword);
-  return ret;
-}
-
-static void
-NEXT (size_t * end, const char *buf, const size_t size)
-{
-  int quot;
-
-  quot = 0;
-  while ((*end < size) && (((quot & 1) != 0) || ((buf[*end] != ' '))))
-    {
-      if (buf[*end] == '\"')
-        quot++;
-      (*end)++;
-    }
-  if ((quot & 1) == 1)
-    (*end) = size + 1;
-}
-
-/**
- * How many bytes do we actually try to scan? (from the beginning
- * of the file).
- */
-#define MAX_READ (16 * 1024)
-
-#define ADD(t,s) do { if (0 != addKeyword (t, s, proc, proc_cls)) return 1; } 
while (0)
-
-int 
-EXTRACTOR_man_extract (const char *buf,
-                      size_t size,
-                      EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls,
-                      const char *options)
-{
-  int pos;
-  size_t xsize;
-  const size_t xlen = strlen (".TH ");
-
-  if (size > MAX_READ)
-    size = MAX_READ;
-  pos = 0;
-  if (size < xlen)
-    return 0;
-  while ((pos < size - xlen) &&
-         ((0 != strncmp (".TH ",
-                         &buf[pos],
-                         xlen)) || ((pos != 0) && (buf[pos - 1] != '\n'))))
-    {
-      if (!isgraph ((unsigned char) buf[pos]) && 
-         !isspace ((unsigned char) buf[pos]))
-        return 0;
-      pos++;
-    }
-  xsize = pos;
-  while ((xsize < size) && (buf[xsize] != '\n'))
-    xsize++;
-  size = xsize;
-
-  if (0 == strncmp (".TH ", &buf[pos], xlen))
-    {
-      size_t end;
-
-      pos += xlen;
-      end = pos;
-      NEXT (&end, buf, size);
-      if (end > size)
-        return 0;
-      if (end - pos > 0)
-        {
-          ADD (EXTRACTOR_METATYPE_TITLE, stndup (&buf[pos], end - pos));
-          pos = end + 1;
-        }
-      if (pos >= size)
-        return 0;
-      end = pos;
-      NEXT (&end, buf, size);
-      if (end > size)
-        return 0;
-      if (buf[pos] == '\"')
-        pos++;
-      if ((end - pos >= 1) && (end - pos <= 4))
-        {
-          switch (buf[pos])
-            {
-            case '1':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                  strdup (_("Commands")));
-              break;
-            case '2':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("System calls")));
-              break;
-            case '3':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("Library calls")));
-              break;
-            case '4':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("Special files")));
-              break;
-            case '5':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("File formats and conventions")));
-              break;
-            case '6':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("Games")));
-              break;
-            case '7':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("Conventions and miscellaneous")));
-              break;
-            case '8':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("System management commands")));
-              break;
-            case '9':
-              ADD (EXTRACTOR_METATYPE_SECTION,
-                                 strdup (_("Kernel routines")));
-              break;
-            }
-          pos = end + 1;
-        }
-      end = pos;
-      NEXT (&end, buf, size);
-      if (end > size)
-        return 0;
-      if (end - pos > 0)
-        {
-          ADD (EXTRACTOR_METATYPE_MODIFICATION_DATE, stndup (&buf[pos], end - 
pos));
-          pos = end + 1;
-        }
-      end = pos;
-      NEXT (&end, buf, size);
-      if (end > size)
-        return 0;
-      if (end - pos > 0)
-        {
-          ADD (EXTRACTOR_METATYPE_SOURCE,
-              stndup (&buf[pos], end - pos));
-          pos = end + 1;
-        }
-      end = pos;
-      NEXT (&end, buf, size);
-      if (end > size)
-        return 0;
-      if (end - pos > 0)
-        {
-          ADD (EXTRACTOR_METATYPE_BOOK_TITLE,
-              stndup (&buf[pos], end - pos));
-          pos = end + 1;
-        }
-    }
-
-  return 0;
-}
-
-/* end of man_extractor.c */

Deleted: Extractor/src/plugins/mkv_extractor.c
===================================================================
--- Extractor/src/plugins/mkv_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/mkv_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,409 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2004, 2005, 2006, 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.
- */
-
- /*
-  * Made by Gabriel Peixoto
-  * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin.
-  *
-  */
-
-#include "platform.h"
-#include "extractor.h"
-#include <stdint.h>
-
-#define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "mkv", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto EXIT; } while 
(0)
-
-/**
- * FIXME: document
- */
-#define BUFFER_SIZE 0x4000
-
-/**
- * FIXME: document
- */
-#define MAX_STRING_SIZE 1024
-
-/**
- * FIXME: document
- */
-#define MAX_STREAMS 9
-
-/**
- * FIXME: document
- */
-enum MKV_TrackType
-{
-  MKV_Track_video = 1,
-  MKV_Track_audio = 2,
-  MKV_Track_subtitle = 3,
-  MKV_Track_subtitle_orig = 0x11
-};
-
-/**
- * FIXME: document
- */
-enum
-{
-  MKVID_OutputSamplingFrequency = 0x78B5,
-  MKVID_FILE_BEGIN = 0x1A,
-  MKVID_EBML = 0x1A45DFA3,
-  MKVID_Segment = 0x18538067,
-  MKVID_Info = 0x1549A966,
-  MKVID_Tracks = 0x1654AE6B,
-  MKVID_TrackEntry = 0xAE,
-  MKVID_TrackType = 0x83,
-  MKVID_DefaultDuration = 0x23E383,
-  MKVID_Language = 0x22B59C,
-  MKVID_CodecID = 0x86,
-  MKVID_CodecPrivate = 0x63A2,
-  MKVID_PixelWidth = 0xB0,
-  MKVID_PixelHeight = 0xBA,
-  MKVID_TimeCodeScale = 0x2AD7B1,
-  MKVID_Duration = 0x4489,
-  MKVID_Channels = 0x9F,
-  MKVID_BitDepth = 0x6264,
-  MKVID_SamplingFrequency = 0xB5,
-  MKVID_Title = 0x7BA9,
-  MKVID_Tags = 0x1254C367,
-  MKVID_SeekHead = 0x114D9B74,
-  MKVID_Video = 0xE0,
-  MKVID_Audio = 0xE1,
-  MKVID_CodecName = 0x258688,
-  MKVID_DisplayHeight = 0x54BA,
-  MKVID_DisplayWidth = 0x54B0
-};
-
-
-/**
- * FIXME: document 'flag', should 'temp'/'result' really be signed?
- *
- * @return 0 on error, otherwise number of bytes read from buffer
- */
-static size_t
-VINTparse (const unsigned char *buffer, size_t start, size_t end,
-           int64_t * result, int flag)
-{
-  static const unsigned char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 
0x2, 0x1 };
-  static const unsigned char imask[8] = { 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 
0x1, 00 };
-  int vint_width;
-  unsigned int c;
-  int64_t temp;
-  unsigned char tempc;
-
-  if (end - start < 2)  
-    return 0;                   /*ops */  
-  
-  vint_width = 0;
-  for (c = 0; c < 8; c++)
-    if (!(buffer[start] & mask[c]))
-      vint_width++;
-    else
-      break;
-  if ( (vint_width >= 8) || (vint_width + start + 1 >= end) )
-    return 0;
-  
-  *result = 0;
-  for (c = 0; c < vint_width; c++)
-  {
-    tempc = buffer[start + vint_width - c];
-    temp = tempc << (c * 8);
-    *result += temp;
-  }
-  if (flag)
-    *result += (buffer[start] & imask[vint_width]) << (vint_width * 8);
-  else
-    *result += (buffer[start]) << (vint_width * 8);
-  return vint_width + 1;
-}
-
-
-/**
- * FIXME: document arguments, return value...
- */
-static unsigned int
-elementRead (const unsigned char *buffer, size_t start, size_t end,
-             uint32_t *id, int64_t * size)
-{
-  int64_t tempID;
-  int64_t tempsize;
-  size_t id_offset;
-  size_t size_offset;
-
-  tempID = 0;
-  
-  id_offset = VINTparse (buffer, start, end, &tempID, 0);
-  if (!id_offset)
-    return 0;
-  size_offset = VINTparse (buffer, start + id_offset, end, &tempsize, 1);
-  if (!size_offset)
-    return 0;
-  *id = (uint32_t) tempID;
-  *size = tempsize;
-  return id_offset + size_offset;
-}
-
-
-/**
- * FIXME: signed or unsigned return value?
- */
-static int64_t
-getInt (const unsigned char *buffer, size_t start, size_t size)
-{
-  /*return a int [8-64], from buffer, Big Endian*/
-  int64_t result;
-  size_t c;
-
-  result = 0;
-  for (c = 1; c <= size; c++)
-    result += ((uint64_t)buffer[start + c - 1]) << (8 * (size - c));  
-  return result;
-}
-
-static float
-getFloat (const unsigned char *buffer, size_t start, size_t size)
-{
-  unsigned char tmp[4];
-
-  if (size != sizeof (float))
-    return 0.0;
-  if (size == sizeof (float))
-  {
-    tmp[0] = buffer[start + 3];
-    tmp[1] = buffer[start + 2];
-    tmp[2] = buffer[start + 1];
-    tmp[3] = buffer[start];
-    return *((float *) (tmp));
-  }
-  return 0.0;
-}
-
-static const unsigned int MKV_Parse_list[] = { 
-  /*Elements, containing requed information (sub-elements), see enum in mkv.h 
for values */
-  MKVID_Segment,
-  MKVID_Info,
-  MKVID_Video,
-  MKVID_Audio,
-  MKVID_TrackEntry,
-  MKVID_Tracks
-};
-
-static const char stream_type_letters[] = "?vat";      /*[0]-no, 
[1]-video,[2]-audio,[3]-text */
-
-
-/* video/mkv */
-int
-EXTRACTOR_mkv_extract (const unsigned char *data, size_t size,
-                       EXTRACTOR_MetaDataProcessor proc, void *proc_cls,
-                       const char *options)
-{
-  int ret;
-  char buffer[256];
-  size_t p;
-  int c;
-  uint32_t eID;
-  int64_t eSize; /* signed? */
-  unsigned int offs;
-  int64_t timescale = 1000000;
-  float duration = -1.0;
-  enum MKV_TrackType trackType;
-  int have_audio = 0;
-  int have_video = 0;
-  unsigned int value_width = 0;
-  unsigned int value_height = 0;
-  int64_t value;
-  size_t size1;
-  const unsigned char *start;
-  int is_mkv = 0;
-  unsigned int fps = 0;
-  unsigned int bit_depth = 0;
-  const unsigned char *codec = NULL;
-  int codec_strlen = 0;
-
-  if (size > 32 * 1024)
-    size1 = 32 * 1024;
-  else
-    size1 = size;
-  start = memchr (data, MKVID_FILE_BEGIN, size1);
-  if (NULL == start)
-    return 0;
-  p = start - data;
-  
-/*main loop*/
-  ret = 0;
-  do
-  {
-    offs = elementRead (data, p, size, &eID, &eSize);
-    p += offs;
-    if (!offs || p >= size)
-      break;
-    if (MKVID_EBML == eID)
-    {
-      ADD ("video/mkv", EXTRACTOR_METATYPE_MIMETYPE);
-      is_mkv = 1;
-      continue;
-    }
-    if (! is_mkv)
-      return 0;
-    for (c = 0; c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list); c++)
-      if (MKV_Parse_list[c] == eID)      
-        break;      
-    if (c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list))
-      continue;
-
-    if (p + eSize > size)
-      break;
-
-    if ( (eSize == 4) || (eSize == 8) || (eSize == 1) || (eSize == 2))
-      value = getInt (data, p, eSize);
-    
-    switch (eID)
-    {
-    case MKVID_TrackType:      /*detect a stream type (video/audio/text) */
-      trackType = (enum MKV_TrackType) value;
-      switch (trackType)
-      {
-      case MKV_Track_video:
-        have_video = 1;
-        break;
-      case MKV_Track_audio:
-        have_audio = 1;
-        break;
-      case MKV_Track_subtitle:
-        break;       
-      case MKV_Track_subtitle_orig:
-        break;       
-      }
-      break;
-    case MKVID_DefaultDuration:
-      if (value > 0)
-        fps = (unsigned int) (1000000000 / value);
-      else
-        fps = 0;
-      break;
-    case MKVID_Language:
-      snprintf (buffer, 
-               sizeof (buffer),
-               "%.*s",
-               (int) eSize,
-               data + p);
-      ADD (buffer, EXTRACTOR_METATYPE_LANGUAGE);
-      break;
-    case MKVID_CodecName:
-    case MKVID_CodecID:
-      codec = data + p;
-      codec_strlen = eSize;
-      break;
-    case MKVID_CodecPrivate:
-      break;
-    case MKVID_PixelWidth:     /*pasthough *//*bug with aspect differ from 1:1 
*/
-    case MKVID_DisplayWidth:
-      value_width = value;
-      break;
-    case MKVID_PixelHeight:    /*pasthough */
-    case MKVID_DisplayHeight:
-      value_height = value;
-      break;
-    case MKVID_TimeCodeScale:
-      timescale = getInt (data, p, eSize);
-      break;
-    case MKVID_Duration:
-      duration = getFloat (data, p, eSize);
-      break;
-    case MKVID_Channels:
-      /* num_channels = (unsigned int) value; */
-      break;
-    case MKVID_BitDepth:
-      bit_depth = (unsigned int) value;
-      break;
-    case MKVID_OutputSamplingFrequency:
-    case MKVID_SamplingFrequency:
-      /* FIXME: what unit has 'value'? */
-      break;
-    case MKVID_Title:
-      if (eSize > MAX_STRING_SIZE)
-        break;
-      snprintf (buffer,
-               sizeof (buffer),
-               "%.*s", 
-               (int) eSize,
-               (const char*) data + p);
-      ADD (buffer, EXTRACTOR_METATYPE_TITLE);
-      break;
-    default:
-      break;
-    }
-    p += eSize;                 /*skip unknown or uninteresting */
-  }
-  while (1);
-
-  snprintf (buffer,
-           sizeof (buffer),
-           "%u s (%s%s%s)",
-           (unsigned int) (duration / 1e+9 * (float) timescale),
-           (have_audio ? "audio" : ""),
-           ((have_audio && have_video) ? "/" : ""),
-           (have_video ? "video" : ""));
-  if ( (have_audio || have_video) && (duration >= 0.0) )
-    ADD (buffer, EXTRACTOR_METATYPE_DURATION);
-  if ( (value_width != 0) && (value_height != 0) )    
-  {
-    snprintf (buffer,
-             sizeof(buffer),
-             "%ux%u", 
-             value_width, value_height);
-    ADD (buffer, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
-  }
-
-  if (NULL != codec)
-  {
-    if ( (fps != 0) && (bit_depth != 0) )
-      snprintf (buffer,
-               sizeof (buffer),
-               "%.*s (%u fps, %u bit)", 
-               codec_strlen,
-               codec,
-               fps,
-               bit_depth);
-    else if (fps != 0)
-      snprintf (buffer,
-               sizeof (buffer),
-               "%.*s (%u fps)", 
-               codec_strlen,
-               codec,
-               fps);
-    else if (bit_depth != 0)
-      snprintf (buffer,
-               sizeof (buffer),
-               "%.*s (%u bit)", 
-               codec_strlen,
-               codec,
-               bit_depth);
-    else
-      snprintf (buffer,
-               sizeof (buffer),
-               "%.*s",
-               codec_strlen,
-               codec);  
-    ADD (buffer, 
-        EXTRACTOR_METATYPE_FORMAT);    
-  }
-EXIT:
-  return ret;
-}

Deleted: Extractor/src/plugins/mp3_extractor.c
===================================================================
--- Extractor/src/plugins/mp3_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/mp3_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,393 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2004, 2006, 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.
-
-
-     Some of this code is based on AVInfo 1.0 alpha 11
-     (c) George Shuklin, gs]AT[shounen.ru, 2002-2004
-     http://shounen.ru/soft/avinfo/
-
- */
-
-#define DEBUG_EXTRACT_MP3 0
-
-#include "platform.h"
-#include "extractor.h"
-#include "convert.h"
-#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-#include "extractor_plugins.h"
-
-#include "le_architecture.h"
-
-#define LARGEST_FRAME_SIZE 8065
-
-enum
-{ MPEG_ERR = 0, MPEG_V1 = 1, MPEG_V2 = 2, MPEG_V25 = 3 };
-
-enum
-{ LAYER_ERR = 0, LAYER_1 = 1, LAYER_2 = 2, LAYER_3 = 3 };
-
-#define MPA_SYNC_MASK          ((unsigned int) 0xFFE00000)
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define MPA_SYNC_MASK_MEM      ((unsigned int) 0xFFE00000)
-#else
-#define MPA_SYNC_MASK_MEM      ((unsigned int) 0x0000E0FF)
-#endif
-#define MPA_LAST_SYNC_BIT_MASK ((unsigned int) 0x00100000)
-#define MPA_VERSION_MASK       ((unsigned int) 0x00080000)
-#define MPA_LAYER_MASK         ((unsigned int) 0x3)
-#define MPA_LAYER_SHIFT        17
-#define MPA_BITRATE_MASK       ((unsigned int) 0xF)
-#define MPA_BITRATE_SHIFT      12
-#define MPA_FREQ_MASK          ((unsigned int) 0x3)
-#define MPA_FREQ_SHIFT         10
-#define MPA_CHMODE_MASK        ((unsigned int) 0x3)
-#define MPA_CHMODE_SHIFT       6
-#define MPA_PADDING_SHIFT      9
-#define MPA_COPYRIGHT_SHIFT    3
-#define MPA_ORIGINAL_SHIFT     2
-
-static const unsigned int bitrate_table[16][6] = {
-  {0,   0,   0,   0,   0,   0},
-  {32,  32,  32,  32,  8,   8},
-  {64,  48,  40,  48,  16,  16},
-  {96,  56,  48,  56,  24,  24},
-  {128, 64,  56,  64,  32,  32},
-  {160, 80,  64,  80,  40,  40},
-  {192, 96,  80,  96,  48,  48},
-  {224, 112, 96,  112, 56,  56},
-  {256, 128, 112, 128, 64,  64},
-  {288, 160, 128, 144, 80,  80},
-  {320, 192, 160, 160, 96,  96},
-  {352, 224, 192, 176, 112, 112},
-  {384, 256, 224, 192, 128, 128},
-  {416, 320, 256, 224, 144, 144},
-  {448, 384, 320, 256, 160, 160},
-  {-1, -1, -1, -1, -1, -1}
-};
-static const int freq_table[4][3] = {
-  {44100, 22050, 11025},
-  {48000, 24000, 12000},
-  {32000, 16000, 8000}
-};
-static const char * const channel_modes[4] = {
-  gettext_noop("stereo"),
-  gettext_noop("joint stereo"),
-  gettext_noop("dual channel"),
-  gettext_noop("mono")
-};
-static const char * const mpeg_versions[3] = {
-  gettext_noop("MPEG-1"),
-  gettext_noop("MPEG-2"),
-  gettext_noop("MPEG-2.5")
-};
-static const char * const layer_names[3] = {
-  gettext_noop("Layer I"),
-  gettext_noop("Layer II"),
-  gettext_noop("Layer III")
-};
-
-
-#define OK         0
-#define SYSERR     1
-#define INVALID_ID3 2
-
-#define ADDR(s,t) do { if (0 != proc (proc_cls, "mp3", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0)
-
-struct mp3_state
-{
-  int state;
-
-  uint32_t header;
-  int sample_rate;
-  char mpeg_ver;
-  char layer;
-  char vbr_flag;
-  int ch;
-  char copyright_flag;
-  char original_flag;
-  int avg_bps;
-  int bitrate;
-
-  int64_t number_of_frames;
-  int64_t number_of_valid_frames;
-};
-
-enum MP3State
-{
-  MP3_LOOKING_FOR_FRAME = 0,
-  MP3_READING_FRAME = 1,
-};
-
-static struct mp3_state *
-EXTRACTOR_mp3_init_state_method ()
-{
-  struct mp3_state *state;
-  state = malloc (sizeof (struct mp3_state));
-  if (state == NULL)
-    return NULL;
-  state->header = 0;
-  state->sample_rate = 0;
-  state->number_of_frames = 0;
-  state->number_of_valid_frames = 0;
-  state->mpeg_ver = 0;
-  state->layer = 0;
-  state->vbr_flag = 0;
-  state->ch = 0;
-  state->copyright_flag = 0;
-  state->original_flag = 0;
-  state->avg_bps = 0;
-  state->bitrate = 0;
-  state->state = 0;
-  return state;
-}
-
-static int
-EXTRACTOR_mp3_discard_state_method (struct mp3_state *state)
-{
-  if (state != NULL)
-  {
-    free (state);
-  }
-  return 1;
-}
-
-static int
-calculate_frame_statistics_and_maybe_report_it (struct EXTRACTOR_PluginList 
*plugin,
-    struct mp3_state *state, EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
-{
-  int length;
-  char format[512];
-
-  if (((double) state->number_of_valid_frames / (double) 
state->number_of_frames) < 0.8 ||
-      state->number_of_valid_frames <= 2)
-    /* Unlikely to be an mp3 file */
-    return 0;
-  ADDR ("audio/mpeg", EXTRACTOR_METATYPE_MIMETYPE);
-  state->avg_bps = state->avg_bps / state->number_of_valid_frames;
-  if (state->sample_rate > 0)
-    length = 1152 * state->number_of_valid_frames / state->sample_rate;
-  else if (state->avg_bps > 0 || state->bitrate > 0)
-    length = plugin->fsize / (state->avg_bps ? state->avg_bps : state->bitrate 
? state->bitrate : 1) / 125;
-  else
-    length = 0;
-
-  ADDR (mpeg_versions[state->mpeg_ver - 1], EXTRACTOR_METATYPE_FORMAT_VERSION);
-  snprintf (format,
-           sizeof (format),
-           "%s %s audio, %d kbps (%s), %d Hz, %s, %s, %s",
-            mpeg_versions[state->mpeg_ver - 1],
-            layer_names[state->layer - 1],
-            state->avg_bps,
-            state->vbr_flag ? _("VBR") : _("CBR"),
-            state->sample_rate,
-            channel_modes[state->ch],
-            state->copyright_flag ? _("copyright") : _("no copyright"),
-            state->original_flag ? _("original") : _("copy") );
-
-  ADDR (format, EXTRACTOR_METATYPE_RESOURCE_TYPE);
-  snprintf (format,
-           sizeof (format), "%dm%02d",
-            length / 60, length % 60);
-  ADDR (format, EXTRACTOR_METATYPE_DURATION);
-  return 0;
-}
-
-int
-EXTRACTOR_mp3_extract_method (struct EXTRACTOR_PluginList *plugin,
-                       EXTRACTOR_MetaDataProcessor proc,
-                      void *proc_cls)
-{
-  int64_t offset = 0;
-  int64_t round_offset;
-  int64_t read_result;
-  int64_t i;
-  unsigned char *data;
-  struct mp3_state *state;
-
-  int start_anew = 0;
-
-  char mpeg_ver = 0;
-  char layer = 0;
-  int idx_num = 0;
-  int bitrate = 0;              /*used for each frame */
-  int copyright_flag = 0;
-  int original_flag = 0;
-  int sample_rate = 0;
-  int ch = 0;
-  int frame_size;
-
-  if (plugin == NULL)
-    return 1;
-
-  state = EXTRACTOR_mp3_init_state_method ();
-  if (state == NULL)
-    return 1;
-
-  while (1)
-  {
-    switch (state->state)
-    {
-    case MP3_LOOKING_FOR_FRAME:
-      /* Look for a frame header */
-      round_offset = offset = pl_get_pos (plugin);
-      while (1)
-      {
-        pl_seek (plugin, offset, SEEK_SET);
-        read_result = pl_read (plugin, &data, 1024*1024);
-        if (read_result < 4)
-        {
-          calculate_frame_statistics_and_maybe_report_it (plugin, state, proc, 
proc_cls);
-          return EXTRACTOR_mp3_discard_state_method (state);
-        }
-        for (i = 0; i + 3 < read_result; i++)
-          if (((*((uint32_t *) &data[i])) & MPA_SYNC_MASK_MEM) == 
MPA_SYNC_MASK_MEM)
-            break;
-        if (i + 3 >= 1024*1024)
-          offset += read_result - 3;
-        else
-          break;
-        if (offset > round_offset + 31*1024*1024)
-        {
-          if (((state->number_of_valid_frames > 2) && ((double) 
state->number_of_valid_frames / (double) state->number_of_frames) < 0.8))
-          {
-            calculate_frame_statistics_and_maybe_report_it (plugin, state, 
proc, proc_cls);
-          }
-          return EXTRACTOR_mp3_discard_state_method (state);
-        }
-      }
-      pl_seek (plugin, offset + i, SEEK_SET);
-      if (4 != pl_read (plugin, &data, 4))
-      {
-        calculate_frame_statistics_and_maybe_report_it (plugin, state, proc, 
proc_cls);
-        return EXTRACTOR_mp3_discard_state_method (state);
-      }
-      state->header = (data[0] << 24) | (data[1] << 16) |
-               (data[2] << 8) | data[3];
-      if ((state->header & MPA_SYNC_MASK) == MPA_SYNC_MASK)
-      {
-        state->state = MP3_READING_FRAME;
-        break;
-      }
-      break;
-    case MP3_READING_FRAME:
-      state->number_of_frames += 1;
-      start_anew = 0;
-      switch (state->header & (MPA_LAST_SYNC_BIT_MASK | MPA_VERSION_MASK))
-      {
-      case (MPA_LAST_SYNC_BIT_MASK | MPA_VERSION_MASK):
-        mpeg_ver = MPEG_V1;
-        break;
-      case (MPA_LAST_SYNC_BIT_MASK):
-        mpeg_ver = MPEG_V2;
-        break;
-      case 0:
-        mpeg_ver = MPEG_V25;
-        break;
-      case (MPA_VERSION_MASK):
-      default:
-        state->state = MP3_LOOKING_FOR_FRAME;
-        offset += 1;
-        start_anew = 1;
-      }
-      if (start_anew)
-        break;
-      switch (state->header & (MPA_LAYER_MASK << MPA_LAYER_SHIFT))
-      {
-      case (0x1 << MPA_LAYER_SHIFT):
-        layer = LAYER_3;
-        break;
-      case (0x2 << MPA_LAYER_SHIFT):
-        layer = LAYER_2;
-        break;
-      case (0x3 << MPA_LAYER_SHIFT):
-        layer = LAYER_1;
-        break;
-      case 0x0:
-      default:
-        state->state = MP3_LOOKING_FOR_FRAME;
-        offset += 1;
-        start_anew = 1;
-      }
-      if (start_anew)
-        break;
-      if (mpeg_ver < MPEG_V25)
-        idx_num = (mpeg_ver - 1) * 3 + layer - 1;
-      else
-        idx_num = 2 + layer;
-      bitrate = 1000 * bitrate_table[(state->header >> MPA_BITRATE_SHIFT) &
-                                     MPA_BITRATE_MASK][idx_num];
-      if (bitrate < 0)
-      {
-        /*error in header */
-        state->state = MP3_LOOKING_FOR_FRAME;
-        offset += 1;
-        break;
-      }
-      sample_rate = freq_table[(state->header >> MPA_FREQ_SHIFT) &
-                               MPA_FREQ_MASK][mpeg_ver - 1];
-      if (sample_rate <= 0)
-      {
-        /*error in header */
-        state->state = MP3_LOOKING_FOR_FRAME;
-        offset += 1;
-        break;
-      }
-      ch = ((state->header >> MPA_CHMODE_SHIFT) & MPA_CHMODE_MASK);
-      copyright_flag = (state->header >> MPA_COPYRIGHT_SHIFT) & 0x1;
-      original_flag = (state->header >> MPA_ORIGINAL_SHIFT) & 0x1;
-      if (layer == LAYER_1)
-        frame_size = (12 * bitrate / sample_rate + ((state->header >> 
MPA_PADDING_SHIFT) & 0x1)) * 4;
-      else
-        frame_size = 144 * bitrate / sample_rate + ((state->header >> 
MPA_PADDING_SHIFT) & 0x1);
-      if (frame_size < 8)
-      {
-        /*error in header */
-        state->state = MP3_LOOKING_FOR_FRAME;
-        offset += 1;
-        break;
-      }
-
-      /* Only save data from valid frames in the state */
-      state->avg_bps += bitrate / 1000;
-      state->sample_rate = sample_rate;
-      state->mpeg_ver = mpeg_ver;
-      state->layer = layer;
-      state->ch = ch;
-      state->copyright_flag = copyright_flag;
-      state->original_flag = original_flag;
-      state->bitrate = bitrate;
-
-      state->number_of_valid_frames += 1;
-      if (state->avg_bps / state->number_of_valid_frames != bitrate / 1000)
-        state->vbr_flag = 1;
-      pl_seek (plugin, frame_size - 4, SEEK_CUR);
-      state->state = MP3_LOOKING_FOR_FRAME;
-      break;
-    }
-  }
-  return 1;
-}
-
-/* end of mp3_extractor.c */

Copied: Extractor/src/plugins/old/applefile_extractor.c (from rev 23239, 
Extractor/src/plugins/applefile_extractor.c)
===================================================================
--- Extractor/src/plugins/old/applefile_extractor.c                             
(rev 0)
+++ Extractor/src/plugins/old/applefile_extractor.c     2012-08-14 23:02:49 UTC 
(rev 23241)
@@ -0,0 +1,250 @@
+/*
+     This file is part of libextractor.
+     Copyright (C) 2008 Heikki Lindholm
+
+     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.
+ */
+
+/*
+ * handles AppleSingle and AppleDouble header files
+ * see RFC 1740
+ */
+#include "platform.h"
+#include "extractor.h"
+#include "pack.h"
+
+#define DEBUG 0
+
+#define APPLESINGLE_SIGNATURE "\x00\x05\x16\x00"
+#define APPLEDOUBLE_SIGNATURE "\x00\x05\x16\x07"
+
+typedef struct
+{
+  unsigned char magic[4];
+  unsigned int version;
+  char homeFileSystem[16]; /* v1: in ASCII v2: zero filler */
+  unsigned short entries;
+} ApplefileHeader;
+
+#define APPLEFILE_HEADER_SIZE 26
+#define APPLEFILE_HEADER_SPEC "4bW16bH"
+#define APPLEFILE_HEADER_FIELDS(p) \
+ &(p)->magic, \
+ &(p)->version, \
+ &(p)->homeFileSystem, \
+ &(p)->entries
+
+typedef struct
+{
+  unsigned int id;
+  unsigned int offset;
+  unsigned int length;
+} ApplefileEntryDescriptor;
+
+#define APPLEFILE_ENTRY_DESCRIPTOR_SIZE 12
+#define APPLEFILE_ENTRY_DESCRIPTOR_SPEC "WWW"
+#define APPLEFILE_ENTRY_DESCRIPTOR_FIELDS(p) \
+ &(p)->id, \
+ &(p)->offset, \
+ &(p)->length
+
+#define AED_ID_DATA_FORK           1
+#define AED_ID_RESOURCE_FORK       2
+#define AED_ID_REAL_NAME           3
+#define AED_ID_COMMENT             4
+#define AED_ID_ICON_BW             5
+#define AED_ID_ICON_COLOUR         6
+#define AED_ID_FILE_DATES_INFO     8
+#define AED_ID_FINDER_INFO         9
+#define AED_ID_MACINTOSH_FILE_INFO 10
+#define AED_ID_PRODOS_FILE_INFO    11
+#define AED_ID_MSDOS_FILE_INFO     12
+#define AED_ID_SHORT_NAME          13
+#define AED_ID_AFP_FILE_INFO       14
+#define AED_ID_DIRECTORY_ID        15
+
+static int readApplefileHeader(const unsigned char *data,
+                               size_t *offset,
+                               size_t size,
+                               ApplefileHeader *hdr)
+{
+  if ((*offset + APPLEFILE_HEADER_SIZE) > size)
+    return -1;
+
+  EXTRACTOR_common_cat_unpack(data + *offset,
+             APPLEFILE_HEADER_SPEC,
+             APPLEFILE_HEADER_FIELDS(hdr));
+  *offset += APPLEFILE_HEADER_SIZE;
+  return 0;
+}
+
+static int readEntryDescriptor(const unsigned char *data,
+                               size_t *offset,
+                               size_t size,
+                               ApplefileEntryDescriptor *dsc)
+{
+  if ((*offset + APPLEFILE_ENTRY_DESCRIPTOR_SIZE) > size)
+    return -1;
+
+  EXTRACTOR_common_cat_unpack(data + *offset,
+             APPLEFILE_ENTRY_DESCRIPTOR_SPEC,
+             APPLEFILE_ENTRY_DESCRIPTOR_FIELDS(dsc));
+  *offset += APPLEFILE_ENTRY_DESCRIPTOR_SIZE;
+  return 0;
+}
+
+/* mimetype = application/applefile */
+int 
+EXTRACTOR_applefile_extract (const char *sdata,
+                            size_t size,
+                            EXTRACTOR_MetaDataProcessor proc,
+                            void *proc_cls,
+                            const char *options)
+{
+  const unsigned char *data = (const unsigned char*) sdata;
+  size_t offset;
+  ApplefileHeader header;
+  ApplefileEntryDescriptor dsc;
+  int i;
+
+  offset = 0;
+  if (readApplefileHeader(data, &offset, size, &header) == -1)
+    return 0;
+  if ( (memcmp(header.magic, APPLESINGLE_SIGNATURE, 4) != 0) &&
+       (memcmp(header.magic, APPLEDOUBLE_SIGNATURE, 4) != 0) )
+    return 0;
+  if (0 != proc (proc_cls, 
+                "applefile",
+                EXTRACTOR_METATYPE_MIMETYPE,
+                EXTRACTOR_METAFORMAT_UTF8,
+                "text/plain",
+                "application/applefile",
+                strlen ("application/applefile")+1))
+    return 1;
+#if DEBUG
+  fprintf(stderr,
+         "applefile header: %08x %d\n", header.version, header.entries);
+#endif
+  if ( (header.version != 0x00010000) && 
+       (header.version != 0x00020000) )
+    return 0;
+
+  for (i = 0; i < header.entries; i++) {
+    if (readEntryDescriptor(data, &offset, size, &dsc) == -1)
+      break;
+
+#if DEBUG
+    fprintf(stderr,
+           "applefile entry: %u %u %u\n", dsc.id, dsc.offset, dsc.length);
+#endif
+    switch (dsc.id) 
+      {
+      case AED_ID_DATA_FORK:
+        {
+         /* same as in filenameextractor.c */
+         char s[14];
+
+        if (dsc.length >= 1000000000)
+          snprintf (s, 13, "%.2f %s", dsc.length / 1000000000.0,
+                    _("GB"));
+        else if (dsc.length >= 1000000)
+          snprintf (s, 13, "%.2f %s", dsc.length / 1000000.0, _("MB"));
+        else if (dsc.length >= 1000)
+          snprintf (s, 13, "%.2f %s", dsc.length / 1000.0, _("KB"));
+        else
+          snprintf (s, 13, "%.2f %s", (double) dsc.length, _("Bytes"));
+
+       if (0 != proc (proc_cls, 
+                      "applefile",
+                      EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE,
+                      EXTRACTOR_METAFORMAT_UTF8,
+                      "text/plain",
+                      s,
+                      strlen (s) + 1))
+         return 1;
+       }
+       break;      
+      case AED_ID_REAL_NAME:
+       {
+         char s[2048];
+         if ( (dsc.length < sizeof(s)) && 
+              ((dsc.offset + dsc.length) < size) ) {
+           memcpy(s, data + dsc.offset, dsc.length);
+           s[dsc.length] = '\0';
+           if (0 != proc (proc_cls, 
+                          "applefile",
+                          EXTRACTOR_METATYPE_FILENAME,
+                          EXTRACTOR_METAFORMAT_UTF8,
+                          "text/plain",
+                          s,
+                          dsc.length + 1))
+             return 1; 
+         }
+       }
+       break;
+      case AED_ID_COMMENT:
+        if ( (dsc.length < 65536) && ((dsc.offset + dsc.length) < size) ) {
+         char *s = malloc(dsc.length + 1);
+         if (s != NULL) {
+            memcpy(s, data + dsc.offset, dsc.length);
+           s[dsc.length] = '\0';
+           if (0 != proc (proc_cls, 
+                          "applefile",
+                          EXTRACTOR_METATYPE_COMMENT,
+                          EXTRACTOR_METAFORMAT_UTF8,
+                          "text/plain",
+                          s,
+                          dsc.length + 1))
+             {
+               free (s);
+               return 1;       
+             }
+           free (s);       
+         }
+       }      
+       break;
+      case AED_ID_FINDER_INFO:
+        if (dsc.length >= 16 && (dsc.offset + dsc.length) < size) {
+          char s[5];
+         memcpy(s, data + dsc.offset, 4);
+         s[4] = '\0';
+         if (0 != proc (proc_cls, 
+                        "applefile",
+                        EXTRACTOR_METATYPE_FINDER_FILE_TYPE,
+                        EXTRACTOR_METAFORMAT_C_STRING,
+                        "text/plain",
+                        s,
+                        strlen(s) + 1))
+           return 1;   
+          
+         memcpy(s, data + dsc.offset + 4, 4);
+         s[4] = '\0';
+         if (0 != proc (proc_cls, 
+                        "applefile",
+                        EXTRACTOR_METATYPE_FINDER_FILE_CREATOR,
+                        EXTRACTOR_METAFORMAT_C_STRING,
+                        "text/plain",
+                        s,
+                        strlen(s) + 1))
+           return 1;   
+        }
+        break;
+      default:
+        break;
+    }
+  }
+  return 0;
+}

Copied: Extractor/src/plugins/old/asf_extractor.c (from rev 23239, 
Extractor/src/plugins/asf_extractor.c)
===================================================================
--- Extractor/src/plugins/old/asf_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/asf_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,587 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2011 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 file is based on demux_asf from the xine project (copyright follows).
+ *
+ * Copyright (C) 2000-2002 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine 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 of the License, or
+ * (at your option) any later version.
+ *
+ * xine 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+ *
+ * $Id: asfextractor.c,v 1.6 2004/10/05 20:02:08 grothoff Exp $
+ *
+ * demultiplexer for asf streams
+ *
+ * based on ffmpeg's
+ * ASF compatible encoder and decoder.
+ * Copyright (c) 2000, 2001 Gerard Lantau.
+ *
+ * GUID list from avifile
+ * some other ideas from MPlayer
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include "convert.h"
+#include <stdint.h>
+
+#define DEMUX_FINISHED 0
+#define DEMUX_START 1
+
+
+/*
+ * define asf GUIDs (list from avifile)
+ */
+#define GUID_ERROR                              0
+#define GUID_ASF_HEADER                         1
+#define GUID_ASF_DATA                           2
+#define GUID_ASF_SIMPLE_INDEX                   3
+#define GUID_ASF_FILE_PROPERTIES                4
+#define GUID_ASF_STREAM_PROPERTIES              5
+#define GUID_ASF_STREAM_BITRATE_PROPERTIES      6
+#define GUID_ASF_CONTENT_DESCRIPTION            7
+#define GUID_ASF_EXTENDED_CONTENT_ENCRYPTION    8
+#define GUID_ASF_SCRIPT_COMMAND                 9
+#define GUID_ASF_MARKER                        10
+#define GUID_ASF_HEADER_EXTENSION              11
+#define GUID_ASF_BITRATE_MUTUAL_EXCLUSION      12
+#define GUID_ASF_CODEC_LIST                    13
+#define GUID_ASF_EXTENDED_CONTENT_DESCRIPTION  14
+#define GUID_ASF_ERROR_CORRECTION              15
+#define GUID_ASF_PADDING                       16
+#define GUID_ASF_AUDIO_MEDIA                   17
+#define GUID_ASF_VIDEO_MEDIA                   18
+#define GUID_ASF_COMMAND_MEDIA                 19
+#define GUID_ASF_NO_ERROR_CORRECTION           20
+#define GUID_ASF_AUDIO_SPREAD                  21
+#define GUID_ASF_MUTEX_BITRATE                 22
+#define GUID_ASF_MUTEX_UKNOWN                  23
+#define GUID_ASF_RESERVED_1                    24
+#define GUID_ASF_RESERVED_SCRIPT_COMMNAND      25
+#define GUID_ASF_RESERVED_MARKER               26
+#define GUID_ASF_AUDIO_CONCEAL_NONE            27
+#define GUID_ASF_CODEC_COMMENT1_HEADER         28
+#define GUID_ASF_2_0_HEADER                    29
+
+#define GUID_END                               30
+
+
+typedef struct
+{
+  uint32_t v1;
+  uint16_t v2;
+  uint16_t v3;
+  uint8_t v4[8];
+} LE_GUID;
+
+
+static const struct
+{
+  const char *name;
+  const LE_GUID guid;
+} guids[] =
+{
+  {
+    "error",
+    {
+  0x0,}},
+    /* base ASF objects */
+  {
+    "header",
+    {
+      0x75b22630, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "data",
+    {
+      0x75b22636, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "simple index",
+    {
+      0x33000890, 0xe5b1, 0x11cf,
+      {
+  0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}},
+    /* header ASF objects */
+  {
+    "file properties",
+    {
+      0x8cabdca1, 0xa947, 0x11cf,
+      {
+  0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "stream header",
+    {
+      0xb7dc0791, 0xa9b7, 0x11cf,
+      {
+  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "stream bitrate properties",        /* (http://get.to/sdp) */
+    {
+      0x7bf875ce, 0x468d, 0x11d1,
+      {
+  0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}},
+  {
+    "content description",
+    {
+      0x75b22633, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "extended content encryption",
+    {
+      0x298ae614, 0x2622, 0x4c17,
+      {
+  0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c}}},
+  {
+    "script command",
+    {
+      0x1efb1a30, 0x0b62, 0x11d0,
+      {
+  0xa3, 0x9b, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "marker",
+    {
+      0xf487cd01, 0xa951, 0x11cf,
+      {
+  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "header extension",
+    {
+      0x5fbf03b5, 0xa92e, 0x11cf,
+      {
+  0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "bitrate mutual exclusion",
+    {
+      0xd6e229dc, 0x35da, 0x11d1,
+      {
+  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
+  {
+    "codec list",
+    {
+      0x86d15240, 0x311d, 0x11d0,
+      {
+  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "extended content description",
+    {
+      0xd2d0a440, 0xe307, 0x11d2,
+      {
+  0x97, 0xf0, 0x00, 0xa0, 0xc9, 0x5e, 0xa8, 0x50}}},
+  {
+    "error correction",
+    {
+      0x75b22635, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "padding",
+    {
+      0x1806d474, 0xcadf, 0x4509,
+      {
+  0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8}}},
+    /* stream properties object stream type */
+  {
+    "audio media",
+    {
+      0xf8699e40, 0x5b4d, 0x11cf,
+      {
+  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
+  {
+    "video media",
+    {
+      0xbc19efc0, 0x5b4d, 0x11cf,
+      {
+  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
+  {
+    "command media",
+    {
+      0x59dacfc0, 0x59e6, 0x11d0,
+      {
+  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+    /* stream properties object error correction */
+  {
+    "no error correction",
+    {
+      0x20fb5700, 0x5b55, 0x11cf,
+      {
+  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
+  {
+    "audio spread",
+    {
+      0xbfc3cd50, 0x618f, 0x11cf,
+      {
+  0x8b, 0xb2, 0x00, 0xaa, 0x00, 0xb4, 0xe2, 0x20}}},
+    /* mutual exclusion object exlusion type */
+  {
+    "mutex bitrate",
+    {
+      0xd6e22a01, 0x35da, 0x11d1,
+      {
+  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
+  {
+    "mutex unknown",
+    {
+      0xd6e22a02, 0x35da, 0x11d1,
+      {
+  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
+    /* header extension */
+  {
+    "reserved_1",
+    {
+      0xabd3d211, 0xa9ba, 0x11cf,
+      {
+  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+    /* script command */
+  {
+    "reserved script command",
+    {
+      0x4B1ACBE3, 0x100B, 0x11D0,
+      {
+  0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6}}},
+    /* marker object */
+  {
+    "reserved marker",
+    {
+      0x4CFEDB20, 0x75F6, 0x11CF,
+      {
+  0x9C, 0x0F, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB}}},
+    /* various */
+    /* Already defined (reserved_1)
+       { "head2",
+       { 0xabd3d211, 0xa9ba, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 
0x53, 0x65 }} },
+     */
+  {
+    "audio conceal none",
+    {
+      0x49f1a440, 0x4ece, 0x11d0,
+      {
+  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "codec comment1 header",
+    {
+      0x86d15241, 0x311d, 0x11d0,
+      {
+  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "asf 2.0 header",
+    {
+      0xd6e229d1, 0x35da, 0x11d1,
+      {
+0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},};
+
+
+struct demux_asf_s
+{
+  /* pointer to the stream data */
+  const char *input;
+  /* current position in stream */
+  size_t inputPos;
+
+  size_t inputLen;
+
+  uint32_t length;
+
+  int status;
+
+  char *title;
+  char *author;
+  char *copyright;
+  char *comment;
+  char *rating;
+};
+
+static int
+readBuf (struct demux_asf_s * this, void *buf, int len)
+{
+  int min;
+
+  min = len;
+  if (this->inputLen - this->inputPos < min)
+    min = this->inputLen - this->inputPos;
+  memcpy (buf, &this->input[this->inputPos], min);
+  this->inputPos += min;
+  return min;
+}
+
+static uint8_t
+get_byte (struct demux_asf_s * this)
+{
+  uint8_t buf;
+  int i;
+
+  i = readBuf (this, &buf, 1);
+  if (i != 1)
+    this->status = DEMUX_FINISHED;
+  return buf;
+}
+
+static uint16_t
+get_le16 (struct demux_asf_s * this)
+{
+  uint8_t buf[2];
+  int i;
+
+  i = readBuf (this, buf, 2);
+  if (i != 2)
+    this->status = DEMUX_FINISHED;
+  return buf[0] | (buf[1] << 8);
+}
+
+static uint32_t
+get_le32 (struct demux_asf_s * this)
+{
+  uint8_t buf[4];
+  int i;
+
+  i = readBuf (this, buf, 4);
+  if (i != 4)
+    this->status = DEMUX_FINISHED;
+  return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
+}
+
+static uint64_t
+get_le64 (struct demux_asf_s * this)
+{
+  uint8_t buf[8];
+  int i;
+
+  i = readBuf (this, buf, 8);
+  if (i != 8)
+    this->status = DEMUX_FINISHED;
+  return (uint64_t) buf[0]
+    | ((uint64_t) buf[1] << 8)
+    | ((uint64_t) buf[2] << 16)
+    | ((uint64_t) buf[3] << 24)
+    | ((uint64_t) buf[4] << 32)
+    | ((uint64_t) buf[5] << 40)
+    | ((uint64_t) buf[6] << 48) | ((uint64_t) buf[7] << 54);
+}
+
+static int
+get_guid (struct demux_asf_s * this)
+{
+  int i;
+  LE_GUID g;
+
+  g.v1 = get_le32 (this);
+  g.v2 = get_le16 (this);
+  g.v3 = get_le16 (this);
+  for (i = 0; i < 8; i++)
+    g.v4[i] = get_byte (this);
+  if (this->status == DEMUX_FINISHED)
+    return GUID_ERROR;
+  for (i = 1; i < GUID_END; i++)
+    if (!memcmp (&g, &guids[i].guid, sizeof (LE_GUID)))
+      return i;
+
+  return GUID_ERROR;
+}
+
+
+static int
+asf_read_header (struct demux_asf_s * this)
+{
+  int guid;
+  uint64_t gsize;
+  uint16_t len1, len2, len3, len4, len5;
+
+  guid = get_guid (this);
+  if (guid != GUID_ASF_HEADER)
+    return 0;
+  get_le64 (this); /* object size */
+  get_le32 (this); /* number of header objects */
+  get_byte (this); /* reserved 1 */
+  get_byte (this); /* reserved 2 */                
+  while (this->status != DEMUX_FINISHED)
+    {
+      guid = get_guid (this); /* object ID */
+      gsize = get_le64 (this); /* object size */
+      if (gsize < 24)
+        goto fail;
+      switch (guid)
+        {
+        case GUID_ASF_FILE_PROPERTIES:
+         guid = get_guid (this); /* file ID */
+         get_le64 (this);    /* file size */
+         get_le64 (this);    /* creation date */
+         get_le64 (this);    /* nb_packets */
+         this->length = get_le64 (this); /* play duration in 100 ns units */
+         get_le64 (this); /* send duration */
+         get_le64 (this); /* preroll */
+         get_le32 (this);    /* flags */
+         get_le32 (this);    /* min size */
+         get_le32 (this);        /* max size */
+         get_le32 (this);    /* max bitrate */          
+          break;
+        case GUID_ASF_DATA:
+          goto headers_ok;
+          break;
+        case GUID_ASF_CONTENT_DESCRIPTION:
+         len1 = get_le16 (this);
+         len2 = get_le16 (this);
+         len3 = get_le16 (this);
+         len4 = get_le16 (this);
+         len5 = get_le16 (this);
+         this->title = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
+                                                         len1,
+                                                         "UTF-16");
+         this->inputPos += len1;
+         this->author = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
+                                                          len2,
+                                                          "UTF-16");
+         this->inputPos += len2;
+         this->copyright = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
+                                                             len3,
+                                                             "UTF-16");
+         this->inputPos += len3;
+         this->comment = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
+                                                           len4,
+                                                           "UTF-16");
+         this->inputPos += len4;
+         this->rating = EXTRACTOR_common_convert_to_utf8 
(&this->input[this->inputPos],
+                                                          len5,
+                                                          "UTF-16");
+         this->inputPos += len5;
+          break;
+        default:
+          this->inputPos += gsize - 24;
+        }
+    }
+
+headers_ok:
+  this->inputPos += sizeof (LE_GUID) + 10;
+  return 1;
+fail:
+  return 0;
+}
+
+
+/* mimetypes:
+   video/x-ms-asf: asf: ASF stream;
+   video/x-ms-wmv: wmv: Windows Media Video;
+   video/x-ms-wma: wma: Windows Media Audio;
+   application/vnd.ms-asf: asf: ASF stream;
+   application/x-mplayer2: asf,asx,asp: mplayer2;
+   video/x-ms-asf-plugin: asf,asx,asp: mms animation;
+   video/x-ms-wvx: wvx: wmv metafile;
+   video/x-ms-wax: wva: wma metafile; */
+
+/* mimetype = application/applefile */
+int 
+EXTRACTOR_asf_extract (const char *data,
+                      size_t size,
+                      EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls,
+                      const char *options)
+{
+  struct demux_asf_s this;
+  size_t slen;
+  char duration_str[30];
+  int ret;
+
+  memset (&this, 0, sizeof (struct demux_asf_s));
+  this.input = data;
+  this.inputLen = size;
+  this.status = DEMUX_START;
+  ret = 0;
+  if (1 == asf_read_header (&this))
+  {
+    snprintf (duration_str, 
+             sizeof (duration_str),
+             "%llu ms", (unsigned long long) (this.length / 10000LL));
+    if ( ( (this.title != NULL) &&
+          (0 < (slen = strlen(this.title))) &&
+          (0 != proc (proc_cls, 
+                      "asf",
+                      EXTRACTOR_METATYPE_TITLE,
+                      EXTRACTOR_METAFORMAT_C_STRING,
+                      "text/plain",
+                      this.title,
+                      slen + 1)) ) ||
+        ( (this.author != NULL) &&
+          (0 < (slen = strlen(this.author))) &&
+          (0 != proc (proc_cls, 
+                      "asf",
+                      EXTRACTOR_METATYPE_AUTHOR_NAME,
+                      EXTRACTOR_METAFORMAT_C_STRING,
+                      "text/plain",
+                      this.author,
+                      slen + 1)) ) ||
+        ( (this.comment != NULL)  &&
+          (0 < (slen = strlen(this.comment))) &&
+          (0 != proc (proc_cls, 
+                      "asf",
+                      EXTRACTOR_METATYPE_COMMENT,
+                      EXTRACTOR_METAFORMAT_C_STRING,
+                      "text/plain",
+                      this.comment,
+                      slen + 1)) ) ||
+        ( (this.copyright != NULL) &&
+          (0 < (slen = strlen(this.copyright))) &&
+          (0 != proc (proc_cls, 
+                      "asf",
+                      EXTRACTOR_METATYPE_COPYRIGHT,
+                      EXTRACTOR_METAFORMAT_C_STRING,
+                      "text/plain",
+                      this.copyright,
+                      slen + 1)) ) ||
+        (0 != proc (proc_cls, 
+                    "asf",
+                    EXTRACTOR_METATYPE_MIMETYPE,
+                    EXTRACTOR_METAFORMAT_C_STRING,
+                    "text/plain",
+                    "video/x-ms-asf",
+                    strlen("video/x-ms-asf") + 1)) ||
+        (0 != proc (proc_cls, 
+                    "asf",
+                    EXTRACTOR_METATYPE_DURATION,
+                    EXTRACTOR_METAFORMAT_C_STRING,
+                    "text/plain",
+                    duration_str,
+                    strlen(duration_str) + 1)) ) 
+      ret = 1; 
+  }
+  free (this.title);
+  free (this.author);
+  free (this.copyright);
+  free (this.comment);
+  free (this.rating);
+  return ret;
+}
+
+/*  end of asf_extractor.c */

Copied: Extractor/src/plugins/old/dvi_extractor.c (from rev 23239, 
Extractor/src/plugins/dvi_extractor.c)
===================================================================
--- Extractor/src/plugins/old/dvi_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/dvi_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,247 @@
+/*
+     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"
+
+typedef struct
+{
+  char *text;
+  enum EXTRACTOR_MetaType type;
+} Matches;
+
+static Matches tmap[] = {
+  {"/Title (",    EXTRACTOR_METATYPE_TITLE},
+  {"/Subject (",  EXTRACTOR_METATYPE_SUBJECT},
+  {"/Author (",   EXTRACTOR_METATYPE_AUTHOR_NAME},
+  {"/Keywords (", EXTRACTOR_METATYPE_KEYWORDS},
+  {"/Creator (",  EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE },
+  {"/Producer (", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE},
+  {NULL, 0},
+};
+
+static int
+parseZZZ (const char *data,
+          size_t pos, size_t len,
+         EXTRACTOR_MetaDataProcessor proc,
+         void *proc_cls)
+{
+  size_t slen;
+  size_t end;
+  int i;
+
+  end = pos + len;
+  slen = strlen ("ps:SDict begin [");
+  if (len <= slen)
+    return 0;
+  if (0 != strncmp ("ps:SDict begin [ ", &data[pos], slen))
+    return 0;
+  pos += slen;
+  while (pos < end)
+    {
+      i = 0;
+      while (tmap[i].text != NULL)
+        {
+          slen = strlen (tmap[i].text);
+          if (pos + slen < end)
+            {
+              if (0 == strncmp (&data[pos], tmap[i].text, slen))
+                {
+                  pos += slen;
+                  slen = pos;
+                  while ((slen < end) && (data[slen] != ')'))
+                    slen++;
+                  slen = slen - pos;
+                 {
+                   char value[slen + 1];
+                   value[slen] = '\0';
+                   memcpy (value, &data[pos], slen);
+                   if (0 != proc (proc_cls, 
+                                  "dvi",
+                                  tmap[i].type,
+                                  EXTRACTOR_METAFORMAT_C_STRING,
+                                  "text/plain",
+                                  value,
+                                  slen +1))
+                     {
+                       return 1;
+                     }
+                 }
+                  pos += slen + 1;
+                }
+            }
+          i++;
+        }
+      pos++;
+    }
+  return 0;
+}
+
+static unsigned int
+getIntAt (const void *data)
+{
+  char p[4];
+
+  memcpy (p, data, 4);          /* ensure alignment! */
+  return *(unsigned int *) &p[0];
+}
+
+static unsigned int
+getShortAt (const void *data)
+{
+  char p[2];
+
+  memcpy (p, data, 2);          /* ensure alignment! */
+  return *(unsigned short *) &p[0];
+}
+
+
+int 
+EXTRACTOR_dvi_extract (const unsigned char *data,
+                      size_t size,
+                      EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls,
+                      const char *options)
+{
+  unsigned int klen;
+  uint32_t pos;
+  uint32_t opos;
+  unsigned int len;
+  unsigned int pageCount;
+  char pages[16];
+
+  if (size < 40)
+    return 0;
+  if ((data[0] != 247) || (data[1] != 2))
+    return 0;                /* cannot be dvi or unsupported version */
+  klen = data[14];
+
+  pos = size - 1;
+  while ((data[pos] == 223) && (pos > 0))
+    pos--;
+  if ((data[pos] != 2) || (pos < 40))
+    return 0;
+  pos--;
+  pos -= 4;
+  /* assert pos at 'post_post tag' */
+  if (data[pos] != 249)
+    return 0;
+  opos = pos;
+  pos = ntohl (getIntAt (&data[opos + 1]));
+  if (pos + 25 > size)
+    return 0;
+  /* assert pos at 'post' command */
+  if (data[pos] != 248)
+    return 0;
+  pageCount = 0;
+  opos = pos;
+  pos = ntohl (getIntAt (&data[opos + 1]));
+  while (1)
+    {
+      if (pos == UINT32_MAX)
+        break;
+      if (pos + 45 > size)
+        return 0;
+      if (data[pos] != 139)     /* expect 'bop' */
+        return 0;
+      pageCount++;
+      opos = pos;
+      pos = ntohl (getIntAt (&data[opos + 41]));
+      if (pos == UINT32_MAX)
+        break;
+      if (pos >= opos)
+        return 0;            /* invalid! */
+    }
+  /* ok, now we believe it's a dvi... */
+  snprintf (pages, sizeof(pages), "%u", pageCount);
+  if (0 != proc (proc_cls, 
+                "dvi",
+                EXTRACTOR_METATYPE_PAGE_COUNT,
+                EXTRACTOR_METAFORMAT_UTF8,
+                "text/plain",
+                pages,
+                strlen (pages) +1))
+    return 1;
+  if (0 != proc (proc_cls, 
+                "dvi",
+                EXTRACTOR_METATYPE_MIMETYPE,
+                EXTRACTOR_METAFORMAT_UTF8,
+                "text/plain",
+                "application/x-dvi",
+                strlen ("application/x-dvi") +1))
+    return 1;
+  {
+    char comment[klen + 1];
+    
+    comment[klen] = '\0';
+    memcpy (comment, &data[15], klen);
+    if (0 != proc (proc_cls, 
+                  "dvi",
+                  EXTRACTOR_METATYPE_COMMENT,
+                  EXTRACTOR_METAFORMAT_UTF8,
+                  "text/plain",
+                  comment,
+                  klen +1))
+      return 1;
+  }
+  /* try to find PDF/ps special */
+  pos = opos;
+  while (pos < size - 100)
+    {
+      switch (data[pos])
+        {
+        case 139:              /* begin page 'bop', we typically have to skip 
that one to
+                                   find the zzz's */
+          pos += 45;            /* skip bop */
+          break;
+        case 239:              /* zzz1 */
+          len = data[pos + 1];
+          if (pos + 2 + len < size)
+            if (0 != parseZZZ ((const char *) data, pos + 2, len, proc, 
proc_cls))
+             return 1;
+          pos += len + 2;
+          break;
+        case 240:              /* zzz2 */
+          len = ntohs (getShortAt (&data[pos + 1]));
+          if (pos + 3 + len < size)
+            if (0 != parseZZZ ((const char *) data, pos + 3, len, proc, 
proc_cls))
+             return 1;
+          pos += len + 3;
+          break;
+        case 241:              /* zzz3, who uses that? */
+          len = (ntohs (getShortAt (&data[pos + 1]))) + 65536 * data[pos + 3];
+          if (pos + 4 + len < size)
+            if (0 != parseZZZ ((const char *) data, pos + 4, len, proc, 
proc_cls))
+             return 1;
+          pos += len + 4;
+          break;
+        case 242:              /* zzz4, hurray! */
+          len = ntohl (getIntAt (&data[pos + 1]));
+          if (pos + 1 + len < size)
+            if (0 != parseZZZ ((const char *) data, pos + 5, len, proc, 
proc_cls))
+             return 1;
+          pos += len + 5;
+          break;
+        default:               /* unsupported opcode, abort scan */
+          return 0;
+        }
+    }
+  return 0;
+}

Copied: Extractor/src/plugins/old/ebml_extractor.c (from rev 23239, 
Extractor/src/plugins/ebml_extractor.c)
===================================================================
--- Extractor/src/plugins/old/ebml_extractor.c                          (rev 0)
+++ Extractor/src/plugins/old/ebml_extractor.c  2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,2290 @@
+/*
+     This file is part of libextractor.
+     (C) 2004, 2005, 2006, 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.
+ */
+
+ /*
+  * Made by Gabriel Peixoto
+  * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin.
+  * Nearly complete rewrite by LRN, Copyright (c) 2012
+  */
+
+#include "platform.h"
+#include "extractor.h"
+#include <stdint.h>
+
+#include "le_architecture.h"
+
+#ifndef DEBUG_EBML
+# define DEBUG_EBML 0
+#endif
+
+#if WINDOWS
+/* According to 
http://old.nabble.com/Porting-localtime_r-and-gmtime_r-td15282276.html
+ * msvcrt.dll does have thread-safe gmtime implementation,
+ * even though the documentation says otherwise.
+ * Should be easy to check - spawn 2 threads, run _gmtime64 in each one
+ * and see if they return the same pointer.
+ */
+struct tm *
+gmtime_undocumented_64_r (const __time64_t *timer, struct tm *result)
+{
+   struct tm *local_result = NULL;//_gmtime64 (timer);
+
+   if (local_result == NULL || result == NULL)
+     return NULL;
+
+   memcpy (result, local_result, sizeof (*result));
+   return result;
+}
+#endif
+
+#include "extractor_plugins.h"
+
+#define ADD_EBML(s,t) do { proc (proc_cls, "ebml", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1); } while (0)
+#define ADD_MATROSKA(s,t) do { proc (proc_cls, "matroska", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1); } while (0)
+
+/**
+ * String length limit. The spec does not limit the strings,
+ * but we don't want to allocate 2^56 bytes
+ * just because some EBML file says it has a string of that length!
+ * This also must be <= of the number of bytes LE gives us in one go
+ * (the code doesn't know how to "read a part of string, request a seek,
+ * then read some more, and repeat until the whole string is read").
+ * If it isn't, the code will loop forever, requesting the same
+ * seek position (beginning of the string) over and over.
+ * FIXME: find a way to fix that condition in LE itself?
+ * TODO: rewrite string reading code to allocate strings on the heap,
+ * that will allow us to greatly increase max string size. Right now
+ * strings are allocated on the stack, and can't be too long because
+ * of that.
+ */
+#define MAX_STRING_SIZE 1024
+
+struct MatroskaTrackType
+{
+  unsigned char code;
+  const char *name;
+  char video_must_be_valid;
+  char audio_must_be_valid;
+};
+
+struct MatroskaTrackType track_types[] = {
+  {0x01, "video", 1, -1},
+  {0x02, "audio", -1, 1},
+  {0x03, "complex", -1, -1},
+  {0x10, "logo", -1, -1},
+  {0x11, "subtitle", -1, -1},
+  {0x12, "buttons", -1, -1},
+  {0x20, "control", -1, -1},
+  {0x00, NULL}
+};
+
+struct MatroskaTagMap
+{
+  const char *name;
+  enum EXTRACTOR_MetaType id;
+};
+
+/* TODO: Add TargetLevel parsing, and use it to correctly set:
+ * "track number" and "disk number" from PART_NUMBER,
+ * "author email" from EMAIL,
+ * "publisher address" from ADDRESS,
+ * "
+ */
+struct MatroskaTagMap tag_map[] = {
+  {"COUNTRY", EXTRACTOR_METATYPE_LOCATION_COUNTRY_CODE},
+  {"TITLE", EXTRACTOR_METATYPE_TITLE},
+  {"SUBTITLE", EXTRACTOR_METATYPE_SUBTITLE},
+  {"URL", EXTRACTOR_METATYPE_URL},
+  {"ARTIST", EXTRACTOR_METATYPE_ARTIST},
+  {"LEAD_PERFORMER", EXTRACTOR_METATYPE_PERFORMER},
+  {"ACCOMPANIMENT", EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST}, /* not sure if 
it's correct */
+  {"COMPOSER", EXTRACTOR_METATYPE_COMPOSER},
+  {"LYRICS", EXTRACTOR_METATYPE_LYRICS},
+  /* LYRICIST */
+  {"CONDUCTOR", EXTRACTOR_METATYPE_CONDUCTOR},
+  /* DIRECTOR UTF-8 This is akin to the IART tag in RIFF.
+     ASSISTANT_DIRECTOR UTF-8 The name of the assistant director.
+     DIRECTOR_OF_PHOTOGRAPHY UTF-8 The name of the director of photography, 
also known as cinematographer. This is akin to the ICNM tag in Extended RIFF.
+     SOUND_ENGINEER UTF-8 The name of the sound engineer or sound recordist.
+     ART_DIRECTOR UTF-8 The person who oversees the artists and craftspeople 
who build the sets.
+     PRODUCTION_DESIGNER UTF-8 Artist responsible for designing the overall 
visual appearance of a movie.
+     CHOREGRAPHER UTF-8 The name of the choregrapher
+     COSTUME_DESIGNER UTF-8 The name of the costume designer
+     ACTOR UTF-8 An actor or actress playing a role in this movie. This is the 
person's real name, not the character's name the person is playing.
+     CHARACTER UTF-8 The name of the character an actor or actress
+  */
+  {"WRITTEN_BY", EXTRACTOR_METATYPE_WRITER},
+  /*
+    SCREENPLAY_BY UTF-8 The author of the screenplay or scenario (used for 
movies and TV shows).
+    EDITED_BY UTF-8 This is akin to the IEDT tag in Extended RIFF.
+    PRODUCER UTF-8 Produced by. This is akin to the IPRO tag in Extended RIFF. 
(NOT EXTRACTOR_METATYPE_PRODUCER!)
+    COPRODUCER UTF-8 The name of a co-producer.
+    EXECUTIVE_PRODUCER UTF-8 The name of an executive producer.
+    DISTRIBUTED_BY UTF-8 This is akin to the IDST tag in Extended RIFF.
+    MASTERED_BY UTF-8 The engineer who mastered the content for a physical 
medium or for digital distribution.
+  */
+  {"ENCODED_BY", EXTRACTOR_METATYPE_ENCODED_BY},
+  /*
+    MIXED_BY UTF-8 DJ mix by the artist specified
+    REMIXED_BY UTF-8 Interpreted, remixed, or otherwise modified by. This is 
akin to the TPE4 tag in ID3.
+    PRODUCTION_STUDIO UTF-8 This is akin to the ISTD tag in Extended RIFF.
+    THANKS_TO UTF-8 A very general tag for everyone else that wants to be 
listed.
+  */
+  {"PUBLISHER", EXTRACTOR_METATYPE_PUBLISHER},
+  /*
+    LABEL UTF-8 The record label or imprint on the disc.
+  */
+  {"GENRE", EXTRACTOR_METATYPE_GENRE},
+  {"MOOD", EXTRACTOR_METATYPE_MOOD},
+  /*
+    ORIGINAL_MEDIA_TYPE UTF-8 Describes the original type of the media, such 
as, "DVD", "CD", "computer image," "drawing," "lithograph," and so forth. This 
is akin to the TMED tag in ID3.
+    CONTENT_TYPE UTF-8 The type of the item. e.g. Documentary, Feature Film, 
Cartoon, Music Video, Music, Sound FX, ...
+  */
+  {"SUBJECT", EXTRACTOR_METATYPE_SUBJECT},
+  {"DESCRIPTION", EXTRACTOR_METATYPE_DESCRIPTION},
+  {"KEYWORDS", EXTRACTOR_METATYPE_KEYWORDS},
+  {"SUMMARY", EXTRACTOR_METATYPE_SUMMARY},
+  /*
+    SYNOPSIS UTF-8 A description of the story line of the item. 
+    INITIAL_KEY UTF-8 The initial key that a musical track starts in. The 
format is identical to ID3.
+    PERIOD UTF-8 Describes the period that the piece is from or about. For 
example, "Renaissance". 
+    LAW_RATING UTF-8 Depending on the country it's the format of the rating of 
a movie (P, R, X in the USA, an age in other countries or a URI defining a 
logo).
+    ICRA binary        The ICRA content rating for parental control. 
(Previously RSACi)
+  */
+  {"DATE_RELEASED", EXTRACTOR_METATYPE_PUBLICATION_DATE},
+  {"DATE_RECORDED", EXTRACTOR_METATYPE_CREATION_DATE},
+  {"DATE_ENCODED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  {"DATE_TAGGED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  {"DATE_DIGITIZED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  {"DATE_WRITTEN", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  {"DATE_PURCHASED", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  /*
+    RECORDING_LOCATION UTF-8 The location where the item was recorded. The 
countries corresponding to the string, same 2 octets as in Internet domains, or 
possibly ISO-3166. This code is followed by a comma, then more detailed 
information such as state/province, another comma, and then city. For example, 
"US, Texas, Austin". This will allow for easy sorting. It is okay to only store 
the country, or the country and the state/province. More detailed information 
can be added after the city through the use of additional commas. In cases 
where the province/state is unknown, but you want to store the city, simply 
leave a space between the two commas. For example, "US, , Austin". 
+    COMPOSITION_LOCATION UTF-8 Location that the item was originaly 
designed/written. The countries corresponding to the string, same 2 octets as 
in Internet domains, or possibly ISO-3166. This code is followed by a comma, 
then more detailed information such as state/province, another comma, and then 
city. For example, "US, Texas, Austin". This will allow for easy sorting. It is 
okay to only store the country, or the country and the state/province. More 
detailed information can be added after the city through the use of additional 
commas. In cases where the province/state is unknown, but you want to store the 
city, simply leave a space between the two commas. For example, "US, , Austin".
+    COMPOSER_NATIONALITY UTF-8 Nationality of the main composer of the item, 
mostly for classical music. The countries corresponding to the string, same 2 
octets as in Internet domains, or possibly ISO-3166.
+  */
+  /* Matroska considers "COMMENT", "PLAY_COUNTER" and "RATING" to be personal. 
Should we extract them? */
+  {"COMMENT", EXTRACTOR_METATYPE_COMMENT},
+  {"PLAY_COUNTER", EXTRACTOR_METATYPE_PLAY_COUNTER},
+  {"RATING", EXTRACTOR_METATYPE_POPULARITY_METER},
+  /*
+    ENCODER UTF-8 The software or hardware used to encode this item. ("LAME" 
or "XviD")
+    ENCODER_SETTINGS UTF-8 A list of the settings used for encoding this item. 
No specific format.
+    BPS UTF-8 The average bits per second of the specified item. This is only 
the data in the Blocks, and excludes headers and any container overhead.
+    FPS UTF-8 The average frames per second of the specified item. This is 
typically the average number of Blocks per second. In the event that lacing is 
used, each laced chunk is to be counted as a seperate frame. 
+  */
+  {"BPM", EXTRACTOR_METATYPE_BEATS_PER_MINUTE},
+  /*
+    MEASURE UTF-8 In music, a measure is a unit of time in Western music like 
"4/4". It represents a regular grouping of beats, a meter, as indicated in 
musical notation by the time signature.. The majority of the contemporary rock 
and pop music you hear on the radio these days is written in the 4/4 time 
signature.
+    TUNING UTF-8 It is saved as a frequency in hertz to allow near-perfect 
tuning of instruments to the same tone as the musical piece (e.g. "441.34" in 
Hertz). The default value is 440.0 Hz.
+    REPLAYGAIN_GAIN binary The gain to apply to reach 89dB SPL on playback. 
This is based on the Replay Gain standard. Note that ReplayGain information can 
be found at all TargetType levels (track, album, etc).
+    REPLAYGAIN_PEAK binary The maximum absolute peak value of the item. This 
is based on the Replay Gain standard.
+  */
+  {"ISRC", EXTRACTOR_METATYPE_ISRC},
+  /*
+    MCDI binary This is a binary dump of the TOC of the CDROM that this item 
was taken from. This holds the same information as the MCDI in ID3.
+    ISBN UTF-8 International Standard Book Number
+    BARCODE UTF-8 EAN-13 (European Article Numbering) or UPC-A (Universal 
Product Code) bar code identifier 
+    CATALOG_NUMBER UTF-8 A label-specific string used to identify the release 
(TIC 01 for example).
+    LABEL_CODE UTF-8 A 4-digit or 5-digit number to identify the record label, 
typically printed as (LC) xxxx or (LC) 0xxxx on CDs medias or covers (only the 
number is stored).
+    LCCN UTF-8 Library of Congress Control Number
+  */
+  /*
+    PURCHASE_ITEM UTF-8 URL to purchase this file. This is akin to the WPAY 
tag in ID3.
+    PURCHASE_INFO UTF-8 Information on where to purchase this album. This is 
akin to the WCOM tag in ID3.
+    PURCHASE_OWNER UTF-8 Information on the person who purchased the file. 
This is akin to the TOWN tag in ID3.
+    PURCHASE_PRICE UTF-8 The amount paid for entity. There should only be a 
numeric value in here. Only numbers, no letters or symbols other than ".". For 
instance, you would store "15.59" instead of "$15.59USD".
+    PURCHASE_CURRENCY UTF-8 The currency type used to pay for the entity. Use 
ISO-4217 for the 3 letter currency code.
+  */
+  {"COPYRIGHT", EXTRACTOR_METATYPE_COPYRIGHT},
+  {"PRODUCTION_COPYRIGHT", EXTRACTOR_METATYPE_COPYRIGHT},
+  {"LICENSE", EXTRACTOR_METATYPE_LICENSE},
+  /* TERMS_OF_USE UTF-8 The terms of use for this item. This is akin to the 
USER tag in ID3. */
+  {NULL, EXTRACTOR_METATYPE_RESERVED}
+};
+
+/**
+ * FIXME: document
+ */
+enum
+{
+  EBMLID_FILE_BEGIN = 0x1A, /* First byte of EBMLID_EBML */
+  EBMLID_EBML = 0x1A45DFA3,
+  EBMLID_VERSION = 0x4286,
+  EBMLID_READ_VERSION = 0x42f7,
+  EBMLID_MAX_ID_LENGTH = 0x42f2,
+  EBMLID_MAX_SIZE_LENGTH = 0x42f3,
+  EBMLID_DOCTYPE = 0x4282,
+  EBMLID_DOCTYPE_VERSION = 0x4287,
+  EBMLID_DOCTYPE_READ_VERSION = 0x4285,
+
+  /*EBMLID_CRC32 = 0xC3, FIXME: support this! Need some magical logic to skip 
it, unlike MatroskaID_CRC32 = 0xBF. That is, files with 0xC3 are completely 
unreadable at the moment. */
+
+  MatroskaID_Segment = 0x18538067,
+
+  MatroskaID_SeekHead = 0x114D9B74,
+
+  MatroskaID_Seek = 0x4DBB, /* mandatory, may appear more than once. Contains 
a single seek entry to an EBML element. */
+
+  MatroskaID_SeekID = 0x53AB, /* mandatory, BINARY. The binary ID 
corresponding to the element name. */
+  MatroskaID_SeekPosition = 0x53AC, /* mandatory, UINT. The position of the 
element in the segment in octets (0 = first level 1 element). */
+
+  MatroskaID_Info = 0x1549A966,
+
+  MatroskaID_Info_TimecodeScale = 0x2AD7B1, /* defaults to 1000000, UINT. 
Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are 
expressed in milliseconds). */
+  MatroskaID_Info_Duration = 0x4489, /* must be >0, FLOAT. Duration of the 
segment (based on TimecodeScale). */
+  MatroskaID_Info_DateUTC = 0x4461, /* DATE. Date of the origin of timecode 
(value 0), i.e. production date. */
+  MatroskaID_Info_Title = 0x7BA9, /* UTF-8-encoded. General name of the 
segment. */
+  MatroskaID_Info_MuxingApp = 0x4D80, /* mandatory, UTF-8-encoded. Muxing 
application or library ("libmatroska-0.4.3"). */
+  MatroskaID_Info_WritingApp = 0x5741, /* mandatory, UTF-8-encoded. Writing 
application ("mkvmerge-0.3.3"). */
+
+  MatroskaID_Tracks = 0x1654AE6B,
+
+  MatroskaID_Tracks_TrackEntry = 0xAE,
+
+  MatroskaID_Tracks_TrackType = 0x83, /* mandatory, 1-254, UINT. A set of 
track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: 
subtitle, 0x12: buttons, 0x20: control). */
+  MatroskaID_Tracks_Name = 0x536E, /* UTF-8-encoded. A human-readable track 
name. */
+  MatroskaID_Tracks_Language = 0x22B59C, /* defaults to 'eng', string. 
Specifies the language of the track in the Matroska languages form. */
+  MatroskaID_Tracks_CodecID = 0x86, /* mandatory, string. An ID corresponding 
to the codec, see the codec page ( 
http://matroska.org/technical/specs/codecid/index.html ) for more info. */
+  MatroskaID_Tracks_CodecName = 0x258688, /* UTF-8-encoded. A human-readable 
string specifying the codec. */
+
+  MatroskaID_Tracks_Video = 0xE0, /* Video settings. */
+  MatroskaID_Tracks_Video_FlagInterlaced = 0x9A, /* mandatory, 0-1, defaults 
to 0, UINT. Set if the video is interlaced. (1 bit) */
+  MatroskaID_Tracks_Video_StereoMode = 0x53B8, /* defaults to 0, UINT. 
Stereo-3D video mode (0: mono, 1: side by side (left eye is first), 2: 
top-bottom (right eye is first), 3: top-bottom (left eye is first), 4: 
checkboard (right is first), 5: checkboard (left is first), 6: row interleaved 
(right is first), 7: row interleaved (left is first), 8: column interleaved 
(right is first), 9: column interleaved (left is first), 10: anaglyph 
(cyan/red), 11: side by side (right eye is first), 12: anaglyph 
(green/magenta), 13 both eyes laced in one Block (left eye is first), 14 both 
eyes laced in one Block (right eye is first)) . There are some more details on 
3D support in the Specification Notes ( 
http://matroska.org/technical/specs/notes.html#3D ). */
+  MatroskaID_Tracks_Video_PixelWidth = 0xB0, /* mandatory, not 0, UINT. Width 
of the encoded video frames in pixels. */
+  MatroskaID_Tracks_Video_PixelHeight = 0xBA, /* mandatory, not 0, UINT. 
Height of the encoded video frames in pixels. */
+  MatroskaID_Tracks_Video_DisplayWidth = 0x54B0, /* not 0, defaults to 
PixelWidth, UINT. Width of the video frames to display. The default value is 
only valid when DisplayUnit is 0. */
+  MatroskaID_Tracks_Video_DisplayHeight = 0x54BA, /* not 0, defaults to 
PixelHeight, UINT. Height of the video frames to display. The default value is 
only valid when DisplayUnit is 0. */
+  MatroskaID_Tracks_Video_DisplayUnit = 0x54B2, /* defaults to 0, UINT. How 
DisplayWidth & DisplayHeight should be interpreted (0: pixels, 1: centimeters, 
2: inches, 3: Display Aspect Ratio). */
+
+  MatroskaID_Tracks_Audio = 0xE1, /* Audio settings. */
+  MatroskaID_Tracks_Audio_SamplingFrequency = 0xB5, /* mandatory, > 0, 
defaults to 8000.0, FLOAT. Sampling frequency in Hz. */
+  MatroskaID_Tracks_Audio_OutputSamplingFrequency = 0x78B5, /* > 0, defaults 
to SamplingFrequency, FLOAT. Real output sampling frequency in Hz (used for SBR 
techniques). */
+  MatroskaID_Tracks_Audio_Channels = 0x9F, /* mandatory, not 0, defaults to 1, 
UINT. Numbers of channels in the track. */
+  MatroskaID_Tracks_Audio_BitDepth = 0x6264, /* not 0, UINT. Bits per sample, 
mostly used for PCM. */
+
+
+
+  MatroskaID_Tags = 0x1254C367, /* can appear more than once. Element 
containing elements specific to Tracks/Chapters. A list of valid tags can be 
found here. */
+  MatroskaID_Tags_Tag = 0x7373, /* mandatory, can appear more than once. 
Element containing elements specific to Tracks/Chapters. */
+  MatroskaID_Tags_Tag_SimpleTag = 0x67C8, /* mandatory, can appear more than 
once, recursive. Contains general information about the target. */
+  MatroskaID_Tags_Tag_SimpleTag_TagName = 0x45A3, /* mandatory, UTF8-encoded. 
The name of the Tag that is going to be stored. */
+  MatroskaID_Tags_Tag_SimpleTag_TagLanguage = 0x447A, /* mandatory, defaults 
to 'und', string. Specifies the language of the tag specified, in the Matroska 
languages form. */
+  MatroskaID_Tags_Tag_SimpleTag_TagDefault = 0x4484, /* mandatory, 0-1, 
defaults to 1, UINT. Indication to know if this is the default/original 
language to use for the given tag. (1 bit) */
+  MatroskaID_Tags_Tag_SimpleTag_TagString = 0x4487, /* UTF-8-encoded. The 
value of the Tag. */
+  MatroskaID_Tags_Tag_SimpleTag_TagBinary = 0x4485 /* BINARY. The values of 
the Tag if it is binary. Note that this cannot be used in the same SimpleTag as 
TagString. */
+};
+
+
+enum VINTParseMode
+{
+  VINT_READ_ID = 0,
+  VINT_READ_SIZE = 1,
+  VINT_READ_UINT = 2,
+  VINT_READ_SINT = 3
+};
+
+/**
+ * Reads an EBML integer from the buffer
+ *
+ * @param buffer array of bytes to read from
+ * @param start the position in buffer at which to start reading
+ * @param end first invalid index in buffer (i.e. buffer size)
+ * @param result receives the integer.
+ * @param mode (see VINTParseMode)
+ * @return number of bytes occupied by the integer (the integer itself
+ *         is always put into 64-bit long buffer),
+ *         -1 if there is not enough bytes to read the integer
+ */
+static ssize_t
+VINTparse (struct EXTRACTOR_PluginList *plugin,
+           int64_t * result, enum VINTParseMode mode)
+{
+  /* 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001 */
+  static const unsigned char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 
0x02, 0x01 };
+  /* 01111111 00111111 00011111 00001111 00000111 00000011 00000001 00000000 */
+  static const unsigned char imask[8] = { 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 
0x01, 0x00 };
+  static const int64_t int_negative_limits[8] = {
+    -0x00000000000040LL, /*  7-bit integer */
+    -0x00000000002000LL, /* 14-bit integer */
+    -0x00000000100000LL, /* 21-bit integer */
+    -0x00000008000000LL, /* 28-bit integer */
+    -0x00000400000000LL, /* 35-bit integer */
+    -0x00020000000000LL, /* 42-bit integer */
+    -0x01000000000000LL, /* 49-bit integer */
+    -0x80000000000000LL, /* 56-bit integer */
+  };
+  static const int64_t int_positive_limits[8] = {
+    0x00000000000040ULL - 1LL, /*  7-bit integer */
+    0x00000000002000ULL - 1LL, /* 14-bit integer */
+    0x00000000100000ULL - 1LL, /* 21-bit integer */
+    0x00000008000000ULL - 1LL, /* 28-bit integer */
+    0x00000400000000ULL - 1LL, /* 35-bit integer */
+    0x00020000000000ULL - 1LL, /* 42-bit integer */
+    0x01000000000000ULL - 1LL, /* 49-bit integer */
+    0x80000000000000ULL - 1LL, /* 56-bit integer */
+  };
+  static const uint64_t uint_positive_limits[8] = {
+    0x0000000000000080ULL - 1LL, /*  7-bit integer */
+    0x0000000000004000ULL - 1LL, /* 14-bit integer */
+    0x0000000000200000ULL - 1LL, /* 21-bit integer */
+    0x0000000010000000ULL - 1LL, /* 28-bit integer */
+    0x0000000800000000ULL - 1LL, /* 35-bit integer */
+    0x0000040000000000ULL - 1LL, /* 42-bit integer */
+    0x0002000000000000ULL - 1LL, /* 49-bit integer */
+    0x0100000000000000ULL - 1LL, /* 56-bit integer */
+  };
+  int vint_width;
+  unsigned int c;
+  uint64_t result_u;
+  int64_t result_s;
+  uint64_t temp;
+  unsigned char *data;
+  unsigned char first_byte;
+  unsigned char int_bytes[8];
+
+  /* Minimal integer size is 1 byte */
+  if (1 != pl_read (plugin, &data, 1))
+    return -1;
+  first_byte = data[0];
+
+  /* An integer begins with zero or more 0-bits. Number of 0-bits indicates the
+   * width of the integer, zero 0-bits means a 1-byte long integer; 8 0-bits
+   * indicate a 8-byte (64-bit) integer.
+   * 0-bits are followed by a mandatory 1-bit. Then - by the bits of the 
integer
+   * itself. Integers are stored in big-endian order. Because of the width 
prefix
+   * and the mandatory 1-bit, integers are relatively short:
+   * 1-byte integer has 2^7 different values,
+   * 2-byte integer has 2^14 different values,
+   * etc
+   */
+  /*
+   * Examine the first byte and see how many 0-bytes are at its beginning.
+   */
+  vint_width = 0;
+  for (c = 0; c < 8; c++)
+    if (!(first_byte & mask[c]))
+      vint_width++;
+    else
+      break;
+  /* vint_width now contains the number of 0-bytes. That is also the number
+   * of extra bytes occupied by the integer (beyond the one that we've just
+   * partially read).
+   */
+  if (vint_width != pl_read (plugin, &data, vint_width))
+    return -1;
+
+  if ((vint_width >= 8))
+    return 0;
+
+  memcpy (&int_bytes[1], data, vint_width);
+  int_bytes[0] = first_byte;
+
+  /* OK, signedness is a PITA. Here's a small scale example to illustrate
+   * the point:
+   * 4-bit unsigned integer:
+   * 0 1 2 3 4 5 6 7  8  9  10  11  12  13  14   15
+   * 4-bit signed integer:
+   * 0 1 2 3 4 5 6 7 -8 -7  -6  -5  -4  -3  -2   -1
+   * 
+   * 3 here is 0011b, and -3 is 1101b
+   * However, writing 1101b into int8_t memory location will NOT make
+   * the machine interpret it as -3, it will be interpreted as 00001101b,
+   * which is 13. To be -3 in int8_t it has to be 11111101b. That is,
+   * it must be padded with extra 1s to the left, but only if its first
+   * bit is set (which means a negative integer)!
+   * Easier way (without looking closesly at the bits):
+   * 1) get it as unsigned integer (say, 1010b, which is 10 for a 4-bit 
unsigned
+   * integer, and is 10 for any large unsigned integer, so this interpretation 
is
+   * always correct).
+   * 2) see if it's more than what a signed integer would hold (it is - a
+   * signed integer only holds up to 7). At this point we will need an array 
of 8
+   * different maximums for signed integers, indexed by vint_width.
+   * 3) do the following math: 10 - 8 = 2 ; -8 + 2 = -6
+   * That is, the minimal signed value (-8) and the number (10) should be 
summed,
+   * and the sum (2) should be added to the minimal signed value (-8)
+   * to get the signed counterpart (-6) of the number (10)
+   * 13 - 8 = 5; -8 + 5 = -3
+   * It's better to do that in two separate steps, because combining it into 
one step
+   * boils down to -8 + -8 + 13, which might confuse the compiler, because -8 
+ -8 = -16,
+   * which is outside of the signed integer range (remember, we're in 4-bit 
space here).
+   * on the other hand, 5 and -3 both are within the range.
+   * 4) if the number does not exceed the signed integer maximum (7), store it 
as-is
+   */
+
+  result_u = 0;
+  /* Copy the extra bytes into a temporary buffer, in the right order */
+  for (c = 0; c < vint_width; c++)
+    result_u += ((uint64_t) int_bytes[vint_width - c]) << (c * 8);
+
+  /* Add the first byte, do mode-dependent adjustment, then copy the result */
+  switch (mode)
+  {
+  case VINT_READ_UINT:
+    /* Unset the 1-bit marker */
+    result_u += ((uint64_t) int_bytes[0] & imask[vint_width]) << (vint_width * 
8);
+    memcpy (result, &result_u, sizeof (uint64_t));
+    break;
+  case VINT_READ_ID:
+    /* Do not unset the 1-bit marker*/
+    result_u += ((uint64_t) int_bytes[0]) << (vint_width * 8);
+    memcpy (result, &result_u, sizeof (uint64_t));
+    break;
+  case VINT_READ_SIZE:
+    /* Unset the 1-bit marker */
+    result_u += ((uint64_t) int_bytes[0] & imask[vint_width]) << (vint_width * 
8);
+    /* Special case: all-1 size means "size is unknown". We indicate this
+     * in the return value by setting it to UINT64_MAX.
+     */
+    if (result_u == uint_positive_limits[vint_width])
+      result_u = 0xFFFFFFFFFFFFFFFFULL;
+    memcpy (result, &result_u, sizeof (uint64_t));
+    break;
+  case VINT_READ_SINT:
+    /* Unset the 1-bit marker */
+    result_u += ((uint64_t) int_bytes[0] & imask[vint_width]) << (vint_width * 
8);
+    /* Interpret large values as negative signed values */
+    if (result_u > int_positive_limits[vint_width])
+    {
+      /* Pray that the compiler won't optimize this */
+      temp = result_u + int_negative_limits[vint_width];
+      result_s = int_negative_limits[vint_width] + temp;
+    }
+    else
+      result_s = result_u;
+    memcpy (result, &result_s, sizeof (int64_t));
+    break;
+  }
+  return vint_width + 1;
+}
+
+
+/**
+ * Reads an EBML element header. Only supports 32-bit IDs and 64-bit sizes.
+ * (EBML might specify that IDs larger than 32 bits are allowed, or that
+ * sizes larger than 64 bits are allowed).
+ *
+ * @param buffer array of bytes to read the header from
+ * @param start index at which start to read
+ * @param end first invalid index in the array (i.e. array size)
+ * @param id receives the element id
+ * @param size receives the element size
+ * @return number of bytes occupied by the header,
+ *         0 if buffer doesn't contain a header at 'start',
+ *         -1 if buffer doesn't contain a complete header
+ */
+static ssize_t
+elementRead (struct EXTRACTOR_PluginList *plugin,
+             uint32_t *id, int64_t * size)
+{
+  int64_t tempID;
+  int64_t tempsize;
+  ssize_t id_offset;
+  ssize_t size_offset;
+
+  tempID = 0;
+
+  id_offset = VINTparse (plugin, &tempID, VINT_READ_ID);
+  if (id_offset <= 0)
+    return id_offset;
+  if (id_offset > 4)
+    /* Interpret unsupported long IDs as file corruption */
+    return 0;
+  /* VINTparse takes care of returning 0 when size is > 8 bytes */
+  size_offset = VINTparse (plugin, &tempsize, VINT_READ_SIZE);
+  if (size_offset <= 0)
+    return size_offset;
+  *id = (uint32_t) tempID;
+  *size = tempsize;
+#if DEBUG_EBML
+  printf ("EL 0x%06X %llu\n", *id, *size);
+#endif
+  return id_offset + size_offset;
+}
+
+static ssize_t
+idRead (struct EXTRACTOR_PluginList *plugin,
+        uint64_t length, uint32_t *id)
+{
+  int64_t tempID;
+  ssize_t id_offset;
+
+  tempID = 0;
+
+  id_offset = VINTparse (plugin, &tempID, VINT_READ_ID);
+  if (id_offset <= 0)
+    return id_offset;
+  if (id_offset > 4)
+    return 0;
+  *id = (uint32_t) tempID;
+  return id_offset;
+}
+
+static ssize_t
+uintRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, uint64_t 
*result)
+{
+  size_t c;
+  unsigned char *data;
+
+  if (length != pl_read (plugin, &data, length))
+    return -1;
+
+  *result = 0;
+  for (c = 1; c <= length; c++)
+    *result += ((uint64_t) data[c - 1]) << (8 * (length - c));
+  return (ssize_t) length;
+}
+
+static ssize_t
+sintRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, int64_t 
*result)
+{
+  size_t c;
+  uint64_t tmp;
+  unsigned char *data;
+
+  if (length != pl_read (plugin, &data, length))
+    return -1;
+
+  tmp = 0;
+  for (c = 1; c <= length; c++)
+    tmp += ((uint64_t) data[c - 1]) << (8 * (length - c));
+  if (0x80 == (0x80 & data[0]))
+  {
+    /* OK, i'm just too tired to think... If sign bit is set, pad the rest of 
the
+     * uint64_t with 0xFF. Unlike variable-length integers, these have normal
+     * multiple-of-8 length, and will fit well. They just need to be padded.
+     */
+    int i;
+    for (i = length; i < 8; i++)
+      tmp += ((uint64_t) 0xFF) << (8 * i);
+  }
+  memcpy (result, &tmp, sizeof (uint64_t));
+  return (ssize_t) length;
+}
+
+static ssize_t
+stringRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, char *result)
+{
+  uint64_t read_length;
+  unsigned char *data;
+
+  read_length = length;
+  if (length > MAX_STRING_SIZE)
+    read_length = MAX_STRING_SIZE;
+
+  if (read_length != pl_read (plugin, &data, read_length))
+    return -1;
+
+  memcpy (result, data, read_length);
+  result[read_length] = '\0';
+  if (read_length < length)
+    if ((length - read_length) != pl_read (plugin, &data, length - 
read_length))
+      return -1;
+  /* Can't return uint64_t - need it to be signed */
+  return 1;
+}
+
+static ssize_t
+floatRead (struct EXTRACTOR_PluginList *plugin, uint64_t length, long double 
*result)
+{
+  size_t c;
+  unsigned char t[8];
+  unsigned char *data;
+
+  if (length != pl_read (plugin, &data, length))
+    return -1;
+
+  /* we don't support 10-byte floats, because not all C compilers will 
guarantee that long double is stored in 10 bytes in a IEEE-conformant format */
+  if (length != 4 && length != 8 /* && length != 10 */)
+    return 0;
+
+  for (c = 0; c < length; c++)
+  {
+#if __BYTE_ORDER == __BIG_ENDIAN
+    t[c] = data[c];
+#else
+    t[c] = data[length - 1 - c];
+#endif
+  }
+  if (length == 4)
+    *result = * ((float *) t);
+  else if (length == 8)
+    *result = * ((double *) t);
+  else
+    *result = * ((long double *) t);
+  return (ssize_t) length;
+}
+
+static const char stream_type_letters[] = "?vat";      /*[0]-no, 
[1]-video,[2]-audio,[3]-text */
+
+enum EBMLState
+{
+  EBML_BAD_STATE = -1,
+  EBML_LOOKING_FOR_HEADER = 0,
+  EBML_READING_HEADER = 1,
+  EBML_READING_ELEMENTS = 2,
+  EBML_READ_ELEMENT = 3,
+  EBML_READING_HEADER_ELEMENTS = 4,
+  EBML_FINISHED_READING_HEADER = 5,
+  EBML_READ_UINT,
+  EBML_READ_ID,
+  EBML_READ_SINT,
+  EBML_READ_FLOAT,
+  EBML_READ_STRING,
+  EBML_READING_HEADER_ELEMENT_VALUE,
+  EBML_SKIP_UNTIL_NEXT_HEADER,
+  EBML_READING_MATROSKA_SEGMENT,
+  EBML_READING_MATROSKA_SEGMENT_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_SEGMENT_CONTENTS,
+  EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_SEEK_HEAD_CONTENTS,
+  EBML_READING_MATROSKA_SEEK_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_SEEK_CONTENTS,
+  EBML_READING_MATROSKA_SEEK_CONTENTS_VALUE,
+  EBML_READING_MATROSKA_INFO_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_INFO_CONTENTS,
+  EBML_READING_MATROSKA_TRACKS_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_TRACKS_CONTENTS,
+  EBML_READING_MATROSKA_TAGS_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_TAGS_CONTENTS,
+  EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_CONTENTS,
+  EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS_VALUE,
+  EBML_READING_MATROSKA_INFO_CONTENTS_VALUE,
+  EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS,
+  EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS_VALUE,
+  EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS,
+  EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS_VALUE,
+  EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS,
+  EBML_READING_MATROSKA_TAG_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_TAG_CONTENTS,
+  EBML_READING_MATROSKA_SIMPLETAG_CONTENTS,
+  EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS,
+  EBML_READING_MATROSKA_SIMPLETAG_CONTENTS_VALUE
+};
+
+struct ebml_element
+{
+  uint64_t position;
+  uint64_t header_size;
+  uint32_t id;
+  uint64_t size;
+  struct ebml_element *parent;
+  int finish_state;
+  int prev_state;
+  int bail_state;
+  int bail_next_state;
+};
+
+struct matroska_seek_list
+{
+  struct matroska_seek_list *next;
+  uint32_t id;
+  uint64_t position;
+};
+
+struct matroska_simpletag
+{
+  struct matroska_simpletag *next;
+  struct matroska_simpletag *child;
+  struct matroska_simpletag *parent;
+  char *name;
+  char *string;
+};
+
+struct ebml_state
+{
+  enum EBMLState state;
+
+  struct ebml_element *stack_top;
+
+  enum EBMLState next_state;
+
+  int reported_ebml;
+  int valid_ebml;
+  uint64_t ebml_version;
+  uint64_t ebml_read_version;
+  uint64_t ebml_max_id_length;
+  uint64_t ebml_max_size_length;
+  char *doctype;
+  uint64_t doctype_version;
+  uint64_t doctype_read_version;
+
+  int64_t segment_contents_start;
+
+  struct matroska_seek_list *matroska_seeks;
+  struct matroska_seek_list *matroska_seeks_tail;
+  struct matroska_seek_list *matroska_pos;
+  uint32_t matroska_seek_id;
+  uint64_t matroska_seek_position;
+
+  int reported_matroska_info;
+  int valid_matroska_info;
+  uint64_t matroska_info_timecode_scale;
+  double matroska_info_duration;
+  int matroska_info_date_utc_is_set;
+  int64_t matroska_info_date_utc;
+  char *matroska_info_title;
+  char *matroska_info_muxing_app;
+  char *matroska_info_writing_app;
+
+  int reported_matroska_track;
+  int valid_matroska_track;
+  uint64_t matroska_track_type;
+  char *matroska_track_name;
+  char *matroska_track_language;
+  char *matroska_track_codec_id;
+  char *matroska_track_codec_name;
+
+  int valid_matroska_track_video;
+  uint64_t matroska_track_video_flag_interlaced;
+  uint64_t matroska_track_video_stereo_mode;
+  uint64_t matroska_track_video_pixel_width;
+  uint64_t matroska_track_video_pixel_height;
+  uint64_t matroska_track_video_display_width;
+  uint64_t matroska_track_video_display_height;
+  uint64_t matroska_track_video_display_unit;
+
+  int valid_matroska_track_audio;
+  double matroska_track_audio_sampling_frequency;
+  double matroska_track_audio_output_sampling_frequency;
+  uint64_t matroska_track_audio_channels;
+  uint64_t matroska_track_audio_bit_depth;
+
+  struct matroska_simpletag *tag_tree;
+  struct matroska_simpletag *tag_last;
+  struct matroska_simpletag *tag_current;
+};
+
+static void
+clean_ebml_state_ebml (struct ebml_state *state)
+{
+  if (state->doctype != NULL)
+    free (state->doctype);
+  state->doctype = NULL;
+  state->reported_ebml = 0;
+  state->valid_ebml = 0;
+  state->ebml_version = 1;
+  state->ebml_read_version = 1;
+  state->ebml_max_id_length = 4;
+  state->ebml_max_size_length = 8;
+  state->doctype = NULL;
+  state->doctype_version = 0;
+  state->doctype_read_version = 0;
+}
+
+static void
+clean_ebml_state_matroska_simpletags (struct ebml_state *state)
+{
+  struct matroska_simpletag *el, *parent, *next;
+  for (el = state->tag_tree; el;)
+  {
+    if (el->child != NULL)
+    {
+      el = el->child;
+      continue;
+    }
+    parent = el->parent;
+    next = el->next;
+    if (el->name != NULL)
+      free (el->name);
+    if (el->string != NULL)
+      free (el->string);
+    free (el);
+    if (parent != NULL && parent->child == el)
+      parent->child = next;
+    el = next;
+    if (next == NULL)
+      el = parent;
+  }
+  state->tag_tree = NULL;
+  state->tag_last = NULL;
+  state->tag_current = NULL;
+}
+
+void
+matroska_add_tag (struct ebml_state *state, struct matroska_simpletag *parent, 
char *name, char *string)
+{
+  struct matroska_simpletag *el = malloc (sizeof (struct matroska_simpletag));
+  el->parent = parent;
+  el->next = NULL;
+  el->child = NULL;
+  el->name = name;
+  el->string = string;
+  if (state->tag_last != NULL)
+  {
+    if (state->tag_last == parent)
+      state->tag_last->child = el;
+    else
+      state->tag_last->next = el;
+  }
+  state->tag_last = el;
+}
+
+static void
+clean_ebml_state_matroska_seeks (struct ebml_state *state)
+{
+  struct matroska_seek_list *seek_head, *next;
+  for (seek_head = state->matroska_seeks; seek_head != NULL; seek_head = next)
+  {
+    next = seek_head->next;
+    free (seek_head);
+  }
+  state->matroska_seeks = NULL;
+  state->matroska_seeks_tail = NULL;
+}
+
+static void
+clean_ebml_state_matroska_segment (struct ebml_state *state)
+{
+  state->segment_contents_start = 0;
+  state->matroska_pos = NULL;
+
+  clean_ebml_state_matroska_seeks (state);
+  clean_ebml_state_matroska_simpletags (state);
+}
+
+static void
+clean_ebml_state_matroska_seek (struct ebml_state *state)
+{
+  state->matroska_seek_id = 0;
+  state->matroska_seek_position = 0;
+}
+
+static void
+clean_ebml_state_matroska_info (struct ebml_state *state)
+{
+  state->reported_matroska_info = 0;
+  state->valid_matroska_info = -1;
+  state->matroska_info_timecode_scale = 1000000;
+  state->matroska_info_duration = -1.0;
+  state->matroska_info_date_utc_is_set = 0;
+  state->matroska_info_date_utc = 0;
+  if (state->matroska_info_title != NULL)
+    free (state->matroska_info_title);
+  state->matroska_info_title = NULL;
+  if (state->matroska_info_muxing_app != NULL)
+    free (state->matroska_info_muxing_app);
+  state->matroska_info_muxing_app = NULL;
+  if (state->matroska_info_writing_app != NULL)
+    free (state->matroska_info_writing_app);
+  state->matroska_info_writing_app = NULL;
+}
+
+static void
+clean_ebml_state_matroska_track_video (struct ebml_state *state)
+{
+  state->valid_matroska_track_video = -1;
+  state->matroska_track_video_flag_interlaced = 0;
+  state->matroska_track_video_stereo_mode = 0;
+  state->matroska_track_video_pixel_width = 0;
+  state->matroska_track_video_pixel_height = 0;
+  state->matroska_track_video_display_width = 0;
+  state->matroska_track_video_display_height = 0;
+  state->matroska_track_video_display_unit = 0;
+}
+
+static void
+clean_ebml_state_matroska_track_audio (struct ebml_state *state)
+{
+  state->valid_matroska_track_audio = -1;
+  state->matroska_track_audio_sampling_frequency = 8000.0;
+  state->matroska_track_audio_output_sampling_frequency = 0;
+  state->matroska_track_audio_channels = 1;
+  state->matroska_track_audio_bit_depth = 0;
+}
+
+static void
+clean_ebml_state_matroska_track (struct ebml_state *state)
+{
+  state->reported_matroska_track = 0;
+  state->valid_matroska_track = -1;
+  state->matroska_track_type = 0;
+  if (state->matroska_track_name != NULL)
+    free (state->matroska_track_name);
+  state->matroska_track_name = NULL;
+  if (state->matroska_track_language != NULL)
+    free (state->matroska_track_language);
+  state->matroska_track_language = strdup ("eng");
+  if (state->matroska_track_codec_id != NULL)
+    free (state->matroska_track_codec_id);
+  state->matroska_track_codec_id = NULL;
+  if (state->matroska_track_codec_name != NULL)
+    free (state->matroska_track_codec_name);
+  state->matroska_track_codec_name = NULL;
+
+  clean_ebml_state_matroska_track_video (state);
+  clean_ebml_state_matroska_track_audio (state);
+}
+
+static struct ebml_state *
+EXTRACTOR_ebml_init_state_method ()
+{
+  struct ebml_state *state;
+  state = malloc (sizeof (struct ebml_state));
+  if (state == NULL)
+    return NULL;
+  memset (state, 0, sizeof (struct ebml_state));
+
+  state->next_state = EBML_BAD_STATE;
+
+  clean_ebml_state_ebml (state);
+  clean_ebml_state_matroska_info (state);
+  clean_ebml_state_matroska_track (state);
+  return state;
+}
+
+static void
+report_simpletag (struct ebml_state *state, EXTRACTOR_MetaDataProcessor proc, 
void *proc_cls)
+{
+  struct matroska_simpletag *el, *next;
+  char format[MAX_STRING_SIZE + 1];
+  for (el = state->tag_tree; el != NULL; el = next)
+  {
+    if (el->name != NULL && el->name[0] != '\0' && el->string != NULL && 
el->string[0] != '\0')
+    {
+      enum EXTRACTOR_MetaType metatype = EXTRACTOR_METATYPE_RESERVED;
+      struct MatroskaTagMap *map_item;
+      for (map_item = &tag_map[0]; map_item->name != NULL; map_item++)
+      {
+        if (strcmp (map_item->name, el->name) == 0)
+        {
+          metatype = map_item->id;
+          break;
+        }
+      }
+      if (metatype == EXTRACTOR_METATYPE_RESERVED)
+      {
+        snprintf (format, MAX_STRING_SIZE, "%s=%s", el->name, el->string);
+        format[MAX_STRING_SIZE] = '\0';
+        ADD_MATROSKA(format, EXTRACTOR_METATYPE_UNKNOWN);
+      }
+      else
+        ADD_MATROSKA(el->string, metatype);
+    }
+    next = el->child;
+    while (next == NULL && el != NULL)
+    {
+      next = el->next;
+      if (next == NULL)
+        el = el->parent;
+    }
+  }
+  clean_ebml_state_matroska_simpletags (state);
+}
+
+static void
+report_state (struct ebml_state *state, EXTRACTOR_MetaDataProcessor proc, void 
*proc_cls)
+{
+  char format[MAX_STRING_SIZE + 1];
+  report_simpletag (state, proc, proc_cls);
+  if (state->valid_ebml && !state->reported_ebml)
+  {
+    state->reported_ebml = 1;
+    snprintf (format, MAX_STRING_SIZE, "%llu", (unsigned long long) 
state->ebml_version);
+    format[MAX_STRING_SIZE] = '\0';
+    ADD_EBML(format, EXTRACTOR_METATYPE_FORMAT_VERSION);
+    snprintf (format, MAX_STRING_SIZE, "%s %llu (EBML %llu)", state->doctype, 
+              (unsigned long long) state->doctype_version,
+              (unsigned long long) state->ebml_version);
+    format[MAX_STRING_SIZE] = '\0';
+    ADD_EBML (format, EXTRACTOR_METATYPE_RESOURCE_TYPE);
+  }
+  if (state->valid_ebml)
+    clean_ebml_state_ebml (state);
+  if (state->valid_matroska_info == -1)
+  {
+    if ((state->matroska_info_duration > 0 || state->matroska_info_duration == 
-1.0) &&
+        state->matroska_info_muxing_app != NULL && 
state->matroska_info_writing_app != NULL)
+      state->valid_matroska_info = 1;
+    else
+      state->valid_matroska_info = 0;
+  }
+  if (state->valid_matroska_info == 1 && !state->reported_matroska_info)
+  {
+    state->reported_matroska_info = 1;
+    if (state->matroska_info_duration != -1.0)
+    {
+      uint64_t seconds = (uint64_t) ((state->matroska_info_duration * (float) 
state->matroska_info_timecode_scale) / 1e+9);
+      snprintf (format, MAX_STRING_SIZE, "%llus", (unsigned long long) 
seconds);
+      format[MAX_STRING_SIZE] = '\0';
+      ADD_MATROSKA(format, EXTRACTOR_METATYPE_DURATION);
+    }
+    if (state->matroska_info_date_utc_is_set)
+    {
+      struct tm millenium_start;
+      struct tm matroska_date;
+      int64_t millenium_start_stamp;
+      int64_t matroska_date_stamp;
+#if WINDOWS
+      __time64_t matroska_date_stamp_time_t;
+#else
+      time_t matroska_date_stamp_time_t;
+#endif
+      millenium_start.tm_sec = 0;
+      millenium_start.tm_min = 0;
+      millenium_start.tm_hour = 0;
+      millenium_start.tm_mday = 1;
+      millenium_start.tm_mon = 1;
+      millenium_start.tm_year = 2001 - 1900;
+      millenium_start.tm_isdst = -1;
+      putenv ("TZ=GMT0");
+      /* If no matter what is the size of the returned value, it fits 32-bit 
integer
+       * (in fact, i could have just used a constant here, since the start of 
Matroska
+       * millenium is known and never changes), but we want to use 64-bit 
integer to
+       * manipulate time. If it gets trimmed later, when assigning back to a 
TIME_TYPE
+       * that happens to be 32-bit long - well, tough luck.
+       */
+      errno = 0;
+#if WINDOWS
+      millenium_start_stamp = _mktime64 (&millenium_start);
+#else
+      millenium_start_stamp = (time_t) mktime (&millenium_start);
+#endif
+      if (millenium_start_stamp == -1)
+        printf ("Failed to convert time: %d\n", errno);
+      matroska_date_stamp = millenium_start_stamp * 1000000000 + 
state->matroska_info_date_utc;
+      /* Now matroska_date_stamp is the number of nanoseconds since UNIX Epoch 
*/
+      matroska_date_stamp_time_t = matroska_date_stamp / 1000000000;
+      /* Now matroska_date_stamp_time_t is the number of seconds since UNIX 
Epoch */
+#if WINDOWS
+      if (NULL != gmtime_undocumented_64_r (&matroska_date_stamp_time_t, 
&matroska_date))
+#else
+      /* We want to be thread-safe. If you have no gmtime_r(), think of 
something! */
+      if (NULL != gmtime_r (&matroska_date_stamp_time_t, &matroska_date))
+#endif
+      {
+        if (0 != strftime (format, MAX_STRING_SIZE, "%Y.%m.%d %H:%M:%S UTC", 
&matroska_date))
+          ADD_MATROSKA(format, EXTRACTOR_METATYPE_CREATION_DATE);
+      }
+    }
+    if (state->matroska_info_title != NULL)
+      ADD_MATROSKA(state->matroska_info_title, EXTRACTOR_METATYPE_TITLE);
+    if (strcmp (state->matroska_info_writing_app, 
state->matroska_info_muxing_app) == 0)
+      snprintf (format, MAX_STRING_SIZE, "Written and muxed with %s", 
state->matroska_info_writing_app);
+    else
+      snprintf (format, MAX_STRING_SIZE, "Written with %s, muxed with %s", 
state->matroska_info_writing_app, state->matroska_info_muxing_app);
+    format[MAX_STRING_SIZE] = '\0';
+    ADD_MATROSKA(format, EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE);
+  }
+  if (state->valid_matroska_info == 1)
+    clean_ebml_state_matroska_info (state);
+  if (state->valid_matroska_track == -1)
+  {
+    if ((state->matroska_track_type > 0 && state->matroska_track_type < 255) &&
+        state->matroska_track_codec_id != NULL)
+      state->valid_matroska_track = 1;
+    else
+      state->valid_matroska_track = 0;
+  }
+  if (state->valid_matroska_track_video == -1)
+  {
+    if ((state->matroska_track_video_flag_interlaced == 0 || 
state->matroska_track_video_flag_interlaced == 1) &&
+        (state->matroska_track_video_stereo_mode >= 0 && 
state->matroska_track_video_stereo_mode <= 14) &&
+        state->matroska_track_video_pixel_width > 0 && 
state->matroska_track_video_pixel_height > 0)
+      state->valid_matroska_track_video = 1;
+    else
+      state->valid_matroska_track_video = 0;
+  }
+  if (state->valid_matroska_track_audio == -1)
+  {
+    if (state->matroska_track_audio_sampling_frequency > 0 &&
+        state->matroska_track_audio_channels > 0)
+      state->valid_matroska_track_audio = 1;
+    else
+      state->valid_matroska_track_audio = 0;
+  }
+  if (state->valid_matroska_track == 1 && !state->reported_matroska_track)
+  {
+    char name_part[MAX_STRING_SIZE + 1];
+    char codec_part[MAX_STRING_SIZE + 1];
+    char bit_part[MAX_STRING_SIZE + 1];
+    char hz_part[MAX_STRING_SIZE + 1];
+    struct MatroskaTrackType *tt;
+    const char *track_type_string = NULL;
+    char use_video = 0;
+    char use_audio = 0;
+
+    state->reported_matroska_track = 1;
+    for (tt = track_types; tt->code > 0; tt++)
+    {
+      if (tt->code == state->matroska_track_type)
+      {
+        track_type_string = tt->name;
+        if (tt->video_must_be_valid == 1)
+          use_video = 1;
+        else if (tt->audio_must_be_valid == 1)
+          use_audio = 1;
+        break;
+      }
+    }
+    if (track_type_string == NULL)
+      track_type_string = "unknown";
+
+    if (state->matroska_track_name == NULL)
+      snprintf (name_part, MAX_STRING_SIZE, "%s", "");
+    else
+      snprintf (name_part, MAX_STRING_SIZE, "`%s' ", 
state->matroska_track_name);
+    name_part[MAX_STRING_SIZE] = '\0';
+
+    if (state->matroska_track_codec_name == NULL)
+      snprintf (codec_part, MAX_STRING_SIZE, "%s", 
state->matroska_track_codec_id);
+    else
+      snprintf (codec_part, MAX_STRING_SIZE, "%s [%s]", 
state->matroska_track_codec_id, state->matroska_track_codec_name);
+    codec_part[MAX_STRING_SIZE] = '\0';
+
+    if (use_video && state->valid_matroska_track_video == 1)
+    {
+      /* Ignore Display* for now. Aspect ratio correction could be
+       * done either way (stretching horizontally or squishing vertically),
+       * so let's stick to hard cold pixel counts.
+       */
+      snprintf (format, MAX_STRING_SIZE, "%llux%llu", 
+                (unsigned long long) state->matroska_track_video_pixel_width,
+                (unsigned long long) state->matroska_track_video_pixel_height);
+      format[MAX_STRING_SIZE] = '\0';
+      ADD_MATROSKA (format, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
+    }
+    if (use_audio && state->valid_matroska_track_audio == 1)
+    {
+      double freq = state->matroska_track_audio_sampling_frequency;
+      double rfreq = freq;
+      if (state->matroska_track_audio_output_sampling_frequency > 0)
+        rfreq = state->matroska_track_audio_output_sampling_frequency;
+      if (freq == rfreq)
+        snprintf (hz_part, MAX_STRING_SIZE, "%.0fHz", freq);
+      else
+        snprintf (hz_part, MAX_STRING_SIZE, "%.0fHz (%.0fHz SBR)", freq, 
rfreq);
+      hz_part[MAX_STRING_SIZE] = '\0';
+
+      if (state->matroska_track_audio_bit_depth > 0)
+        snprintf (bit_part, MAX_STRING_SIZE, "%llu-bit ", (unsigned long long) 
state->matroska_track_audio_bit_depth);
+      else
+        bit_part[0] = '\0';
+      bit_part[MAX_STRING_SIZE] = '\0';
+
+      snprintf (format, MAX_STRING_SIZE, "%s track %s(%s, %llu-channel %sat 
%s) [%s]",
+          track_type_string, name_part, codec_part, 
+          (unsigned long long) state->matroska_track_audio_channels,
+          bit_part, hz_part, state->matroska_track_language);
+    }
+    else
+    {
+      snprintf (format, MAX_STRING_SIZE, "%s track %s(%s) [%s]",
+          track_type_string, name_part, codec_part, 
state->matroska_track_language);
+    }
+    format[MAX_STRING_SIZE] = '\0';
+    ADD_EBML (format, EXTRACTOR_METATYPE_RESOURCE_TYPE);
+  }
+  if (state->valid_matroska_track)
+    clean_ebml_state_matroska_track (state);
+}
+
+
+static int 
+EXTRACTOR_ebml_discard_state_method (struct ebml_state *state)
+{
+  if (state != NULL)
+  {
+    if (state->doctype != NULL)
+      free (state->doctype);
+    clean_ebml_state_matroska_segment (state);
+    clean_ebml_state_matroska_info (state);
+    clean_ebml_state_matroska_track (state);
+    free (state);
+  }
+  return 1;
+}
+
+static struct ebml_element *
+ebml_stack_pop (struct ebml_state *state)
+{
+  struct ebml_element *result;
+  if (state->stack_top == NULL)
+    return NULL;
+  result = state->stack_top;
+  state->stack_top = result->parent;
+  return result;
+}
+
+
+static void
+ebml_stack_push_new (struct ebml_state *state, uint64_t position, uint32_t id, 
uint64_t size, uint64_t header_size, int finish_state, int prev_state, int 
bail_state, int bail_next_state)
+{
+  struct ebml_element *element = malloc (sizeof (struct ebml_element));
+  element->parent = state->stack_top;
+  state->stack_top = element;
+  element->position = position - header_size;
+  element->header_size = header_size;
+  element->id = id;
+  element->size = size;
+  element->finish_state = finish_state;
+  element->prev_state = prev_state;
+  element->bail_state = bail_state;
+  element->bail_next_state = bail_next_state;
+}
+
+static int
+check_result (struct EXTRACTOR_PluginList *plugin, ssize_t read_result, struct 
ebml_state *state)
+{
+  if (read_result == 0)
+  {
+    int64_t offset;
+    struct ebml_element *parent = ebml_stack_pop (state);
+    if (parent == NULL)
+    {
+      /* But this shouldn't really happen */
+      state->state = EBML_LOOKING_FOR_HEADER;
+      return 0;
+    }
+    offset = parent->position + parent->header_size + parent->size;
+    if (offset < 0 || offset != pl_seek (plugin, offset, SEEK_SET))
+    {
+      state->state = EBML_BAD_STATE;
+      return 0;
+    }
+    state->state = parent->bail_state;
+    state->next_state = parent->bail_next_state;
+    free (parent);
+    return 0;
+  }
+  return 1;
+}
+
+static int
+maybe_rise_up (struct EXTRACTOR_PluginList *plugin, struct ebml_state *state, 
int *do_break, int64_t read_result)
+{
+  int64_t offset;
+  offset = pl_get_pos (plugin) - read_result;
+  if (state->stack_top != NULL && offset >= state->stack_top->position + 
state->stack_top->header_size + state->stack_top->size)
+  {
+    state->state = state->stack_top->finish_state;
+    pl_seek (plugin, -read_result, SEEK_CUR);
+    *do_break = 1;
+    return 1;
+  }
+  return 0;
+}
+
+static void
+rise_up_after_value (struct EXTRACTOR_PluginList *plugin, struct ebml_state 
*state, int next_state)
+{
+  int64_t offset;
+  state->state = EBML_READ_ELEMENT;
+  offset = state->stack_top->position + state->stack_top->header_size + 
state->stack_top->size;
+  free (ebml_stack_pop (state));
+  state->next_state = next_state;
+  pl_seek (plugin, offset, SEEK_SET);
+}
+
+static void
+try_to_find_pos (struct EXTRACTOR_PluginList *plugin, struct ebml_state *state)
+{
+  if (state->matroska_seeks != NULL)
+  {
+    struct matroska_seek_list *el, *pos = NULL;
+    int64_t segment_position = pl_get_pos (plugin) - 
state->segment_contents_start;
+    for (el = state->matroska_seeks; el != NULL; el = el->next)
+    {
+      if (el->position <= segment_position)
+        pos = el;
+      else
+        break;
+    }
+    if (pos != NULL)
+      state->matroska_pos = pos;
+  }
+}
+
+static void
+maybe_seek_to_something_interesting (struct EXTRACTOR_PluginList *plugin, 
struct ebml_state *state)
+{
+  int64_t offset;
+  struct matroska_seek_list *el;
+  try_to_find_pos (plugin, state);
+  if (state->matroska_pos == NULL)
+    return;
+  offset = pl_get_pos (plugin);
+  for (el = state->matroska_pos; el != NULL; el = el->next)
+  {
+    char do_break = 0;
+    switch (el->id)
+    {
+    case MatroskaID_Info:
+    case MatroskaID_Tracks:
+    case MatroskaID_Tags:
+    /* Some files will have more than one seek head */
+    case MatroskaID_SeekHead:
+      if (el->position + state->segment_contents_start >= offset)
+        do_break = 1;
+      break;
+    default:
+      break;
+    }
+    if (do_break)
+      break;
+  }
+  if (el == NULL)
+    el = state->matroska_seeks_tail;
+  if (el->position + state->segment_contents_start > offset)
+  {
+    /* TODO: add a separate stage after seeking that checks the ID of the 
element against
+     * the one we've got from seek table. If it doesn't match - stop parsing 
the file.
+     */
+#if DEBUG_EBML
+    printf ("Seeking from %llu to %llu\n", offset, el->position + 
state->segment_contents_start);
+#endif
+    pl_seek (plugin, el->position + state->segment_contents_start, SEEK_SET);
+  }
+}
+
+static void
+sort_seeks (struct ebml_state *state)
+{
+  uint32_t id;
+  int64_t position;
+  struct matroska_seek_list *el;
+  char sorted = 0;
+  while (!sorted)
+  {
+    sorted = 1;
+    for (el = state->matroska_seeks; el != NULL; el = el->next)
+    {
+      if (el->next == NULL)
+        break;
+      id = el->next->id;
+      position = el->next->position;
+      if (position < el->position)
+      {
+        el->next->position = el->position;
+        el->next->id = el->id;
+        el->position = position;
+        el->id = id;
+        sorted = 0;
+      }
+    }
+  }
+}
+
+
+int
+EXTRACTOR_ebml_extract_method (struct EXTRACTOR_PluginList *plugin, 
EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
+{
+  uint64_t offset = 0;
+  ssize_t read_result;
+  unsigned char *data;
+  struct ebml_state *state;
+
+  const unsigned char *start;
+  uint32_t eID;
+  uint64_t eSize;
+  int do_break;
+
+  uint64_t uint_value;
+  int64_t sint_value;
+  char string_value[MAX_STRING_SIZE + 1];
+  long double float_value;
+  uint32_t id_value;
+
+  if (plugin == NULL)
+    return 1;
+  
+  state = EXTRACTOR_ebml_init_state_method ();
+  if (state == NULL)
+    return 1;
+
+  while (1)
+  {
+    switch (state->state)
+    {
+    default:
+    case EBML_BAD_STATE:
+      report_state (state, proc, proc_cls);
+      return EXTRACTOR_ebml_discard_state_method (state);
+    case EBML_LOOKING_FOR_HEADER:
+      offset = pl_get_pos (plugin);
+      sint_value = pl_read (plugin, &data, 1024*1024);
+      if (sint_value < 4)
+        return EXTRACTOR_ebml_discard_state_method (state);
+      start = NULL;
+      while (start == NULL)
+      {
+        start = memchr (data, EBMLID_FILE_BEGIN, sint_value);
+        if (start == NULL)
+        {
+          offset = pl_get_pos (plugin) - 3;
+          if (offset != pl_seek (plugin, offset, SEEK_SET))
+            return EXTRACTOR_ebml_discard_state_method (state);
+          sint_value = pl_read (plugin, &data, 1024*1024);
+          if (sint_value < 4)
+            return EXTRACTOR_ebml_discard_state_method (state);
+        }
+      }
+      if (offset + start - data != pl_seek (plugin, offset + start - data, 
SEEK_SET))
+        return EXTRACTOR_ebml_discard_state_method (state);
+      state->state = EBML_READING_HEADER;
+      break;
+    case EBML_READING_HEADER:
+      if (0 > (read_result = elementRead (plugin, &eID, (int64_t*) &eSize)))
+        return EXTRACTOR_ebml_discard_state_method (state);
+      if (EBMLID_EBML != eID)
+      {
+        /* Not a header (happens easily, 0x1A is not uncommon), look further. 
*/
+        offset = pl_get_pos (plugin) - 3;
+        if (offset < 0)
+          offset = 0;
+        if (offset != pl_seek (plugin, offset, SEEK_SET))
+          return EXTRACTOR_ebml_discard_state_method (state);
+        state->state = EBML_LOOKING_FOR_HEADER;
+        break;
+      }
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = EBML_READING_HEADER_ELEMENTS;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_HEADER, EBML_BAD_STATE, 
EBML_FINISHED_READING_HEADER, EBML_BAD_STATE);
+      break;
+    case EBML_READ_ELEMENT:
+#if DEBUG_EBML
+      printf ("Reading at %lld\n", pl_get_pos (plugin));
+#endif
+      /* The following code generates some odd compiled instructions - instead 
of being getting the next state,
+       * state->state gets 0xfeeefeee.
+       */
+      /*
+      if (0 > (read_result = elementRead (plugin, &eID, &eSize)))
+      {
+        state->state = -1;
+        break;
+      }
+      state->state = state->next_state;
+      break;
+      */
+      /* while the following code crashes with SIGILL.
+       */
+      /*
+      read_result = elementRead (plugin, &eID, &eSize);
+      state->state = state->next_state;
+      if (read_result < 0)
+        state->state = EBML_BAD_STATE;
+      break;
+      */
+      /* but the following code works as intended */
+      /* All three code snippets were compiled with -O0 */
+      {
+        enum EBMLState next_state = state->next_state;
+        state->state = EBML_BAD_STATE;
+        read_result = elementRead (plugin, &eID, (int64_t*) &eSize);
+        if (read_result >= 0)
+          state->state = next_state;
+      }
+      break;
+    case EBML_READ_UINT:
+      if (state->stack_top->size == 0)
+      {
+        /* Special case - zero-size uint means zero */
+        uint_value = 0;
+        read_result = 1; /* 0 means error */
+      }
+      else if (state->stack_top->size > 8)
+        read_result = 0;
+      else
+      {
+        if (0 > (read_result = uintRead (plugin, state->stack_top->size, 
&uint_value)))
+        {
+          state->state = EBML_BAD_STATE;
+          break;
+        }
+      }
+      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
+      state->state = state->next_state;
+      break;
+    case EBML_READ_ID:
+      if (0 > (read_result = idRead (plugin, state->stack_top->size, 
&id_value)))
+      {
+        state->state = EBML_BAD_STATE;
+        break;
+      }
+      state->state = state->next_state;
+      break;
+    case EBML_READ_SINT:
+      if (state->stack_top->size == 0)
+      {
+        /* Special case - zero-size sint means zero */
+        sint_value = 0;
+        read_result = 1; /* 0 means error */
+      }
+      else if (state->stack_top->size > 8)
+        read_result = 0;
+      else
+      {
+        if (0 > (read_result = sintRead (plugin, state->stack_top->size, 
&sint_value)))
+        {
+          state->state = EBML_BAD_STATE;
+          break;
+        }
+      }
+      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
+      state->state = state->next_state;
+      break;
+    case EBML_READ_FLOAT:
+      if (state->stack_top->size == 0)
+      {
+        /* Special case - zero-size float means zero */
+        float_value = 0.0;
+        read_result = 1; /* 0 means error */
+      }
+      else if (state->stack_top->size > 10)
+        read_result = 0;
+      else
+      {
+        if (0 > (read_result = floatRead (plugin, state->stack_top->size, 
&float_value)))
+        {
+          state->state = EBML_BAD_STATE;
+          break;
+        }
+      }
+      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
+      state->state = state->next_state;
+      break;
+    case EBML_READ_STRING:
+      if (state->stack_top->size == 0)
+      {
+        string_value[0] = '\0';
+        read_result = 1; /* 0 means error */
+      }
+      else
+      {
+        if (0 > (read_result = stringRead (plugin, state->stack_top->size, 
(char *) &string_value)))
+        {
+          state->state = EBML_BAD_STATE;
+          break;
+        }
+      }
+      /* REMINDER: read_result might not be == number of read bytes in this 
case! */
+      state->state = state->next_state;
+      break;
+    case EBML_READING_HEADER_ELEMENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+      do_break = 0;
+      switch (eID)
+      {
+      case EBMLID_VERSION:
+      case EBMLID_READ_VERSION:
+      case EBMLID_MAX_ID_LENGTH:
+      case EBMLID_MAX_SIZE_LENGTH:
+      case EBMLID_DOCTYPE_VERSION:
+      case EBMLID_DOCTYPE_READ_VERSION:
+        state->state = EBML_READ_UINT;
+        break;
+      case EBMLID_DOCTYPE:
+        state->state = EBML_READ_STRING;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        /* Unknown element in EBML header - skip over it */
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_HEADER_ELEMENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+      }
+      if (do_break)
+        break;
+      state->next_state = EBML_READING_HEADER_ELEMENT_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_HEADER_ELEMENTS, EBML_READ_ELEMENT, 
EBML_READING_HEADER_ELEMENTS);
+      break;
+    case EBML_READING_HEADER_ELEMENT_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      switch (state->stack_top->id)
+      {
+      case EBMLID_VERSION:
+        state->ebml_version = uint_value;
+        break;
+      case EBMLID_READ_VERSION:
+        state->ebml_read_version = uint_value;
+        if (uint_value > 1)
+        {
+          /* We don't support EBML versions > 1 */
+          state->state = EBML_BAD_STATE;
+          /* State remains invalid, and is not reported. That is probably OK,
+           * since we barely read anything (we only know that this is
+           * _probably_ EBML version X, that's all).
+           * We also stop right here and do not assume that somewhere further
+           * in the file there's another EBML header that is, maybe, readable
+           * by us. If you think this is worth correcting - patches are 
welcome.
+           */
+          continue;
+        }
+        break;
+      case EBMLID_MAX_ID_LENGTH:
+        state->ebml_max_id_length = uint_value;
+        break;
+      case EBMLID_MAX_SIZE_LENGTH:
+        state->ebml_max_size_length = uint_value;
+        break;
+      case EBMLID_DOCTYPE_VERSION:
+        state->doctype_version = uint_value;
+        break;
+      case EBMLID_DOCTYPE_READ_VERSION:
+        state->doctype_read_version = uint_value;
+        break;
+      case EBMLID_DOCTYPE:
+        if (state->doctype != NULL)
+          free (state->doctype);
+        state->doctype = strdup (string_value);
+        state->valid_ebml = 1;
+        break;
+      }
+      rise_up_after_value (plugin, state, EBML_READING_HEADER_ELEMENTS);
+      break;
+    case EBML_FINISHED_READING_HEADER:
+      if (!state->valid_ebml)
+      {
+        /* Header was invalid (lacking doctype). */
+        state->next_state = EBML_SKIP_UNTIL_NEXT_HEADER;
+        break;
+      }
+      else
+      {
+        char *doctype = strdup (state->doctype);
+        report_state (state, proc, proc_cls);
+        state->state = EBML_READ_ELEMENT;
+        if (strcmp (doctype, "matroska") == 0)
+        {
+          state->next_state = EBML_READING_MATROSKA_SEGMENT;
+        }
+        else if (strcmp (doctype, "webm") == 0)
+        {
+          /* Webm is a strict subset of Matroska. However, since strictness
+           * means nothing to us (we don't validate the container, we extract
+           * metadata from it!), we do not care about these differences
+           * (which means that this code will happily read webm files that do
+           * not conform to Webm spec, but conform to Matroska spec).
+           */
+          state->next_state = EBML_READING_MATROSKA_SEGMENT;
+        }
+        else
+        {
+          /* Header was valid, but doctype is unknown. */
+          state->next_state = EBML_SKIP_UNTIL_NEXT_HEADER;
+        }
+        free (doctype);
+      }
+      break;
+    case EBML_SKIP_UNTIL_NEXT_HEADER:
+      if (read_result == 0)
+      {
+        state->state = EBML_LOOKING_FOR_HEADER;
+        break;
+      }
+      if (eID != EBMLID_EBML)
+      {
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_SKIP_UNTIL_NEXT_HEADER;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        break;
+      }
+      state->state = EBML_READING_HEADER;
+      break;
+    case EBML_READING_MATROSKA_SEGMENT:
+      if (read_result == 0)
+      {
+        state->state = EBML_LOOKING_FOR_HEADER;
+        break;
+      }
+      if (eID == EBMLID_EBML)
+      {
+        state->state = EBML_READING_HEADER;
+        break;
+      }
+      if (eID != MatroskaID_Segment)
+      {
+        pl_seek (plugin, eSize, SEEK_CUR);
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_SEGMENT;
+        break;
+      }
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = EBML_READING_MATROSKA_SEGMENT_CONTENTS;
+      clean_ebml_state_matroska_segment (state);
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SEGMENT_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT);
+      state->segment_contents_start = pl_get_pos (plugin);
+      break;
+    case EBML_READING_MATROSKA_SEGMENT_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      state->state = EBML_READ_ELEMENT;
+      switch (eID)
+      {
+      case MatroskaID_SeekHead:
+        state->next_state = EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS;
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SEEK_HEAD_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
+        break;
+      case MatroskaID_Info:
+        state->next_state = EBML_READING_MATROSKA_INFO_CONTENTS;
+        clean_ebml_state_matroska_info (state);
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_INFO_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
+        break;
+      case MatroskaID_Tracks:
+        state->next_state = EBML_READING_MATROSKA_TRACKS_CONTENTS;
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACKS_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
+        break;
+      case MatroskaID_Tags:
+        state->next_state = EBML_READING_MATROSKA_TAGS_CONTENTS;
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TAGS_CONTENTS, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEGMENT_CONTENTS);
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        maybe_seek_to_something_interesting (plugin, state);
+        state->next_state = EBML_READING_MATROSKA_SEGMENT_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+      }
+      break;
+    case EBML_READING_MATROSKA_TAGS_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+      state->state = EBML_READ_ELEMENT;
+      switch (eID)
+      {
+      case MatroskaID_Tags_Tag:
+        state->next_state = EBML_READING_MATROSKA_TAG_CONTENTS;
+        clean_ebml_state_matroska_seek (state);
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TAG_CONTENTS, 
EBML_READING_MATROSKA_TAGS_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TAGS_CONTENTS);
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->next_state = EBML_READING_MATROSKA_TAGS_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+      }
+      break;
+    case EBML_READING_MATROSKA_TAG_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      state->state = EBML_READ_ELEMENT;
+      switch (eID)
+      {
+      case MatroskaID_Tags_Tag_SimpleTag:
+        state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS;
+        clean_ebml_state_matroska_simpletags (state);
+        matroska_add_tag (state, NULL, NULL, NULL);
+        state->tag_current = state->tag_last;
+        state->tag_tree = state->tag_current;
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS, 
EBML_READING_MATROSKA_TAG_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TAG_CONTENTS);
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->next_state = EBML_READING_MATROSKA_TAG_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+      }
+      break;
+    case EBML_READING_MATROSKA_SIMPLETAG_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      do_break = 0;
+      switch (eID)
+      {
+      case MatroskaID_Tags_Tag_SimpleTag_TagName:
+        state->state = EBML_READ_STRING;
+        break; /* mandatory, UTF8-encoded. The name of the Tag that is going 
to be stored. */
+      case MatroskaID_Tags_Tag_SimpleTag_TagString:
+        state->state = EBML_READ_STRING;
+        break; /* UTF-8-encoded. The value of the Tag. */
+      case MatroskaID_Tags_Tag_SimpleTag:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        /* Oh joy, simpletags are recursive! */
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS;
+        matroska_add_tag (state, state->tag_current, NULL, NULL);
+        state->tag_current = state->tag_last;
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS, 
EBML_READING_MATROSKA_SIMPLETAG_CONTENTS, EBML_READ_ELEMENT, 
EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS);
+        do_break = 1;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+        break;
+      }
+      if (do_break)
+        break;
+      state->next_state = EBML_READING_MATROSKA_SIMPLETAG_CONTENTS_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_SIMPLETAG_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_SIMPLETAG_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_SIMPLETAG_CONTENTS_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      /* This breaks the specs, as there should be only one instance of each
+       * element (at most). We ignore that and remember the latest value,
+       * dropping previous ones.
+       */
+      switch (state->stack_top->id)
+      {
+      case MatroskaID_Tags_Tag_SimpleTag_TagName:
+        if (state->tag_current->name != NULL)
+          free (state->tag_current->name);
+        state->tag_current->name = strdup (string_value);
+        break;
+      case MatroskaID_Tags_Tag_SimpleTag_TagString:
+        if (state->tag_current->string != NULL)
+          free (state->tag_current->string);
+        state->tag_current->string = strdup (string_value);
+        break;
+      }
+      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_SIMPLETAG_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      state->state = EBML_READ_ELEMENT;
+      switch (eID)
+      {
+      case MatroskaID_Seek:
+        state->next_state = EBML_READING_MATROSKA_SEEK_CONTENTS;
+        clean_ebml_state_matroska_seek (state);
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_SEEK_CONTENTS, 
EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS);
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->next_state = EBML_READING_MATROSKA_SEEK_HEAD_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+      }
+      break;
+    case EBML_READING_MATROSKA_SEEK_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      do_break = 0;
+      switch (eID)
+      {
+      case MatroskaID_SeekID:
+        state->state = EBML_READ_ID;
+        break;
+      case MatroskaID_SeekPosition:
+        state->state = EBML_READ_UINT;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_SEEK_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+        break;
+      }
+      if (do_break)
+        break;
+      state->next_state = EBML_READING_MATROSKA_SEEK_CONTENTS_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_SEEK_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_SEEK_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_SEEK_CONTENTS_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      /* This breaks the specs, as there should be only one instance of each
+       * element (at most). We ignore that and remember the latest value,
+       * dropping previous ones.
+       */
+      switch (state->stack_top->id)
+      {
+      case MatroskaID_SeekID:
+        state->matroska_seek_id = id_value;
+        break;
+      case MatroskaID_SeekPosition:
+        state->matroska_seek_position = uint_value;
+        break;
+      }
+      rise_up_after_value (plugin, state, EBML_READING_MATROSKA_SEEK_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_TRACKS_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      state->state = EBML_READ_ELEMENT;
+      switch (eID)
+      {
+      case MatroskaID_Tracks_TrackEntry:
+        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS;
+        clean_ebml_state_matroska_track (state);
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_CONTENTS, 
EBML_READING_MATROSKA_TRACKS_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TRACKS_CONTENTS);
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->next_state = EBML_READING_MATROSKA_TRACKS_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+      }
+      break;
+    case EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      do_break = 0;
+      switch (eID)
+      {
+      case MatroskaID_Tracks_TrackType:
+        state->state = EBML_READ_UINT;
+        break;
+      case MatroskaID_Tracks_Name:
+      case MatroskaID_Tracks_Language:
+      case MatroskaID_Tracks_CodecID:
+      case MatroskaID_Tracks_CodecName:
+        state->state = EBML_READ_STRING;
+        break;
+      case MatroskaID_Tracks_Video:
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS;
+        clean_ebml_state_matroska_track_video (state);
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
+        do_break = 1;
+        break;
+      case MatroskaID_Tracks_Audio:
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS;
+        clean_ebml_state_matroska_track_audio (state);
+        ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS, EBML_READ_ELEMENT, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
+        do_break = 1;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+        break;
+      }
+      if (do_break)
+        break;
+      state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      do_break = 0;
+      switch (eID)
+      {
+      case MatroskaID_Tracks_Audio_SamplingFrequency:
+      case MatroskaID_Tracks_Audio_OutputSamplingFrequency:
+        state->state = EBML_READ_FLOAT;
+        break;
+      case MatroskaID_Tracks_Audio_Channels:
+      case MatroskaID_Tracks_Audio_BitDepth:
+        state->state = EBML_READ_UINT;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+        break;
+      }
+      if (do_break)
+        break;
+      state->next_state = 
EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      /* This breaks the specs, as there should be only one instance of each
+       * element (at most). We ignore that and remember the latest value,
+       * dropping previous ones.
+       */
+      switch (state->stack_top->id)
+      {
+      case MatroskaID_Tracks_Audio_SamplingFrequency:
+        state->matroska_track_audio_sampling_frequency = float_value;
+        break;
+      case MatroskaID_Tracks_Audio_OutputSamplingFrequency:
+        state->matroska_track_audio_output_sampling_frequency = float_value;
+        break;
+      case MatroskaID_Tracks_Audio_Channels:
+        state->matroska_track_audio_channels = uint_value;
+        break;
+      case MatroskaID_Tracks_Audio_BitDepth:
+        state->matroska_track_audio_bit_depth = uint_value;
+        break;
+      }
+      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      do_break = 0;
+      switch (eID)
+      {
+      case MatroskaID_Tracks_Video_FlagInterlaced:
+      case MatroskaID_Tracks_Video_StereoMode:
+      case MatroskaID_Tracks_Video_PixelWidth:
+      case MatroskaID_Tracks_Video_PixelHeight:
+      case MatroskaID_Tracks_Video_DisplayWidth:
+      case MatroskaID_Tracks_Video_DisplayHeight:
+      case MatroskaID_Tracks_Video_DisplayUnit:
+        state->state = EBML_READ_UINT;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+        break;
+      }
+      if (do_break)
+        break;
+      state->next_state = 
EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      /* This breaks the specs, as there should be only one instance of each
+       * element (at most). We ignore that and remember the latest value,
+       * dropping previous ones.
+       */
+      switch (state->stack_top->id)
+      {
+      case MatroskaID_Tracks_Video_FlagInterlaced:
+        state->matroska_track_video_flag_interlaced = uint_value;
+        break;
+      case MatroskaID_Tracks_Video_StereoMode:
+        state->matroska_track_video_stereo_mode = uint_value;
+        break;
+      case MatroskaID_Tracks_Video_PixelWidth:
+        state->matroska_track_video_pixel_width = uint_value;
+        break;
+      case MatroskaID_Tracks_Video_PixelHeight:
+        state->matroska_track_video_pixel_height = uint_value;
+        break;
+      case MatroskaID_Tracks_Video_DisplayWidth:
+        state->matroska_track_video_display_width = uint_value;
+        break;
+      case MatroskaID_Tracks_Video_DisplayHeight:
+        state->matroska_track_video_display_height = uint_value;
+        break;
+      case MatroskaID_Tracks_Video_DisplayUnit:
+        state->matroska_track_video_display_unit = uint_value;
+        break;
+      }
+      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      /* This breaks the specs, as there should be only one instance of each
+       * element (at most). We ignore that and remember the latest value,
+       * dropping previous ones.
+       */
+      switch (state->stack_top->id)
+      {
+      case MatroskaID_Tracks_TrackType:
+        state->matroska_track_type = uint_value;
+        break;
+      case MatroskaID_Tracks_Name:
+        if (state->matroska_track_name != NULL)
+          free (state->matroska_track_name);
+        state->matroska_track_name = strdup (string_value);
+        break; /* UTF-8-encoded. A human-readable track name. */
+      case MatroskaID_Tracks_Language:
+        if (state->matroska_track_language != NULL)
+          free (state->matroska_track_language);
+        state->matroska_track_language = strdup (string_value);
+        break; /* defaults to 'eng', string. Specifies the language of the 
track in the Matroska languages form. */
+      case MatroskaID_Tracks_CodecID:
+        if (state->matroska_track_codec_id != NULL)
+          free (state->matroska_track_codec_id);
+        state->matroska_track_codec_id = strdup (string_value);
+        break; /* mandatory, string. An ID corresponding to the codec, see the 
codec page ( http://matroska.org/technical/specs/codecid/index.html ) for more 
info. */
+      case MatroskaID_Tracks_CodecName:
+        if (state->matroska_track_codec_name != NULL)
+          free (state->matroska_track_codec_name);
+        state->matroska_track_codec_name = strdup (string_value);
+        break; /* UTF-8-encoded. A human-readable string specifying the codec. 
*/
+      }
+      rise_up_after_value (plugin, state, 
EBML_READING_MATROSKA_TRACK_ENTRY_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_INFO_CONTENTS:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      do_break = 0;
+      switch (eID)
+      {
+      case MatroskaID_Info_Title:
+      case MatroskaID_Info_MuxingApp:
+      case MatroskaID_Info_WritingApp:
+        state->state = EBML_READ_STRING;
+        break;
+      case MatroskaID_Info_TimecodeScale:
+        state->state = EBML_READ_UINT;
+        break;
+      case MatroskaID_Info_Duration:
+        state->state = EBML_READ_FLOAT;
+        break;
+      case MatroskaID_Info_DateUTC:
+        state->state = EBML_READ_SINT;
+        break;
+      default:
+        if (maybe_rise_up (plugin, state, &do_break, read_result))
+          break;
+        /* Unknown element in MatroskaInfo - skip over it */
+        state->state = EBML_READ_ELEMENT;
+        state->next_state = EBML_READING_MATROSKA_INFO_CONTENTS;
+        pl_seek (plugin, eSize, SEEK_CUR);
+        do_break = 1;
+      }
+      if (do_break)
+        break;
+      state->next_state = EBML_READING_MATROSKA_INFO_CONTENTS_VALUE;
+      ebml_stack_push_new (state, pl_get_pos (plugin), eID, eSize, 
read_result, EBML_BAD_STATE, EBML_READING_MATROSKA_INFO_CONTENTS, 
EBML_READ_ELEMENT, EBML_READING_MATROSKA_INFO_CONTENTS);
+      break;
+    case EBML_READING_MATROSKA_INFO_CONTENTS_VALUE:
+      if (!check_result (plugin, read_result, state))
+        break;
+
+      /* This breaks the specs, as there should be only one instance of each
+       * element (at most). We ignore that and remember the latest value,
+       * dropping previous ones.
+       */
+      switch (state->stack_top->id)
+      {
+      case MatroskaID_Info_Title:
+        if (state->matroska_info_title != NULL)
+          free (state->matroska_info_title);
+        state->matroska_info_title = strdup (string_value);
+        break;
+      case MatroskaID_Info_MuxingApp:
+        if (state->matroska_info_muxing_app != NULL)
+          free (state->matroska_info_muxing_app);
+        state->matroska_info_muxing_app = strdup (string_value);
+        break;
+      case MatroskaID_Info_WritingApp:
+        if (state->matroska_info_writing_app != NULL)
+          free (state->matroska_info_writing_app);
+        state->matroska_info_writing_app = strdup (string_value);
+        break;
+      case MatroskaID_Info_TimecodeScale:
+        state->matroska_info_timecode_scale = uint_value;
+        break;
+      case MatroskaID_Info_Duration:
+        state->matroska_info_duration = float_value;
+        break;
+      case MatroskaID_Info_DateUTC:
+        state->matroska_info_date_utc_is_set = 1;
+        state->matroska_info_date_utc = sint_value;
+        break;
+      }
+      rise_up_after_value (plugin, state, EBML_READING_MATROSKA_INFO_CONTENTS);
+      break;
+    case EBML_FINISHED_READING_MATROSKA_INFO_CONTENTS:
+      if (state->stack_top != NULL && pl_get_pos (plugin) >= 
state->stack_top->position + state->stack_top->header_size + 
state->stack_top->size)
+        report_state (state, proc, proc_cls);
+      maybe_seek_to_something_interesting (plugin, state);
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    case EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_CONTENTS:
+      if (state->stack_top != NULL && pl_get_pos (plugin) >= 
state->stack_top->position + state->stack_top->header_size + 
state->stack_top->size)
+        report_state (state, proc, proc_cls);
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    case EBML_FINISHED_READING_MATROSKA_SEEK_CONTENTS:
+      if ((state->matroska_seek_id != 0) &&
+          ((state->matroska_seek_position > 0) || state->matroska_seeks_tail 
== NULL))
+      {
+        struct matroska_seek_list *el;
+        el = malloc (sizeof (struct matroska_seek_list));
+        el->next = NULL;
+        el->id = state->matroska_seek_id;
+        el->position = state->matroska_seek_position;
+        if (state->matroska_seeks_tail != NULL)
+        {
+          state->matroska_seeks_tail->next = el;
+          state->matroska_seeks_tail = el;
+        }
+        else
+          state->matroska_seeks_tail = state->matroska_seeks = el;
+      }
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    case EBML_FINISHED_READING_MATROSKA_TRACKS_CONTENTS:
+    case EBML_FINISHED_READING_MATROSKA_TAGS_CONTENTS:
+      maybe_seek_to_something_interesting (plugin, state);
+    case EBML_FINISHED_READING_MATROSKA_SEGMENT_CONTENTS:
+    case EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_VIDEO_CONTENTS:
+    case EBML_FINISHED_READING_MATROSKA_TRACK_ENTRY_AUDIO_CONTENTS:
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    case EBML_FINISHED_READING_MATROSKA_SIMPLETAG_CONTENTS:
+      state->tag_current = state->tag_current->parent;
+      if (state->tag_current == NULL)
+        report_simpletag (state, proc, proc_cls);
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    case EBML_FINISHED_READING_MATROSKA_TAG_CONTENTS:
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    case EBML_FINISHED_READING_MATROSKA_SEEK_HEAD_CONTENTS:
+      sort_seeks (state);
+      try_to_find_pos (plugin, state);
+      state->state = EBML_READ_ELEMENT;
+      state->next_state = state->stack_top->prev_state;
+      free (ebml_stack_pop (state));
+      break;
+    }
+  }
+  return EXTRACTOR_ebml_discard_state_method (state);
+}

Copied: Extractor/src/plugins/old/elf_extractor.c (from rev 23239, 
Extractor/src/plugins/elf_extractor.c)
===================================================================
--- Extractor/src/plugins/old/elf_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/elf_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,655 @@
+/*
+     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.
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include "pack.h"
+#include <stdint.h>
+
+typedef uint32_t Elf32_Addr;
+typedef uint16_t Elf32_Half;
+typedef uint32_t Elf32_Off;
+typedef int32_t  Elf32_Sword;
+typedef uint32_t Elf32_Word;
+
+typedef uint16_t Elf64_Half;
+typedef uint32_t Elf64_Word;
+typedef uint64_t Elf64_Addr;
+typedef uint64_t Elf64_Off;
+
+/* first 4 bytes of the ELF header */
+static char elfMagic[] = { 0x7f, 'E', 'L', 'F' };
+
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+#define EI_OSABI 7
+#define EI_NIDENT 16
+
+typedef struct
+{
+  Elf32_Half e_type;
+  Elf32_Half e_machine;
+  Elf32_Word e_version;
+  Elf32_Addr e_entry;
+  Elf32_Off e_phoff;
+  Elf32_Off e_shoff;            /* offset of the section header table */
+  Elf32_Word e_flags;
+  Elf32_Half e_ehsize;
+  Elf32_Half e_phensize;
+  Elf32_Half e_phnum;
+  Elf32_Half e_shentsize;       /* size of each entry in SH table */
+  Elf32_Half e_shnum;           /* how many entries in section header table */
+  Elf32_Half e_shstrndx;        /* section header's sh_name member is index 
into this string table! */
+} Elf32_Ehdr;
+
+/* elf-header minus e_ident */
+#define ELF_HEADER_SIZE sizeof (Elf32_Ehdr)
+
+#define ELF_HEADER_FIELDS(p) \
+  &(p)->e_type,                     \
+    &(p)->e_machine,        \
+    &(p)->e_version,        \
+    &(p)->e_entry,          \
+    &(p)->e_phoff,          \
+    &(p)->e_shoff,          \
+    &(p)->e_flags,          \
+    &(p)->e_ehsize,         \
+    &(p)->e_phensize,       \
+    &(p)->e_phnum,          \
+    &(p)->e_shentsize,      \
+    &(p)->e_shnum,          \
+    &(p)->e_shstrndx
+static char *ELF_HEADER_SPECS[] = {
+  "hhwwwwwhhhhhh",
+  "HHWWWWWHHHHHH",
+};
+
+typedef struct {
+        Elf64_Half      e_type;
+        Elf64_Half      e_machine;
+        Elf64_Word      e_version;
+        Elf64_Addr      e_entry;
+        Elf64_Off       e_phoff;
+        Elf64_Off       e_shoff;
+        Elf64_Word      e_flags;
+        Elf64_Half      e_ehsize;
+        Elf64_Half      e_phensize;
+        Elf64_Half      e_phnum;
+        Elf64_Half      e_shentsize;
+        Elf64_Half      e_shnum;
+        Elf64_Half      e_shstrndx;
+} Elf64_Ehdr;
+
+/* elf-header minus e_ident */
+#define ELF64_HEADER_SIZE sizeof (Elf64_Ehdr)
+
+#define ELF64_HEADER_FIELDS(p) \
+    &(p)->e_type,                   \
+    &(p)->e_machine,        \
+    &(p)->e_version,        \
+    &(p)->e_entry,          \
+    &(p)->e_phoff,          \
+    &(p)->e_shoff,          \
+    &(p)->e_flags,          \
+    &(p)->e_ehsize,         \
+    &(p)->e_phensize,       \
+    &(p)->e_phnum,          \
+    &(p)->e_shentsize,      \
+    &(p)->e_shnum,          \
+    &(p)->e_shstrndx
+static char *ELF64_HEADER_SPECS[] = {
+  "hhwxxxwhhhhhh",
+  "HHWXXXWHHHHHH",
+};
+
+
+typedef struct
+{
+  Elf32_Word sh_name;
+  Elf32_Word sh_type;
+  Elf32_Word sh_flags;
+  Elf32_Addr sh_addr;           /* where loaded */
+  Elf32_Off sh_offset;          /* where in image (! sh_type==SHT_NOBITS) */
+  Elf32_Word sh_size;           /* section size in bytes */
+  Elf32_Word sh_link;           /* for symbol table: section header index of 
the associated string table! */
+  Elf32_Word sh_info;           /* "one greater than the symbol table index of 
the last local symbol _STB_LOCAL_" */
+  Elf32_Word sh_addralign;
+  Elf32_Word sh_entsize;
+} Elf32_Shdr;
+#define ELF_SECTION_SIZE 40
+
+#define ELF_SECTION_FIELDS(p) \
+  &(p)->sh_name,             \
+    &(p)->sh_type,           \
+    &(p)->sh_flags,          \
+    &(p)->sh_addr,           \
+    &(p)->sh_offset,         \
+    &(p)->sh_size,           \
+    &(p)->sh_link,           \
+    &(p)->sh_info,           \
+    &(p)->sh_addralign,              \
+    &(p)->sh_entsize
+static char *ELF_SECTION_SPECS[] = {
+  "wwwwwwwwww",
+  "WWWWWWWWWW",
+};
+
+typedef struct
+{
+  Elf32_Word p_type;
+  Elf32_Off p_offset;
+  Elf32_Addr p_vaddr;
+  Elf32_Addr p_paddr;
+  Elf32_Word p_filesz;
+  Elf32_Word p_memsz;
+  Elf32_Word p_flags;
+  Elf32_Word p_align;
+} Elf32_Phdr;
+#define ELF_PDHR_SIZE 32
+#define ELF_PHDR_FIELDS(p)        \
+  &(p)->p_type,                           \
+    &(p)->p_offset,               \
+    &(p)->p_vaddr,                \
+    &(p)->p_paddr,                \
+    &(p)->p_filesz,               \
+    &(p)->p_memsz,                \
+    &(p)->p_flags,                \
+    &(p)->p_align
+static char *ELF_PHDR_SPECS[] = {
+  "wwwwwwww",
+  "WWWWWWWW",
+};
+
+typedef struct
+{
+  Elf32_Sword d_tag;
+  union
+  {
+    Elf32_Word d_val;
+    Elf32_Addr d_ptr;
+  } d_un;
+} Elf32_Dyn;
+#define ELF_DYN_SIZE 8
+#define ELF_DYN_FIELDS(p)                      \
+  &(p)->d_tag,                                 \
+    &(p)->d_un
+static char *ELF_DYN_SPECS[] = {
+  "ww",
+  "WW",
+};
+
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+#define EM_NONE 0
+#define EM_M32 1
+#define EM_SPARC 2
+#define EM_386 3
+#define EM_68K 4
+#define EM_88K 5
+#define EM_860 7
+#define EM_MIPS 8
+#define EM_PPC 20
+#define EM_PPC64 21
+#define EM_S390 22
+#define EM_ARM 40
+#define EM_ALPHA 41
+#define EM_IA_64 50
+#define EM_X86_64 62
+#define EM_CUDA 190
+
+#define ELFOSABI_NETBSD 2
+#define ELFOSABI_LINUX 3
+#define ELFOSABI_IRIX 8
+#define ELFOSABI_FREEBSD 9
+#define ELFOSABI_OPENBSD 12
+
+#define EV_NONE 0
+#define EV_CURRENT 1
+
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+/* string table! */
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+/* dynamic linking info! */
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7fffffff
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0xffffffff
+
+#define SHF_WRITE 0x1
+#define SHF_ALLOC 0x2
+#define SHF_EXECINSTR 0x4
+#define SHF_MASKPROC 0xf000000
+
+#define DT_NULL 0
+/* name of a needed library, offset into table
+   recorded in DT_STRTAB entry */
+#define DT_NEEDED 1
+#define DT_PLTRELSZ 2
+#define DT_PLTGOT 3
+#define DT_HASH 4
+/* address of the string table from where symbol
+   names, library names, etc for this DT come from */
+#define DT_STRTAB 5
+#define DT_SYMTAB 6
+#define DT_SYMENT 7
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+/* size of the string-table in bytes */
+#define DT_STRSZ 10
+/* fixme 11 */
+#define DT_INIT 12
+#define DT_FINI 13
+/* string-table offset giving the name of the shared object */
+#define DT_SONAME 14
+/* string-table offset of a null-terminated library search path */
+#define DT_RPATH 15
+#define DT_SYMBOLIC 16
+
+
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7fffffff
+
+
+
+
+#define ELFCLASSNONE 0
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+
+#define ELFDATANONE 0
+/* little endian */
+#define ELFDATA2LSB 1
+/* big endian */
+#define ELFDATA2MSB 2
+
+/**
+ * @param ei_data ELFDATA2LSB or ELFDATA2MSB
+ * @return 1 if we need to convert, 0 if not
+ */
+static int
+getByteorder (char ei_data)
+{
+  if (ei_data == ELFDATA2LSB)
+    {
+#if __BYTE_ORDER == __BIG_ENDIAN
+      return 1;
+#else
+      return 0;
+#endif
+    }
+  else
+    {
+#if __BYTE_ORDER == __BIG_ENDIAN
+      return 0;
+#else
+      return 1;
+#endif
+    }
+}
+
+/**
+ *
+ * @return 0 on success, -1 on error
+ */
+static int
+getSectionHdr (const char *data,
+               size_t size,
+               Elf32_Ehdr * ehdr, Elf32_Half idx, Elf32_Shdr * ret)
+{
+  if (ehdr->e_shnum <= idx)
+    return -1;
+
+  EXTRACTOR_common_cat_unpack (&data[ehdr->e_shoff + ehdr->e_shentsize * idx],
+              ELF_SECTION_SPECS[getByteorder (data[EI_CLASS])],
+              ELF_SECTION_FIELDS (ret));
+  return 0;
+}
+
+/**
+ *
+ * @return 0 on success, -1 on error
+ */
+static int
+getDynTag (const char *data,
+           size_t size,
+           Elf32_Ehdr * ehdr,
+           Elf32_Off off, Elf32_Word osize, unsigned int idx, Elf32_Dyn * ret)
+{
+  if ((off + osize > size) || ((idx + 1) * ELF_DYN_SIZE > osize))
+    return -1;
+  EXTRACTOR_common_cat_unpack (&data[off + idx * ELF_DYN_SIZE],
+                              ELF_DYN_SPECS[getByteorder (data[EI_CLASS])],
+                              ELF_DYN_FIELDS (ret));
+  return 0;
+}
+
+/**
+ *
+ * @return 0 on success, -1 on error
+ */
+static int
+getProgramHdr (const char *data,
+               size_t size,
+               Elf32_Ehdr * ehdr, Elf32_Half idx, Elf32_Phdr * ret)
+{
+  if (ehdr->e_phnum <= idx)
+    return -1;
+
+  EXTRACTOR_common_cat_unpack (&data[ehdr->e_phoff + ehdr->e_phensize * idx],
+              ELF_PHDR_SPECS[getByteorder (data[EI_CLASS])],
+              ELF_PHDR_FIELDS (ret));
+  return 0;
+}
+
+/**
+ * Parse ELF header.
+ * @return 0 on success for 32 bit, 1 on success for 64 bit, -1 on error
+ */
+static int
+getELFHdr (const char *data, 
+          size_t size,
+          Elf32_Ehdr * ehdr,
+          Elf64_Ehdr * ehdr64)
+{
+  /* catlib */
+  if (size < EI_NIDENT)
+    return -1;
+  if (0 != strncmp (data, elfMagic, sizeof (elfMagic)))
+    return -1;                  /* not an elf */
+
+  switch (data[EI_CLASS])
+    {
+    case ELFCLASS32:
+      if (size < sizeof (Elf32_Ehdr) + EI_NIDENT)
+       return -1;
+      EXTRACTOR_common_cat_unpack (&data[EI_NIDENT],
+                                  ELF_HEADER_SPECS[getByteorder 
(data[EI_DATA])],
+                                  ELF_HEADER_FIELDS (ehdr));
+      if (ehdr->e_shoff + ehdr->e_shentsize * ehdr->e_shnum > size)
+       return -1;                  /* invalid offsets... */
+      if (ehdr->e_shentsize < ELF_SECTION_SIZE)
+       return -1;                  /* huh? */
+      if (ehdr->e_phoff + ehdr->e_phensize * ehdr->e_phnum > size)
+       return -1;
+      return 0;
+    case ELFCLASS64:
+      if (size < sizeof (Elf64_Ehdr) + EI_NIDENT)
+       return -1;
+      EXTRACTOR_common_cat_unpack (&data[EI_NIDENT],
+                                  ELF64_HEADER_SPECS[getByteorder 
(data[EI_DATA])],
+                                  ELF64_HEADER_FIELDS (ehdr64));
+      if (ehdr64->e_shoff + ((uint32_t) ehdr64->e_shentsize * ehdr64->e_shnum) 
> size)
+       return -1;                  /* invalid offsets... */
+      if (ehdr64->e_phoff + ((uint32_t) ehdr64->e_phensize * ehdr64->e_phnum) 
> size)
+       return -1;
+      return 1;
+    default:
+      return -1;
+    }
+}
+
+/**
+ * @return the string (offset into data, do NOT free), NULL on error
+ */
+static const char *
+readStringTable (const char *data,
+                 size_t size,
+                 Elf32_Ehdr * ehdr,
+                 Elf32_Half strTableOffset, Elf32_Word sh_name)
+{
+  Elf32_Shdr shrd;
+  if (-1 == getSectionHdr (data, size, ehdr, strTableOffset, &shrd))
+    return NULL;
+  if ((shrd.sh_type != SHT_STRTAB) ||
+      (shrd.sh_offset + shrd.sh_size > size) ||
+      (shrd.sh_size <= sh_name) ||
+      (data[shrd.sh_offset + shrd.sh_size - 1] != '\0'))
+    return NULL;
+  return &data[shrd.sh_offset + sh_name];
+}
+
+#define ADD(s, type) do { if (0!=proc(proc_cls, "elf", type, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0)
+
+/* application/x-executable, ELF */
+int 
+EXTRACTOR_elf_extract (const char *data,
+                      size_t size,
+                      EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls,
+                      const char *options)
+{
+  Elf32_Ehdr ehdr;
+  Elf32_Half idx;
+  Elf64_Ehdr ehdr64;
+  int ret;
+
+  ret = getELFHdr (data, size, &ehdr, &ehdr64);
+  if (ret == -1)
+    return 0;
+  ADD ("application/x-executable", EXTRACTOR_METATYPE_MIMETYPE);
+  switch ( ((unsigned char*) data)[EI_OSABI])
+    {
+    case ELFOSABI_LINUX:
+      ADD ("Linux", EXTRACTOR_METATYPE_TARGET_OS);
+      break;
+    case ELFOSABI_FREEBSD:
+      ADD ("FreeBSD", EXTRACTOR_METATYPE_TARGET_OS);
+      break;
+    case ELFOSABI_NETBSD:
+      ADD ("NetBSD", EXTRACTOR_METATYPE_TARGET_OS);
+      break;
+    case ELFOSABI_OPENBSD:
+      ADD ("OpenBSD", EXTRACTOR_METATYPE_TARGET_OS);
+      break;
+    case ELFOSABI_IRIX:
+      ADD ("IRIX", EXTRACTOR_METATYPE_TARGET_OS);
+      break;
+    default:
+      break;
+    }
+  switch ( (ret == 0) ? ehdr.e_type : ehdr64.e_type) 
+    {
+    case ET_REL:
+      ADD ("Relocatable file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
+      break;
+    case ET_EXEC:
+      ADD ("Executable file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
+      break;
+    case ET_DYN:
+      ADD ("Shared object file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
+      break;
+    case ET_CORE:
+      ADD ("Core file", EXTRACTOR_METATYPE_RESOURCE_TYPE);
+      break;
+    default:
+      break;                    /* unknown */
+    }
+  switch ( (ret == 0) ? ehdr.e_machine : ehdr64.e_machine)
+    {
+    case EM_M32:
+      ADD ("M32", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_386:
+      ADD ("i386", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_68K:
+      ADD ("68K", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_88K:
+      ADD ("88K", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_SPARC:
+      ADD ("Sparc", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_860:
+      ADD ("960", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_MIPS:
+      ADD ("MIPS", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_PPC:
+      ADD ("PPC", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_PPC64:
+      ADD ("PPC64", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_S390:
+      ADD ("S390", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_ARM:
+      ADD ("ARM", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_ALPHA:
+      ADD ("ALPHA", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_IA_64:
+      ADD ("IA-64", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_X86_64:
+      ADD ("x86_64", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    case EM_CUDA:
+      ADD ("NVIDIA CUDA", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+      break;
+    default:
+      break;                    /* oops */
+    }
+
+  if (ret != 0)
+    return 0; /* FIXME: full support for 64-bit ELF... */
+  for (idx = 0; idx < ehdr.e_phnum; idx++)
+    {
+      Elf32_Phdr phdr;
+
+      if (0 != getProgramHdr (data, size, &ehdr, idx, &phdr))
+        return 0;
+      if (phdr.p_type == PT_DYNAMIC)
+        {
+          unsigned int dc = phdr.p_filesz / ELF_DYN_SIZE;
+          unsigned int id;
+          Elf32_Addr stringPtr;
+          Elf32_Half stringIdx;
+          Elf32_Half six;
+
+          stringPtr = 0;
+
+          for (id = 0; id < dc; id++)
+            {
+              Elf32_Dyn dyn;
+              if (0 != getDynTag (data,
+                                  size,
+                                  &ehdr,
+                                  phdr.p_offset, phdr.p_filesz, id, &dyn))
+                return 0;
+              if (DT_STRTAB == dyn.d_tag)
+                {
+                  stringPtr = dyn.d_un.d_ptr;
+                  break;
+                }
+            }
+          if (stringPtr == 0)
+            return 0;
+          for (six = 0; six < ehdr.e_shnum; six++)
+            {
+              Elf32_Shdr sec;
+              if (-1 == getSectionHdr (data, size, &ehdr, six, &sec))
+                return 0;
+              if ((sec.sh_addr == stringPtr) && (sec.sh_type == SHT_STRTAB))
+                {
+                  stringIdx = six;
+                  break;
+                }
+            }
+         if (six == ehdr.e_shnum)
+           return 0; /* stringIdx not found */
+
+          for (id = 0; id < dc; id++)
+            {
+              Elf32_Dyn dyn;
+              if (0 != getDynTag (data,
+                                  size,
+                                  &ehdr,
+                                  phdr.p_offset, phdr.p_filesz, id, &dyn))
+                return 0;
+              switch (dyn.d_tag)
+                {
+                case DT_RPATH:
+                  {
+                    const char *rpath;
+
+                    rpath = readStringTable (data,
+                                             size,
+                                             &ehdr,
+                                             stringIdx, dyn.d_un.d_val);
+                    /* "source" of the dependencies: path
+                       to dynamic libraries */
+                    if (rpath != NULL)
+                      {
+                        ADD (rpath, EXTRACTOR_METATYPE_LIBRARY_SEARCH_PATH);
+                      }
+                    break;
+                  }
+                case DT_NEEDED:
+                  {
+                    const char *needed;
+
+                    needed = readStringTable (data,
+                                              size,
+                                              &ehdr,
+                                              stringIdx, dyn.d_un.d_val);
+                    if (needed != NULL)
+                      {
+                        ADD (needed, EXTRACTOR_METATYPE_LIBRARY_DEPENDENCY);
+                      }
+                    break;
+                  }
+                }
+            }
+
+        }
+    }
+
+  return 0;
+}

Copied: Extractor/src/plugins/old/flv_extractor.c (from rev 23239, 
Extractor/src/plugins/flv_extractor.c)
===================================================================
--- Extractor/src/plugins/old/flv_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/flv_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,1235 @@
+/*
+     This file is part of libextractor.
+     Copyright (C) 2007, 2009 Heikki Lindholm
+
+     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.
+ */
+
+/*
+ * see http://osflash.org/flv
+ *     http://osflash.org/documentation/amf
+ */
+#include "platform.h"
+#include "extractor.h"
+#include "convert_numeric.h"
+#include <string.h>
+
+#define DEBUG 0
+
+#define FLV_SIGNATURE "FLV"
+
+/*
+ * AMF parser
+ */
+
+/* Actionscript types */
+#define ASTYPE_NUMBER       0x00
+#define ASTYPE_BOOLEAN      0x01
+#define ASTYPE_STRING       0x02
+#define ASTYPE_OBJECT       0x03
+#define ASTYPE_MOVIECLIP    0x04
+#define ASTYPE_NULL         0x05
+#define ASTYPE_UNDEFINED    0x06
+#define ASTYPE_REFERENCE    0x07
+#define ASTYPE_MIXEDARRAY   0x08
+#define ASTYPE_ENDOFOBJECT  0x09
+#define ASTYPE_ARRAY        0x0a
+#define ASTYPE_DATE         0x0b
+#define ASTYPE_LONGSTRING   0x0c
+#define ASTYPE_UNSUPPORTED  0x0d
+#define ASTYPE_RECORDSET    0x0e
+#define ASTYPE_XML          0x0f
+#define ASTYPE_TYPEDOBJECT  0x10
+#define ASTYPE_AMF3DATA     0x11
+
+typedef struct {
+  void * userdata;
+  void (*as_begin_callback)(unsigned char type, void * userdata);
+  void (*as_key_callback)(char * key, void * userdata);
+  void (*as_end_callback)(unsigned char type, void * value, void * userdata);
+} AMFParserHandler;
+
+/* core datatypes */
+
+static uint32_t readInt32(const unsigned char **data)
+{
+  const unsigned char *ptr = *data;
+  uint32_t val;
+
+  val = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
+  ptr += 4;
+  *data = ptr;
+  return val;
+}
+
+static uint32_t readInt24(const unsigned char **data)
+{
+  const unsigned char *ptr = *data;
+  uint32_t val;
+
+  val = (ptr[0] << 16) | (ptr[1] << 8) | ptr[2];
+  ptr += 3;
+  *data = ptr;
+  return val;
+}
+
+static uint16_t readInt16(const unsigned char **data)
+{
+  const unsigned char *ptr = *data;
+  uint16_t val;
+
+  val = (ptr[0] << 8) | ptr[1];
+  ptr += 2;
+  *data = ptr;
+  return val;
+}
+
+static double readDouble(const unsigned char **data)
+{
+  const unsigned char *ptr = *data;
+  double val;
+
+  
EXTRACTOR_common_floatformat_to_double(&EXTRACTOR_floatformat_ieee_double_big,
+                        (const void *)ptr,
+                        &val);
+  ptr += 8;
+  *data = ptr;
+  return val;
+}
+
+
+/* actionscript types */
+
+static int readASNumber(const unsigned char **data,
+                               size_t *len,
+                               double *retval)
+{
+  const unsigned char *ptr = *data;
+  double val;
+
+  if (*len < 8)
+    return -1;
+
+  val = readDouble(&ptr);
+  *len -= 8;
+
+  *retval = val;
+  *data = ptr;
+  return 0;
+}
+
+static int readASBoolean(const unsigned char **data,
+                                size_t *len,
+                                int *retval)
+{
+  const unsigned char *ptr = *data;
+  int val;
+
+  if (*len < 1)
+    return -1;
+
+  val = (*ptr != 0x00);
+  ptr += 1;
+  *len -= 1;
+
+  *retval = val;
+  *data = ptr;
+  return 0;
+}
+
+static int readASDate(const unsigned char **data,
+                             size_t *len,
+                             double *millis,
+                             short *zone)
+{
+  const unsigned char *ptr = *data;
+
+  if (*len < 10)
+    return -1;
+
+  *millis = readDouble(&ptr);
+  *len -= 8;
+
+  *zone = readInt16(&ptr);
+  *len -= 2;
+
+  *data = ptr;
+  return 0;
+}
+
+static int readASString(const unsigned char **data,
+                               size_t *len,
+                               char **retval)
+{
+  const unsigned char *ptr = *data;
+  char *ret;
+  int slen;
+
+  if (*len < 2)
+    return -1;
+
+  slen = readInt16(&ptr);
+
+  if (*len < (2 + slen))
+    return -1;
+
+  ret = malloc(slen+1);
+  if (ret == NULL)
+    return -1;
+  memcpy(ret, ptr, slen);
+  ret[slen] = '\0';
+  ptr += slen;
+  *len -= (2 + slen);
+
+  *retval = ret;
+  *data = ptr;
+  return 0;
+}
+
+static int parse_amf(const unsigned char **data,
+              size_t *len,
+              AMFParserHandler *handler)
+{
+  const unsigned char *ptr = *data;
+  unsigned char astype;
+  int ret;
+
+  ret = 0;
+  astype = *ptr++;
+  (*(handler->as_begin_callback))(astype, handler->userdata);
+  switch (astype) {
+    case ASTYPE_NUMBER:
+    {
+      double val;
+      ret = readASNumber(&ptr, len, &val);
+      if (ret == 0)
+        (*(handler->as_end_callback))(astype,
+                                      &val,
+                                      handler->userdata);
+      break;
+    }
+    case ASTYPE_BOOLEAN:
+    {
+      int val;
+      ret = readASBoolean(&ptr, len, &val);
+      if (ret == 0)
+        (*(handler->as_end_callback))(astype,
+                                      &val,
+                                      handler->userdata);
+      break;
+    }
+    case ASTYPE_STRING:
+    {
+      char *val;
+      ret = readASString(&ptr, len, &val);
+      if (ret == 0) {
+        (*(handler->as_end_callback))(astype,
+                                      val,
+                                      handler->userdata);
+        free(val);
+      }
+      break;
+    }
+    case ASTYPE_DATE:
+    {
+      void *tmp[2];
+      double millis;
+      short tz;
+      ret = readASDate(&ptr, len, &millis, &tz);
+      tmp[0] = &millis;
+      tmp[1] = &tz;
+      if (ret == 0)
+        (*(handler->as_end_callback))(astype,
+                                      &tmp,
+                                      handler->userdata);
+      break;
+    }
+    case ASTYPE_NULL:
+    case ASTYPE_UNDEFINED:
+    case ASTYPE_UNSUPPORTED:
+    case ASTYPE_ENDOFOBJECT:
+      (*(handler->as_end_callback))(astype, NULL, handler->userdata);
+      break;
+    case ASTYPE_ARRAY:
+    {
+      long i, alen;
+      if (*len < 4) {
+        ret = -1;
+        break;
+      }
+      alen = readInt32(&ptr);
+      *len -= 4;
+      for (i = 0; i < alen; i++) {
+        ret = parse_amf(&ptr, len, handler);
+        if (ret == -1)
+         break;
+      }
+      (*(handler->as_end_callback))(ASTYPE_ARRAY,
+                                    NULL,
+                                    handler->userdata);
+      break;
+    }
+    case ASTYPE_OBJECT:
+    {
+      char *key;
+      unsigned char type;
+
+      ret = readASString(&ptr, len, &key);
+      if (ret == -1)
+        break;
+      (*(handler->as_key_callback))(key,
+                                    handler->userdata);
+      free(key);
+      type = *ptr;
+      while (type != ASTYPE_ENDOFOBJECT) {
+        ret = parse_amf(&ptr, len, handler);
+        if (ret == -1)
+          break;
+        ret = readASString(&ptr, len, &key);
+        if (ret == -1)
+          break;
+        (*(handler->as_key_callback))(key,
+                                      handler->userdata);
+        free(key);
+        type = *ptr;
+      }
+      if (ret == 0)
+        (*(handler->as_end_callback))(ASTYPE_OBJECT,
+                                      NULL,
+                                      handler->userdata);
+      break;
+    }
+    case ASTYPE_MIXEDARRAY:
+    {
+      char *key;
+      unsigned char type;
+      
+      if (*len < 4) {
+        ret = -1;
+        break;
+      }
+      /* max_index */ readInt32(&ptr);
+      *len -= 4;
+      ret = readASString(&ptr, len, &key);
+      if (ret == -1)
+        break;
+      (*(handler->as_key_callback))(key,
+                                    handler->userdata);
+      free(key);
+      type = *ptr;
+      while (type != ASTYPE_ENDOFOBJECT) {
+        ret = parse_amf(&ptr, len, handler);
+        if (ret == -1)
+          break;
+        ret = readASString(&ptr, len, &key);
+        if (ret == -1)
+          break;
+        (*(handler->as_key_callback))(key,
+                                      handler->userdata);
+        free(key);
+        type = *ptr;
+      }
+      if (ret == 0)
+        (*(handler->as_end_callback))(astype,
+                                      NULL,
+                                      handler->userdata);
+      break;
+    }
+    default:
+      ret = -1;
+      (*(handler->as_end_callback))(astype,
+                                    NULL,
+                                    handler->userdata);
+#if DEBUG
+      printf("parse_amf: Unknown type %02x", astype);
+#endif
+      break;
+  }
+
+  *data = ptr;
+  return ret;
+}
+
+/*
+ * FLV parser
+ */
+
+/* from tarextractor, modified to take timezone */
+/* TODO: check that the output date is correct */
+static int
+flv_to_iso_date (double timeval, short timezone,
+                 char *rtime, unsigned int rsize)
+{
+  int retval = 0;
+
+  /*
+   * shift epoch to proleptic times
+   * to make subsequent modulo operations safer.
+   */
+  long long my_timeval = (timeval/1000)
+    + ((long long) ((1970 * 365) + 478) * (long long) 86400);
+
+  unsigned int seconds = (unsigned int) (my_timeval % 60);
+  unsigned int minutes = (unsigned int) ((my_timeval / 60) % 60);
+  unsigned int hours = (unsigned int) ((my_timeval / 3600) % 24);
+
+  int zone_sign;
+  int zone_hours;
+  unsigned int zone_minutes;
+
+  unsigned int year = 0;
+  unsigned int month = 1;
+
+  unsigned int days = (unsigned int) (my_timeval / (24 * 3600));
+
+  unsigned int days_in_month[] =
+    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+  unsigned int diff = 0;
+
+  if ((long long) 0 > my_timeval)
+    return EDOM;
+
+  /*
+   * 400-year periods
+   */
+  year += (400 * (days / ((365 * 400) + 97)));
+  days %= ((365 * 400) + 97);
+
+  /*
+   * 100-year periods
+   */
+  diff = (days / ((365 * 100) + 24));
+  if (4 <= diff)
+    {
+      year += 399;
+      days = 364;
+    }
+  else
+    {
+      year += (100 * diff);
+      days %= ((365 * 100) + 24);
+    }
+
+  /*
+   * remaining leap years
+   */
+  year += (4 * (days / ((365 * 4) + 1)));
+  days %= ((365 * 4) + 1);
+
+  while (1)
+    {
+      if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
+        {
+          if (366 > days)
+            {
+              break;
+            }
+          else
+            {
+              days -= 366;
+              year++;
+            }
+        }
+      else
+        {
+          if (365 > days)
+            {
+              break;
+            }
+          else
+            {
+              days -= 365;
+              year++;
+            }
+        }
+    }
+
+  if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
+    days_in_month[1] = 29;
+
+  for (month = 0; (month < 12) && (days >= days_in_month[month]); month += 1)
+    days -= days_in_month[month];
+
+  zone_sign = 0;
+  if (timezone < 0)
+    {
+      zone_sign = -1;
+      timezone = -timezone;
+    }
+  zone_hours = timezone/60;
+  zone_minutes = timezone - zone_hours*60;
+
+  retval = snprintf (rtime, rsize, "%04u-%02u-%02uT%02u:%02u:%02u%c%02d:%02u",
+                     year, month + 1, days + 1, hours, minutes, seconds,
+                     ((zone_sign < 0) ? '-' : '+'), zone_hours, zone_minutes);
+
+  return (retval < rsize) ? 0 : EOVERFLOW;
+}
+
+typedef struct
+{
+  char signature[3];
+  unsigned char version;
+  unsigned char flags;
+  unsigned long offset;
+} FLVHeader;
+
+#define FLV_HEADER_SIZE 9
+
+#define FLV_TAG_TYPE_AUDIO 0x08
+#define FLV_TAG_TYPE_VIDEO 0x09
+#define FLV_TAG_TYPE_META  0x12
+
+typedef struct
+{
+  unsigned char type;
+  unsigned long bodyLength;
+  uint32_t timestamp;
+  unsigned long streamId;
+} FLVTagHeader;
+
+#define FLV_TAG_HEADER_SIZE 11
+
+static int readFLVHeader(const unsigned char **data,
+                        const unsigned char *end,
+                        FLVHeader *hdr)
+{
+  const unsigned char *ptr = *data;
+
+  if ((ptr + FLV_HEADER_SIZE) > end)
+    return -1;
+
+  memcpy(hdr->signature, ptr, 3);
+  ptr += 3;
+  hdr->version = *ptr++;
+  hdr->flags = *ptr++;
+  hdr->offset = readInt32(&ptr);
+  if (hdr->offset != FLV_HEADER_SIZE)
+    return -1;
+
+  *data = ptr;
+  return 0;
+}
+
+static int readPreviousTagSize(const unsigned char **data,
+                                const unsigned char *end,
+                                unsigned long *prev_size)
+{
+  const unsigned char *ptr = *data;
+
+  if ((ptr + 4) > end)
+    return -1;
+
+  *prev_size = readInt32(&ptr);
+
+  *data = ptr;
+  return 0;
+}
+
+static int readFLVTagHeader(const unsigned char **data,
+                          const unsigned char *end,
+                          FLVTagHeader *hdr)
+{
+  const unsigned char *ptr = *data;
+
+  if ((ptr + FLV_TAG_HEADER_SIZE) > end)
+    return -1;
+
+  hdr->type = *ptr++;
+  hdr->bodyLength = readInt24(&ptr);
+  hdr->timestamp = readInt32(&ptr);
+  hdr->streamId = readInt24(&ptr);
+
+  *data = ptr;
+  return 0;
+}
+
+typedef struct {
+  int videoCodec;
+  char *videoCodecStr;
+  int videoWidth;
+  int videoHeight;
+  double videoDataRate;
+  double videoFrameRate;
+
+  int audioCodec;
+  char *audioCodecStr;
+  double audioDataRate;
+  int audioChannels;
+  int audioSampleBits;
+  int audioRate;
+} FLVStreamInfo;
+
+typedef enum {
+  FLV_NONE = 0,
+  FLV_WIDTH,
+  FLV_HEIGHT,
+  FLV_FRAMERATE,
+  FLV_STEREO,
+  FLV_ACHANNELS,
+  FLV_VDATARATE,
+  FLV_ADATARATE,
+  FLV_VCODECID,
+  FLV_ACODECID
+} FLVStreamAttribute;
+
+typedef struct {
+  const char *key;
+  FLVStreamAttribute attribute;
+} MetaKeyToStreamAttribute;
+
+static MetaKeyToStreamAttribute key_to_attribute_map[] = {
+  { "width", FLV_WIDTH },
+  { "height", FLV_HEIGHT },
+  { "framerate", FLV_FRAMERATE },
+  { "videoframerate", FLV_FRAMERATE },
+  { "stereo", FLV_STEREO },
+  { "audiochannels", FLV_ACHANNELS },
+  { "videodatarate", FLV_VDATARATE },
+  { "audiodatarate", FLV_ADATARATE },
+  { "videocodecid", FLV_VCODECID },
+  { "audiocodecid", FLV_ACODECID },
+  { NULL, FLV_NONE }
+};
+
+typedef struct {
+  const char *key;
+  enum EXTRACTOR_MetaType type;
+} MetaKeyToExtractorItem;
+
+static MetaKeyToExtractorItem key_to_extractor_map[] = {
+  { "duration", EXTRACTOR_METATYPE_DURATION },
+  { "creator", EXTRACTOR_METATYPE_CREATOR },
+  { "metadatacreator", EXTRACTOR_METATYPE_CREATOR },
+  { "creationdate", EXTRACTOR_METATYPE_CREATION_DATE },
+  { "metadatadate", EXTRACTOR_METATYPE_MODIFICATION_DATE },
+  { NULL, EXTRACTOR_METATYPE_RESERVED }
+};
+
+typedef struct {
+  int onMetaData;
+  int parsingDepth;
+  int ret;
+  /* mixed array keys mapped to something readily usable */
+  enum EXTRACTOR_MetaType currentKeyType;
+  FLVStreamAttribute currentAttribute;
+
+  EXTRACTOR_MetaDataProcessor proc;
+  void *proc_cls;
+  FLVStreamInfo *streamInfo;
+} FLVMetaParserState;
+
+static void handleASBegin(unsigned char type, void * userdata)
+{
+  FLVMetaParserState *state = (FLVMetaParserState *)userdata;
+
+  if (state->onMetaData && state->parsingDepth == 0 &&
+      type != ASTYPE_MIXEDARRAY)
+    state->onMetaData = 0;
+
+  if (type == ASTYPE_ARRAY || type == ASTYPE_MIXEDARRAY ||
+      type == ASTYPE_OBJECT)
+    state->parsingDepth++;
+}
+
+static void handleASKey(char * key, void * userdata)
+{
+  FLVMetaParserState *state = (FLVMetaParserState *)userdata;
+  int i;
+
+  if (key == NULL)
+    return;
+
+  i = 0;
+  while ((key_to_extractor_map[i].key != NULL) &&
+         (strcasecmp(key, key_to_extractor_map[i].key) != 0))
+    i++;
+  state->currentKeyType = key_to_extractor_map[i].type;
+
+  i = 0;
+  while ((key_to_attribute_map[i].key != NULL) &&
+         (strcasecmp(key, key_to_attribute_map[i].key) != 0))
+    i++;
+  state->currentAttribute = key_to_attribute_map[i].attribute;
+}
+
+static void handleASEnd(unsigned char type, void * value, void * userdata)
+{
+  FLVMetaParserState *state = (FLVMetaParserState *)userdata;
+  const char *s;
+  char tmpstr[30];
+
+  if ((state->parsingDepth == 0) && (type == ASTYPE_STRING)) {
+    s = (const char *)value;
+    if (!strcmp(s, "onMetaData"))
+      state->onMetaData = 1;
+  }
+
+  /* we expect usable metadata to reside in a MIXEDARRAY container
+   * right after a "onMetaData" STRING */
+
+  /* stream info related metadata */
+  if (state->onMetaData && (state->parsingDepth == 1) &&
+      (state->currentAttribute != FLV_NONE) &&
+      (type == ASTYPE_NUMBER))
+  {
+    double n = *((double *)value);
+    switch (state->currentAttribute) {
+      case FLV_NONE: /* make gcc happy */
+       break;
+      case FLV_STEREO:
+        break;
+      case FLV_ACHANNELS:
+        state->streamInfo->audioChannels = n;
+        break;
+      case FLV_WIDTH:
+        if (state->streamInfo->videoWidth == -1)
+          state->streamInfo->videoWidth = n;
+        break;
+      case FLV_HEIGHT:
+        if (state->streamInfo->videoHeight == -1)
+          state->streamInfo->videoHeight = n;
+        break;
+      case FLV_FRAMERATE:
+        state->streamInfo->videoFrameRate = n;
+        break;
+      case FLV_VDATARATE:
+        state->streamInfo->videoDataRate = n;
+        break;
+      case FLV_ADATARATE:
+        state->streamInfo->audioDataRate = n;
+        break;
+      case FLV_VCODECID:
+        if (state->streamInfo->videoCodec == -1)
+          state->streamInfo->videoCodec = n;
+        /* prefer codec ids to fourcc codes */
+        if (state->streamInfo->videoCodecStr != NULL) {
+          free(state->streamInfo->videoCodecStr);
+          state->streamInfo->videoCodecStr = NULL;
+        }
+        break;
+      case FLV_ACODECID:
+        if (state->streamInfo->audioCodec == -1)
+          state->streamInfo->audioCodec = n;
+        /* prefer codec ids to fourcc codes */
+        if (state->streamInfo->audioCodecStr != NULL) {
+          free(state->streamInfo->audioCodecStr);
+          state->streamInfo->audioCodecStr = NULL;
+        }
+        break;
+    }
+  }
+
+  /* sometimes a/v codecs are as fourcc strings */
+  if (state->onMetaData && (state->parsingDepth == 1) &&
+      (state->currentAttribute != FLV_NONE) &&
+      (type == ASTYPE_STRING))
+  {
+    s = (const char *)value;
+    switch (state->currentAttribute) {
+      case FLV_VCODECID:
+        if (s != NULL && state->streamInfo->videoCodecStr == NULL &&
+            state->streamInfo->videoCodec == -1)
+          state->streamInfo->videoCodecStr = strdup(s);
+        break;
+      case FLV_ACODECID:
+        if (s != NULL && state->streamInfo->audioCodecStr == NULL &&
+            state->streamInfo->audioCodec == -1)
+          state->streamInfo->audioCodecStr = strdup(s);
+        break;
+      default:
+        break;
+    }
+  }
+
+  if (state->onMetaData && (state->parsingDepth == 1) &&
+      (state->currentAttribute == FLV_STEREO) &&
+      (type == ASTYPE_BOOLEAN))
+  {
+    int n = *((int *)value);
+    if (state->streamInfo->audioChannels == -1)
+      state->streamInfo->audioChannels = (n == 0) ? 1 : 2;
+  }
+
+  /* metadata that maps straight to extractor keys */
+  if (state->onMetaData && (state->parsingDepth == 1) &&
+      (state->currentKeyType != EXTRACTOR_METATYPE_RESERVED))
+  {
+    s = NULL;
+    switch (type) {
+      case ASTYPE_NUMBER:
+      {
+        double n = *((double *)value);
+        s = tmpstr;
+       if (state->currentKeyType == EXTRACTOR_METATYPE_DURATION)
+          snprintf(tmpstr, sizeof(tmpstr), "%.2f s", n);
+       else
+          snprintf(tmpstr, sizeof(tmpstr), "%f", n);
+       break;
+      }
+      case ASTYPE_STRING:
+      {
+        s = (char *)value;
+        break;
+      }
+      case ASTYPE_DATE:
+      {
+        void **tmp = (void **)value;
+       double *millis;
+       short *tz;
+        millis = (double *)tmp[0];
+       tz = (short *)tmp[1];
+       if (0 == flv_to_iso_date(*millis, *tz, tmpstr, sizeof(tmpstr)))
+         s = tmpstr;
+        break;
+      }
+    }
+    if ( (s != NULL) &&
+        (state->ret == 0) )
+      state->ret = state->proc (state->proc_cls,
+                               "flv",
+                               state->currentKeyType,
+                               EXTRACTOR_METAFORMAT_UTF8,
+                               "text/plain",
+                               s,
+                               strlen (s) + 1);
+  }
+  state->currentKeyType = EXTRACTOR_METATYPE_RESERVED;
+  state->currentAttribute = FLV_NONE;
+
+  if (type == ASTYPE_ARRAY || type == ASTYPE_MIXEDARRAY ||
+      type == ASTYPE_OBJECT)
+    state->parsingDepth--;
+}
+
+static int
+handleMetaBody(const unsigned char *data, size_t len,
+              FLVStreamInfo *stinfo,
+              EXTRACTOR_MetaDataProcessor proc,
+              void *proc_cls)
+{
+  AMFParserHandler handler;
+  FLVMetaParserState pstate;
+
+  pstate.onMetaData = 0;
+  pstate.currentKeyType = EXTRACTOR_METATYPE_RESERVED;
+  pstate.parsingDepth = 0;
+  pstate.streamInfo = stinfo;
+  pstate.ret = 0;
+  pstate.proc = proc;
+  pstate.proc_cls = proc_cls;
+  handler.userdata = &pstate;
+  handler.as_begin_callback = &handleASBegin;
+  handler.as_key_callback = &handleASKey;
+  handler.as_end_callback = &handleASEnd;
+
+  while (len > 0 && parse_amf(&data, &len, &handler) == 0);
+  if (pstate.ret != 0)
+    return 1;
+  return 0;
+}
+
+static char *FLVAudioCodecs[] = {
+  "Uncompressed",
+  "ADPCM",
+  "MP3",
+  NULL,
+  NULL,
+  "Nellymoser 8kHz mono",
+  "Nellymoser",
+  NULL,
+  NULL,
+  NULL,
+  "AAC",
+  "Speex"
+};
+
+static char *FLVAudioChannels[] = {
+  "mono",
+  "stereo"
+};
+
+static char *FLVAudioSampleSizes[] = {
+  "8-bit",
+  "16-bit"
+};
+
+static char *FLVAudioSampleRates[] = {
+  "5512.5",
+  "11025",
+  "22050",
+  "44100"
+};
+
+static void
+handleAudioBody(const unsigned char *data, size_t len,
+                FLVStreamInfo *stinfo)
+{
+  stinfo->audioChannels = (*data & 0x01) + 1;
+  stinfo->audioSampleBits = (*data & 0x02) >> 1;
+  stinfo->audioRate = (*data & 0x0C) >> 2;
+  stinfo->audioCodec = (*data & 0xF0) >> 4;
+  if (stinfo->audioCodecStr != NULL) {
+    free(stinfo->audioCodecStr);
+    stinfo->audioCodecStr = NULL;
+  }
+}
+
+static char *FLVVideoCodecs[] = {
+  NULL,
+  NULL,
+  "Sorenson Spark",
+  "ScreenVideo",
+  "On2 TrueMotion VP6",
+  "On2 TrueMotion VP6 Alpha",
+  "ScreenVideo 2",
+  "H.264" /* XXX not found in docs */
+};
+
+static int sorenson_predefined_res[][2] = {
+  { -1, -1 },
+  { -1, -1 },
+  { 352, 288 },
+  { 176, 144 },
+  { 128, 96 },
+  { 320, 240 },
+  { 160, 120 },
+  { -1, -1 }
+};
+
+static void
+handleVideoBody(const unsigned char *data, size_t len,
+                FLVStreamInfo *stinfo)
+{
+  int codecId, frameType;
+
+  codecId = *data & 0x0F;
+  frameType = (*data & 0xF0) >> 4;
+  data++;
+
+  /* try to get video dimensions */
+  switch (codecId) {
+    case 0x02: /* Sorenson */
+      if (len < 9)
+        break;
+      if (frameType == 1) {
+        int start_code = (data[0] << 9) | (data[1] << 1) | ((data[2] >> 
7)&0x1);
+        int version = (data[2] & 0x7C) >> 2;
+        int frame_size = ((data[3] & 0x03) << 1) | (data[4] >> 7);
+        if (start_code != 0x00000001)
+          break;
+        if (!(version == 0 || version == 1))
+          break;
+        if (frame_size == 0) {
+          stinfo->videoWidth = ((data[4] & 0x7F) >> 1) | (data[5] >> 7);
+          stinfo->videoHeight = ((data[5] & 0x7F) >> 1) | (data[6] >> 7);
+        }
+        else if (frame_size == 1) {
+          stinfo->videoWidth = ((data[4] & 0x7F) << 9) | (data[5] << 1) |
+                               (data[6] >> 7);
+          stinfo->videoHeight = ((data[6] & 0x7F) << 9) | (data[7] << 1) |
+                                (data[8] >> 7);
+        }
+        else {
+          stinfo->videoWidth = sorenson_predefined_res[frame_size][0];
+          stinfo->videoHeight = sorenson_predefined_res[frame_size][1];
+        }
+      }
+      break;
+    case 0x03: /* ScreenVideo */
+      if (len < 5)
+        break;
+      stinfo->videoWidth = readInt16(&data) & 0x0FFF;
+      stinfo->videoHeight = readInt16(&data) & 0x0FFF;
+      break;
+    case 0x04: /* On2 VP6 */
+    case 0x05:
+    {
+      unsigned char dim_adj;
+      if (len < 10)
+        break;
+      dim_adj = *data++;
+      if ((frameType == 1) && ((data[0] & 0x80) == 0)) {
+        /* see ffmpeg vp6 decoder */
+        int separated_coeff = data[0] & 0x01;
+        int filter_header = data[1] & 0x06;
+        /*int interlaced = data[1] & 0x01; TODO: used in flv ever? */
+        if (separated_coeff || !filter_header) {
+          data += 2;
+        }
+        /* XXX encoded/displayed dimensions might vary, but which are the
+         * right ones? */
+        stinfo->videoWidth = (data[3]*16) - (dim_adj>>4);
+        stinfo->videoHeight = (data[2]*16) - (dim_adj&0x0F);
+      }
+      break;
+    }
+    default:
+      break;
+  }
+
+  stinfo->videoCodec = codecId;
+  if (stinfo->videoCodecStr != NULL) {
+    free(stinfo->videoCodecStr);
+    stinfo->videoCodecStr = NULL;
+  }
+}
+
+static int readFLVTag(const unsigned char **data,
+                      const unsigned char *end,
+                      FLVStreamInfo *stinfo,
+                     EXTRACTOR_MetaDataProcessor proc,
+                     void *proc_cls)
+{
+  const unsigned char *ptr = *data;
+  FLVTagHeader header;
+  int ret = 0;
+
+  if (readFLVTagHeader(&ptr, end, &header) == -1)
+    return -1;
+
+  if ((ptr + header.bodyLength) > end)
+    return -1;
+
+  switch (header.type)
+  {
+    case FLV_TAG_TYPE_AUDIO:
+      handleAudioBody(ptr, header.bodyLength, stinfo);
+      break;
+    case FLV_TAG_TYPE_VIDEO:
+      handleVideoBody(ptr, header.bodyLength, stinfo);
+      break;
+    case FLV_TAG_TYPE_META:
+      ret = handleMetaBody(ptr, header.bodyLength, stinfo, proc, proc_cls);
+      break;
+    default:
+      break;
+  }
+
+  ptr += header.bodyLength;
+  *data = ptr;
+  return ret;
+}
+
+#define MAX_FLV_FORMAT_LINE 80
+static char * printVideoFormat(FLVStreamInfo *stinfo)
+{
+  char s[MAX_FLV_FORMAT_LINE+1];
+  int n;
+  size_t len = MAX_FLV_FORMAT_LINE;
+
+  n = 0;
+  /* some files seem to specify only the width or the height, print '?' for
+   * the unknown dimension */
+  if (stinfo->videoWidth != -1 || stinfo->videoHeight != -1) {
+    if (n < len) {
+      if (stinfo->videoWidth != -1)
+        n += snprintf(s+n, len-n, "%d", stinfo->videoWidth);
+      else
+        n += snprintf(s+n, len-n, "?");
+    }
+
+    if (n < len) {
+      if (stinfo->videoHeight != -1)
+        n += snprintf(s+n, len-n, "x%d", stinfo->videoHeight);
+      else
+        n += snprintf(s+n, len-n, "x?");
+    }
+  }
+
+  if (stinfo->videoFrameRate != 0.0 && n < len) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%0.2f fps", stinfo->videoFrameRate);
+  }
+
+  if (stinfo->videoCodec > -1 && stinfo->videoCodec < 8 &&
+      FLVVideoCodecs[stinfo->videoCodec] != NULL && n < len) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%s", FLVVideoCodecs[stinfo->videoCodec]);
+  }
+  else if (stinfo->videoCodecStr != NULL && n < len) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%s", stinfo->videoCodecStr);    
+  }
+
+  if (stinfo->videoDataRate != 0.0 && n < len) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%.4f kbps", stinfo->videoDataRate);
+  }
+
+  if (n == 0)
+    return NULL;
+  return strdup(s);
+}
+
+static char * printAudioFormat(FLVStreamInfo *stinfo)
+{
+  char s[MAX_FLV_FORMAT_LINE+1];
+  int n;
+  size_t len = MAX_FLV_FORMAT_LINE;
+
+  n = 0;
+  if ( (stinfo->audioRate != -1) && (n < len)) {
+      n += snprintf(s+n, len-n, "%s Hz", 
FLVAudioSampleRates[stinfo->audioRate]);
+  }
+
+  if ((stinfo->audioSampleBits != -1) && (n < len)) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%s",
+                    FLVAudioSampleSizes[stinfo->audioSampleBits]);
+  }
+
+  if ((stinfo->audioChannels != -1) && (n < len)) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len) {
+      if (stinfo->audioChannels >= 1 && stinfo->audioChannels <= 2)
+        n += snprintf(s+n, len-n, "%s",
+                      FLVAudioChannels[stinfo->audioChannels-1]);
+      else
+        n += snprintf(s+n, len-n, "%d",
+                      stinfo->audioChannels);
+    }
+  }
+
+  if ((stinfo->audioCodec > -1) && (stinfo->audioCodec < 12) &&
+      (FLVAudioCodecs[stinfo->audioCodec] != NULL) && (n < len)) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%s", FLVAudioCodecs[stinfo->audioCodec]);
+  }
+  else if ((stinfo->audioCodecStr != NULL) && (n < len)) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%s", stinfo->audioCodecStr);    
+  }
+
+  if ((stinfo->audioDataRate != 0.0) && (n < len)) {
+    if (n > 0)
+      n += snprintf(s+n, len-n, ", ");
+    if (n < len)
+      n += snprintf(s+n, len-n, "%.4f kbps", stinfo->audioDataRate);
+  }
+
+  if (n == 0)
+    return NULL;
+  return strdup(s);
+}
+
+int 
+EXTRACTOR_flv_extract (const unsigned char *data,
+                      size_t size,
+                      EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls,
+                      const char *options)
+{
+  const unsigned char *ptr;
+  const unsigned char *end;
+  FLVStreamInfo stinfo;
+  FLVHeader header;
+  unsigned long prev_tag_size;
+  char *s;
+  int ret;
+
+  ptr = data;
+  end = ptr + size;
+
+  if (readFLVHeader(&ptr, end, &header) == -1)
+    return 0;
+
+  if (memcmp(header.signature, FLV_SIGNATURE, 3) != 0)
+    return 0;
+
+  if (0 != proc (proc_cls,
+                "flv",
+                EXTRACTOR_METATYPE_MIMETYPE, 
+                EXTRACTOR_METAFORMAT_UTF8,
+                "text/plain",
+                "video/x-flv",
+                strlen ("video/x-flv") + 1))
+    return 0;
+  if (header.version != 1)
+    return 0;
+  if (readPreviousTagSize (&ptr, end, &prev_tag_size) == -1)
+    return 0;
+
+  stinfo.videoCodec = -1;
+  stinfo.videoCodecStr = NULL;
+  stinfo.videoWidth = -1;
+  stinfo.videoHeight = -1;
+  stinfo.videoFrameRate = 0.0;
+  stinfo.videoDataRate = 0.0;
+  stinfo.audioCodec = -1;
+  stinfo.audioCodecStr = NULL;
+  stinfo.audioRate = -1;
+  stinfo.audioSampleBits = -1;
+  stinfo.audioChannels = -1;
+  stinfo.audioDataRate = 0.0;
+  ret = 0;
+  while (ptr < end) {
+    if (-1 == (ret = readFLVTag (&ptr, end, &stinfo, proc, proc_cls)))
+      break;
+    if (readPreviousTagSize (&ptr, end, &prev_tag_size) == -1)
+      break;
+  }
+  if (1 == ret)
+    return 1;
+  s = printVideoFormat (&stinfo);
+  if (s != NULL)
+    {
+      if (0 != proc (proc_cls, 
+                    "flv",
+                    EXTRACTOR_METATYPE_RESOURCE_TYPE,
+                    EXTRACTOR_METAFORMAT_UTF8,
+                    "text/plain",
+                    s,
+                    strlen (s)+1))
+       {
+         free (s);
+         return 1;
+       }
+      free (s);
+    }
+  s = printAudioFormat (&stinfo);
+  if (s != NULL)
+    {
+      if (0 != proc (proc_cls, 
+                    "flv",
+                    EXTRACTOR_METATYPE_RESOURCE_TYPE,
+                    EXTRACTOR_METAFORMAT_UTF8,
+                    "text/plain",
+                    s,
+                    strlen (s)+1))
+       {
+         free (s);
+         return 1;
+       }
+      free (s);
+    }
+  return 0;
+}

Copied: Extractor/src/plugins/old/html_extractor.c (from rev 23239, 
Extractor/src/plugins/html_extractor.c)
===================================================================
--- Extractor/src/plugins/old/html_extractor.c                          (rev 0)
+++ Extractor/src/plugins/old/html_extractor.c  2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,420 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2005, 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 <string.h>
+#include "convert.h"
+
+static struct
+{
+  const char *name;
+  enum EXTRACTOR_MetaType type;
+} tagmap[] = {
+  { "author", EXTRACTOR_METATYPE_AUTHOR_NAME },
+  { "dc.author", EXTRACTOR_METATYPE_AUTHOR_NAME },
+  { "title", EXTRACTOR_METATYPE_TITLE },
+  { "dc.title", EXTRACTOR_METATYPE_TITLE},
+  { "description", EXTRACTOR_METATYPE_DESCRIPTION },
+  { "dc.description", EXTRACTOR_METATYPE_DESCRIPTION },
+  { "subject", EXTRACTOR_METATYPE_SUBJECT},
+  { "dc.subject", EXTRACTOR_METATYPE_SUBJECT},
+  { "date", EXTRACTOR_METATYPE_UNKNOWN_DATE },
+  { "dc.date", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  { "publisher", EXTRACTOR_METATYPE_PUBLISHER },
+  { "dc.publisher", EXTRACTOR_METATYPE_PUBLISHER},
+  { "rights", EXTRACTOR_METATYPE_RIGHTS },
+  { "dc.rights", EXTRACTOR_METATYPE_RIGHTS },
+  { "copyright", EXTRACTOR_METATYPE_COPYRIGHT },
+  { "language", EXTRACTOR_METATYPE_LANGUAGE },  
+  { "keywords", EXTRACTOR_METATYPE_KEYWORDS },
+  { "abstract", EXTRACTOR_METATYPE_ABSTRACT },
+  { "formatter", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE },
+  { "dc.creator", EXTRACTOR_METATYPE_CREATOR},
+  { "dc.identifier", EXTRACTOR_METATYPE_URI },
+  { "dc.format", EXTRACTOR_METATYPE_FORMAT },
+  { NULL, EXTRACTOR_METATYPE_RESERVED }
+};
+
+static const char *relevantTags[] = {
+  "title",
+  "meta",
+  NULL,
+};
+
+typedef struct TI
+{
+  struct TI *next;
+  const char *tagStart;
+  const char *tagEnd;
+  const char *dataStart;
+  const char *dataEnd;
+} TagInfo;
+
+
+
+
+/* ******************** parser helper functions ************** */
+
+static int
+tagMatch (const char *tag, const char *s, const char *e)
+{
+  return (((e - s) == strlen (tag)) && (0 == strncasecmp (tag, s, e - s)));
+}
+
+static int
+lookFor (char c, size_t * pos, const char *data, size_t size)
+{
+  size_t p = *pos;
+
+  while ((p < size) && (data[p] != c))
+    {
+      if (data[p] == '\0')
+        return 0;
+      p++;
+    }
+  *pos = p;
+  return p < size;
+}
+
+static int
+skipWhitespace (size_t * pos, const char *data, size_t size)
+{
+  size_t p = *pos;
+
+  while ((p < size) && (isspace ( (unsigned char) data[p])))
+    {
+      if (data[p] == '\0')
+        return 0;
+      p++;
+    }
+  *pos = p;
+  return p < size;
+}
+
+static int
+skipLetters (size_t * pos, const char *data, size_t size)
+{
+  size_t p = *pos;
+
+  while ((p < size) && (isalpha ( (unsigned char) data[p])))
+    {
+      if (data[p] == '\0')
+        return 0;
+      p++;
+    }
+  *pos = p;
+  return p < size;
+}
+
+static int
+lookForMultiple (const char *c, size_t * pos, const char *data, size_t size)
+{
+  size_t p = *pos;
+
+  while ((p < size) && (strchr (c, data[p]) == NULL))
+    {
+      if (data[p] == '\0')
+        return 0;
+      p++;
+    }
+  *pos = p;
+  return p < size;
+}
+
+static void
+findEntry (const char *key,
+           const char *start,
+           const char *end, const char **mstart, const char **mend)
+{
+  size_t len;
+
+  *mstart = NULL;
+  *mend = NULL;
+  len = strlen (key);
+  while (start < end - len - 1)
+    {
+      start++;
+      if (start[len] != '=')
+        continue;
+      if (0 == strncasecmp (start, key, len))
+        {
+          start += len + 1;
+          *mstart = start;
+          if ((*start == '\"') || (*start == '\''))
+            {
+              start++;
+              while ((start < end) && (*start != **mstart))
+                start++;
+              (*mstart)++;      /* skip quote */
+            }
+          else
+            {
+              while ((start < end) && (!isspace ( (unsigned char) *start)))
+                start++;
+            }
+          *mend = start;
+          return;
+        }
+    }
+}
+
+/**
+ * Search all tags that correspond to "tagname".  Example:
+ * If the tag is <meta name="foo" desc="bar">, and
+ * tagname == "meta", keyname="name", keyvalue="foo",
+ * and searchname="desc", then this function returns a
+ * copy (!) of "bar".  Easy enough?
+ *
+ * @return NULL if nothing is found
+ */
+static char *
+findInTags (TagInfo * t,
+            const char *tagname,
+            const char *keyname, const char *keyvalue, const char *searchname)
+{
+  const char *pstart;
+  const char *pend;
+
+  while (t != NULL)
+    {
+      if (tagMatch (tagname, t->tagStart, t->tagEnd))
+        {
+          findEntry (keyname, t->tagEnd, t->dataStart, &pstart, &pend);
+          if ((pstart != NULL) && (tagMatch (keyvalue, pstart, pend)))
+            {
+              findEntry (searchname, t->tagEnd, t->dataStart, &pstart, &pend);
+              if (pstart != NULL)
+                {
+                  char *ret = malloc (pend - pstart + 1);
+                 if (ret == NULL)
+                   return NULL;
+                  memcpy (ret, pstart, pend - pstart);
+                  ret[pend - pstart] = '\0';
+                  return ret;
+                }
+            }
+        }
+      t = t->next;
+    }
+  return NULL;
+}
+
+
+/* mimetype = text/html */
+int 
+EXTRACTOR_html_extract (const char *data,
+                       size_t size,
+                       EXTRACTOR_MetaDataProcessor proc,
+                       void *proc_cls,
+                       const char *options)
+{
+  size_t xsize;
+  TagInfo *tags;
+  TagInfo *t;
+  TagInfo tag;
+  size_t pos;
+  size_t tpos;
+  int i;
+  char *charset;
+  char *tmp;
+  char *xtmp;
+  int ret;
+
+  ret = 0;
+  if (size == 0)
+    return 0;
+  /* only scan first 32k */
+  if (size > 1024 * 32)
+    xsize = 1024 * 32;
+  else
+    xsize = size;
+  tags = NULL;
+  tag.next = NULL;
+  pos = 0;
+  while (pos < xsize)
+    {
+      if (!lookFor ('<', &pos, data, size))
+        break;
+      tag.tagStart = &data[++pos];
+      if (!skipLetters (&pos, data, size))
+        break;
+      tag.tagEnd = &data[pos];
+      if (!skipWhitespace (&pos, data, size))
+        break;
+    STEP3:
+      if (!lookForMultiple (">\"\'", &pos, data, size))
+        break;
+      if (data[pos] != '>')
+        {
+          /* find end-quote, ignore escaped quotes (\') */
+          do
+            {
+              tpos = pos;
+              pos++;
+              if (!lookFor (data[tpos], &pos, data, size))
+                break;
+            }
+          while (data[pos - 1] == '\\');
+          pos++;
+          goto STEP3;
+        }
+      pos++;
+      if (!skipWhitespace (&pos, data, size))
+        break;
+      tag.dataStart = &data[pos];
+      if (!lookFor ('<', &pos, data, size))
+        break;
+      tag.dataEnd = &data[pos];
+      i = 0;
+      while (relevantTags[i] != NULL)
+        {
+          if ((strlen (relevantTags[i]) == tag.tagEnd - tag.tagStart) &&
+              (0 == strncasecmp (relevantTags[i],
+                                 tag.tagStart, tag.tagEnd - tag.tagStart)))
+            {
+              t = malloc (sizeof (TagInfo));
+             if (t == NULL)
+               return 0;
+              *t = tag;
+              t->next = tags;
+              tags = t;
+              break;
+            }
+          i++;
+        }
+      /* abort early if we hit the body tag */
+      if (tagMatch ("body", tag.tagStart, tag.tagEnd))
+        break;
+    }
+
+  /* fast exit */
+  if (tags == NULL)
+    return 0;
+
+  charset = NULL;
+  /* first, try to determine mime type and/or character set */
+  tmp = findInTags (tags, "meta", "http-equiv", "content-type", "content");
+  if (tmp != NULL)
+    {
+      /* ideally, tmp == "test/html; charset=ISO-XXXX-Y" or something like 
that;
+         if text/html is present, we take that as the mime-type; if charset=
+         is present, we try to use that for character set conversion. */
+      if (0 == strncasecmp (tmp, "text/html", strlen ("text/html")))
+        ret = proc (proc_cls, 
+                   "html",
+                   EXTRACTOR_METATYPE_MIMETYPE,
+                   EXTRACTOR_METAFORMAT_UTF8,
+                   "text/plain",
+                   "text/html",
+                   strlen ("text/html")+1);
+      charset = strcasestr (tmp, "charset=");
+      if (charset != NULL)
+        charset = strdup (&charset[strlen ("charset=")]);
+      free (tmp);
+    }
+  i = 0;
+  while (tagmap[i].name != NULL)
+    {
+      tmp = findInTags (tags, "meta", "name", tagmap[i].name, "content");
+      if ( (tmp != NULL) &&
+          (ret == 0) )
+        {
+         if (charset == NULL)
+           {
+             ret = proc (proc_cls,
+                         "html",
+                         tagmap[i].type,
+                         EXTRACTOR_METAFORMAT_C_STRING,
+                         "text/plain",
+                         tmp,
+                         strlen (tmp) + 1);
+           }
+         else
+           {
+             xtmp = EXTRACTOR_common_convert_to_utf8 (tmp,
+                                                      strlen (tmp),
+                                                      charset);
+             if (xtmp != NULL)
+               {
+                 ret = proc (proc_cls,
+                             "html",
+                             tagmap[i].type,
+                             EXTRACTOR_METAFORMAT_UTF8,
+                             "text/plain",
+                             xtmp,
+                             strlen (xtmp) + 1);
+                 free (xtmp);
+               }
+           }
+        }
+      if (tmp != NULL)
+       free (tmp);
+      i++;
+    }
+  while (tags != NULL) 
+    {
+      t = tags;
+      if ( (tagMatch ("title", t->tagStart, t->tagEnd)) &&
+          (ret == 0) )
+       {
+         if (charset == NULL)
+           {
+             xtmp = malloc (t->dataEnd - t->dataStart + 1);
+             if (xtmp != NULL)
+               {
+                 memcpy (xtmp, t->dataStart, t->dataEnd - t->dataStart);
+                 xtmp[t->dataEnd - t->dataStart] = '\0';
+                 ret = proc (proc_cls,
+                             "html",
+                             EXTRACTOR_METATYPE_TITLE,
+                             EXTRACTOR_METAFORMAT_C_STRING,
+                             "text/plain",
+                             xtmp,
+                             strlen (xtmp) + 1);
+                 free (xtmp);
+               }
+           }
+         else
+           {
+             xtmp = EXTRACTOR_common_convert_to_utf8 (t->dataStart,
+                                                      t->dataEnd - 
t->dataStart,
+                                                      charset);
+             if (xtmp != NULL)
+               {
+                 ret = proc (proc_cls,
+                             "html",
+                             EXTRACTOR_METATYPE_TITLE,
+                             EXTRACTOR_METAFORMAT_UTF8,
+                             "text/plain",
+                             xtmp,
+                             strlen (xtmp) + 1);
+                 free (xtmp);
+               }
+           }
+       }
+      tags = t->next;
+      free (t);
+    }
+  if (charset != NULL)
+    free (charset);
+  return ret;
+}

Copied: Extractor/src/plugins/old/id3_extractor.c (from rev 23239, 
Extractor/src/plugins/id3_extractor.c)
===================================================================
--- Extractor/src/plugins/old/id3_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/id3_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,306 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2006, 2009, 2010 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 "convert.h"
+#include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "extractor_plugins.h"
+
+typedef struct
+{
+  char *title;
+  char *artist;
+  char *album;
+  char *year;
+  char *comment;
+  const char *genre;
+  unsigned int track_number;
+} id3tag;
+
+static const char *const genre_names[] = {
+  gettext_noop ("Blues"),
+  gettext_noop ("Classic Rock"),
+  gettext_noop ("Country"),
+  gettext_noop ("Dance"),
+  gettext_noop ("Disco"),
+  gettext_noop ("Funk"),
+  gettext_noop ("Grunge"),
+  gettext_noop ("Hip-Hop"),
+  gettext_noop ("Jazz"),
+  gettext_noop ("Metal"),
+  gettext_noop ("New Age"),
+  gettext_noop ("Oldies"),
+  gettext_noop ("Other"),
+  gettext_noop ("Pop"),
+  gettext_noop ("R&B"),
+  gettext_noop ("Rap"),
+  gettext_noop ("Reggae"),
+  gettext_noop ("Rock"),
+  gettext_noop ("Techno"),
+  gettext_noop ("Industrial"),
+  gettext_noop ("Alternative"),
+  gettext_noop ("Ska"),
+  gettext_noop ("Death Metal"),
+  gettext_noop ("Pranks"),
+  gettext_noop ("Soundtrack"),
+  gettext_noop ("Euro-Techno"),
+  gettext_noop ("Ambient"),
+  gettext_noop ("Trip-Hop"),
+  gettext_noop ("Vocal"),
+  gettext_noop ("Jazz+Funk"),
+  gettext_noop ("Fusion"),
+  gettext_noop ("Trance"),
+  gettext_noop ("Classical"),
+  gettext_noop ("Instrumental"),
+  gettext_noop ("Acid"),
+  gettext_noop ("House"),
+  gettext_noop ("Game"),
+  gettext_noop ("Sound Clip"),
+  gettext_noop ("Gospel"),
+  gettext_noop ("Noise"),
+  gettext_noop ("Alt. Rock"),
+  gettext_noop ("Bass"),
+  gettext_noop ("Soul"),
+  gettext_noop ("Punk"),
+  gettext_noop ("Space"),
+  gettext_noop ("Meditative"),
+  gettext_noop ("Instrumental Pop"),
+  gettext_noop ("Instrumental Rock"),
+  gettext_noop ("Ethnic"),
+  gettext_noop ("Gothic"),
+  gettext_noop ("Darkwave"),
+  gettext_noop ("Techno-Industrial"),
+  gettext_noop ("Electronic"),
+  gettext_noop ("Pop-Folk"),
+  gettext_noop ("Eurodance"),
+  gettext_noop ("Dream"),
+  gettext_noop ("Southern Rock"),
+  gettext_noop ("Comedy"),
+  gettext_noop ("Cult"),
+  gettext_noop ("Gangsta Rap"),
+  gettext_noop ("Top 40"),
+  gettext_noop ("Christian Rap"),
+  gettext_noop ("Pop/Funk"),
+  gettext_noop ("Jungle"),
+  gettext_noop ("Native American"),
+  gettext_noop ("Cabaret"),
+  gettext_noop ("New Wave"),
+  gettext_noop ("Psychedelic"),
+  gettext_noop ("Rave"),
+  gettext_noop ("Showtunes"),
+  gettext_noop ("Trailer"),
+  gettext_noop ("Lo-Fi"),
+  gettext_noop ("Tribal"),
+  gettext_noop ("Acid Punk"),
+  gettext_noop ("Acid Jazz"),
+  gettext_noop ("Polka"),
+  gettext_noop ("Retro"),
+  gettext_noop ("Musical"),
+  gettext_noop ("Rock & Roll"),
+  gettext_noop ("Hard Rock"),
+  gettext_noop ("Folk"),
+  gettext_noop ("Folk/Rock"),
+  gettext_noop ("National Folk"),
+  gettext_noop ("Swing"),
+  gettext_noop ("Fast-Fusion"),
+  gettext_noop ("Bebob"),
+  gettext_noop ("Latin"),
+  gettext_noop ("Revival"),
+  gettext_noop ("Celtic"),
+  gettext_noop ("Bluegrass"),
+  gettext_noop ("Avantgarde"),
+  gettext_noop ("Gothic Rock"),
+  gettext_noop ("Progressive Rock"),
+  gettext_noop ("Psychedelic Rock"),
+  gettext_noop ("Symphonic Rock"),
+  gettext_noop ("Slow Rock"),
+  gettext_noop ("Big Band"),
+  gettext_noop ("Chorus"),
+  gettext_noop ("Easy Listening"),
+  gettext_noop ("Acoustic"),
+  gettext_noop ("Humour"),
+  gettext_noop ("Speech"),
+  gettext_noop ("Chanson"),
+  gettext_noop ("Opera"),
+  gettext_noop ("Chamber Music"),
+  gettext_noop ("Sonata"),
+  gettext_noop ("Symphony"),
+  gettext_noop ("Booty Bass"),
+  gettext_noop ("Primus"),
+  gettext_noop ("Porn Groove"),
+  gettext_noop ("Satire"),
+  gettext_noop ("Slow Jam"),
+  gettext_noop ("Club"),
+  gettext_noop ("Tango"),
+  gettext_noop ("Samba"),
+  gettext_noop ("Folklore"),
+  gettext_noop ("Ballad"),
+  gettext_noop ("Power Ballad"),
+  gettext_noop ("Rhythmic Soul"),
+  gettext_noop ("Freestyle"),
+  gettext_noop ("Duet"),
+  gettext_noop ("Punk Rock"),
+  gettext_noop ("Drum Solo"),
+  gettext_noop ("A Cappella"),
+  gettext_noop ("Euro-House"),
+  gettext_noop ("Dance Hall"),
+  gettext_noop ("Goa"),
+  gettext_noop ("Drum & Bass"),
+  gettext_noop ("Club-House"),
+  gettext_noop ("Hardcore"),
+  gettext_noop ("Terror"),
+  gettext_noop ("Indie"),
+  gettext_noop ("BritPop"),
+  gettext_noop ("Negerpunk"),
+  gettext_noop ("Polsk Punk"),
+  gettext_noop ("Beat"),
+  gettext_noop ("Christian Gangsta Rap"),
+  gettext_noop ("Heavy Metal"),
+  gettext_noop ("Black Metal"),
+  gettext_noop ("Crossover"),
+  gettext_noop ("Contemporary Christian"),
+  gettext_noop ("Christian Rock"),
+  gettext_noop ("Merengue"),
+  gettext_noop ("Salsa"),
+  gettext_noop ("Thrash Metal"),
+  gettext_noop ("Anime"),
+  gettext_noop ("JPop"),
+  gettext_noop ("Synthpop"),
+};
+
+#define GENRE_NAME_COUNT \
+    ((unsigned int)(sizeof genre_names / sizeof (const char *const)))
+
+
+
+#define OK         0
+#define INVALID_ID3 1
+
+static void
+trim (char *k)
+{
+  if (k == NULL)
+    return;
+  while ((strlen (k) > 0) && (isspace ((unsigned char) k[strlen (k) - 1])))
+    k[strlen (k) - 1] = '\0';
+}
+
+static int
+get_id3 (const char *data, int64_t offset, int64_t size, id3tag *id3)
+{
+  const char *pos;
+
+  if (size < 128)
+    return INVALID_ID3;
+
+  pos = &data[offset];
+  if (0 != strncmp ("TAG", pos, 3))
+    return INVALID_ID3;
+  pos += 3;
+
+  id3->title = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
+  trim (id3->title);
+  pos += 30;
+  id3->artist = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
+  trim (id3->artist);
+  pos += 30;
+  id3->album = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
+  trim (id3->album);
+  pos += 30;
+  id3->year = EXTRACTOR_common_convert_to_utf8 (pos, 4, "ISO-8859-1");
+  trim (id3->year);
+  pos += 4;
+  id3->comment = EXTRACTOR_common_convert_to_utf8 (pos, 30, "ISO-8859-1");
+  trim (id3->comment);
+  if ( (pos[28] == '\0') &&
+       (pos[29] != '\0') )
+    {
+      /* ID3v1.1 */
+      id3->track_number = pos[29];
+    }
+  else
+    {
+      id3->track_number = 0;
+    }
+  pos += 30;
+  id3->genre = "";
+  if (pos[0] < GENRE_NAME_COUNT)
+    id3->genre = dgettext (PACKAGE, genre_names[(unsigned) pos[0]]);
+  return OK;
+}
+
+
+#define ADD(s,t) do { if ( (s != NULL) && (strlen(s) > 0) && (0 != proc 
(proc_cls, "id3", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) 
return 1; } while (0)
+
+
+int
+EXTRACTOR_id3_extract_method (struct EXTRACTOR_PluginList *plugin,
+    EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
+{
+  id3tag info;
+  int64_t fsize;
+  unsigned char *data;
+  char track[16];
+
+  if (plugin == NULL)
+    return 1;
+
+  pl_seek (plugin, -128, SEEK_END);
+  fsize = pl_get_fsize (plugin);
+  if (fsize <= 0)
+    return 1;
+
+  if (128 != pl_read (plugin, &data, 128))
+    return 1;
+
+  memset (&info, 0, sizeof (info));
+
+  if (OK != get_id3 ((const char *) data, 0, 128, &info))
+    return 1;
+  ADD (info.title, EXTRACTOR_METATYPE_TITLE);
+  ADD (info.artist, EXTRACTOR_METATYPE_ARTIST);
+  ADD (info.album, EXTRACTOR_METATYPE_ALBUM);
+  ADD (info.year, EXTRACTOR_METATYPE_PUBLICATION_YEAR);
+  ADD (info.genre, EXTRACTOR_METATYPE_GENRE);
+  ADD (info.comment, EXTRACTOR_METATYPE_COMMENT);
+  if (info.track_number != 0)
+  {
+    snprintf (track, sizeof(track), "%u", info.track_number);
+    ADD (track, EXTRACTOR_METATYPE_TRACK_NUMBER);
+  }
+
+  if (info.title != NULL) free (info.title);
+  if (info.year != NULL) free (info.year);
+  if (info.album != NULL) free (info.album);
+  if (info.artist != NULL) free (info.artist);
+  if (info.comment != NULL) free (info.comment);
+  
+  return 1;
+}
+
+/* end of id3_extractor.c */

Copied: Extractor/src/plugins/old/id3v2_extractor.c (from rev 23239, 
Extractor/src/plugins/id3v2_extractor.c)
===================================================================
--- Extractor/src/plugins/old/id3v2_extractor.c                         (rev 0)
+++ Extractor/src/plugins/old/id3v2_extractor.c 2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,753 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2006, 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"
+#ifndef MINGW
+#include <sys/mman.h>
+#endif
+#include "convert.h"
+
+#include "extractor_plugins.h"
+
+#define DEBUG_EXTRACT_ID3v2 0
+
+enum Id3v2Fmt
+  {
+    T, /* simple, 0-terminated string, prefixed by encoding */
+    U, /* 0-terminated ASCII string, no encoding */
+    UL, /* unsync'ed lyrics */
+    SL, /* sync'ed lyrics */
+    L, /* string with language prefix */
+    I /* image */
+  };
+
+typedef struct
+{
+  const char *text;
+  enum EXTRACTOR_MetaType type;
+  enum Id3v2Fmt fmt;
+} Matches;
+
+static Matches tmap[] = {
+  /* skipping UFI */
+  {"TT1 ", EXTRACTOR_METATYPE_SECTION, T},
+  {"TT2 ", EXTRACTOR_METATYPE_TITLE, T},
+  {"TT3 ", EXTRACTOR_METATYPE_SONG_VERSION, T},
+  {"TP1 ", EXTRACTOR_METATYPE_ARTIST, T},
+  {"TP2 ", EXTRACTOR_METATYPE_PERFORMER, T},
+  {"TP3 ", EXTRACTOR_METATYPE_CONDUCTOR, T},
+  {"TP4 ", EXTRACTOR_METATYPE_INTERPRETATION, T},
+  {"TCM ", EXTRACTOR_METATYPE_COMPOSER, T},
+  {"TXT ", EXTRACTOR_METATYPE_WRITER, T},
+  {"TLA ", EXTRACTOR_METATYPE_LANGUAGE, T},
+  {"TCO ", EXTRACTOR_METATYPE_GENRE, T},
+  {"TAL ", EXTRACTOR_METATYPE_ALBUM, T},
+  {"TPA ", EXTRACTOR_METATYPE_DISC_NUMBER, T},
+  {"TRK ", EXTRACTOR_METATYPE_TRACK_NUMBER, T},
+  {"TRC ", EXTRACTOR_METATYPE_ISRC, T},
+  {"TYE ", EXTRACTOR_METATYPE_PUBLICATION_YEAR, T},
+  /*
+    FIXME: these two and TYE should be combined into
+    the actual publication date (if TRD is missing)
+  {"TDA ", EXTRACTOR_METATYPE_PUBLICATION_DATE},
+  {"TIM ", EXTRACTOR_METATYPE_PUBLICATION_DATE},
+  */
+  {"TRD ", EXTRACTOR_METATYPE_CREATION_TIME, T},
+  {"TMT ", EXTRACTOR_METATYPE_SOURCE, T},
+  {"TFT ", EXTRACTOR_METATYPE_FORMAT_VERSION, T},
+  {"TBP ", EXTRACTOR_METATYPE_BEATS_PER_MINUTE, T},
+  {"TCR ", EXTRACTOR_METATYPE_COPYRIGHT, T},
+  {"TPB ", EXTRACTOR_METATYPE_PUBLISHER, T},
+  {"TEN ", EXTRACTOR_METATYPE_ENCODED_BY, T},
+  {"TSS ", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE, T},
+  {"TOF ", EXTRACTOR_METATYPE_FILENAME, T},
+  {"TLE ", EXTRACTOR_METATYPE_DURATION, T}, /* FIXME: should append 'ms' as 
unit */
+  {"TSI ", EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE, T},
+  /* skipping TDY, TKE */
+  {"TOT ", EXTRACTOR_METATYPE_ORIGINAL_TITLE, T},
+  {"TOA ", EXTRACTOR_METATYPE_ORIGINAL_ARTIST, T},
+  {"TOL ", EXTRACTOR_METATYPE_ORIGINAL_WRITER, T},
+  {"TOR ", EXTRACTOR_METATYPE_ORIGINAL_RELEASE_YEAR, T},
+  /* skipping TXX */
+
+  {"WAF ", EXTRACTOR_METATYPE_URL, U},
+  {"WAR ", EXTRACTOR_METATYPE_URL, U},
+  {"WAS ", EXTRACTOR_METATYPE_URL, U},
+  {"WCM ", EXTRACTOR_METATYPE_URL, U},
+  {"WCP ", EXTRACTOR_METATYPE_RIGHTS, U},
+  {"WCB ", EXTRACTOR_METATYPE_URL, U},
+  /* skipping WXX */
+  {"IPL ", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME, T},
+  /* skipping MCI */
+  /* skipping ETC */
+  /* skipping MLL */
+  /* skipping STC */
+  {"ULT ", EXTRACTOR_METATYPE_LYRICS, UL},
+  {"SLT ", EXTRACTOR_METATYPE_LYRICS, SL},
+  {"COM ", EXTRACTOR_METATYPE_COMMENT, L},
+  /* skipping RVA */
+  /* skipping EQU */
+  /* skipping REV */
+  {"PIC ", EXTRACTOR_METATYPE_PICTURE, I},
+  /* skipping GEN */
+  /* {"CNT ", EXTRACTOR_METATYPE_PLAY_COUNTER, XXX}, */
+  /* {"POP ", EXTRACTOR_METATYPE_POPULARITY_METER, XXX}, */
+  /* skipping BUF */
+  /* skipping CRM */
+  /* skipping CRA */
+  /* {"LNK ", EXTRACTOR_METATYPE_URL, XXX}, */
+
+
+  {"TALB", EXTRACTOR_METATYPE_ALBUM, T},
+  {"TBPM", EXTRACTOR_METATYPE_BEATS_PER_MINUTE, T},
+  {"TCOM", EXTRACTOR_METATYPE_COMPOSER, T},
+  {"TCON", EXTRACTOR_METATYPE_SONG_VERSION, T},
+  {"TCOP", EXTRACTOR_METATYPE_COPYRIGHT, T},
+  {"TDAT", EXTRACTOR_METATYPE_CREATION_DATE, T}, /* idv23 only */
+  /* TDLY */
+  {"TENC", EXTRACTOR_METATYPE_ENCODED_BY, T},
+  {"TEXT", EXTRACTOR_METATYPE_WRITER, T},  
+  {"TFLT", EXTRACTOR_METATYPE_FORMAT_VERSION, T},
+  /* TIME, idv23 only */
+  {"TIT1", EXTRACTOR_METATYPE_SECTION, T},
+  {"TIT2", EXTRACTOR_METATYPE_TITLE, T},
+  {"TIT3", EXTRACTOR_METATYPE_SONG_VERSION, T},
+  /* TKEY */
+  {"TLAN", EXTRACTOR_METATYPE_LANGUAGE, T},
+  {"TLEN", EXTRACTOR_METATYPE_DURATION, T}, /* FIXME: should append 'ms' as 
unit */
+  {"TMED", EXTRACTOR_METATYPE_SOURCE, T}, 
+  {"TOAL", EXTRACTOR_METATYPE_ORIGINAL_TITLE, T},
+  {"TOFN", EXTRACTOR_METATYPE_ORIGINAL_ARTIST, T},
+  {"TOLY", EXTRACTOR_METATYPE_ORIGINAL_WRITER, T},
+  {"TOPE", EXTRACTOR_METATYPE_ORIGINAL_PERFORMER, T},
+  {"TORY", EXTRACTOR_METATYPE_ORIGINAL_RELEASE_YEAR, T}, /* idv23 only */
+  {"TOWN", EXTRACTOR_METATYPE_LICENSEE, T},
+  {"TPE1", EXTRACTOR_METATYPE_ARTIST, T},
+  {"TPE2", EXTRACTOR_METATYPE_PERFORMER, T},
+  {"TPE3", EXTRACTOR_METATYPE_CONDUCTOR, T},
+  {"TPE4", EXTRACTOR_METATYPE_INTERPRETATION, T}, 
+  {"TPOS", EXTRACTOR_METATYPE_DISC_NUMBER, T},
+  {"TPUB", EXTRACTOR_METATYPE_PUBLISHER, T},
+  {"TRCK", EXTRACTOR_METATYPE_TRACK_NUMBER, T},
+  /* TRDA, idv23 only */
+  {"TRSN", EXTRACTOR_METATYPE_NETWORK_NAME, T},
+  /* TRSO */
+  {"TSIZ", EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE, T}, /* idv23 only */
+  {"TSRC", EXTRACTOR_METATYPE_ISRC, T},
+  /* TSSE */
+  {"TYER", EXTRACTOR_METATYPE_PUBLICATION_YEAR, T}, /* idv23 only */
+  {"WCOM", EXTRACTOR_METATYPE_URL, U},
+  {"WCOP", EXTRACTOR_METATYPE_URL, U},
+  {"WOAF", EXTRACTOR_METATYPE_URL, U},
+  {"WOAS", EXTRACTOR_METATYPE_URL, U},
+  {"WORS", EXTRACTOR_METATYPE_URL, U},
+  {"WPAY", EXTRACTOR_METATYPE_URL, U},
+  {"WPUB", EXTRACTOR_METATYPE_URL, U},
+  {"WXXX", EXTRACTOR_METATYPE_URL, T},
+  {"IPLS", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME, T}, /* idv23 only */
+  /* ... */
+  {"USLT", EXTRACTOR_METATYPE_LYRICS, UL },
+  {"SYLT", EXTRACTOR_METATYPE_LYRICS, SL },
+  {"COMM", EXTRACTOR_METATYPE_COMMENT, L},
+  /* ... */
+  {"APIC", EXTRACTOR_METATYPE_PICTURE, I},
+  /* ... */
+  {"LINK", EXTRACTOR_METATYPE_URL, U},
+  /* ... */
+  {"USER", EXTRACTOR_METATYPE_LICENSE, T},
+  /* ... */
+
+  /* new frames in id3v24 */
+  /* ASPI, EQU2, RVA2, SEEK, SIGN, TDEN */
+  {"TDOR", EXTRACTOR_METATYPE_PUBLICATION_DATE, T},
+  /* TDRC, TDRL, TDTG */
+  {"TIPL", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME, T},
+  {"TMCL", EXTRACTOR_METATYPE_MUSICIAN_CREDITS_LIST, T},
+  {"TMOO", EXTRACTOR_METATYPE_MOOD, T},
+  {"TPRO", EXTRACTOR_METATYPE_COPYRIGHT, T},
+  {"TSOA", EXTRACTOR_METATYPE_ALBUM, T},
+  {"TSOP", EXTRACTOR_METATYPE_PERFORMER, T},
+  {"TSOT", EXTRACTOR_METATYPE_TITLE, T},
+  {"TSST", EXTRACTOR_METATYPE_SUBTITLE, T},
+
+  {NULL, 0, T},
+};
+
+struct id3v2_state
+{
+  int state;
+  unsigned int tsize;
+  size_t csize;
+  char id[4];
+  int32_t ti;
+  char ver;
+  char extended_header;
+  uint16_t frame_flags;
+  char *mime;
+};
+
+enum ID3v2State
+{
+  ID3V2_INVALID = -1,
+  ID3V2_READING_HEADER = 0,
+  ID3V2_READING_FRAME_HEADER,
+  ID3V23_READING_EXTENDED_HEADER,
+  ID3V24_READING_EXTENDED_HEADER,
+  ID3V2_READING_FRAME
+};
+
+struct id3v2_state *
+EXTRACTOR_id3v2_init_state_method ()
+{
+  struct id3v2_state *state;
+  state = malloc (sizeof (struct id3v2_state));
+  if (state == NULL)
+    return NULL;
+  memset (state, 0, sizeof (struct id3v2_state));
+  state->state = ID3V2_READING_HEADER;
+  state->ti = -1;
+  state->mime = NULL;
+  return state;
+}
+
+static int
+EXTRACTOR_id3v2_discard_state_method (struct id3v2_state *state)
+{
+  if (state != NULL)
+  {
+    if (state->mime != NULL)
+      free (state->mime);
+    free (state);
+  }
+  return 1;
+}
+
+static int
+find_type (const char *id, size_t len)
+{
+  int i;
+  for (i = 0; tmap[i].text != NULL; i++)
+    if (0 == strncmp (tmap[i].text, id, len))
+      return i;
+  return -1;
+}
+
+int
+EXTRACTOR_id3v2_extract_method (struct EXTRACTOR_PluginList *plugin,
+    EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
+{
+  int64_t offset = 0;
+  struct id3v2_state *state;
+  unsigned char *data;
+  char *word = NULL;
+  unsigned int off;
+  enum EXTRACTOR_MetaType type;
+  unsigned char picture_type;
+
+  if (plugin == NULL)
+    return 1;
+
+  state = EXTRACTOR_id3v2_init_state_method ();
+  if (state == NULL)
+    return 1;
+
+  while (1)
+  {
+    switch (state->state)
+    {
+    case ID3V2_INVALID:
+      plugin->seek_request = -1;
+      return EXTRACTOR_id3v2_discard_state_method (state);
+    case ID3V2_READING_HEADER:
+      /* TODO: support id3v24 tags at the end of file. Here's a quote from id3 
faq:
+       * Q: Where is an ID3v2 tag located in an MP3 file?
+       * A: It is most likely located at the beginning of the file. Look for 
the
+       *    marker "ID3" in the first 3 bytes of the file. If it's not there, 
it
+       *    could be at the end of the file (if the tag is ID3v2.4). Look for 
the
+       *    marker "3DI" 10 bytes from the end of the file, or 10 bytes before 
the
+       *    beginning of an ID3v1 tag. Finally it is possible to embed ID3v2 
tags
+       *    in the actual MPEG stream, on an MPEG frame boundry. Almost nobody 
does
+       *    this.
+       * Parsing of such tags will not be completely correct, because we can't
+       * seek backwards. (OK, now we CAN seek backwards, but we still need to 
mind the
+       * chunk size). We will have to seek to file_size - chunk_size instead
+       * (by the way, chunk size is theoretically unknown, LE is free to use 
any chunk
+       * size, even though plugins often make assumptions about chunk size 
being large
+       * enough to make one atomic read without seeking, if offset == 0) and 
search
+       * for id3v1 at -128 offset, then look if there's a 3DI marker 10 bytes 
before
+       *  it (or 10 bytes before the end of file, if id3v1 is not there; not 
sure
+       * about APETAGs; we should probably just scan byte-by-byte from the end 
of file,
+       * until we hit 3DI, or reach the offset == 0), and use it set offset to 
the
+       * start of ID3v24 header, adjust the following file_position check and 
data
+       * indices (use offset), and otherwise proceed as normal (maybe file 
size checks
+       * along the way will have to be adjusted by -1, or made ">" instead of 
">=";
+       * these problems do not arise for tags at the beginning of the file, 
since
+       * audio itself is usually at least 1-byte long; when the tag is at the 
end of
+       * file, these checks will have to be 100% correct).
+       * If there are two tags (at the beginning and at the end of the file),
+       * a SEEK in the one at the beginning of the file can be used to seek to 
the
+       * one at the end.
+       */
+      /* TODO: merge id3v1 and id3v2 parsers. There's an "update" flag in 
id3v2 that
+       * tells the parser to augument id3v1 values with the values from id3v2 
(if this
+       * flag is not set, id3v2 parser must discard id3v1 data).
+       * At the moment id3v1 and id3v2 are parsed separately, and update flag 
is ignored.
+       */
+      if (10 != pl_read (plugin, &data, 10))
+      {
+        state->state = ID3V2_INVALID;
+        break;
+      }
+      if ((data[0] != 0x49) || (data[1] != 0x44) || (data[2] != 0x33) || 
((data[3] != 0x02) && (data[3] != 0x03) && (data[3] != 0x04))/* || (data[4] != 
0x00) minor verisons are backward-compatible*/)
+      {
+        state->state = ID3V2_INVALID;
+        break;
+      }
+      state->ver = data[3];
+      if (state->ver == 0x02)
+      {
+        state->extended_header = 0;
+      }
+      else if ((state->ver == 0x03) || (state->ver == 0x04))
+      {
+        if ((data[5] & 0x80) > 0)
+        {
+          /* unsync is not supported in id3v23 or id3v24*/
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        state->extended_header = (data[5] & 0x40) > 0;
+        if ((data[5] & 0x20) > 0)
+        {
+          /* experimental is not supported in id3v23 or id3v24*/
+          state->state = ID3V2_INVALID;
+          break;
+        }
+      }
+      state->tsize = (((data[6] & 0x7F) << 21) | ((data[7] & 0x7F) << 14) | 
((data[8] & 0x7F) << 07) | ((data[9] & 0x7F) << 00));
+      if (state->ver == 0x03 && state->extended_header)
+        state->state = ID3V23_READING_EXTENDED_HEADER;
+      else if (state->ver == 0x04 && state->extended_header)
+        state->state = ID3V24_READING_EXTENDED_HEADER;
+      else
+        state->state = ID3V2_READING_FRAME_HEADER;
+      break;
+    case ID3V23_READING_EXTENDED_HEADER:
+      if (10 != pl_read (plugin, &data, 10))
+      {
+        state->state = ID3V2_INVALID;
+        break;
+      }
+      if (state->ver == 0x03 && state->extended_header)
+      {
+        uint32_t extended_header_size;
+        extended_header_size = (((data[0]) << 24) | ((data[1]) << 16) | 
((data[2]) << 8) | ((data[3]) << 0));
+        // padding = (((data[6]) << 24) | ((data[7]) << 16) | ((data[8]) << 8) 
| ((data[9]) << 0));
+        if (extended_header_size - 6 != pl_read (plugin, &data, 
extended_header_size - 6))
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+      }
+      break;
+    case ID3V24_READING_EXTENDED_HEADER:
+      if (4 != pl_read (plugin, &data, 4))
+      {
+        state->state = ID3V2_INVALID;
+        break;
+      }
+      if ((state->ver == 0x04) && (state->extended_header))
+      {
+       uint32_t extended_header_size;
+
+        extended_header_size = (((data[0]) << 24) | 
+                               ((data[1]) << 16) | 
+                               ((data[2]) << 8) | 
+                               ((data[3]) << 0));
+        if (extended_header_size != pl_read (plugin, &data, 
extended_header_size))
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+      }
+      break;
+    case ID3V2_READING_FRAME_HEADER:
+      if (state->ver == 0x02)
+      {
+        if (6 != pl_read (plugin, &data, 6))
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+      }
+      else if ((state->ver == 0x03) || (state->ver == 0x04))
+      {
+        if (10 != pl_read (plugin, &data, 10))
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+      }
+      if (state->ver == 0x02)
+      {
+        memcpy (state->id, &data[0], 3);
+        state->csize = (data[3] << 16) + (data[4] << 8) + data[5];
+        if (state->csize == 0)
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        state->frame_flags = 0;
+      }
+      else if ((state->ver == 0x03) || (state->ver == 0x04))
+      {
+        memcpy (state->id, &data[0], 4);
+        if (state->ver == 0x03)
+          state->csize = (data[4] << 24) + (data[5] << 16) + (data[6] << 8) + 
data[7];
+        else if (state->ver == 0x04)
+          state->csize = ((data[4] & 0x7F) << 21) | ((data[5] & 0x7F) << 14) | 
((data[6] & 0x7F) << 07) | ((data[7] & 0x7F) << 00);
+        if (state->csize == 0)
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        state->frame_flags = (data[8] << 8) + data[9];
+        if (state->ver == 0x03)
+        {
+          if (((state->frame_flags & 0x80) > 0) /* compressed, not yet 
supported */ ||
+              ((state->frame_flags & 0x40) > 0) /* encrypted, not supported */)
+          {
+            /* Skip to next frame header */
+            if (state->csize != pl_read (plugin, &data, state->csize))
+              state->state = ID3V2_INVALID;
+            break;
+          }
+        }
+        else if (state->ver == 0x04)
+        {
+          if (((state->frame_flags & 0x08) > 0) /* compressed, not yet 
supported */ ||
+              ((state->frame_flags & 0x04) > 0) /* encrypted, not supported */ 
||
+              ((state->frame_flags & 0x02) > 0) /* unsynchronization, not 
supported */)
+          {
+            /* Skip to next frame header */
+            if (state->csize != pl_read (plugin, &data, state->csize))
+              state->state = ID3V2_INVALID;
+            break;
+          }
+          if ((state->frame_flags & 0x01) > 0)
+          {
+            /* Skip data length indicator */
+            state->csize -= 4;
+            if (4 != pl_read (plugin, &data, 4))
+            {
+              state->state = ID3V2_INVALID;
+              break;
+            }
+          }
+        }
+      }
+
+      state->ti = find_type ((const char *) state->id, (state->ver == 0x02) ? 
3 : (((state->ver == 0x03) || (state->ver == 0x04)) ? 4 : 0));
+      if (state->ti == -1)
+      {
+        if (state->csize != pl_read (plugin, &data, state->csize))
+          state->state = ID3V2_INVALID;
+        break;
+      }
+      state->state = ID3V2_READING_FRAME;
+      break;
+    case ID3V2_READING_FRAME:
+      if (0 > (offset = pl_get_pos (plugin)))
+      {
+        state->state = ID3V2_INVALID;
+        break;
+      }
+      word = NULL;
+      if (((state->ver == 0x03) && ((state->frame_flags & 0x20) > 0)) ||
+          ((state->ver == 0x04) && ((state->frame_flags & 0x40) > 0)))
+      {
+        /* "group" identifier, skip a byte */
+        if (1 != pl_read (plugin, &data, 1))
+        {
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        state->csize--;
+      }
+      if (state->csize != pl_read (plugin, &data, state->csize))
+      {
+        state->state = ID3V2_INVALID;
+        break;
+      }
+      switch (tmap[state->ti].fmt)
+      {
+      case T:
+        if (data[0] == 0x00)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
+              state->csize - 1, "ISO-8859-1");
+        else if (data[0] == 0x01)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
+              state->csize - 1, "UCS-2");
+        else if ((state->ver == 0x04) && (data[0] == 0x02))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
+              state->csize - 1, "UTF-16BE");
+        else if ((state->ver == 0x04) && (data[0] == 0x03))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
+              state->csize - 1, "UTF-8");
+        else
+          /* bad encoding byte, try to convert from iso-8859-1 */
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[1],
+              state->csize - 1, "ISO-8859-1");
+        break;
+      case U:
+        word = EXTRACTOR_common_convert_to_utf8 ((const char *) data,
+            state->csize, "ISO-8859-1");
+        break;
+      case UL:
+        if (state->csize < 6)
+        {
+          /* malformed */
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        /* find end of description */
+        off = 4;
+        while ((off < state->csize) && (data[off] != '\0'))
+          off++;
+        if ((off >= state->csize) || (data[off] != '\0'))
+        {
+          /* malformed */
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        off++;
+        if (data[0] == 0x00)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "ISO-8859-1");
+        else if (data[0] == 0x01)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "UCS-2");
+        else if ((state->ver == 0x04) && (data[0] == 0x02))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "UTF-16BE");
+        else if ((state->ver == 0x04) && (data[0] == 0x03))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "UTF-8");
+        else
+          /* bad encoding byte, try to convert from iso-8859-1 */
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "ISO-8859-1");
+        break;
+      case SL:
+        if (state->csize < 7)
+        {
+          /* malformed */
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        if (data[0] == 0x00)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
+              state->csize - 6, "ISO-8859-1");
+        else if (data[0] == 0x01)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
+              state->csize - 6, "UCS-2");
+        else if ((state->ver == 0x04) && (data[0] == 0x02))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
+              state->csize - 6, "UTF-16BE");
+        else if ((state->ver == 0x04) && (data[0] == 0x03))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
+              state->csize - 6, "UTF-8");
+        else
+          /* bad encoding byte, try to convert from iso-8859-1 */
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[6],
+              state->csize - 6, "ISO-8859-1");
+        break;
+      case L:
+        if (state->csize < 5)
+        {
+          /* malformed */
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        /* find end of description */
+        off = 4;
+        while ((off < state->csize) && (data[off] != '\0'))
+          off++;
+        if ((off >= state->csize) || (data[off] != '\0'))
+        {
+          /* malformed */
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        off++;
+
+        if (data[0] == 0x00)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "ISO-8859-1");
+        else if (data[0] == 0x01)
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "UCS-2");
+        else if ((state->ver == 0x04) && (data[0] == 0x02))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "UTF-1offBE");
+        else if ((state->ver == 0x04) && (data[0] == 0x03))
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "UTF-8");
+        else
+          /* bad encoding byte, try to convert from iso-8859-1 */
+          word = EXTRACTOR_common_convert_to_utf8 ((const char *) &data[off],
+              state->csize - off, "ISO-8859-1");
+        break;
+      case I:
+        if ( ( (state->ver == 0x02) && 
+              (state->csize < 7) ) ||
+            ( ( (state->ver == 0x03) || 
+                (state->ver == 0x04)) && (state->csize < 5)) )
+        {
+          /* malformed */
+          state->state = ID3V2_INVALID;
+          break;
+        }
+        if (state->mime != NULL)
+          free (state->mime);
+        state->mime = NULL;
+        if (state->ver == 0x02)
+        {
+          off = 5;
+          picture_type = data[4];
+        }
+        else if ((state->ver == 0x03) || (state->ver == 0x04))
+        {
+          off = 1;
+          while ((off < state->csize) && (data[off] != '\0'))
+            off++;
+          if ((off >= state->csize) || (data[off] != '\0'))
+          {
+            /* malformed */
+            state->state = ID3V2_INVALID;
+            break;
+          }
+          state->mime = malloc (off);
+          memcpy (state->mime, &data[1], off - 1);
+          state->mime[off - 1] = '\0';
+          off += 1;
+          picture_type = data[off];
+          off += 1;
+          /* find end of mime type*/
+          while ((off < state->csize) && (data[off] != '\0'))
+            off++;
+          if ((off >= state->csize) || (data[off] != '\0'))
+          {
+            free (state->mime);
+            state->mime = NULL;
+            /* malformed */
+            state->state = ID3V2_INVALID;
+            break;
+          }
+          off++;
+        }
+        switch (picture_type)
+        {
+        case 0x03:
+        case 0x04:
+          type = EXTRACTOR_METATYPE_COVER_PICTURE;
+          break;
+        case 0x07:
+        case 0x08:
+        case 0x09:
+        case 0x0A:
+        case 0x0B:
+        case 0x0C:
+          type = EXTRACTOR_METATYPE_CONTRIBUTOR_PICTURE;
+          break;
+        case 0x0D:
+        case 0x0E:
+        case 0x0F:
+          type = EXTRACTOR_METATYPE_EVENT_PICTURE;
+          break;
+        case 0x14:
+          type = EXTRACTOR_METATYPE_LOGO;
+          type = EXTRACTOR_METATYPE_LOGO;
+          break;
+        default:
+          type = EXTRACTOR_METATYPE_PICTURE;
+          break;
+        }
+        if (state->ver == 0x02)
+        {
+          if (0 == strncasecmp ("PNG", (const char *) &data[1], 3))
+            state->mime = strdup ("image/png");
+          else if (0 == strncasecmp ("JPG", (const char *) &data[1], 3))
+            state->mime = strdup ("image/jpeg");
+          else
+            state->mime = NULL;
+        }
+        else if (((state->ver == 0x03) || (state->ver == 0x04)) && (strchr 
(state->mime, '/') == NULL))
+        {
+          size_t mime_len = strlen (state->mime);
+          char *type_mime = malloc (mime_len + 6 + 1);
+          snprintf (type_mime, mime_len + 6 + 1, "image/%s", state->mime);
+          free (state->mime);
+          state->mime = type_mime;
+        }
+        if ((state->mime != NULL) && (0 == strcmp (state->mime, "-->")))
+        {
+          /* not supported */
+          free (state->mime);
+          state->mime = NULL;
+        }
+        else
+        {
+          if (0 != proc (proc_cls, "id3v2", type, EXTRACTOR_METAFORMAT_BINARY, 
state->mime, (const char*) &data[off], state->csize - off))
+          {
+            if (state->mime != NULL)
+              free (state->mime);
+            state->mime = NULL;
+            return 1;
+          }
+          if (state->mime != NULL)
+            free (state->mime);
+          state->mime = NULL;
+        }
+        word = NULL;
+        break;
+      default:
+        return 1;
+      }
+      if ((word != NULL) && (strlen (word) > 0))
+      {
+        if (0 != proc (proc_cls, "id3v2", tmap[state->ti].type, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", word, strlen (word) + 1))
+        {
+          free (word);
+          return 1;
+        }
+      }
+      if (word != NULL)
+        free (word);
+      state->state = ID3V2_READING_FRAME_HEADER;
+    break;
+    }
+  }
+  return 1;
+}
+
+/* end of id3v2_extractor.c */

Copied: Extractor/src/plugins/old/man_extractor.c (from rev 23239, 
Extractor/src/plugins/man_extractor.c)
===================================================================
--- Extractor/src/plugins/old/man_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/man_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,232 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 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.
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include <ctype.h>
+
+static char *
+stndup (const char *str, size_t n)
+{
+  char *tmp;
+  tmp = malloc (n + 1);
+  if (tmp == NULL)
+    return NULL;
+  tmp[n] = '\0';
+  memcpy (tmp, str, n);
+  return tmp;
+}
+
+static int
+addKeyword (enum EXTRACTOR_MetaType type,
+            char *keyword, 
+           EXTRACTOR_MetaDataProcessor proc,
+           void *proc_cls)
+{
+  int ret;
+  if (keyword == NULL)
+    return 0;
+  if (strlen (keyword) == 0)
+    {
+      free (keyword);
+      return 0;
+    }
+  if ((keyword[0] == '\"') && (keyword[strlen (keyword) - 1] == '\"'))
+    {
+      char *tmp;
+
+      keyword[strlen (keyword) - 1] = '\0';
+      tmp = strdup (&keyword[1]);
+      free (keyword);
+      if (tmp == NULL)
+       return 0;
+      keyword = tmp;
+    }
+  if (strlen (keyword) == 0)
+    {
+      free (keyword);
+      return 0;
+    }
+  ret = proc (proc_cls, 
+             "man",
+             type,
+             EXTRACTOR_METAFORMAT_UTF8,
+             "text/plain",
+             keyword,
+             strlen (keyword)+1);
+  free (keyword);
+  return ret;
+}
+
+static void
+NEXT (size_t * end, const char *buf, const size_t size)
+{
+  int quot;
+
+  quot = 0;
+  while ((*end < size) && (((quot & 1) != 0) || ((buf[*end] != ' '))))
+    {
+      if (buf[*end] == '\"')
+        quot++;
+      (*end)++;
+    }
+  if ((quot & 1) == 1)
+    (*end) = size + 1;
+}
+
+/**
+ * How many bytes do we actually try to scan? (from the beginning
+ * of the file).
+ */
+#define MAX_READ (16 * 1024)
+
+#define ADD(t,s) do { if (0 != addKeyword (t, s, proc, proc_cls)) return 1; } 
while (0)
+
+int 
+EXTRACTOR_man_extract (const char *buf,
+                      size_t size,
+                      EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls,
+                      const char *options)
+{
+  int pos;
+  size_t xsize;
+  const size_t xlen = strlen (".TH ");
+
+  if (size > MAX_READ)
+    size = MAX_READ;
+  pos = 0;
+  if (size < xlen)
+    return 0;
+  while ((pos < size - xlen) &&
+         ((0 != strncmp (".TH ",
+                         &buf[pos],
+                         xlen)) || ((pos != 0) && (buf[pos - 1] != '\n'))))
+    {
+      if (!isgraph ((unsigned char) buf[pos]) && 
+         !isspace ((unsigned char) buf[pos]))
+        return 0;
+      pos++;
+    }
+  xsize = pos;
+  while ((xsize < size) && (buf[xsize] != '\n'))
+    xsize++;
+  size = xsize;
+
+  if (0 == strncmp (".TH ", &buf[pos], xlen))
+    {
+      size_t end;
+
+      pos += xlen;
+      end = pos;
+      NEXT (&end, buf, size);
+      if (end > size)
+        return 0;
+      if (end - pos > 0)
+        {
+          ADD (EXTRACTOR_METATYPE_TITLE, stndup (&buf[pos], end - pos));
+          pos = end + 1;
+        }
+      if (pos >= size)
+        return 0;
+      end = pos;
+      NEXT (&end, buf, size);
+      if (end > size)
+        return 0;
+      if (buf[pos] == '\"')
+        pos++;
+      if ((end - pos >= 1) && (end - pos <= 4))
+        {
+          switch (buf[pos])
+            {
+            case '1':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                  strdup (_("Commands")));
+              break;
+            case '2':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("System calls")));
+              break;
+            case '3':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("Library calls")));
+              break;
+            case '4':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("Special files")));
+              break;
+            case '5':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("File formats and conventions")));
+              break;
+            case '6':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("Games")));
+              break;
+            case '7':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("Conventions and miscellaneous")));
+              break;
+            case '8':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("System management commands")));
+              break;
+            case '9':
+              ADD (EXTRACTOR_METATYPE_SECTION,
+                                 strdup (_("Kernel routines")));
+              break;
+            }
+          pos = end + 1;
+        }
+      end = pos;
+      NEXT (&end, buf, size);
+      if (end > size)
+        return 0;
+      if (end - pos > 0)
+        {
+          ADD (EXTRACTOR_METATYPE_MODIFICATION_DATE, stndup (&buf[pos], end - 
pos));
+          pos = end + 1;
+        }
+      end = pos;
+      NEXT (&end, buf, size);
+      if (end > size)
+        return 0;
+      if (end - pos > 0)
+        {
+          ADD (EXTRACTOR_METATYPE_SOURCE,
+              stndup (&buf[pos], end - pos));
+          pos = end + 1;
+        }
+      end = pos;
+      NEXT (&end, buf, size);
+      if (end > size)
+        return 0;
+      if (end - pos > 0)
+        {
+          ADD (EXTRACTOR_METATYPE_BOOK_TITLE,
+              stndup (&buf[pos], end - pos));
+          pos = end + 1;
+        }
+    }
+
+  return 0;
+}
+
+/* end of man_extractor.c */

Copied: Extractor/src/plugins/old/mkv_extractor.c (from rev 23239, 
Extractor/src/plugins/mkv_extractor.c)
===================================================================
--- Extractor/src/plugins/old/mkv_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/mkv_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,409 @@
+/*
+     This file is part of libextractor.
+     (C) 2004, 2005, 2006, 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.
+ */
+
+ /*
+  * Made by Gabriel Peixoto
+  * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin.
+  *
+  */
+
+#include "platform.h"
+#include "extractor.h"
+#include <stdint.h>
+
+#define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "mkv", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto EXIT; } while 
(0)
+
+/**
+ * FIXME: document
+ */
+#define BUFFER_SIZE 0x4000
+
+/**
+ * FIXME: document
+ */
+#define MAX_STRING_SIZE 1024
+
+/**
+ * FIXME: document
+ */
+#define MAX_STREAMS 9
+
+/**
+ * FIXME: document
+ */
+enum MKV_TrackType
+{
+  MKV_Track_video = 1,
+  MKV_Track_audio = 2,
+  MKV_Track_subtitle = 3,
+  MKV_Track_subtitle_orig = 0x11
+};
+
+/**
+ * FIXME: document
+ */
+enum
+{
+  MKVID_OutputSamplingFrequency = 0x78B5,
+  MKVID_FILE_BEGIN = 0x1A,
+  MKVID_EBML = 0x1A45DFA3,
+  MKVID_Segment = 0x18538067,
+  MKVID_Info = 0x1549A966,
+  MKVID_Tracks = 0x1654AE6B,
+  MKVID_TrackEntry = 0xAE,
+  MKVID_TrackType = 0x83,
+  MKVID_DefaultDuration = 0x23E383,
+  MKVID_Language = 0x22B59C,
+  MKVID_CodecID = 0x86,
+  MKVID_CodecPrivate = 0x63A2,
+  MKVID_PixelWidth = 0xB0,
+  MKVID_PixelHeight = 0xBA,
+  MKVID_TimeCodeScale = 0x2AD7B1,
+  MKVID_Duration = 0x4489,
+  MKVID_Channels = 0x9F,
+  MKVID_BitDepth = 0x6264,
+  MKVID_SamplingFrequency = 0xB5,
+  MKVID_Title = 0x7BA9,
+  MKVID_Tags = 0x1254C367,
+  MKVID_SeekHead = 0x114D9B74,
+  MKVID_Video = 0xE0,
+  MKVID_Audio = 0xE1,
+  MKVID_CodecName = 0x258688,
+  MKVID_DisplayHeight = 0x54BA,
+  MKVID_DisplayWidth = 0x54B0
+};
+
+
+/**
+ * FIXME: document 'flag', should 'temp'/'result' really be signed?
+ *
+ * @return 0 on error, otherwise number of bytes read from buffer
+ */
+static size_t
+VINTparse (const unsigned char *buffer, size_t start, size_t end,
+           int64_t * result, int flag)
+{
+  static const unsigned char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 
0x2, 0x1 };
+  static const unsigned char imask[8] = { 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 
0x1, 00 };
+  int vint_width;
+  unsigned int c;
+  int64_t temp;
+  unsigned char tempc;
+
+  if (end - start < 2)  
+    return 0;                   /*ops */  
+  
+  vint_width = 0;
+  for (c = 0; c < 8; c++)
+    if (!(buffer[start] & mask[c]))
+      vint_width++;
+    else
+      break;
+  if ( (vint_width >= 8) || (vint_width + start + 1 >= end) )
+    return 0;
+  
+  *result = 0;
+  for (c = 0; c < vint_width; c++)
+  {
+    tempc = buffer[start + vint_width - c];
+    temp = tempc << (c * 8);
+    *result += temp;
+  }
+  if (flag)
+    *result += (buffer[start] & imask[vint_width]) << (vint_width * 8);
+  else
+    *result += (buffer[start]) << (vint_width * 8);
+  return vint_width + 1;
+}
+
+
+/**
+ * FIXME: document arguments, return value...
+ */
+static unsigned int
+elementRead (const unsigned char *buffer, size_t start, size_t end,
+             uint32_t *id, int64_t * size)
+{
+  int64_t tempID;
+  int64_t tempsize;
+  size_t id_offset;
+  size_t size_offset;
+
+  tempID = 0;
+  
+  id_offset = VINTparse (buffer, start, end, &tempID, 0);
+  if (!id_offset)
+    return 0;
+  size_offset = VINTparse (buffer, start + id_offset, end, &tempsize, 1);
+  if (!size_offset)
+    return 0;
+  *id = (uint32_t) tempID;
+  *size = tempsize;
+  return id_offset + size_offset;
+}
+
+
+/**
+ * FIXME: signed or unsigned return value?
+ */
+static int64_t
+getInt (const unsigned char *buffer, size_t start, size_t size)
+{
+  /*return a int [8-64], from buffer, Big Endian*/
+  int64_t result;
+  size_t c;
+
+  result = 0;
+  for (c = 1; c <= size; c++)
+    result += ((uint64_t)buffer[start + c - 1]) << (8 * (size - c));  
+  return result;
+}
+
+static float
+getFloat (const unsigned char *buffer, size_t start, size_t size)
+{
+  unsigned char tmp[4];
+
+  if (size != sizeof (float))
+    return 0.0;
+  if (size == sizeof (float))
+  {
+    tmp[0] = buffer[start + 3];
+    tmp[1] = buffer[start + 2];
+    tmp[2] = buffer[start + 1];
+    tmp[3] = buffer[start];
+    return *((float *) (tmp));
+  }
+  return 0.0;
+}
+
+static const unsigned int MKV_Parse_list[] = { 
+  /*Elements, containing requed information (sub-elements), see enum in mkv.h 
for values */
+  MKVID_Segment,
+  MKVID_Info,
+  MKVID_Video,
+  MKVID_Audio,
+  MKVID_TrackEntry,
+  MKVID_Tracks
+};
+
+static const char stream_type_letters[] = "?vat";      /*[0]-no, 
[1]-video,[2]-audio,[3]-text */
+
+
+/* video/mkv */
+int
+EXTRACTOR_mkv_extract (const unsigned char *data, size_t size,
+                       EXTRACTOR_MetaDataProcessor proc, void *proc_cls,
+                       const char *options)
+{
+  int ret;
+  char buffer[256];
+  size_t p;
+  int c;
+  uint32_t eID;
+  int64_t eSize; /* signed? */
+  unsigned int offs;
+  int64_t timescale = 1000000;
+  float duration = -1.0;
+  enum MKV_TrackType trackType;
+  int have_audio = 0;
+  int have_video = 0;
+  unsigned int value_width = 0;
+  unsigned int value_height = 0;
+  int64_t value;
+  size_t size1;
+  const unsigned char *start;
+  int is_mkv = 0;
+  unsigned int fps = 0;
+  unsigned int bit_depth = 0;
+  const unsigned char *codec = NULL;
+  int codec_strlen = 0;
+
+  if (size > 32 * 1024)
+    size1 = 32 * 1024;
+  else
+    size1 = size;
+  start = memchr (data, MKVID_FILE_BEGIN, size1);
+  if (NULL == start)
+    return 0;
+  p = start - data;
+  
+/*main loop*/
+  ret = 0;
+  do
+  {
+    offs = elementRead (data, p, size, &eID, &eSize);
+    p += offs;
+    if (!offs || p >= size)
+      break;
+    if (MKVID_EBML == eID)
+    {
+      ADD ("video/mkv", EXTRACTOR_METATYPE_MIMETYPE);
+      is_mkv = 1;
+      continue;
+    }
+    if (! is_mkv)
+      return 0;
+    for (c = 0; c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list); c++)
+      if (MKV_Parse_list[c] == eID)      
+        break;      
+    if (c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list))
+      continue;
+
+    if (p + eSize > size)
+      break;
+
+    if ( (eSize == 4) || (eSize == 8) || (eSize == 1) || (eSize == 2))
+      value = getInt (data, p, eSize);
+    
+    switch (eID)
+    {
+    case MKVID_TrackType:      /*detect a stream type (video/audio/text) */
+      trackType = (enum MKV_TrackType) value;
+      switch (trackType)
+      {
+      case MKV_Track_video:
+        have_video = 1;
+        break;
+      case MKV_Track_audio:
+        have_audio = 1;
+        break;
+      case MKV_Track_subtitle:
+        break;       
+      case MKV_Track_subtitle_orig:
+        break;       
+      }
+      break;
+    case MKVID_DefaultDuration:
+      if (value > 0)
+        fps = (unsigned int) (1000000000 / value);
+      else
+        fps = 0;
+      break;
+    case MKVID_Language:
+      snprintf (buffer, 
+               sizeof (buffer),
+               "%.*s",
+               (int) eSize,
+               data + p);
+      ADD (buffer, EXTRACTOR_METATYPE_LANGUAGE);
+      break;
+    case MKVID_CodecName:
+    case MKVID_CodecID:
+      codec = data + p;
+      codec_strlen = eSize;
+      break;
+    case MKVID_CodecPrivate:
+      break;
+    case MKVID_PixelWidth:     /*pasthough *//*bug with aspect differ from 1:1 
*/
+    case MKVID_DisplayWidth:
+      value_width = value;
+      break;
+    case MKVID_PixelHeight:    /*pasthough */
+    case MKVID_DisplayHeight:
+      value_height = value;
+      break;
+    case MKVID_TimeCodeScale:
+      timescale = getInt (data, p, eSize);
+      break;
+    case MKVID_Duration:
+      duration = getFloat (data, p, eSize);
+      break;
+    case MKVID_Channels:
+      /* num_channels = (unsigned int) value; */
+      break;
+    case MKVID_BitDepth:
+      bit_depth = (unsigned int) value;
+      break;
+    case MKVID_OutputSamplingFrequency:
+    case MKVID_SamplingFrequency:
+      /* FIXME: what unit has 'value'? */
+      break;
+    case MKVID_Title:
+      if (eSize > MAX_STRING_SIZE)
+        break;
+      snprintf (buffer,
+               sizeof (buffer),
+               "%.*s", 
+               (int) eSize,
+               (const char*) data + p);
+      ADD (buffer, EXTRACTOR_METATYPE_TITLE);
+      break;
+    default:
+      break;
+    }
+    p += eSize;                 /*skip unknown or uninteresting */
+  }
+  while (1);
+
+  snprintf (buffer,
+           sizeof (buffer),
+           "%u s (%s%s%s)",
+           (unsigned int) (duration / 1e+9 * (float) timescale),
+           (have_audio ? "audio" : ""),
+           ((have_audio && have_video) ? "/" : ""),
+           (have_video ? "video" : ""));
+  if ( (have_audio || have_video) && (duration >= 0.0) )
+    ADD (buffer, EXTRACTOR_METATYPE_DURATION);
+  if ( (value_width != 0) && (value_height != 0) )    
+  {
+    snprintf (buffer,
+             sizeof(buffer),
+             "%ux%u", 
+             value_width, value_height);
+    ADD (buffer, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
+  }
+
+  if (NULL != codec)
+  {
+    if ( (fps != 0) && (bit_depth != 0) )
+      snprintf (buffer,
+               sizeof (buffer),
+               "%.*s (%u fps, %u bit)", 
+               codec_strlen,
+               codec,
+               fps,
+               bit_depth);
+    else if (fps != 0)
+      snprintf (buffer,
+               sizeof (buffer),
+               "%.*s (%u fps)", 
+               codec_strlen,
+               codec,
+               fps);
+    else if (bit_depth != 0)
+      snprintf (buffer,
+               sizeof (buffer),
+               "%.*s (%u bit)", 
+               codec_strlen,
+               codec,
+               bit_depth);
+    else
+      snprintf (buffer,
+               sizeof (buffer),
+               "%.*s",
+               codec_strlen,
+               codec);  
+    ADD (buffer, 
+        EXTRACTOR_METATYPE_FORMAT);    
+  }
+EXIT:
+  return ret;
+}

Copied: Extractor/src/plugins/old/mp3_extractor.c (from rev 23239, 
Extractor/src/plugins/mp3_extractor.c)
===================================================================
--- Extractor/src/plugins/old/mp3_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/mp3_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,393 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2006, 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.
+
+
+     Some of this code is based on AVInfo 1.0 alpha 11
+     (c) George Shuklin, gs]AT[shounen.ru, 2002-2004
+     http://shounen.ru/soft/avinfo/
+
+ */
+
+#define DEBUG_EXTRACT_MP3 0
+
+#include "platform.h"
+#include "extractor.h"
+#include "convert.h"
+#include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "extractor_plugins.h"
+
+#include "le_architecture.h"
+
+#define LARGEST_FRAME_SIZE 8065
+
+enum
+{ MPEG_ERR = 0, MPEG_V1 = 1, MPEG_V2 = 2, MPEG_V25 = 3 };
+
+enum
+{ LAYER_ERR = 0, LAYER_1 = 1, LAYER_2 = 2, LAYER_3 = 3 };
+
+#define MPA_SYNC_MASK          ((unsigned int) 0xFFE00000)
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define MPA_SYNC_MASK_MEM      ((unsigned int) 0xFFE00000)
+#else
+#define MPA_SYNC_MASK_MEM      ((unsigned int) 0x0000E0FF)
+#endif
+#define MPA_LAST_SYNC_BIT_MASK ((unsigned int) 0x00100000)
+#define MPA_VERSION_MASK       ((unsigned int) 0x00080000)
+#define MPA_LAYER_MASK         ((unsigned int) 0x3)
+#define MPA_LAYER_SHIFT        17
+#define MPA_BITRATE_MASK       ((unsigned int) 0xF)
+#define MPA_BITRATE_SHIFT      12
+#define MPA_FREQ_MASK          ((unsigned int) 0x3)
+#define MPA_FREQ_SHIFT         10
+#define MPA_CHMODE_MASK        ((unsigned int) 0x3)
+#define MPA_CHMODE_SHIFT       6
+#define MPA_PADDING_SHIFT      9
+#define MPA_COPYRIGHT_SHIFT    3
+#define MPA_ORIGINAL_SHIFT     2
+
+static const unsigned int bitrate_table[16][6] = {
+  {0,   0,   0,   0,   0,   0},
+  {32,  32,  32,  32,  8,   8},
+  {64,  48,  40,  48,  16,  16},
+  {96,  56,  48,  56,  24,  24},
+  {128, 64,  56,  64,  32,  32},
+  {160, 80,  64,  80,  40,  40},
+  {192, 96,  80,  96,  48,  48},
+  {224, 112, 96,  112, 56,  56},
+  {256, 128, 112, 128, 64,  64},
+  {288, 160, 128, 144, 80,  80},
+  {320, 192, 160, 160, 96,  96},
+  {352, 224, 192, 176, 112, 112},
+  {384, 256, 224, 192, 128, 128},
+  {416, 320, 256, 224, 144, 144},
+  {448, 384, 320, 256, 160, 160},
+  {-1, -1, -1, -1, -1, -1}
+};
+static const int freq_table[4][3] = {
+  {44100, 22050, 11025},
+  {48000, 24000, 12000},
+  {32000, 16000, 8000}
+};
+static const char * const channel_modes[4] = {
+  gettext_noop("stereo"),
+  gettext_noop("joint stereo"),
+  gettext_noop("dual channel"),
+  gettext_noop("mono")
+};
+static const char * const mpeg_versions[3] = {
+  gettext_noop("MPEG-1"),
+  gettext_noop("MPEG-2"),
+  gettext_noop("MPEG-2.5")
+};
+static const char * const layer_names[3] = {
+  gettext_noop("Layer I"),
+  gettext_noop("Layer II"),
+  gettext_noop("Layer III")
+};
+
+
+#define OK         0
+#define SYSERR     1
+#define INVALID_ID3 2
+
+#define ADDR(s,t) do { if (0 != proc (proc_cls, "mp3", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0)
+
+struct mp3_state
+{
+  int state;
+
+  uint32_t header;
+  int sample_rate;
+  char mpeg_ver;
+  char layer;
+  char vbr_flag;
+  int ch;
+  char copyright_flag;
+  char original_flag;
+  int avg_bps;
+  int bitrate;
+
+  int64_t number_of_frames;
+  int64_t number_of_valid_frames;
+};
+
+enum MP3State
+{
+  MP3_LOOKING_FOR_FRAME = 0,
+  MP3_READING_FRAME = 1,
+};
+
+static struct mp3_state *
+EXTRACTOR_mp3_init_state_method ()
+{
+  struct mp3_state *state;
+  state = malloc (sizeof (struct mp3_state));
+  if (state == NULL)
+    return NULL;
+  state->header = 0;
+  state->sample_rate = 0;
+  state->number_of_frames = 0;
+  state->number_of_valid_frames = 0;
+  state->mpeg_ver = 0;
+  state->layer = 0;
+  state->vbr_flag = 0;
+  state->ch = 0;
+  state->copyright_flag = 0;
+  state->original_flag = 0;
+  state->avg_bps = 0;
+  state->bitrate = 0;
+  state->state = 0;
+  return state;
+}
+
+static int
+EXTRACTOR_mp3_discard_state_method (struct mp3_state *state)
+{
+  if (state != NULL)
+  {
+    free (state);
+  }
+  return 1;
+}
+
+static int
+calculate_frame_statistics_and_maybe_report_it (struct EXTRACTOR_PluginList 
*plugin,
+    struct mp3_state *state, EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
+{
+  int length;
+  char format[512];
+
+  if (((double) state->number_of_valid_frames / (double) 
state->number_of_frames) < 0.8 ||
+      state->number_of_valid_frames <= 2)
+    /* Unlikely to be an mp3 file */
+    return 0;
+  ADDR ("audio/mpeg", EXTRACTOR_METATYPE_MIMETYPE);
+  state->avg_bps = state->avg_bps / state->number_of_valid_frames;
+  if (state->sample_rate > 0)
+    length = 1152 * state->number_of_valid_frames / state->sample_rate;
+  else if (state->avg_bps > 0 || state->bitrate > 0)
+    length = plugin->fsize / (state->avg_bps ? state->avg_bps : state->bitrate 
? state->bitrate : 1) / 125;
+  else
+    length = 0;
+
+  ADDR (mpeg_versions[state->mpeg_ver - 1], EXTRACTOR_METATYPE_FORMAT_VERSION);
+  snprintf (format,
+           sizeof (format),
+           "%s %s audio, %d kbps (%s), %d Hz, %s, %s, %s",
+            mpeg_versions[state->mpeg_ver - 1],
+            layer_names[state->layer - 1],
+            state->avg_bps,
+            state->vbr_flag ? _("VBR") : _("CBR"),
+            state->sample_rate,
+            channel_modes[state->ch],
+            state->copyright_flag ? _("copyright") : _("no copyright"),
+            state->original_flag ? _("original") : _("copy") );
+
+  ADDR (format, EXTRACTOR_METATYPE_RESOURCE_TYPE);
+  snprintf (format,
+           sizeof (format), "%dm%02d",
+            length / 60, length % 60);
+  ADDR (format, EXTRACTOR_METATYPE_DURATION);
+  return 0;
+}
+
+int
+EXTRACTOR_mp3_extract_method (struct EXTRACTOR_PluginList *plugin,
+                       EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls)
+{
+  int64_t offset = 0;
+  int64_t round_offset;
+  int64_t read_result;
+  int64_t i;
+  unsigned char *data;
+  struct mp3_state *state;
+
+  int start_anew = 0;
+
+  char mpeg_ver = 0;
+  char layer = 0;
+  int idx_num = 0;
+  int bitrate = 0;              /*used for each frame */
+  int copyright_flag = 0;
+  int original_flag = 0;
+  int sample_rate = 0;
+  int ch = 0;
+  int frame_size;
+
+  if (plugin == NULL)
+    return 1;
+
+  state = EXTRACTOR_mp3_init_state_method ();
+  if (state == NULL)
+    return 1;
+
+  while (1)
+  {
+    switch (state->state)
+    {
+    case MP3_LOOKING_FOR_FRAME:
+      /* Look for a frame header */
+      round_offset = offset = pl_get_pos (plugin);
+      while (1)
+      {
+        pl_seek (plugin, offset, SEEK_SET);
+        read_result = pl_read (plugin, &data, 1024*1024);
+        if (read_result < 4)
+        {
+          calculate_frame_statistics_and_maybe_report_it (plugin, state, proc, 
proc_cls);
+          return EXTRACTOR_mp3_discard_state_method (state);
+        }
+        for (i = 0; i + 3 < read_result; i++)
+          if (((*((uint32_t *) &data[i])) & MPA_SYNC_MASK_MEM) == 
MPA_SYNC_MASK_MEM)
+            break;
+        if (i + 3 >= 1024*1024)
+          offset += read_result - 3;
+        else
+          break;
+        if (offset > round_offset + 31*1024*1024)
+        {
+          if (((state->number_of_valid_frames > 2) && ((double) 
state->number_of_valid_frames / (double) state->number_of_frames) < 0.8))
+          {
+            calculate_frame_statistics_and_maybe_report_it (plugin, state, 
proc, proc_cls);
+          }
+          return EXTRACTOR_mp3_discard_state_method (state);
+        }
+      }
+      pl_seek (plugin, offset + i, SEEK_SET);
+      if (4 != pl_read (plugin, &data, 4))
+      {
+        calculate_frame_statistics_and_maybe_report_it (plugin, state, proc, 
proc_cls);
+        return EXTRACTOR_mp3_discard_state_method (state);
+      }
+      state->header = (data[0] << 24) | (data[1] << 16) |
+               (data[2] << 8) | data[3];
+      if ((state->header & MPA_SYNC_MASK) == MPA_SYNC_MASK)
+      {
+        state->state = MP3_READING_FRAME;
+        break;
+      }
+      break;
+    case MP3_READING_FRAME:
+      state->number_of_frames += 1;
+      start_anew = 0;
+      switch (state->header & (MPA_LAST_SYNC_BIT_MASK | MPA_VERSION_MASK))
+      {
+      case (MPA_LAST_SYNC_BIT_MASK | MPA_VERSION_MASK):
+        mpeg_ver = MPEG_V1;
+        break;
+      case (MPA_LAST_SYNC_BIT_MASK):
+        mpeg_ver = MPEG_V2;
+        break;
+      case 0:
+        mpeg_ver = MPEG_V25;
+        break;
+      case (MPA_VERSION_MASK):
+      default:
+        state->state = MP3_LOOKING_FOR_FRAME;
+        offset += 1;
+        start_anew = 1;
+      }
+      if (start_anew)
+        break;
+      switch (state->header & (MPA_LAYER_MASK << MPA_LAYER_SHIFT))
+      {
+      case (0x1 << MPA_LAYER_SHIFT):
+        layer = LAYER_3;
+        break;
+      case (0x2 << MPA_LAYER_SHIFT):
+        layer = LAYER_2;
+        break;
+      case (0x3 << MPA_LAYER_SHIFT):
+        layer = LAYER_1;
+        break;
+      case 0x0:
+      default:
+        state->state = MP3_LOOKING_FOR_FRAME;
+        offset += 1;
+        start_anew = 1;
+      }
+      if (start_anew)
+        break;
+      if (mpeg_ver < MPEG_V25)
+        idx_num = (mpeg_ver - 1) * 3 + layer - 1;
+      else
+        idx_num = 2 + layer;
+      bitrate = 1000 * bitrate_table[(state->header >> MPA_BITRATE_SHIFT) &
+                                     MPA_BITRATE_MASK][idx_num];
+      if (bitrate < 0)
+      {
+        /*error in header */
+        state->state = MP3_LOOKING_FOR_FRAME;
+        offset += 1;
+        break;
+      }
+      sample_rate = freq_table[(state->header >> MPA_FREQ_SHIFT) &
+                               MPA_FREQ_MASK][mpeg_ver - 1];
+      if (sample_rate <= 0)
+      {
+        /*error in header */
+        state->state = MP3_LOOKING_FOR_FRAME;
+        offset += 1;
+        break;
+      }
+      ch = ((state->header >> MPA_CHMODE_SHIFT) & MPA_CHMODE_MASK);
+      copyright_flag = (state->header >> MPA_COPYRIGHT_SHIFT) & 0x1;
+      original_flag = (state->header >> MPA_ORIGINAL_SHIFT) & 0x1;
+      if (layer == LAYER_1)
+        frame_size = (12 * bitrate / sample_rate + ((state->header >> 
MPA_PADDING_SHIFT) & 0x1)) * 4;
+      else
+        frame_size = 144 * bitrate / sample_rate + ((state->header >> 
MPA_PADDING_SHIFT) & 0x1);
+      if (frame_size < 8)
+      {
+        /*error in header */
+        state->state = MP3_LOOKING_FOR_FRAME;
+        offset += 1;
+        break;
+      }
+
+      /* Only save data from valid frames in the state */
+      state->avg_bps += bitrate / 1000;
+      state->sample_rate = sample_rate;
+      state->mpeg_ver = mpeg_ver;
+      state->layer = layer;
+      state->ch = ch;
+      state->copyright_flag = copyright_flag;
+      state->original_flag = original_flag;
+      state->bitrate = bitrate;
+
+      state->number_of_valid_frames += 1;
+      if (state->avg_bps / state->number_of_valid_frames != bitrate / 1000)
+        state->vbr_flag = 1;
+      pl_seek (plugin, frame_size - 4, SEEK_CUR);
+      state->state = MP3_LOOKING_FOR_FRAME;
+      break;
+    }
+  }
+  return 1;
+}
+
+/* end of mp3_extractor.c */

Copied: Extractor/src/plugins/old/ps_extractor.c (from rev 23239, 
Extractor/src/plugins/ps_extractor.c)
===================================================================
--- Extractor/src/plugins/old/ps_extractor.c                            (rev 0)
+++ Extractor/src/plugins/old/ps_extractor.c    2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,197 @@
+/*
+     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"
+
+
+static char *
+readline (const char *data, size_t size, size_t pos)
+{
+  size_t end;
+  char *res;
+
+  while ((pos < size) &&
+         ((data[pos] == (char) 0x0d) || (data[pos] == (char) 0x0a)))
+    pos++;
+
+  if (pos >= size)
+    return NULL;                /* end of file */
+  end = pos;
+  while ((end < size) &&
+         (data[end] != (char) 0x0d) && (data[end] != (char) 0x0a))
+    end++;
+  res = malloc (end - pos + 1);
+  if (res == NULL)
+    return NULL;
+  memcpy (res, &data[pos], end - pos);
+  res[end - pos] = '\0';
+
+  return res;
+}
+
+
+static int
+testmeta (char *line,
+          const char *match,
+          enum EXTRACTOR_MetaType type, 
+         EXTRACTOR_MetaDataProcessor proc,
+         void *proc_cls)
+{
+  char *key;
+
+  if ( (strncmp (line, match, strlen (match)) == 0) &&
+       (strlen (line) > strlen (match)) )
+    {
+      if ((line[strlen (line) - 1] == ')') && (line[strlen (match)] == '('))
+        {
+          key = &line[strlen (match) + 1];
+          key[strlen (key) - 1] = '\0'; /* remove ")" */
+        }
+      else
+        {
+          key = &line[strlen (match)];
+        }
+      if (0 != proc (proc_cls,
+                    "ps",
+                    type,
+                    EXTRACTOR_METAFORMAT_UTF8,
+                    "text/plain",
+                    key,
+                    strlen (key)+1))
+       return 1;
+    }
+  return 0;
+}
+
+typedef struct
+{
+  const char *prefix;
+  enum EXTRACTOR_MetaType type;
+} Matches;
+
+static Matches tests[] = {
+  {"%%Title: ", EXTRACTOR_METATYPE_TITLE},
+  {"%%Author: ", EXTRACTOR_METATYPE_AUTHOR_NAME},
+  {"%%Version: ", EXTRACTOR_METATYPE_REVISION_NUMBER},
+  {"%%Creator: ", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
+  {"%%CreationDate: ", EXTRACTOR_METATYPE_CREATION_DATE},
+  {"%%Pages: ", EXTRACTOR_METATYPE_PAGE_COUNT},
+  {"%%Orientation: ", EXTRACTOR_METATYPE_PAGE_ORIENTATION},
+  {"%%DocumentPaperSizes: ", EXTRACTOR_METATYPE_PAPER_SIZE},
+  {"%%PageOrder: ", EXTRACTOR_METATYPE_PAGE_ORDER},
+  {"%%LanguageLevel: ", EXTRACTOR_METATYPE_FORMAT_VERSION},
+  {"%%Magnification: ", EXTRACTOR_METATYPE_MAGNIFICATION},
+
+  /* Also widely used but not supported since they
+     probably make no sense:
+     "%%BoundingBox: ",
+     "%%DocumentNeededResources: ",
+     "%%DocumentSuppliedResources: ",
+     "%%DocumentProcSets: ",
+     "%%DocumentData: ", */
+
+  {NULL, 0}
+};
+
+#define PS_HEADER "%!PS-Adobe"
+
+/* mimetype = application/postscript */
+int 
+EXTRACTOR_ps_extract (const char *data,
+                     size_t size,
+                     EXTRACTOR_MetaDataProcessor proc,
+                     void *proc_cls,
+                     const char *options)
+{
+  size_t pos;
+  char *line;
+  int i;
+  int lastLine;
+  int ret;
+
+  pos = strlen (PS_HEADER);
+  if ( (size < pos) ||
+       (0 != strncmp (PS_HEADER,
+                     data,
+                     pos)) )
+    return 0;
+  ret = 0;
+
+  if (0 != proc (proc_cls,
+                "ps",
+                EXTRACTOR_METATYPE_MIMETYPE,
+                EXTRACTOR_METAFORMAT_UTF8,
+                "text/plain",
+                "application/postscript",
+                strlen ("application/postscript")+1))
+    return 1;
+  /* skip rest of first line */
+  while ((pos < size) && (data[pos] != '\n'))
+    pos++;
+
+  lastLine = -1;
+  line = NULL;
+  /* while Windows-PostScript does not seem to (always?) put
+     "%%EndComments", this should allow us to not read through most of
+     the file for all the sane applications... For Windows-generated
+     PS files, we will bail out at the end of the file. */
+  while ( (line == NULL) ||
+         (0 != strncmp ("%%EndComments", line, strlen ("%%EndComments"))) )
+    {
+      if (line != NULL)
+       free (line);
+      line = readline (data, size, pos);
+      if (line == NULL)
+        break;
+      i = 0;
+      while (tests[i].prefix != NULL)
+        {
+          ret = testmeta (line, tests[i].prefix, tests[i].type, proc, 
proc_cls);
+         if (ret != 0)
+           break;
+          i++;
+        }
+      if (ret != 0)
+       break;
+
+      /* %%+ continues previous meta-data type... */
+      if ( (lastLine != -1) && (0 == strncmp (line, "%%+ ", strlen ("%%+ "))))
+        {
+          ret = testmeta (line, "%%+ ", tests[lastLine].type, proc, proc_cls);
+        }
+      else
+        {
+          /* update "previous" type */
+          if (tests[i].prefix == NULL)
+            lastLine = -1;
+          else
+            lastLine = i;
+        }
+      if (pos + strlen (line) + 1 <= pos)
+       break; /* overflow */
+      pos += strlen (line) + 1; /* skip newline, too; guarantee progress! */   
   
+    }
+  if (line != NULL)
+    free (line);
+  return ret;
+}
+
+/* end of ps_extractor.c */

Copied: Extractor/src/plugins/old/qt_extractor.c (from rev 23239, 
Extractor/src/plugins/qt_extractor.c)
===================================================================
--- Extractor/src/plugins/old/qt_extractor.c                            (rev 0)
+++ Extractor/src/plugins/old/qt_extractor.c    2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,1148 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2006 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 <zlib.h>
+#include <math.h>
+
+#define DEBUG 0
+
+/* verbatim from mp3extractor */
+static const char *const genre_names[] = {
+  gettext_noop ("Blues"),
+  gettext_noop ("Classic Rock"),
+  gettext_noop ("Country"),
+  gettext_noop ("Dance"),
+  gettext_noop ("Disco"),
+  gettext_noop ("Funk"),
+  gettext_noop ("Grunge"),
+  gettext_noop ("Hip-Hop"),
+  gettext_noop ("Jazz"),
+  gettext_noop ("Metal"),
+  gettext_noop ("New Age"),
+  gettext_noop ("Oldies"),
+  gettext_noop ("Other"),
+  gettext_noop ("Pop"),
+  gettext_noop ("R&B"),
+  gettext_noop ("Rap"),
+  gettext_noop ("Reggae"),
+  gettext_noop ("Rock"),
+  gettext_noop ("Techno"),
+  gettext_noop ("Industrial"),
+  gettext_noop ("Alternative"),
+  gettext_noop ("Ska"),
+  gettext_noop ("Death Metal"),
+  gettext_noop ("Pranks"),
+  gettext_noop ("Soundtrack"),
+  gettext_noop ("Euro-Techno"),
+  gettext_noop ("Ambient"),
+  gettext_noop ("Trip-Hop"),
+  gettext_noop ("Vocal"),
+  gettext_noop ("Jazz+Funk"),
+  gettext_noop ("Fusion"),
+  gettext_noop ("Trance"),
+  gettext_noop ("Classical"),
+  gettext_noop ("Instrumental"),
+  gettext_noop ("Acid"),
+  gettext_noop ("House"),
+  gettext_noop ("Game"),
+  gettext_noop ("Sound Clip"),
+  gettext_noop ("Gospel"),
+  gettext_noop ("Noise"),
+  gettext_noop ("Alt. Rock"),
+  gettext_noop ("Bass"),
+  gettext_noop ("Soul"),
+  gettext_noop ("Punk"),
+  gettext_noop ("Space"),
+  gettext_noop ("Meditative"),
+  gettext_noop ("Instrumental Pop"),
+  gettext_noop ("Instrumental Rock"),
+  gettext_noop ("Ethnic"),
+  gettext_noop ("Gothic"),
+  gettext_noop ("Darkwave"),
+  gettext_noop ("Techno-Industrial"),
+  gettext_noop ("Electronic"),
+  gettext_noop ("Pop-Folk"),
+  gettext_noop ("Eurodance"),
+  gettext_noop ("Dream"),
+  gettext_noop ("Southern Rock"),
+  gettext_noop ("Comedy"),
+  gettext_noop ("Cult"),
+  gettext_noop ("Gangsta Rap"),
+  gettext_noop ("Top 40"),
+  gettext_noop ("Christian Rap"),
+  gettext_noop ("Pop/Funk"),
+  gettext_noop ("Jungle"),
+  gettext_noop ("Native American"),
+  gettext_noop ("Cabaret"),
+  gettext_noop ("New Wave"),
+  gettext_noop ("Psychedelic"),
+  gettext_noop ("Rave"),
+  gettext_noop ("Showtunes"),
+  gettext_noop ("Trailer"),
+  gettext_noop ("Lo-Fi"),
+  gettext_noop ("Tribal"),
+  gettext_noop ("Acid Punk"),
+  gettext_noop ("Acid Jazz"),
+  gettext_noop ("Polka"),
+  gettext_noop ("Retro"),
+  gettext_noop ("Musical"),
+  gettext_noop ("Rock & Roll"),
+  gettext_noop ("Hard Rock"),
+  gettext_noop ("Folk"),
+  gettext_noop ("Folk/Rock"),
+  gettext_noop ("National Folk"),
+  gettext_noop ("Swing"),
+  gettext_noop ("Fast-Fusion"),
+  gettext_noop ("Bebob"),
+  gettext_noop ("Latin"),
+  gettext_noop ("Revival"),
+  gettext_noop ("Celtic"),
+  gettext_noop ("Bluegrass"),
+  gettext_noop ("Avantgarde"),
+  gettext_noop ("Gothic Rock"),
+  gettext_noop ("Progressive Rock"),
+  gettext_noop ("Psychedelic Rock"),
+  gettext_noop ("Symphonic Rock"),
+  gettext_noop ("Slow Rock"),
+  gettext_noop ("Big Band"),
+  gettext_noop ("Chorus"),
+  gettext_noop ("Easy Listening"),
+  gettext_noop ("Acoustic"),
+  gettext_noop ("Humour"),
+  gettext_noop ("Speech"),
+  gettext_noop ("Chanson"),
+  gettext_noop ("Opera"),
+  gettext_noop ("Chamber Music"),
+  gettext_noop ("Sonata"),
+  gettext_noop ("Symphony"),
+  gettext_noop ("Booty Bass"),
+  gettext_noop ("Primus"),
+  gettext_noop ("Porn Groove"),
+  gettext_noop ("Satire"),
+  gettext_noop ("Slow Jam"),
+  gettext_noop ("Club"),
+  gettext_noop ("Tango"),
+  gettext_noop ("Samba"),
+  gettext_noop ("Folklore"),
+  gettext_noop ("Ballad"),
+  gettext_noop ("Power Ballad"),
+  gettext_noop ("Rhythmic Soul"),
+  gettext_noop ("Freestyle"),
+  gettext_noop ("Duet"),
+  gettext_noop ("Punk Rock"),
+  gettext_noop ("Drum Solo"),
+  gettext_noop ("A Cappella"),
+  gettext_noop ("Euro-House"),
+  gettext_noop ("Dance Hall"),
+  gettext_noop ("Goa"),
+  gettext_noop ("Drum & Bass"),
+  gettext_noop ("Club-House"),
+  gettext_noop ("Hardcore"),
+  gettext_noop ("Terror"),
+  gettext_noop ("Indie"),
+  gettext_noop ("BritPop"),
+  gettext_noop ("Negerpunk"),
+  gettext_noop ("Polsk Punk"),
+  gettext_noop ("Beat"),
+  gettext_noop ("Christian Gangsta Rap"),
+  gettext_noop ("Heavy Metal"),
+  gettext_noop ("Black Metal"),
+  gettext_noop ("Crossover"),
+  gettext_noop ("Contemporary Christian"),
+  gettext_noop ("Christian Rock"),
+  gettext_noop ("Merengue"),
+  gettext_noop ("Salsa"),
+  gettext_noop ("Thrash Metal"),
+  gettext_noop ("Anime"),
+  gettext_noop ("JPop"),
+  gettext_noop ("Synthpop"),
+};
+
+#define GENRE_NAME_COUNT \
+    ((unsigned int)(sizeof genre_names / sizeof (const char *const)))
+
+
+static const char *languages[] = {
+  "English",
+  "French",
+  "German",
+  "Italian",
+  "Dutch",
+  "Swedish",
+  "Spanish",
+  "Danish",
+  "Portuguese",
+  "Norwegian",
+  "Hebrew",
+  "Japanese",
+  "Arabic",
+  "Finnish",
+  "Greek",
+  "Icelandic",
+  "Maltese",
+  "Turkish",
+  "Croatian",
+  "Traditional Chinese",
+  "Urdu",
+  "Hindi",
+  "Thai",
+  "Korean",
+  "Lithuanian",
+  "Polish",
+  "Hungarian",
+  "Estonian",
+  "Lettish",
+  "Saamisk",
+  "Lappish",
+  "Faeroese",
+  "Farsi",
+  "Russian",
+  "Simplified Chinese",
+  "Flemish",
+  "Irish",
+  "Albanian",
+  "Romanian",
+  "Czech",
+  "Slovak",
+  "Slovenian",
+  "Yiddish",
+  "Serbian",
+  "Macedonian",
+  "Bulgarian",
+  "Ukrainian",
+  "Byelorussian",
+  "Uzbek",
+  "Kazakh",
+  "Azerbaijani",
+  "AzerbaijanAr",
+  "Armenian",
+  "Georgian",
+  "Moldavian",
+  "Kirghiz",
+  "Tajiki",
+  "Turkmen",
+  "Mongolian",
+  "MongolianCyr",
+  "Pashto",
+  "Kurdish",
+  "Kashmiri",
+  "Sindhi",
+  "Tibetan",
+  "Nepali",
+  "Sanskrit",
+  "Marathi",
+  "Bengali",
+  "Assamese",
+  "Gujarati",
+  "Punjabi",
+  "Oriya",
+  "Malayalam",
+  "Kannada",
+  "Tamil",
+  "Telugu",
+  "Sinhalese",
+  "Burmese",
+  "Khmer",
+  "Lao",
+  "Vietnamese",
+  "Indonesian",
+  "Tagalog",
+  "MalayRoman",
+  "MalayArabic",
+  "Amharic",
+  "Tigrinya",
+  "Galla",
+  "Oromo",
+  "Somali",
+  "Swahili",
+  "Ruanda",
+  "Rundi",
+  "Chewa",
+  "Malagasy",
+  "Esperanto",
+  "Welsh",
+  "Basque",
+  "Catalan",
+  "Latin",
+  "Quechua",
+  "Guarani",
+  "Aymara",
+  "Tatar",
+  "Uighur",
+  "Dzongkha",
+  "JavaneseRom",
+};
+
+
+typedef struct
+{
+  const char *ext;
+  const char *mime;
+} C2M;
+
+/* see http://www.mp4ra.org/filetype.html 
+ *     http://www.ftyps.com/ */
+static C2M ftMap[] = {
+  {"qt  ", "video/quicktime"},
+  {"isom", "video/mp4"},        /* ISO Base Media files */
+  {"iso2", "video/mp4"},
+  {"mp41", "video/mp4"},        /* MPEG-4 (ISO/IEC 14491-1) version 1 */
+  {"mp42", "video/mp4"},        /* MPEG-4 (ISO/IEC 14491-1) version 2 */
+  {"3gp1", "video/3gpp"},
+  {"3gp2", "video/3gpp"},
+  {"3gp3", "video/3gpp"},
+  {"3gp4", "video/3gpp"},
+  {"3gp5", "video/3gpp"},
+  {"3g2a", "video/3gpp2"},
+  {"mmp4", "video/mp4"},        /* Mobile MPEG-4 */
+  {"M4A ", "audio/mp4"},
+  {"M4B ", "audio/mp4"},
+  {"M4P ", "audio/mp4"},
+  {"M4V ", "video/mp4"},
+  {"mj2s", "video/mj2"},        /* Motion JPEG 2000 */
+  {"mjp2", "video/mj2"},
+  {NULL, NULL},
+};
+
+typedef struct CHE
+{
+  const char *pfx;
+  enum EXTRACTOR_MetaType type;
+} CHE;
+
+static CHE cHm[] = {
+  {"aut", EXTRACTOR_METATYPE_AUTHOR_NAME},
+  {"cpy", EXTRACTOR_METATYPE_COPYRIGHT},
+  {"day", EXTRACTOR_METATYPE_CREATION_DATE},
+  {"ed1", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed2", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed3", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed4", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed5", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed6", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed7", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed8", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"ed9", EXTRACTOR_METATYPE_MODIFICATION_DATE},
+  {"cmt", EXTRACTOR_METATYPE_COMMENT},
+  {"url", EXTRACTOR_METATYPE_URL},
+  {"enc", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
+  {"hst", EXTRACTOR_METATYPE_BUILDHOST},
+  {"nam", EXTRACTOR_METATYPE_TITLE},
+  {"gen", EXTRACTOR_METATYPE_GENRE},
+  {"mak", EXTRACTOR_METATYPE_CAMERA_MAKE},
+  {"mod", EXTRACTOR_METATYPE_CAMERA_MODEL},
+  {"des", EXTRACTOR_METATYPE_DESCRIPTION},
+  {"dis", EXTRACTOR_METATYPE_DISCLAIMER},
+  {"dir", EXTRACTOR_METATYPE_MOVIE_DIRECTOR},
+  {"src", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME},
+  {"prf", EXTRACTOR_METATYPE_PERFORMER },
+  {"prd", EXTRACTOR_METATYPE_PRODUCER},
+  {"PRD", EXTRACTOR_METATYPE_PRODUCT_VERSION}, 
+  {"swr", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE},
+  {"isr", EXTRACTOR_METATYPE_ISRC},
+  {"wrt", EXTRACTOR_METATYPE_WRITER},
+  {"wrn", EXTRACTOR_METATYPE_WARNING},
+  {"chp", EXTRACTOR_METATYPE_CHAPTER_NAME},
+  {"inf", EXTRACTOR_METATYPE_DESCRIPTION},
+  {"req", EXTRACTOR_METATYPE_TARGET_PLATFORM},      /* hardware requirements */
+  {"fmt", EXTRACTOR_METATYPE_FORMAT},
+  {NULL, EXTRACTOR_METATYPE_RESERVED },
+};
+
+
+typedef struct
+{
+  const char *atom_type;
+  enum EXTRACTOR_MetaType type;
+} ITTagConversionEntry;
+
+/* iTunes Tags:
+ * see http://atomicparsley.sourceforge.net/mpeg-4files.html */
+static ITTagConversionEntry it_to_extr_table[] = {
+  {"\xa9" "alb", EXTRACTOR_METATYPE_ALBUM},
+  {"\xa9" "ART", EXTRACTOR_METATYPE_ARTIST},
+  {"aART", EXTRACTOR_METATYPE_ARTIST},
+  {"\xa9" "cmt", EXTRACTOR_METATYPE_COMMENT},
+  {"\xa9" "day", EXTRACTOR_METATYPE_UNKNOWN_DATE},
+  {"\xa9" "nam", EXTRACTOR_METATYPE_TITLE},
+  {"trkn", EXTRACTOR_METATYPE_TRACK_NUMBER},
+  {"disk", EXTRACTOR_METATYPE_DISC_NUMBER},
+  {"\xa9" "gen", EXTRACTOR_METATYPE_GENRE},
+  {"gnre", EXTRACTOR_METATYPE_GENRE},
+  {"\xa9" "wrt", EXTRACTOR_METATYPE_WRITER},
+  {"\xa9" "too", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
+  {"cprt", EXTRACTOR_METATYPE_COPYRIGHT},
+  {"\xa9" "grp", EXTRACTOR_METATYPE_GROUP},
+  {"catg", EXTRACTOR_METATYPE_SECTION},
+  {"keyw", EXTRACTOR_METATYPE_KEYWORDS},
+  {"desc", EXTRACTOR_METATYPE_DESCRIPTION},
+  {"tvnn", EXTRACTOR_METATYPE_NETWORK_NAME},
+  {"tvsh", EXTRACTOR_METATYPE_SHOW_NAME}, 
+  {"tven", EXTRACTOR_METATYPE_NETWORK_NAME},
+  {NULL, EXTRACTOR_METATYPE_RESERVED}
+};
+
+
+typedef struct
+{
+  unsigned int size;
+  unsigned int type;
+} Atom;
+
+typedef struct
+{
+  unsigned int one;
+  unsigned int type;
+  unsigned long long size;
+} LongAtom;
+
+static unsigned long long
+ntohll (unsigned long long n)
+{
+#if __BYTE_ORDER == __BIG_ENDIAN
+  return n;
+#else
+  return (((unsigned long long) ntohl (n)) << 32) + ntohl (n >> 32);
+#endif
+}
+
+
+/**
+ * Check if at position pos there is a valid atom.
+ * @return 0 if the atom is invalid, 1 if it is valid
+ */
+static int
+checkAtomValid (const char *buffer, size_t size, size_t pos)
+{
+  unsigned long long atomSize;
+  const Atom *atom;
+  const LongAtom *latom;
+  if ((pos >= size) ||
+      (pos + sizeof (Atom) > size) || (pos + sizeof (Atom) < pos))
+    return 0;
+  atom = (const Atom *) &buffer[pos];
+  if (ntohl (atom->size) == 1)
+    {
+      if ((pos + sizeof (LongAtom) > size) || (pos + sizeof (LongAtom) < pos))
+        return 0;
+      latom = (const LongAtom *) &buffer[pos];
+      atomSize = ntohll (latom->size);
+      if ((atomSize < sizeof (LongAtom)) ||
+          (atomSize + pos > size) || (atomSize + pos < atomSize))
+        return 0;
+    }
+  else
+    {
+      atomSize = ntohl (atom->size);
+      if ((atomSize < sizeof (Atom)) ||
+          (atomSize + pos > size) || (atomSize + pos < atomSize))
+        return 0;
+    }
+  return 1;
+}
+
+/**
+ * Assumes that checkAtomValid has already been called.
+ */
+static unsigned long long
+getAtomSize (const char *buf)
+{
+  const Atom *atom;
+  const LongAtom *latom;
+  atom = (const Atom *) buf;
+  if (ntohl (atom->size) == 1)
+    {
+      latom = (const LongAtom *) buf;
+      return ntohll (latom->size);
+    }
+  return ntohl (atom->size);
+}
+
+/**
+ * Assumes that checkAtomValid has already been called.
+ */
+static unsigned int
+getAtomHeaderSize (const char *buf)
+{
+  const Atom *atom;
+
+  atom = (const Atom *) buf;
+  if (ntohl (atom->size) == 1)
+    return sizeof (const LongAtom);
+  return sizeof (Atom);
+}
+
+struct ExtractContext
+{
+  EXTRACTOR_MetaDataProcessor proc;
+  void *proc_cls;
+  int ret;
+};
+
+static void
+addKeyword (enum EXTRACTOR_MetaType type,
+           const char *str,
+           struct ExtractContext *ec)
+{
+  if (ec->ret != 0)
+    return;
+  ec->ret = ec->proc (ec->proc_cls,
+                     "qt",
+                     type,
+                     EXTRACTOR_METAFORMAT_UTF8,
+                     "text/plain",
+                     str,
+                     strlen(str)+1);
+}
+
+
+
+/**
+ * Assumes that checkAtomValid has already been called.
+ */
+typedef int (*AtomHandler) (const char *input,
+                            size_t size,
+                            size_t pos, struct ExtractContext *ec);
+
+typedef struct
+{
+  char *name;
+  AtomHandler handler;
+} HandlerEntry;
+
+/**
+ * Call the handler for the atom at the given position.
+ * Will check validity of the given atom.
+ *
+ * @return 0 on error, 1 for success, -1 for unknown atom type
+ */
+static int handleAtom (HandlerEntry *handlers,
+                       const char *input,
+                       size_t size,
+                       size_t pos, 
+                      struct ExtractContext *ec);
+
+static HandlerEntry all_handlers[];
+static HandlerEntry ilst_handlers[];
+
+/**
+ * Process atoms.
+ * @return 0 on error, 1 for success, -1 for unknown atom type
+ */
+static int
+processAtoms (HandlerEntry *handlers, const char *input,
+                 size_t size, struct ExtractContext *ec)
+{
+  size_t pos;
+
+  if (size < sizeof (Atom))
+    return 1;
+  pos = 0;
+  while (pos < size - sizeof (Atom))
+    {
+      if (0 == handleAtom (handlers, input, size, pos, ec))
+        return 0;
+      pos += getAtomSize (&input[pos]);
+    }
+  return 1;
+}
+
+/**
+ * Process all atoms.
+ * @return 0 on error, 1 for success, -1 for unknown atom type
+ */
+static int
+processAllAtoms (const char *input,
+                 size_t size, struct ExtractContext *ec)
+{
+  return processAtoms(all_handlers, input, size, ec);
+}
+
+/**
+ * Handle the moov atom.
+ * @return 0 on error, 1 for success, -1 for unknown atom type
+ */
+static int
+moovHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  unsigned int hdr = getAtomHeaderSize (&input[pos]);
+  return processAllAtoms (&input[pos + hdr],
+                          getAtomSize (&input[pos]) - hdr, ec);
+}
+
+/* see 
http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap1/chapter_2_section_5.html
 */
+typedef struct
+{
+  Atom header;
+  /* major brand */
+  char type[4];
+  /* minor version */
+  unsigned int version;
+  /* compatible brands */
+  char compatibility[4];
+} FileType;
+
+static int
+ftypHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  const FileType *ft;
+  int i;
+
+  if (getAtomSize (&input[pos]) < sizeof (FileType)) {
+    return 0;
+  }
+  ft = (const FileType *) &input[pos];
+
+  i = 0;
+  while ((ftMap[i].ext != NULL) && (0 != memcmp (ft->type, ftMap[i].ext, 4)))
+    i++;
+  if (ftMap[i].ext != NULL)
+    addKeyword (EXTRACTOR_METATYPE_MIMETYPE, ftMap[i].mime, ec);
+  return 1;
+}
+
+typedef struct
+{
+  Atom hdr;
+  unsigned char version;
+  unsigned char flags[3];
+  /* in seconds since midnight, January 1, 1904 */
+  unsigned int creationTime;
+  /* in seconds since midnight, January 1, 1904 */
+  unsigned int modificationTime;
+  /* number of time units that pass per second in the movies time
+     coordinate system */
+  unsigned int timeScale;
+  /* A time value that indicates the duration of the movie in time
+     scale units. */
+  unsigned int duration;
+  unsigned int preferredRate;
+  /* A 16-bit fixed-point number that specifies how loud to
+     play. 1.0 indicates full volume */
+  unsigned short preferredVolume;
+  unsigned char reserved[10];
+  unsigned char matrix[36];
+  unsigned int previewTime;
+  unsigned int previewDuration;
+  unsigned int posterTime;
+  unsigned int selectionTime;
+  unsigned int selectionDuration;
+  unsigned int currentTime;
+  unsigned int nextTrackId;
+} MovieHeaderAtom;
+
+static int
+mvhdHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  const MovieHeaderAtom *m;
+  char duration[16];
+  if (getAtomSize (&input[pos]) != sizeof (MovieHeaderAtom))
+    return 0;
+  m = (const MovieHeaderAtom *) &input[pos];
+  snprintf (duration,
+           sizeof(duration),
+           "%us",
+           ntohl (m->duration) / ntohl (m->timeScale));
+  addKeyword (EXTRACTOR_METATYPE_DURATION, duration, ec);
+  return 1;
+}
+
+typedef struct
+{
+  Atom cmovAtom;
+  Atom dcomAtom;
+  char compressor[4];
+  Atom cmvdAtom;
+  unsigned int decompressedSize;
+} CompressedMovieHeaderAtom;
+
+static int
+cmovHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  const CompressedMovieHeaderAtom *c;
+  unsigned int s;
+  char *buf;
+  int ret;
+  z_stream z_state;
+  int z_ret_code;
+
+
+  if (getAtomSize (&input[pos]) < sizeof (CompressedMovieHeaderAtom))
+    return 0;
+  c = (const CompressedMovieHeaderAtom *) &input[pos];
+  if ((ntohl (c->dcomAtom.size) != 12) ||
+      (0 != memcmp (&c->dcomAtom.type, "dcom", 4)) ||
+      (0 != memcmp (c->compressor, "zlib", 4)) ||
+      (0 != memcmp (&c->cmvdAtom.type, "cmvd", 4)) ||
+      (ntohl (c->cmvdAtom.size) !=
+       getAtomSize (&input[pos]) - sizeof (Atom) * 2 - 4))
+    {
+      return 0;                 /* dcom must be 12 bytes */
+    }
+  s = ntohl (c->decompressedSize);
+  if (s > 16 * 1024 * 1024)
+    return 1;                   /* ignore, too big! */
+  buf = malloc (s);
+  if (buf == NULL)
+    return 1;                   /* out of memory, handle gracefully */
+
+  z_state.next_in = (unsigned char *) &c[1];
+  z_state.avail_in = ntohl (c->cmvdAtom.size);
+  z_state.avail_out = s;
+  z_state.next_out = (unsigned char *) buf;
+  z_state.zalloc = (alloc_func) 0;
+  z_state.zfree = (free_func) 0;
+  z_state.opaque = (voidpf) 0;
+  z_ret_code = inflateInit (&z_state);
+  if (Z_OK != z_ret_code)
+    {
+      free (buf);
+      return 0;                 /* crc error? */
+    }
+  z_ret_code = inflate (&z_state, Z_NO_FLUSH);
+  if ((z_ret_code != Z_OK) && (z_ret_code != Z_STREAM_END))
+    {
+      free (buf);
+      return 0;                 /* decode error? */
+    }
+  z_ret_code = inflateEnd (&z_state);
+  if (Z_OK != z_ret_code)
+    {
+      free (buf);
+      return 0;                 /* decode error? */
+    }
+  ret = handleAtom (all_handlers, buf, s, 0, ec);
+  free (buf);
+  return ret;
+}
+
+typedef struct
+{
+  short integer;
+  short fraction;
+} QTFixed;
+
+typedef struct
+{
+  Atom hdr;
+  unsigned int flags;           /* 1 byte of version, 3 bytes of flags */
+  /* in seconds since midnight, January 1, 1904 */
+  unsigned int creationTime;
+  /* in seconds since midnight, January 1, 1904 */
+  unsigned int modificationTime;
+  unsigned int trackID;
+  unsigned int reserved_0;
+  unsigned int duration;
+  unsigned int reserved_1;
+  unsigned int reserved_2;
+  unsigned short layer;
+  unsigned short alternate_group;
+  unsigned short volume;
+  unsigned short reserved_3;
+  QTFixed matrix[3][3];
+  /* in pixels */
+  QTFixed track_width;
+  /* in pixels */
+  QTFixed track_height;
+} TrackAtom;
+
+static int
+tkhdHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  const TrackAtom *m;
+  char dimensions[40];
+
+  if (getAtomSize (&input[pos]) < sizeof (TrackAtom))
+    return 0;
+  m = (const TrackAtom *) &input[pos];
+  if (ntohs (m->track_width.integer) != 0)
+    {
+      /* if actually a/the video track */
+      snprintf (dimensions,
+                sizeof(dimensions),
+                "%dx%d",
+                ntohs (m->track_width.integer),
+                ntohs (m->track_height.integer));
+      addKeyword (EXTRACTOR_METATYPE_IMAGE_DIMENSIONS, dimensions, ec);
+    }
+  return 1;
+}
+
+static int
+trakHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  unsigned int hdr = getAtomHeaderSize (&input[pos]);
+  return processAllAtoms (&input[pos + hdr],
+                          getAtomSize (&input[pos]) - hdr, ec);
+}
+
+static int
+metaHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  unsigned int hdr = getAtomHeaderSize (&input[pos]);
+  if (getAtomSize (&input[pos]) < hdr + 4)
+    return 0;
+  return processAllAtoms (&input[pos + hdr + 4],
+                          getAtomSize (&input[pos]) - hdr - 4, ec);
+}
+
+typedef struct
+{
+  Atom header;
+  unsigned short length;
+  unsigned short language;
+} InternationalText;
+
+/*
+ * see 
http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter
+_3_section_2.html
+ *   "User Data Text Strings and Language Codes"
+ * TODO: make conformant
+ */
+static int
+processTextTag (const char *input,
+                size_t size,
+                size_t pos,
+                enum EXTRACTOR_MetaType type, struct ExtractContext *ec)
+{
+  unsigned long long as;
+  unsigned short len;
+  unsigned short lang;
+  const InternationalText *txt;
+  char *meta;
+  int i;
+
+  /* contains "international text":
+     16-bit size + 16 bit language code */
+  as = getAtomSize (&input[pos]);
+  if (as < sizeof (InternationalText))
+    return 0;                   /* invalid */
+  txt = (const InternationalText *) &input[pos];
+  len = ntohs (txt->length);
+  if (len + sizeof (InternationalText) > as)
+    return 0;                   /* invalid */
+  lang = ntohs (txt->language);
+  if (lang >= sizeof (languages) / sizeof (char *))
+    return 0;                   /* invalid */
+  addKeyword (EXTRACTOR_METATYPE_LANGUAGE, languages[lang], ec);
+
+  meta = malloc (len + 1);
+  if (meta == NULL)
+    return 0;
+  memcpy (meta, &txt[1], len);
+  meta[len] = '\0';
+  for (i = 0; i < len; i++)
+    if (meta[i] == '\r')
+      meta[i] = '\n';
+  addKeyword (type, meta, ec);
+  free (meta);
+  return 1;
+}
+
+
+static int
+c_Handler (const char *input,
+           size_t size, size_t pos, struct ExtractContext *ec)
+{
+  int i;
+
+  i = 0;
+  while ((cHm[i].pfx != NULL) && (0 != memcmp (&input[pos+5], cHm[i].pfx, 3)))
+    i++;
+  if (cHm[i].pfx != NULL)
+    return processTextTag (input, size, pos, cHm[i].type, ec);
+  return -1;                    /* not found */
+}
+
+static int
+udtaHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  unsigned int hdr = getAtomHeaderSize (&input[pos]);
+  return processAllAtoms (&input[pos + hdr],
+                          getAtomSize (&input[pos]) - hdr, ec);
+}
+
+static int
+processDataAtom (const char *input,
+                size_t size, /* parent atom size */
+                size_t pos,
+                const char *patom,
+                enum EXTRACTOR_MetaType type,
+                struct ExtractContext *ec)
+{
+  char *meta;
+  unsigned char version;
+  unsigned int flags;
+  unsigned long long asize;
+  unsigned int len;
+  unsigned int hdr;
+  int i;
+
+  hdr = getAtomHeaderSize (&input[pos]);
+  asize = getAtomSize (&input[pos]);
+  if (memcmp(&input[pos+4], "data", 4) != 0)
+    return -1;
+
+  if (asize < hdr + 8 || /* header + u32 flags + u32 reserved */
+      asize > (getAtomSize(&patom[0]) - 8))
+    return 0;
+
+  len = (unsigned int)(asize - (hdr + 8));
+
+  version = input[pos+8];
+  flags = ((unsigned char)input[pos+9]<<16) |
+          ((unsigned char)input[pos+10]<<8) | 
+          (unsigned char)input[pos+11];
+#if DEBUG
+  printf("[data] version:%02x flags:%08x txtlen:%d\n", version, flags, len);
+#endif
+
+  if (version != 0)
+    return -1;
+
+  if (flags == 0x0) { /* binary data */
+    if (memcmp(&patom[4], "gnre", 4) == 0) {
+      if (len >= 2) {
+        unsigned short genre = ((unsigned char)input[pos+16] << 8) |
+                                (unsigned char)input[pos+17];
+        if (genre > 0 && genre < GENRE_NAME_COUNT)
+          addKeyword(type, genre_names[genre-1], ec);
+      }
+      return 1;
+    }
+    else if ((memcmp(&patom[4], "trkn", 4) == 0) || 
+        (memcmp(&patom[4], "disk", 4) == 0)) {
+      if (len >= 4) {
+        unsigned short n = ((unsigned char)input[pos+18] << 8) |
+                            (unsigned char)input[pos+19];
+        char s[8];
+       snprintf(s, 8, "%d", n);
+        addKeyword(type, s, ec);
+      }
+    }
+    else {
+      return -1;
+    }
+  }
+  else if (flags == 0x1) { /* text data */
+    meta = malloc (len + 1);
+    if (meta == NULL)
+      return 0;
+    memcpy (meta, &input[pos+16], len);
+    meta[len] = '\0';
+    for (i = 0; i < len; i++)
+      if (meta[i] == '\r')
+        meta[i] = '\n';
+    addKeyword (type, meta, ec);
+    free (meta);
+    return 1;
+  }
+
+  return -1;
+}
+
+/* NOTE: iTunes tag processing should, in theory, be limited to iTunes
+ * file types (from ftyp), but, in reality, it seems that there are other
+ * files, like 3gpp, out in the wild with iTunes tags. */
+static int
+iTunesTagHandler (const char *input,
+           size_t size, size_t pos, struct ExtractContext *ec)
+{
+  unsigned long long asize;
+  unsigned int hdr;
+  int i;
+
+  hdr = getAtomHeaderSize (&input[pos]);
+  asize = getAtomSize (&input[pos]);
+
+  if (asize < hdr + 8) /* header + at least one atom */
+    return 0;
+
+  i = 0;
+  while ((it_to_extr_table[i].atom_type != NULL) && 
+         (0 != memcmp (&input[pos+4], it_to_extr_table[i].atom_type, 4)))
+    i++;
+  if (it_to_extr_table[i].atom_type != NULL)
+    return processDataAtom(input, asize, pos+hdr, &input[pos],  
+                           it_to_extr_table[i].type, ec);
+
+  return -1;
+}
+
+
+static int 
+ilstHandler (const char *input,
+             size_t size, size_t pos, struct ExtractContext *ec)
+{
+  unsigned int hdr = getAtomHeaderSize (&input[pos]);
+  return processAtoms(ilst_handlers, &input[pos + hdr],
+                      getAtomSize(&input[pos]) - hdr, ec);
+}
+
+
+static HandlerEntry all_handlers[] = {
+  {"moov", &moovHandler},
+  {"cmov", &cmovHandler},
+  {"mvhd", &mvhdHandler},
+  {"trak", &trakHandler},
+  {"tkhd", &tkhdHandler},
+  {"ilst", &ilstHandler},
+  {"meta", &metaHandler},
+  {"udta", &udtaHandler},
+  {"ftyp", &ftypHandler},
+  {"\xa9" "swr", &c_Handler},
+  {"\xa9" "cpy", &c_Handler},
+  {"\xa9" "day", &c_Handler},
+  {"\xa9" "dir", &c_Handler},
+  {"\xa9" "ed1", &c_Handler},
+  {"\xa9" "ed2", &c_Handler},
+  {"\xa9" "ed3", &c_Handler},
+  {"\xa9" "ed4", &c_Handler},
+  {"\xa9" "ed5", &c_Handler},
+  {"\xa9" "ed6", &c_Handler},
+  {"\xa9" "ed7", &c_Handler},
+  {"\xa9" "ed8", &c_Handler},
+  {"\xa9" "ed9", &c_Handler},
+  {"\xa9" "fmt", &c_Handler},
+  {"\xa9" "inf", &c_Handler},
+  {"\xa9" "prd", &c_Handler},
+  {"\xa9" "prf", &c_Handler},
+  {"\xa9" "req", &c_Handler},
+  {"\xa9" "src", &c_Handler},
+  {"\xa9" "wrt", &c_Handler},
+  {"\xa9" "aut", &c_Handler},
+  {"\xa9" "hst", &c_Handler},
+  {"\xa9" "wrt", &c_Handler},
+  {"\xa9" "cmt", &c_Handler},
+  {"\xa9" "mak", &c_Handler},
+  {"\xa9" "mod", &c_Handler},
+  {"\xa9" "nam", &c_Handler},
+  {"\xa9" "des", &c_Handler},
+  {"\xa9" "PRD", &c_Handler},
+  {"\xa9" "wrn", &c_Handler},
+  {"\xa9" "chp", &c_Handler},
+  /*  { "name", &nameHandler }, */
+  {NULL, NULL},
+};
+
+static HandlerEntry ilst_handlers[] = {
+  {"\xa9" "alb", &iTunesTagHandler},
+  {"\xa9" "ART", &iTunesTagHandler},
+  {"aART", &iTunesTagHandler},
+  {"\xa9" "cmt", &iTunesTagHandler},
+  {"\xa9" "day", &iTunesTagHandler},
+  {"\xa9" "nam", &iTunesTagHandler},
+  {"\xa9" "gen", &iTunesTagHandler},
+  {"gnre", &iTunesTagHandler},
+  {"trkn", &iTunesTagHandler},
+  {"disk", &iTunesTagHandler},
+  {"\xa9" "wrt", &iTunesTagHandler},
+  {"\xa9" "too", &iTunesTagHandler},
+  {"tmpo", &iTunesTagHandler},
+  {"cprt", &iTunesTagHandler},
+  {"cpil", &iTunesTagHandler},
+  {"covr", &iTunesTagHandler},
+  {"rtng", &iTunesTagHandler},
+  {"\xa9" "grp", &iTunesTagHandler},
+  {"stik", &iTunesTagHandler},
+  {"pcst", &iTunesTagHandler},
+  {"catg", &iTunesTagHandler},
+  {"keyw", &iTunesTagHandler},
+  {"purl", &iTunesTagHandler},
+  {"egid", &iTunesTagHandler},
+  {"desc", &iTunesTagHandler},
+  {"\xa9" "lyr", &iTunesTagHandler},
+  {"tvnn", &iTunesTagHandler},
+  {"tvsh", &iTunesTagHandler},
+  {"tven", &iTunesTagHandler},
+  {"tvsn", &iTunesTagHandler},
+  {"tves", &iTunesTagHandler},
+  {"purd", &iTunesTagHandler},
+  {"pgap", &iTunesTagHandler},
+  {NULL, NULL},
+};
+
+/**
+ * Call the handler for the atom at the given position.
+ * @return 0 on error, 1 for success, -1 for unknown atom type
+ */
+static int
+handleAtom (HandlerEntry *handlers, const char *input,
+            size_t size, size_t pos, struct ExtractContext *ec)
+{
+  int i;
+  if (0 == checkAtomValid (input, size, pos))
+    {
+      return 0;
+    }
+  i = 0;
+  while ((handlers[i].name != NULL) &&
+         (0 != memcmp (&input[pos + 4], handlers[i].name, 4)))
+    i++;
+  if (handlers[i].name == NULL)
+    {
+#if DEBUG
+      char b[5];
+      memcpy (b, &input[pos + 4], 4);
+      b[4] = '\0';
+      printf ("No handler for `%s'\n", b);
+#endif
+      return -1;
+    }
+  i = handlers[i].handler (input, size, pos, ec);
+#if DEBUG
+  printf ("Running handler for `%4s' at %u completed with result %d\n",
+          &input[pos + 4], pos, i);
+#endif
+  return i;
+}
+
+/* mimetypes:
+   video/quicktime: mov,qt: Quicktime animation;
+   video/x-quicktime: mov,qt: Quicktime animation;
+   application/x-quicktimeplayer: qtl: Quicktime list;
+ */
+
+int 
+EXTRACTOR_qt_extract (const char *data,
+                     size_t size,
+                     EXTRACTOR_MetaDataProcessor proc,
+                     void *proc_cls,
+                     const char *options)
+{
+  struct ExtractContext ec;
+  ec.proc = proc;
+  ec.proc_cls = proc_cls;
+  ec.ret = 0;
+  processAllAtoms (data, size, &ec);
+  return ec.ret;
+}
+
+/*  end of qt_extractor.c */

Copied: Extractor/src/plugins/old/real_extractor.c (from rev 23239, 
Extractor/src/plugins/real_extractor.c)
===================================================================
--- Extractor/src/plugins/old/real_extractor.c                          (rev 0)
+++ Extractor/src/plugins/old/real_extractor.c  2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,434 @@
+/*
+     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 <stdint.h>
+
+#define UINT32 uint32_t
+#define UINT16 uint16_t
+#define UINT8 uint8_t
+
+typedef struct
+{
+  UINT32 object_id;
+  UINT32 size;
+  UINT16 object_version;        /* must be 0 */
+  UINT16 stream_number;
+  UINT32 max_bit_rate;
+  UINT32 avg_bit_rate;
+  UINT32 max_packet_size;
+  UINT32 avg_packet_size;
+  UINT32 start_time;
+  UINT32 preroll;
+  UINT32 duration;
+  UINT8 stream_name_size;
+  UINT8 data[0];                /* variable length section */
+  /*
+     UINT8[stream_name_size]     stream_name;
+     UINT8                       mime_type_size;
+     UINT8[mime_type_size]       mime_type;
+     UINT32                      type_specific_len;
+     UINT8[type_specific_len]    type_specific_data;
+   */
+} Media_Properties;
+
+typedef struct
+{
+  UINT32 object_id;
+  UINT32 size;
+  UINT16 object_version;        /* must be 0 */
+  UINT16 title_len;
+  UINT8 data[0];                /* variable length section */
+  /*
+     UINT8[title_len]  title;
+     UINT16    author_len;
+     UINT8[author_len]  author;
+     UINT16    copyright_len;
+     UINT8[copyright_len]  copyright;
+     UINT16    comment_len;
+     UINT8[comment_len]  comment;
+   */
+} Content_Description;
+/* author, copyright and comment are supposed to be ASCII */
+
+#define REAL_HEADER 0x2E524d46
+#define MDPR_HEADER 0x4D445052
+#define CONT_HEADER 0x434F4e54
+
+#define RAFF4_HEADER 0x2E7261FD
+
+
+static int
+processMediaProperties (const Media_Properties * prop,
+                       EXTRACTOR_MetaDataProcessor proc,
+                       void *proc_cls)
+{
+
+  UINT8 mime_type_size;
+  UINT32 prop_size;
+
+  prop_size = ntohl (prop->size);
+  if (prop_size <= sizeof (Media_Properties))
+    return 0;
+  if (0 != prop->object_version)
+    return 0;
+  if (prop_size <= prop->stream_name_size + sizeof (UINT8)
+      + sizeof (Media_Properties))
+    return 0;
+
+  mime_type_size = prop->data[prop->stream_name_size];
+  if (prop_size > prop->stream_name_size + sizeof (UINT8) +
+      +mime_type_size + sizeof (Media_Properties))
+    {
+      char data[mime_type_size + 1];
+      memcpy (data, &prop->data[prop->stream_name_size + 1], mime_type_size);
+      data[mime_type_size] = '\0';
+      
+      return proc (proc_cls,
+                  "real",
+                  EXTRACTOR_METATYPE_MIMETYPE,
+                  EXTRACTOR_METAFORMAT_UTF8,
+                  "text/plain",
+                  data,
+                  strlen (data));
+    }
+  return 0;
+}
+
+static int
+processContentDescription (const Content_Description * prop,
+                          EXTRACTOR_MetaDataProcessor proc,
+                          void *proc_cls)
+{
+  UINT16 author_len;
+  UINT16 copyright_len;
+  UINT16 comment_len;
+  UINT16 title_len;
+  char *title;
+  char *author;
+  char *copyright;
+  char *comment;
+  UINT32 prop_size;
+  int ret;
+
+  prop_size = ntohl (prop->size);
+  if (prop_size <= sizeof (Content_Description))
+    return 0;
+  if (0 != prop->object_version)
+    return 0;
+  title_len = ntohs (prop->title_len);
+  if (prop_size <= title_len + sizeof (UINT16) + sizeof (Content_Description))
+    return 0;
+  author_len = ntohs (*(UINT16 *) & prop->data[title_len]);
+  if (prop_size <= title_len + sizeof (UINT16)
+      + author_len + sizeof (Content_Description))
+    return 0;
+
+  copyright_len = ntohs (*(UINT16 *) & prop->data[title_len +
+                                                  author_len +
+                                                  sizeof (UINT16)]);
+
+  if (prop_size <= title_len + 2 * sizeof (UINT16)
+      + author_len + copyright_len + sizeof (Content_Description))
+    return 0;
+
+  comment_len = ntohs (*(UINT16 *) & prop->data[title_len +
+                                                author_len +
+                                                copyright_len +
+                                                2 * sizeof (UINT16)]);
+
+  if (prop_size < title_len + 3 * sizeof (UINT16)
+      + author_len + copyright_len + comment_len
+      + sizeof (Content_Description))
+    return 0;
+
+  ret = 0;
+  title = malloc (title_len + 1);
+  if (title != NULL)
+    {
+      memcpy (title, &prop->data[0], title_len);
+      title[title_len] = '\0';
+      ret = proc (proc_cls,
+                 "real",
+                 EXTRACTOR_METATYPE_TITLE,
+                 EXTRACTOR_METAFORMAT_UTF8,
+                 "text/plain",
+                 title,
+                 strlen (title)+1);
+      free (title);
+    }
+  if (ret != 0)
+    return ret;
+
+  author = malloc (author_len + 1);
+  if (author != NULL)
+    {
+      memcpy (author, &prop->data[title_len + sizeof (UINT16)], author_len);
+      author[author_len] = '\0';
+      ret = proc (proc_cls,
+                 "real",
+                 EXTRACTOR_METATYPE_AUTHOR_NAME,
+                 EXTRACTOR_METAFORMAT_UTF8,
+                 "text/plain",
+                 author,
+                 strlen (author)+1);
+      free (author);
+    }
+  if (ret != 0)
+    return ret;
+
+  copyright = malloc (copyright_len + 1);
+  if (copyright != NULL)
+    {
+      memcpy (copyright,
+             &prop->data[title_len + sizeof (UINT16) * 2 + author_len],
+             copyright_len);
+      copyright[copyright_len] = '\0';
+      ret = proc (proc_cls,
+                 "real",
+                 EXTRACTOR_METATYPE_COPYRIGHT,
+                 EXTRACTOR_METAFORMAT_UTF8,
+                 "text/plain",
+                 copyright,
+                 strlen (copyright)+1);
+      free (copyright);
+    }
+  if (ret != 0)
+    return ret;
+
+  comment = malloc (comment_len + 1);
+  if (comment != NULL)
+    {
+      memcpy (comment,
+             &prop->data[title_len + sizeof (UINT16) * 3 + author_len +
+                         copyright_len], comment_len);
+      comment[comment_len] = '\0';
+      ret = proc (proc_cls,
+                 "real",
+                 EXTRACTOR_METATYPE_COMMENT,
+                 EXTRACTOR_METAFORMAT_UTF8,
+                 "text/plain",
+                 comment,
+                 strlen (comment)+1);
+      free (comment);
+    }
+  if (ret != 0)
+    return ret;
+  return 0;
+}
+
+typedef struct RAFF4_header
+{
+  unsigned short version;
+  unsigned short revision;
+  unsigned short header_length;
+  unsigned short compression_type;
+  unsigned int granularity;
+  unsigned int total_bytes;
+  unsigned int bytes_per_minute;
+  unsigned int bytes_per_minute2;
+  unsigned short interleave_factor;
+  unsigned short interleave_block_size;
+  unsigned int user_data;
+  float sample_rate;
+  unsigned short sample_size;
+  unsigned short channels;
+  unsigned char interleave_code[5];
+  unsigned char compression_code[5];
+  unsigned char is_interleaved;
+  unsigned char copy_byte;
+  unsigned char stream_type;
+  /*
+     unsigned char tlen;
+     unsigned char title[tlen];
+     unsigned char alen;
+     unsigned char author[alen];
+     unsigned char clen;
+     unsigned char copyright[clen];
+     unsigned char aplen;
+     unsigned char app[aplen]; */
+} RAFF4_header;
+
+#define RAFF4_HDR_SIZE 53
+
+static char *
+stndup (const char *str, size_t n)
+{
+  char *tmp;
+  tmp = malloc (n + 1);
+  if (tmp == NULL)
+    return NULL;
+  tmp[n] = '\0';
+  memcpy (tmp, str, n);
+  return tmp;
+}
+
+/* audio/vnd.rn-realaudio */
+int 
+EXTRACTOR_real_extract (const unsigned char *data,
+                       size_t size,
+                       EXTRACTOR_MetaDataProcessor proc,
+                       void *proc_cls,
+                       const char *options)
+{
+  const unsigned char *pos;
+  const unsigned char *end;
+  unsigned int length;
+  const RAFF4_header *hdr;
+  unsigned char tlen;
+  unsigned char alen;
+  unsigned char clen;
+  unsigned char aplen;
+  char *x;
+  int ret;
+
+  if (size <= 2 * sizeof (int))
+    return 0;
+  if (RAFF4_HEADER == ntohl (*(int *) data))
+    {
+      /* HELIX */
+      if (size <= RAFF4_HDR_SIZE + 16 + 4)
+        return 0;
+      if (0 != proc (proc_cls,
+                    "real",
+                    EXTRACTOR_METATYPE_MIMETYPE,
+                    EXTRACTOR_METAFORMAT_UTF8,
+                    "text/plain",
+                    "audio/vnd.rn-realaudio",
+                    strlen ("audio/vnd.rn-realaudio")+1))
+       return 1;
+      hdr = (const RAFF4_header *) &data[16];
+      if (ntohs (hdr->header_length) + 16 > size)
+        return 0;
+      tlen = data[16 + RAFF4_HDR_SIZE];
+      if (tlen + RAFF4_HDR_SIZE + 20 > size)
+        return 0;
+      alen = data[17 + tlen + RAFF4_HDR_SIZE];
+      if (tlen + alen + RAFF4_HDR_SIZE + 20 > size)
+        return 0;
+      clen = data[18 + tlen + alen + RAFF4_HDR_SIZE];
+      if (tlen + alen + clen + RAFF4_HDR_SIZE + 20 > size)
+        return 0;
+      aplen = data[19 + tlen + clen + alen + RAFF4_HDR_SIZE];
+      if (tlen + alen + clen + aplen + RAFF4_HDR_SIZE + 20 > size)
+        return 0;
+      ret = 0;
+      if ( (tlen > 0) && (ret == 0) )
+       {
+         x = stndup ((const char *) &data[17 + RAFF4_HDR_SIZE], tlen);
+         if (x != NULL)
+           {
+             ret = proc (proc_cls,
+                         "real",
+                         EXTRACTOR_METATYPE_MIMETYPE,
+                         EXTRACTOR_METAFORMAT_UTF8,
+                         "text/plain",
+                         x,
+                         strlen (x)+1);
+             free (x);
+           }
+       }
+      if ( (alen > 0) && (ret == 0) )
+       {
+         x = stndup ((const char *) &data[18 + RAFF4_HDR_SIZE + tlen], alen);
+         if (x != NULL)
+           {
+             ret = proc (proc_cls,
+                         "real",
+                         EXTRACTOR_METATYPE_MIMETYPE,
+                         EXTRACTOR_METAFORMAT_UTF8,
+                         "text/plain",
+                         x,
+                         strlen (x)+1);
+             free (x);
+           }
+       }
+      if ( (clen > 0) && (ret == 0) )
+       {
+         x = stndup ((const char *) &data[19 + RAFF4_HDR_SIZE + tlen + alen], 
clen);
+         if (x != NULL)
+           {
+             ret = proc (proc_cls,
+                         "real",
+                         EXTRACTOR_METATYPE_MIMETYPE,
+                         EXTRACTOR_METAFORMAT_UTF8,
+                         "text/plain",
+                         x,
+                         strlen (x)+1);
+             free (x);
+           }
+       }
+      if ( (aplen > 0) && (ret == 0) )
+       {
+         x = stndup ((const char *) &data[20 + RAFF4_HDR_SIZE + tlen + alen + 
clen], aplen);
+         if (x != NULL)
+           {
+             ret = proc (proc_cls,
+                         "real",
+                         EXTRACTOR_METATYPE_MIMETYPE,
+                         EXTRACTOR_METAFORMAT_UTF8,
+                         "text/plain",
+                         x,
+                         strlen (x)+1);
+             free (x);
+           }
+       }
+      return ret;
+    }
+  if (REAL_HEADER == ntohl (*(int *) data))
+    {
+      /* old real */
+      end = &data[size];
+      pos = &data[0];
+      ret = 0;
+      while (0 == ret)
+        {
+          if ((pos + 8 >= end) || (pos + 8 < pos))
+            break;
+          length = ntohl (*(((unsigned int *) pos) + 1));
+          if (length <= 0)
+            break;
+          if ((pos + length >= end) || (pos + length < pos))
+            break;
+          switch (ntohl (*((unsigned int *) pos)))
+            {
+            case MDPR_HEADER:
+              ret = processMediaProperties ((Media_Properties *) pos,
+                                               proc,
+                                              proc_cls);
+              pos += length;
+              break;
+            case CONT_HEADER:
+              ret = processContentDescription ((Content_Description *) pos,
+                                              proc,
+                                              proc_cls);
+              pos += length;
+              break;
+            case REAL_HEADER:  /* treat like default */
+            default:
+              pos += length;
+              break;
+            }
+        }
+      return ret;
+    }
+  return 0;
+}

Copied: Extractor/src/plugins/old/riff_extractor.c (from rev 23239, 
Extractor/src/plugins/riff_extractor.c)
===================================================================
--- Extractor/src/plugins/old/riff_extractor.c                          (rev 0)
+++ Extractor/src/plugins/old/riff_extractor.c  2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,123 @@
+/*
+     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 AVInfo 1.0 alpha 11
+     (c) George Shuklin, gs]AT[shounen.ru, 2002-2004
+     http://shounen.ru/soft/avinfo/
+
+     and bitcollider 0.6.0
+     (PD) 2004 The Bitzi Corporation
+     http://bitzi.com/
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include <math.h>
+
+/**
+ * Read the specified number of bytes as a little-endian (least
+ * significant byte first) integer.
+ */
+static unsigned int
+fread_le (const char *data)
+{
+  int x;
+  unsigned int result = 0;
+
+  for (x = 0; x < 4; x++)
+    result |= ((unsigned char) data[x]) << (x * 8);
+  return result;
+}
+
+/* We implement our own rounding function, because the availability of
+ * C99's round(), nearbyint(), rint(), etc. seems to be spotty, whereas
+ * floor() is available in math.h on all C compilers.
+ */
+static double
+round_double (double num)
+{
+  return floor (num + 0.5);
+}
+
+#define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "riff", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto FINISH; } while 
(0)
+
+/* video/x-msvideo */
+int 
+EXTRACTOR_riff_extract (const char *xdata,
+                       size_t xsize,
+                       EXTRACTOR_MetaDataProcessor proc,
+                       void *proc_cls,
+                       const char *options)
+{
+  unsigned int blockLen;
+  unsigned int fps;
+  unsigned int duration;
+  size_t pos;
+  unsigned int width;
+  unsigned int height;
+  char codec[5];
+  char format[256];
+  int ret;
+
+  if (xsize < 32)
+    return 0;
+  if ((memcmp (&xdata[0],
+               "RIFF", 4) != 0) || (memcmp (&xdata[8], "AVI ", 4) != 0))
+    return 0;
+  if (memcmp (&xdata[12], "LIST", 4) != 0)
+    return 0;
+  if (memcmp (&xdata[20], "hdrlavih", 8) != 0)
+    return 0;
+
+  blockLen = fread_le (&xdata[28]);
+
+  /* begin of AVI header at 32 */
+  fps = (unsigned int) round_double ((double) 1.0e6 / fread_le (&xdata[32]));
+  duration = (unsigned int) round_double ((double) fread_le (&xdata[48])
+                                          * 1000 / fps);
+  width = fread_le (&xdata[64]);
+  height = fread_le (&xdata[68]);
+  /* pos: begin of video stream header */
+  pos = blockLen + 32;
+
+  if ((pos < blockLen) || (pos + 32 > xsize) || (pos > xsize))
+    return 0;
+  if (memcmp (&xdata[pos], "LIST", 4) != 0)
+    return 0;
+  blockLen = fread_le (&xdata[pos + 4]);
+  if (memcmp (&xdata[pos + 8], "strlstrh", 8) != 0)
+    return 0;
+  if (memcmp (&xdata[pos + 20], "vids", 4) != 0)
+    return 0;
+  ret = 0;
+  /* pos + 24: video stream header */
+  memcpy (codec, &xdata[pos + 24], 4);
+  codec[4] = '\0';
+  snprintf (format,
+           sizeof(format),
+           _("codec: %s, %u fps, %u ms"), codec, fps, duration);
+  ADD (format, EXTRACTOR_METATYPE_FORMAT);
+  snprintf (format, 
+           sizeof(format), 
+           "%ux%u", width, height);
+  ADD (format, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
+  ADD ("video/x-msvideo", EXTRACTOR_METATYPE_MIMETYPE);
+ FINISH:
+  return ret;
+}

Copied: Extractor/src/plugins/old/tar_extractor.c (from rev 23239, 
Extractor/src/plugins/tar_extractor.c)
===================================================================
--- Extractor/src/plugins/old/tar_extractor.c                           (rev 0)
+++ Extractor/src/plugins/old/tar_extractor.c   2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,855 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003, 2004, 2005, 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"
+
+/*
+ * Note that this code is not complete!
+ *
+ * References:
+ *
+ * http://www.mkssoftware.com/docs/man4/tar.4.asp
+ * (does document USTAR format common nowadays,
+ *  but not other extended formats such as the one produced
+ *  by GNU tar 1.13 when very long filenames are met.)
+ *
+ * http://gd.tuwien.ac.at/utils/archivers/star/README.otherbugs
+ * (J. Schilling's remarks on TAR formats compatibility issues.)
+ */
+
+/*
+ * Define known TAR archive member variants.
+ * In theory different variants
+ * can coexist within a single TAR archive file
+ * although this will be uncommon.
+ */
+#define TAR_V7ORIGINAL_FORMAT    (1)
+#define TAR_V7EXTENDED_FORMAT    (1 << 1)
+#define TAR_SCHILLING1985_FORMAT (1 << 2)
+#define TAR_POSIX1988_FORMAT     (1 << 3)
+#define TAR_GNU1991_FORMAT       (1 << 4)
+#define TAR_SCHILLING1994_FORMAT (1 << 5)
+#define TAR_GNU1997_FORMAT       (1 << 6)
+#define TAR_POSIX2001_FORMAT     (1 << 7)
+#define TAR_SCHILLING2001_FORMAT (1 << 8)
+#define TAR_SOLARIS2001_FORMAT   (1 << 9)
+#define TAR_GNU2004_FORMAT       (1 << 10)
+
+/*
+ * TAR header structure, modelled after POSIX.1-1988
+ */
+typedef struct
+{
+  char fileName[100];
+  char mode[8];
+  char userId[8];
+  char groupId[8];
+  char fileSize[12];
+  char lastModTime[12];
+  char chksum[8];
+  char link;
+  char linkName[100];
+  /*
+   * All fields below are a
+   * either zero-filled or undefined
+   * for UNIX V7 TAR archive members ;
+   * their header is always 512 octets long nevertheless.
+   */
+  char ustarMagic[6];
+  char version[2];
+  char userName[32];
+  char groupName[32];
+  char devMajor[8];
+  char devMinor[8];
+  char prefix[155];
+  char filler[12];
+} TarHeader;
+
+#define TAR_HEADER_SIZE (sizeof(TarHeader))
+#define TAR_TIME_FENCE  ((long long) (-(1LL << 62)))
+
+static size_t
+tar_roundup (size_t size)
+{
+  size_t diff = (size % TAR_HEADER_SIZE);
+
+  return (0 == diff) ? size : (size + (TAR_HEADER_SIZE - diff));
+}
+
+static int
+tar_isnonzero (const char *data, unsigned int length)
+{
+  unsigned int total = 0;
+
+  while (total < length)
+    {
+      if (0 != data[total])
+        return 1;
+      total++;
+    }
+
+  return 0;
+}
+
+static unsigned int
+tar_octalvalue (const char *data, size_t size, unsigned long long *valueptr)
+{
+  unsigned int result = 0;
+
+  if (NULL != data && 0 < size)
+    {
+      const char *p = data;
+      int found = 0;
+      unsigned long long value = 0;
+
+      while ((p < data + size) && (' ' == *p))
+        p += 1;
+
+      while ((p < data + size) && ('0' <= *p) && (*p < '8'))
+        {
+          found = 1;
+          value *= 8;
+          value += (*p - '0');
+          p += 1;
+        }
+
+      if (0 != found)
+        {
+          while ((p < data + size) && ((0 == *p) || (' ' == *p)))
+            p += 1;
+
+          result = (p - data);
+        }
+
+      if ((0 < result) && (NULL != valueptr))
+        *valueptr = value;
+    }
+
+  return result;
+}
+
+#ifndef EOVERFLOW
+#define EOVERFLOW -1
+#endif
+
+static int
+tar_time (long long timeval, char *rtime, unsigned int rsize)
+{
+  int retval = 0;
+
+  /*
+   * shift epoch to proleptic times
+   * to make subsequent modulo operations safer.
+   */
+  long long my_timeval = timeval
+    + ((long long) ((1970 * 365) + 478) * (long long) 86400);
+
+  unsigned int seconds = (unsigned int) (my_timeval % 60);
+  unsigned int minutes = (unsigned int) ((my_timeval / 60) % 60);
+  unsigned int hours = (unsigned int) ((my_timeval / 3600) % 24);
+
+  unsigned int year = 0;
+  unsigned int month = 1;
+
+  unsigned int days = (unsigned int) (my_timeval / (24 * 3600));
+
+  unsigned int days_in_month[] =
+    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+  unsigned int diff = 0;
+
+  if ((long long) 0 > my_timeval)
+    return EDOM;
+
+  /*
+   * 400-year periods
+   */
+  year += (400 * (days / ((365 * 400) + 97)));
+  days %= ((365 * 400) + 97);
+
+  /*
+   * 100-year periods
+   */
+  diff = (days / ((365 * 100) + 24));
+  if (4 <= diff)
+    {
+      year += 399;
+      days = 364;
+    }
+  else
+    {
+      year += (100 * diff);
+      days %= ((365 * 100) + 24);
+    }
+
+  /*
+   * remaining leap years
+   */
+  year += (4 * (days / ((365 * 4) + 1)));
+  days %= ((365 * 4) + 1);
+
+  while (1)
+    {
+      if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
+        {
+          if (366 > days)
+            {
+              break;
+            }
+          else
+            {
+              days -= 366;
+              year++;
+            }
+        }
+      else
+        {
+          if (365 > days)
+            {
+              break;
+            }
+          else
+            {
+              days -= 365;
+              year++;
+            }
+        }
+    }
+
+  if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
+    days_in_month[1] = 29;
+
+  for (month = 0; (month < 12) && (days >= days_in_month[month]); month += 1)
+    days -= days_in_month[month];
+
+  retval = snprintf (rtime, rsize, "%04u-%02u-%02uT%02u:%02u:%02uZ",
+                     year, month + 1, days + 1, hours, minutes, seconds);
+
+  return (retval < rsize) ? 0 : EOVERFLOW;
+}
+
+#define ADD(t,s) do { if (0 != (ret = proc (proc_cls, "tar", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto FINISH; } while 
(0)
+#define ADDF(t,s) do { if (0 != (ret = proc (proc_cls, "tar", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) { free(s); goto 
FINISH; } free (s); } while (0)
+
+int
+EXTRACTOR_tar_extract (const char *data,
+                       size_t size,
+                       EXTRACTOR_MetaDataProcessor proc,
+                       void *proc_cls, const char *options)
+{
+  char *fname = NULL;
+  size_t pos;
+  int contents_are_empty = 1;
+  long long maxftime = TAR_TIME_FENCE;
+  unsigned int format_archive = 0;
+  int ret;
+
+  if (512 != TAR_HEADER_SIZE)
+    return 0;                   /* compiler should remove this when optimising 
*/
+  if (0 != (size % TAR_HEADER_SIZE))
+    return 0;                   /* cannot be tar! */
+  if (size < TAR_HEADER_SIZE)
+    return 0;                   /* too short, or somehow truncated */
+
+  ret = 0;
+  pos = 0;
+  while ((pos + TAR_HEADER_SIZE) <= size)
+    {
+      const TarHeader *tar = NULL;
+      unsigned format_member = 0;
+      unsigned long long fmode;
+      unsigned long long fsize;
+      long long ftime = TAR_TIME_FENCE;
+      char typeFlag = -1;
+      const char *nul_pos;
+      unsigned int tar_prefix_length = 0;
+      unsigned int tar_name_length = 0;
+      unsigned int checksum_offset;
+      int checksum_computed_500s = 0;
+      int checksum_computed_512s = 0;
+      unsigned int checksum_computed_500u = 0;
+      unsigned int checksum_computed_512u = 0;
+      unsigned long long checksum_stored = 0;
+
+      /*
+       * Compute TAR header checksum and compare with stored value.
+       * Allow for non-conformant checksums computed with signed values,
+       * such as those produced by early Solaris tar.
+       * Allow for non-conformant checksums computed on first 500 octets,
+       * such as those produced by SunOS 4.x tar according to J. Schilling.
+       * This will also detect EOF marks, since a zero-filled block
+       * cannot possibly hold octal values.
+       */
+      for (checksum_offset = 0; checksum_offset < 148; checksum_offset += 1)
+        {
+          checksum_computed_500u +=
+            (unsigned char) data[pos + checksum_offset];
+          checksum_computed_500s += (signed char) data[pos + checksum_offset];
+        }
+      if (8 >
+          tar_octalvalue (data + pos + checksum_offset, 8, &checksum_stored))
+        break;
+      for (; checksum_offset < 156; checksum_offset += 1)
+        {
+          checksum_computed_500u += (unsigned char) ' ';
+          checksum_computed_500s += (signed char) ' ';
+        }
+      for (; checksum_offset < 500; checksum_offset += 1)
+        {
+          checksum_computed_500u +=
+            (unsigned char) data[pos + checksum_offset];
+          checksum_computed_500s += (signed char) data[pos + checksum_offset];
+        }
+
+      checksum_computed_512u = checksum_computed_500u;
+      checksum_computed_512s = checksum_computed_500s;
+      for (; checksum_offset < TAR_HEADER_SIZE; checksum_offset += 1)
+        {
+          checksum_computed_512u +=
+            (unsigned char) data[pos + checksum_offset];
+          checksum_computed_512s += (signed char) data[pos + checksum_offset];
+        }
+
+      /*
+       * Suggestion: use signed checksum matches to refine
+       * TAR format detection.
+       */
+      if ((checksum_stored != (unsigned long long) checksum_computed_512u)
+          && (checksum_stored != (unsigned long long) checksum_computed_512s)
+          && (checksum_stored != (unsigned long long) checksum_computed_500s)
+          && (checksum_stored != (unsigned long long) checksum_computed_500u))
+        break;
+
+      tar = (const TarHeader *) &data[pos];
+      typeFlag = tar->link;
+      pos += TAR_HEADER_SIZE;
+
+      /*
+       * Checking all octal fields helps reduce
+       * the possibility of false positives ;
+       * only the file size, time and mode are used for now.
+       *
+       * This will fail over GNU and Schilling TAR huge size fields
+       * using non-octal encodings used for very large file lengths (> 8 GB).
+       */
+      if ((12 > tar_octalvalue (tar->fileSize, 12,
+                                &fsize))
+          || (12 > tar_octalvalue (tar->lastModTime, 12,
+                                   (unsigned long long *) &ftime))
+          || (8 > tar_octalvalue (tar->mode, 8,
+                                  (unsigned long long *) &fmode))
+          || (8 > tar_octalvalue (tar->userId, 8, NULL))
+          || (8 > tar_octalvalue (tar->groupId, 8, NULL)))
+        break;
+
+      /*
+       * Find out which TAR variant is here.
+       */
+      if (0 == memcmp (tar->ustarMagic, "ustar  ", 7))
+        {
+
+          if (' ' == tar->mode[6])
+            format_member = TAR_GNU1991_FORMAT;
+          else if (('K' == typeFlag) || ('L' == typeFlag))
+            {
+              format_member = TAR_GNU1997_FORMAT;
+              ftime = TAR_TIME_FENCE;
+            }
+          else
+            format_member =
+              (((unsigned) fmode) !=
+               (((unsigned) fmode) & 03777)) ? TAR_GNU1997_FORMAT :
+              TAR_GNU2004_FORMAT;
+
+        }
+      else if (0 == memcmp (tar->ustarMagic, "ustar", 6))
+        {
+
+          /*
+           * It is important to perform test for SCHILLING1994 before GNU1997
+           * because certain extension type flags ('L' and 'S' for instance)
+           * are used by both.
+           */
+          if ((0 == tar->prefix[130])
+              && (12 <= tar_octalvalue (tar->prefix + 131, 12, NULL))
+              && (12 <= tar_octalvalue (tar->prefix + 143, 12, NULL))
+              && (0 == tar_isnonzero (tar->filler, 8))
+              && (0 == memcmp (tar->filler + 8, "tar", 4)))
+            {
+
+              format_member = TAR_SCHILLING1994_FORMAT;
+
+            }
+          else if (('D' == typeFlag) || ('K' == typeFlag)
+                   || ('L' == typeFlag) || ('M' == typeFlag)
+                   || ('N' == typeFlag) || ('S' == typeFlag)
+                   || ('V' == typeFlag))
+            {
+
+              format_member = TAR_GNU1997_FORMAT;
+
+            }
+          else if (('g' == typeFlag)
+                   || ('x' == typeFlag) || ('X' == typeFlag))
+            {
+
+              format_member = TAR_POSIX2001_FORMAT;
+              ftime = TAR_TIME_FENCE;
+
+            }
+          else
+            {
+
+              format_member = TAR_POSIX1988_FORMAT;
+
+            }
+        }
+      else if ((0 == memcmp (tar->filler + 8, "tar", 4))
+               && (0 == tar_isnonzero (tar->filler, 8)))
+        {
+
+          format_member = TAR_SCHILLING1985_FORMAT;
+
+        }
+      else if (('0' <= typeFlag) && (typeFlag <= '2'))
+        {
+
+          format_member = TAR_V7ORIGINAL_FORMAT;
+
+        }
+      else
+        {
+
+          format_member = TAR_V7EXTENDED_FORMAT;
+
+        }
+
+      /*
+       * Locate the file names.
+       */
+      if ((0 != (format_member & TAR_POSIX2001_FORMAT))
+         && (('x' == typeFlag) || ('X' == typeFlag)))
+       {
+         
+         if (size <= pos)
+           break;
+         
+         else if ((8 <= fsize) && fsize <= (unsigned long long) (size - pos))
+           {
+             const char *keyptr = data + pos;
+             const char *valptr = NULL;
+             const char *nameptr = NULL;
+             unsigned int keylength = 0;
+             unsigned int namelength = 0;
+             
+             while (keyptr < data + pos + (size_t) fsize)
+               {
+                 if (('0' > *keyptr) || ('9' < *keyptr))
+                   {
+                     keyptr += 1;
+                     continue;
+                   }
+                 
+                 keylength =
+                   (unsigned int) strtoul (keyptr, (char **) &valptr, 10);
+                 if ((0 < keylength) && (NULL != valptr)
+                     && (keyptr != valptr))
+                   {
+                     while ((valptr < data + pos + (size_t) fsize)
+                            && (' ' == *valptr))
+                       valptr += 1;
+                     if (0 == memcmp (valptr, "path=", 5))
+                       {
+                         nameptr = valptr + 5;
+                         namelength = keylength - (nameptr - keyptr);
+                       }
+                     else
+                       {
+                         
+                         if ((keylength > (valptr - keyptr) + 4 + 2)
+                             && (0 == memcmp (valptr, "GNU.", 4)))
+                           format_archive |= TAR_GNU2004_FORMAT;
+                         
+                         else if ((keylength > (valptr - keyptr) + 7 + 2)
+                                  && (0 == memcmp (valptr, "SCHILY.", 7)))
+                           format_archive |= TAR_SCHILLING2001_FORMAT;
+                         
+                         else if ((keylength > (valptr - keyptr) + 4 + 2)
+                                  && (0 == memcmp (valptr, "SUN.", 4)))
+                           format_archive |= TAR_SOLARIS2001_FORMAT;
+                       }
+                     
+                     keyptr += keylength;
+                   }
+                 else
+                   {
+                     nameptr = NULL;
+                     break;
+                   }
+                }
+             
+              if ((NULL != nameptr) && (0 != *nameptr)
+                  && ((size - (nameptr - data)) >= namelength)
+                  && (1 < namelength) )
+                {
+                  /*
+                   * There is an 1-offset because POSIX.1-2001
+                   * field separator is counted in field length.
+                   */
+                 if (fname != NULL)
+                   free (fname);
+                  fname = malloc (namelength);
+                  if (NULL != fname)
+                    {
+                      memcpy (fname, nameptr, namelength - 1);
+                      fname[namelength - 1] = '\0';
+
+                      pos += tar_roundup ((size_t) fsize);
+                      format_archive |= format_member;
+                      continue;
+                    }
+                }
+            }
+        }
+
+      else if ((0 != (format_member
+                      & (TAR_SCHILLING1994_FORMAT
+                         | TAR_GNU1997_FORMAT | TAR_GNU2004_FORMAT)))
+               && ('L' == typeFlag))
+        {
+
+          if (size <= pos)
+            break;
+
+          else if ((0 < fsize) && fsize <= (unsigned long long) (size - pos))
+            {
+
+              size_t length = (size_t) fsize;
+
+              nul_pos = memchr (data + pos, 0, length);
+              if (NULL != nul_pos)
+                length = (nul_pos - (data + pos));
+
+              if (0 < length)
+                {
+                 if (fname != NULL)
+                   free (fname);
+                  fname = malloc (1 + length);
+                  if (NULL != fname)
+                    {
+                      memcpy (fname, data + pos, length);
+                      fname[length] = '\0';
+                    }
+
+                  pos += tar_roundup ((size_t) fsize);
+                  format_archive |= format_member;
+                  continue;
+                }
+            }
+        }
+      else
+        {
+
+          nul_pos = memchr (tar->fileName, 0, sizeof tar->fileName);
+          tar_name_length = (0 == nul_pos)
+            ? sizeof (tar->fileName) : (nul_pos - tar->fileName);
+
+          if ((0 !=
+               (format_member & (TAR_GNU1997_FORMAT | TAR_GNU2004_FORMAT)))
+              && ('S' == typeFlag))
+            {
+
+              if ((0 == tar->prefix[40])
+                  && (0 != tar->prefix[137])
+                  && (12 <= tar_octalvalue (tar->prefix + 41, 12, NULL))
+                  && (12 <= tar_octalvalue (tar->prefix + 53, 12, NULL)))
+                {
+                  /*
+                   * fsize needs adjustment when there are more than 4 sparse 
blocks
+                   */
+                  size_t diffpos = 0;
+                  fsize += TAR_HEADER_SIZE;
+
+                  while ((pos + diffpos + TAR_HEADER_SIZE < size)
+                         && (0 != *(data + pos + diffpos + 504)))
+                    {
+                      diffpos += TAR_HEADER_SIZE;
+                      fsize += TAR_HEADER_SIZE;
+                    }
+                }
+
+              typeFlag = '0';
+
+            }
+          else if (0 != (format_member & TAR_SCHILLING1994_FORMAT))
+            {
+
+              nul_pos = memchr (tar->prefix, 0, 130);
+              tar_prefix_length = (0 == nul_pos)
+                ? 130 : (nul_pos - tar->prefix);
+
+              if ('S' == typeFlag)
+                typeFlag = '0';
+
+            }
+          else if (0 != (format_member & TAR_SCHILLING1985_FORMAT))
+            {
+
+              nul_pos = memchr (tar->prefix, 0, 155);
+              tar_prefix_length = (0 == nul_pos)
+                ? 155 : (nul_pos - tar->prefix);
+
+
+              if ('S' == typeFlag)
+                typeFlag = '0';
+
+            }
+          else if (0 != (format_member & TAR_POSIX1988_FORMAT))
+            {
+
+              nul_pos = memchr (tar->prefix, 0, sizeof tar->prefix);
+              tar_prefix_length = (0 == nul_pos)
+                ? sizeof tar->prefix : nul_pos - tar->prefix;
+
+            }
+        }
+
+      /*
+       * Update position so that next loop iteration will find
+       * either a TAR header or TAR EOF mark or just EOF.
+       *
+       * Consider archive member size to be zero
+       * with no data following the header in the following cases :
+       * '1' : hard link, '2' : soft link,
+       * '3' : character device, '4' : block device,
+       * '5' : directory, '6' : named pipe.
+       */
+      if ('1' != typeFlag && '2' != typeFlag
+          && '3' != typeFlag && '4' != typeFlag
+          && '5' != typeFlag && '6' != typeFlag)
+        {
+          if ((fsize > (unsigned long long) size)
+              || (fsize + (unsigned long long) pos >
+                  (unsigned long long) size))
+            break;
+
+          pos += tar_roundup ((size_t) fsize);
+        }
+      if (pos - 1 > size)
+        break;
+
+      format_archive |= format_member;
+
+      /*
+       * Store the file name in libextractor list.
+       *
+       * For the time being, only file types listed in POSIX.1-1988 ('0'..'7')
+       * are retained, leaving out labels, access control lists, etc.
+       */
+      if ((0 == typeFlag) || (('0' <= typeFlag) && (typeFlag <= '7')))
+        {
+          if (NULL == fname)
+            {
+              if (0 < tar_prefix_length + tar_name_length)
+                {
+                  fname = malloc (2 + tar_prefix_length + tar_name_length);
+
+                  if (NULL != fname)
+                    {
+                      if (0 < tar_prefix_length)
+                        {
+                          memcpy (fname, tar->prefix, tar_prefix_length);
+
+                          if (('/' != tar->prefix[tar_prefix_length - 1])
+                              && (0 < tar_name_length)
+                              && ('/' != tar->fileName[0]))
+                            {
+                              fname[tar_prefix_length] = '/';
+                              tar_prefix_length += 1;
+                            }
+                        }
+
+                      if (0 < tar_name_length)
+                        memcpy (fname + tar_prefix_length, tar->fileName,
+                                tar_name_length);
+
+                      fname[tar_prefix_length + tar_name_length] = '\0';
+                    }
+                }
+            }
+
+          if ((NULL != fname) && (0 != *fname))
+            {
+#if 0
+              fprintf (stdout,
+                       "(%u) flag = %c, size = %u, tname = (%s), fname = 
(%s)\n",
+                       __LINE__, typeFlag, (unsigned int) fsize,
+                       (NULL == tar->fileName) ? "" : tar->fileName,
+                       (NULL == fname) ? "" : fname);
+#endif
+
+              ADDF (EXTRACTOR_METATYPE_FILENAME, fname);
+              fname = NULL;
+              if (ftime > maxftime)
+                maxftime = ftime;
+              contents_are_empty = 0;
+            }
+        }
+
+      if (NULL != fname)
+        {
+          free (fname);
+          fname = NULL;
+        }
+    }
+
+  if (NULL != fname)
+    {
+      free (fname);
+      fname = NULL;
+    }
+
+  /*
+   * Report mimetype; report also format(s) and most recent date
+   * when at least one archive member was found.
+   */
+  if (0 == format_archive)
+    return ret;
+  if (0 == contents_are_empty)
+    {
+
+      const char *formats[5] = { NULL, NULL, NULL, NULL, NULL };
+      unsigned int formats_count = 0;
+      unsigned int formats_u = 0;
+      unsigned int format_length = 0;
+      char *format = NULL;
+
+      if (TAR_TIME_FENCE < maxftime)
+        {
+          char iso8601_time[24];
+
+          if (0 == tar_time (maxftime, iso8601_time, sizeof (iso8601_time)))
+            ADD (EXTRACTOR_METATYPE_CREATION_DATE, iso8601_time);
+        }
+
+      /*
+       * We only keep the most recent POSIX format.
+       */
+      if (0 != (format_archive & TAR_POSIX2001_FORMAT))
+        formats[formats_count++] = "POSIX 2001";
+
+      else if (0 != (format_archive & TAR_POSIX1988_FORMAT))
+        formats[formats_count++] = "POSIX 1988";
+
+      /*
+       * We only keep the most recent GNU format.
+       */
+      if (0 != (format_archive & TAR_GNU2004_FORMAT))
+        formats[formats_count++] = "GNU 2004";
+
+      else if (0 != (format_archive & TAR_GNU1997_FORMAT))
+        formats[formats_count++] = "GNU 1997";
+
+      else if (0 != (format_archive & TAR_GNU1991_FORMAT))
+        formats[formats_count++] = "GNU 1991";
+
+      /*
+       * We only keep the most recent Schilling format.
+       */
+      if (0 != (format_archive & TAR_SCHILLING2001_FORMAT))
+        formats[formats_count++] = "Schilling 2001";
+
+      else if (0 != (format_archive & TAR_SCHILLING1994_FORMAT))
+        formats[formats_count++] = "Schilling 1994";
+
+      else if (0 != (format_archive & TAR_SCHILLING1985_FORMAT))
+        formats[formats_count++] = "Schilling 1985";
+
+      /*
+       * We only keep the most recent Solaris format.
+       */
+      if (0 != (format_archive & TAR_SOLARIS2001_FORMAT))
+        formats[formats_count++] = "Solaris 2001";
+
+      /*
+       * We only keep the (supposedly) most recent UNIX V7 format.
+       */
+      if (0 != (format_archive & TAR_V7EXTENDED_FORMAT))
+        formats[formats_count++] = "UNIX extended V7";
+
+      else if (0 != (format_archive & TAR_V7ORIGINAL_FORMAT))
+        formats[formats_count++] = "UNIX original V7";
+
+      /*
+       * Build the format string
+       */
+      for (formats_u = 0; formats_u < formats_count; formats_u += 1)
+        {
+          if ((NULL != formats[formats_u]) && (0 != *formats[formats_u]))
+            {
+              if (0 < format_length)
+                format_length += 3;
+              format_length += strlen (formats[formats_u]);
+            }
+        }
+
+      if (0 < format_length)
+        {
+         if (fname != NULL)
+           free (fname);
+          format = malloc (format_length + 5);
+
+          if (NULL != format)
+            {
+
+              format_length = 0;
+
+              for (formats_u = 0; formats_u < formats_count; formats_u += 1)
+                {
+                  if ((NULL != formats[formats_u])
+                      && (0 != *formats[formats_u]))
+                    {
+                      if (0 < format_length)
+                        {
+                          strcpy (format + format_length, " + ");
+                          format_length += 3;
+                        }
+                      strcpy (format + format_length, formats[formats_u]);
+                      format_length += strlen (formats[formats_u]);
+                    }
+                }
+
+              if (0 < format_length)
+                {
+                  strcpy (format + format_length, " TAR");
+                  ADDF (EXTRACTOR_METATYPE_FORMAT_VERSION, format);
+                }
+              else
+                {
+                  free (format);
+                }
+            }
+        }
+    }
+
+  ADD (EXTRACTOR_METATYPE_MIMETYPE, "application/x-tar");
+FINISH:
+  return ret;
+}

Copied: Extractor/src/plugins/old/thumbnailffmpeg_extractor.c (from rev 23239, 
Extractor/src/plugins/thumbnailffmpeg_extractor.c)
===================================================================
--- Extractor/src/plugins/old/thumbnailffmpeg_extractor.c                       
        (rev 0)
+++ Extractor/src/plugins/old/thumbnailffmpeg_extractor.c       2012-08-14 
23:02:49 UTC (rev 23241)
@@ -0,0 +1,655 @@
+/*
+     This file is part of libextractor.
+     Copyright (C) 2008 Heikki Lindholm
+
+     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.
+ */
+
+/**
+ * @file thumbnailffmpeg_extractor.c
+ * @author Heikki Lindholm
+ * @brief this extractor produces a binary encoded
+ * thumbnail of images and videos using the ffmpeg libs.
+ */
+
+/* This is a thumbnail extractor using the ffmpeg libraries that will 
eventually
+   support extracting thumbnails from both image and video files. 
+
+   Note that ffmpeg has a few issues:
+   (1) there are no recent official releases of the ffmpeg libs
+   (2) ffmpeg has a history of having security issues (parser is not robust)
+
+   So this plugin cannot be recommended for system with high security
+   requirements. 
+*/
+
+#include "platform.h"
+#include "extractor.h"
+#if HAVE_LIBAVUTIL_AVUTIL_H
+#include <libavutil/avutil.h>
+#elif HAVE_FFMPEG_AVUTIL_H
+#include <ffmpeg/avutil.h>
+#endif
+#if HAVE_LIBAVFORMAT_AVFORMAT_H
+#include <libavformat/avformat.h>
+#elif HAVE_FFMPEG_AVFORMAT_H
+#include <ffmpeg/avformat.h>
+#endif
+#if HAVE_LIBAVCODEC_AVCODEC_H
+#include <libavcodec/avcodec.h>
+#elif HAVE_FFMPEG_AVCODEC_H
+#include <ffmpeg/avcodec.h>
+#endif
+#if HAVE_LIBSWSCALE_SWSCALE_H
+#include <libswscale/swscale.h>
+#elif HAVE_FFMPEG_SWSCALE_H
+#include <ffmpeg/swscale.h>
+#endif
+
+#include "mime_extractor.c" /* TODO: do this cleaner */
+
+#define DEBUG 0
+
+static void thumbnailffmpeg_av_log_callback(void* ptr, 
+                                            int level,
+                                            const char *format,
+                                            va_list ap)
+{
+#if DEBUG
+  vfprintf(stderr, format, ap);
+#endif
+}
+
+void __attribute__ ((constructor)) ffmpeg_lib_init (void)
+{
+  av_log_set_callback (thumbnailffmpeg_av_log_callback);
+  av_register_all ();
+}
+
+#define MAX_THUMB_DIMENSION 128         /* max dimension in pixels */
+#define MAX_THUMB_BYTES (100*1024)
+
+/*
+ * Rescale and encode a PNG thumbnail
+ * on success, fills in output_data and returns the number of bytes used
+ */
+static size_t create_thumbnail(
+  int src_width, int src_height, int src_stride[],
+  enum PixelFormat src_pixfmt, const uint8_t * const src_data[],
+  int dst_width, int dst_height,
+  uint8_t **output_data, size_t output_max_size)
+{
+  AVCodecContext *encoder_codec_ctx = NULL;
+  AVCodec *encoder_codec = NULL;
+  struct SwsContext *scaler_ctx = NULL;
+  int sws_flags = SWS_BILINEAR;
+  AVFrame *dst_frame = NULL;
+  uint8_t *dst_buffer = NULL;
+  uint8_t *encoder_output_buffer = NULL;
+  size_t encoder_output_buffer_size;
+  int err;
+
+  encoder_codec = avcodec_find_encoder_by_name ("png");
+  if (encoder_codec == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+              "Couldn't find a PNG encoder\n");
+#endif
+      return 0;
+    }
+
+  /* NOTE: the scaler will be used even if the src and dst image dimensions
+   * match, because the scaler will also perform colour space conversion */
+  scaler_ctx =
+    sws_getContext (src_width, src_height, src_pixfmt,
+                    dst_width, dst_height, PIX_FMT_RGB24, 
+                    sws_flags, NULL, NULL, NULL);
+  if (scaler_ctx == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to get a scaler context\n");
+#endif
+      return 0;
+    }
+
+  dst_frame = avcodec_alloc_frame ();
+  if (dst_frame == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate the destination image frame\n");
+#endif
+      sws_freeContext(scaler_ctx);
+      return 0;
+    }
+  dst_buffer =
+    av_malloc (avpicture_get_size (PIX_FMT_RGB24, dst_width, dst_height));
+  if (dst_buffer == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate the destination image buffer\n");
+#endif
+      av_free (dst_frame);
+      sws_freeContext(scaler_ctx);
+      return 0;
+    }
+  avpicture_fill ((AVPicture *) dst_frame, dst_buffer,
+                  PIX_FMT_RGB24, dst_width, dst_height);
+      
+  sws_scale (scaler_ctx,
+             src_data, 
+             src_stride,
+             0, src_height, 
+             dst_frame->data, 
+             dst_frame->linesize);
+
+  encoder_output_buffer_size = output_max_size;
+  encoder_output_buffer = av_malloc (encoder_output_buffer_size);
+  if (encoder_output_buffer == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate the encoder output buffer\n");
+#endif
+      av_free (dst_buffer);
+      av_free (dst_frame);
+      sws_freeContext(scaler_ctx);
+      return 0;
+    }
+
+  encoder_codec_ctx = avcodec_alloc_context ();
+  if (encoder_codec_ctx == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate the encoder codec context\n");
+#endif
+      av_free (encoder_output_buffer);
+      av_free (dst_buffer);
+      av_free (dst_frame);
+      sws_freeContext(scaler_ctx);
+      return 0;
+    }
+  encoder_codec_ctx->width = dst_width;
+  encoder_codec_ctx->height = dst_height;
+  encoder_codec_ctx->pix_fmt = PIX_FMT_RGB24;
+
+  if (avcodec_open (encoder_codec_ctx, encoder_codec) < 0)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to open the encoder\n");
+#endif
+      av_free (encoder_codec_ctx);
+      av_free (encoder_output_buffer);
+      av_free (dst_buffer);
+      av_free (dst_frame);
+      sws_freeContext(scaler_ctx);
+      return 0;
+    }
+
+  err = avcodec_encode_video (encoder_codec_ctx,
+                              encoder_output_buffer,
+                              encoder_output_buffer_size, dst_frame);
+
+  avcodec_close (encoder_codec_ctx);
+  av_free (encoder_codec_ctx);
+  av_free (dst_buffer);
+  av_free (dst_frame);
+  sws_freeContext(scaler_ctx);
+
+  *output_data = encoder_output_buffer;
+
+  return err < 0 ? 0 : err;
+}
+
+struct MIMEToDecoderMapping
+{
+ const char *mime_type;
+ enum CodecID codec_id;
+};
+
+/* map MIME image types to an ffmpeg decoder */
+static const struct MIMEToDecoderMapping m2d_map[] = {
+  {"image/x-bmp", CODEC_ID_BMP},
+  {"image/gif", CODEC_ID_GIF},
+  {"image/jpeg", CODEC_ID_MJPEG},
+  {"image/png", CODEC_ID_PNG},
+  {"image/x-png", CODEC_ID_PNG},
+  {"image/x-portable-pixmap", CODEC_ID_PPM},
+  {NULL, CODEC_ID_NONE}
+};
+
+static char *mime_type;
+
+static int
+mime_processor (void *cls,
+                        const char *plugin_name,
+                        enum EXTRACTOR_MetaType type,
+                        enum EXTRACTOR_MetaFormat format,
+                        const char *data_mime_type,
+                        const char *data,
+                        size_t data_len)
+{ 
+  switch (format)
+    {
+    case EXTRACTOR_METAFORMAT_UTF8:
+      mime_type = strdup(data);
+      break;
+    default:
+      break;
+    }
+  return 0;
+}
+
+/* calculate the thumbnail dimensions, taking pixel aspect into account */
+static void calculate_thumbnail_dimensions(int src_width,
+                                           int src_height,
+                                           int src_sar_num,
+                                           int src_sar_den,
+                                           int *dst_width,
+                                           int *dst_height)
+{
+  if (src_sar_num <= 0 || src_sar_den <= 0)
+    {
+      src_sar_num = 1;
+      src_sar_den = 1;
+    }
+  if ((src_width * src_sar_num) / src_sar_den > src_height)
+    {
+      *dst_width = MAX_THUMB_DIMENSION;
+      *dst_height = (*dst_width * src_height) /
+                     ((src_width * src_sar_num) / src_sar_den);
+    }
+  else
+    {
+      *dst_height = MAX_THUMB_DIMENSION;
+      *dst_width = (*dst_height *
+                    ((src_width * src_sar_num) / src_sar_den)) /
+                    src_height;
+    }
+  if (*dst_width < 8)
+    *dst_width = 8;
+  if (*dst_height < 1)
+    *dst_height = 1;
+#if DEBUG
+  fprintf (stderr,
+           "Thumbnail dimensions: %d %d\n", 
+           *dst_width, *dst_height);
+#endif
+}
+
+static int 
+extract_image (enum CodecID image_codec_id,
+               const unsigned char *data,
+               size_t size,
+               EXTRACTOR_MetaDataProcessor proc,
+               void *proc_cls,
+               const char *options)
+{
+  AVCodecContext *codec_ctx;
+  AVCodec *codec = NULL;
+  AVFrame *frame = NULL;
+  uint8_t *encoded_thumbnail;
+  int thumb_width;
+  int thumb_height;
+  int err;
+  int frame_finished;
+  int ret = 0;
+
+  codec_ctx = avcodec_alloc_context ();
+  if (codec_ctx == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate codec context\n");
+#endif
+      return 0;
+    }
+
+  codec = avcodec_find_decoder (image_codec_id);
+  if (codec != NULL)
+    {
+      if (avcodec_open (codec_ctx, codec) != 0)
+        {
+#if DEBUG
+          fprintf (stderr,
+                   "Failed to open image codec\n");
+#endif
+          av_free (codec_ctx);
+          return 0;
+        }
+    }
+  else
+    {
+#if DEBUG
+      fprintf (stderr,
+               "No suitable codec found\n");
+#endif
+      av_free (codec_ctx);
+      return 0;
+    }
+
+  frame = avcodec_alloc_frame ();
+  if (frame == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate frame\n");
+#endif
+      avcodec_close (codec_ctx);
+      av_free (codec_ctx);
+      return 0;
+    }
+
+  avcodec_decode_video (codec_ctx, frame, &frame_finished, data, size);
+
+  if (!frame_finished)
+    {
+      fprintf (stderr,
+              "Failed to decode a complete frame\n");
+      av_free (frame);
+      avcodec_close (codec_ctx);
+      av_free (codec_ctx);
+      return 0;
+    }
+
+  calculate_thumbnail_dimensions (codec_ctx->width, codec_ctx->height,
+                                  codec_ctx->sample_aspect_ratio.num,
+                                  codec_ctx->sample_aspect_ratio.den,
+                                  &thumb_width, &thumb_height);
+
+  err = create_thumbnail (codec_ctx->width, codec_ctx->height,
+                          frame->linesize, codec_ctx->pix_fmt, 
+                         (const uint8_t * const*) frame->data,
+                          thumb_width, thumb_height,
+                          &encoded_thumbnail, MAX_THUMB_BYTES);
+
+  if (err > 0)
+    {
+      ret = proc (proc_cls,
+                  "thumbnailffmpeg",
+                  EXTRACTOR_METATYPE_THUMBNAIL,
+                  EXTRACTOR_METAFORMAT_BINARY,
+                  "image/png",
+                  (const char*) encoded_thumbnail,
+                  err);
+      av_free (encoded_thumbnail);
+    }
+
+  av_free (frame);
+  avcodec_close (codec_ctx);
+  av_free (codec_ctx);
+  return ret;
+}
+
+static int 
+extract_video (const unsigned char *data,
+               size_t size,
+               EXTRACTOR_MetaDataProcessor proc,
+               void *proc_cls,
+               const char *options)
+{
+  AVProbeData pd; 
+  AVPacket packet;
+  AVInputFormat *input_format;
+  int input_format_nofileflag;
+  ByteIOContext *bio_ctx;
+  struct AVFormatContext *format_ctx;
+  AVCodecContext *codec_ctx;
+  AVCodec *codec = NULL;
+  AVFrame *frame = NULL;
+  uint8_t *encoded_thumbnail;
+  int video_stream_index = -1;
+  int thumb_width;
+  int thumb_height;
+  int i;
+  int err;
+  int frame_finished;
+  int ret = 0;
+
+#if DEBUG
+  fprintf (stderr,
+          "ffmpeg starting\n");
+#endif
+  /* probe format
+   * initial try with a smaller probe size for efficiency */
+  pd.filename = "";
+  pd.buf = (void *) data; 
+  pd.buf_size = 128*1024 > size ? size : 128*1024;
+RETRY_PROBE: 
+  if (NULL == (input_format = av_probe_input_format(&pd, 1))) 
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to probe input format\n");
+#endif
+      if (pd.buf_size != size) /* retry probe once with full data size */
+        {
+          pd.buf_size = size;
+          goto RETRY_PROBE;
+        }
+      return 0;
+    }
+  input_format_nofileflag = input_format->flags & AVFMT_NOFILE;
+  input_format->flags |= AVFMT_NOFILE;
+  bio_ctx = NULL; 
+  pd.buf_size = size;
+  url_open_buf(&bio_ctx, pd.buf, pd.buf_size, URL_RDONLY);
+  bio_ctx->is_streamed = 1;  
+  if ((av_open_input_stream(&format_ctx, bio_ctx, pd.filename, input_format, 
NULL)) < 0)
+    {
+ #if DEBUG
+      fprintf (stderr,
+               "Failed to open input stream\n");
+#endif
+      url_close_buf (bio_ctx);
+      if (!input_format_nofileflag)
+        input_format->flags ^= AVFMT_NOFILE;
+      return 0;
+    }
+  if (0 > av_find_stream_info (format_ctx))
+    {
+ #if DEBUG
+      fprintf (stderr,
+               "Failed to read stream info\n");
+#endif
+      av_close_input_stream (format_ctx);
+      url_close_buf (bio_ctx);
+      if (!input_format_nofileflag)
+        input_format->flags ^= AVFMT_NOFILE;
+      return 0;
+    }
+
+  codec_ctx = NULL;
+  for (i=0; i<format_ctx->nb_streams; i++)
+    {
+      codec_ctx = format_ctx->streams[i]->codec;
+      if (codec_ctx->codec_type != CODEC_TYPE_VIDEO)
+        continue;
+      codec = avcodec_find_decoder (codec_ctx->codec_id);
+      if (codec == NULL)
+        continue;
+      err = avcodec_open (codec_ctx, codec);
+      if (err != 0)
+        {
+          codec = NULL;
+          continue;
+        }
+      video_stream_index = i;
+      break;
+    }
+
+  if ( (video_stream_index == -1) ||
+       (codec_ctx->width == 0) || 
+       (codec_ctx->height == 0) )
+    {
+#if DEBUG
+      fprintf (stderr,
+               "No video streams or no suitable codec found\n");
+#endif
+      if (codec != NULL)
+        avcodec_close (codec_ctx);
+      av_close_input_stream (format_ctx);
+      url_close_buf (bio_ctx);
+      if (!input_format_nofileflag)
+        input_format->flags ^= AVFMT_NOFILE;
+      return 0;
+    }
+
+  frame = avcodec_alloc_frame ();
+  if (frame == NULL)
+    {
+#if DEBUG
+      fprintf (stderr,
+               "Failed to allocate frame\n");
+#endif
+      avcodec_close (codec_ctx);
+      av_close_input_stream (format_ctx);
+      url_close_buf (bio_ctx);
+      if (!input_format_nofileflag)
+        input_format->flags ^= AVFMT_NOFILE;
+      return 0;
+    }
+#if DEBUG
+  if (format_ctx->duration == AV_NOPTS_VALUE)
+    fprintf (stderr,
+            "Duration unknown\n");
+  else
+    fprintf (stderr,
+            "Duration: %lld\n", 
+            format_ctx->duration);      
+#endif
+  /* TODO: if duration is known, seek to some better place,
+   * but use 10 sec into stream for now */
+  err = av_seek_frame (format_ctx, -1, 10 * AV_TIME_BASE, 0);
+  if (err >= 0)        
+    avcodec_flush_buffers (codec_ctx);        
+  frame_finished = 0;
+
+  while (1)
+    {
+      err = av_read_frame (format_ctx, &packet);
+      if (err < 0)
+        break;
+      if (packet.stream_index == video_stream_index)
+        {
+          avcodec_decode_video (codec_ctx,
+                                frame,
+                                &frame_finished,
+                                packet.data, packet.size);
+          if (frame_finished && frame->key_frame)
+            {
+              av_free_packet (&packet);
+              break;
+            }
+        }
+      av_free_packet (&packet);
+    }
+  if (!frame_finished)
+    {
+      fprintf (stderr,
+              "Failed to decode a complete frame\n");
+      av_free (frame);
+      avcodec_close (codec_ctx);
+      av_close_input_stream (format_ctx);
+      url_close_buf (bio_ctx);
+      if (!input_format_nofileflag)
+        input_format->flags ^= AVFMT_NOFILE;
+      return 0;
+    }
+
+  calculate_thumbnail_dimensions (codec_ctx->width, codec_ctx->height,
+                                  codec_ctx->sample_aspect_ratio.num,
+                                  codec_ctx->sample_aspect_ratio.den,
+                                  &thumb_width, &thumb_height);
+
+  err = create_thumbnail (codec_ctx->width, codec_ctx->height,
+                          frame->linesize, codec_ctx->pix_fmt,
+                         (const uint8_t* const *) frame->data,
+                          thumb_width, thumb_height,
+                          &encoded_thumbnail, MAX_THUMB_BYTES);
+
+  if (err > 0)
+    {
+      ret = proc (proc_cls,
+                  "thumbnailffmpeg",
+                  EXTRACTOR_METATYPE_THUMBNAIL,
+                  EXTRACTOR_METAFORMAT_BINARY,
+                  "image/png",
+                  (const char*) encoded_thumbnail,
+                  err);
+      av_free (encoded_thumbnail);
+    }
+
+  av_free (frame);
+  avcodec_close (codec_ctx);
+  av_close_input_stream (format_ctx);
+  url_close_buf (bio_ctx);
+  if (!input_format_nofileflag)
+    input_format->flags ^= AVFMT_NOFILE;
+  return ret;
+}
+
+int 
+EXTRACTOR_thumbnailffmpeg_extract (const unsigned char *data,
+                                  size_t size,
+                                  EXTRACTOR_MetaDataProcessor proc,
+                                  void *proc_cls,
+                                  const char *options)
+{
+  enum CodecID image_codec_id;
+  int is_image = 0;
+  int i;
+
+  mime_type = NULL;
+  EXTRACTOR_mime_extract((const char*) data, size, mime_processor, NULL, NULL);
+  if (mime_type != NULL) 
+    {
+      i = 0;
+      while (m2d_map[i].mime_type != NULL)
+        {
+          if (!strcmp (m2d_map[i].mime_type, mime_type))
+            {
+              is_image = 1;
+              image_codec_id = m2d_map[i].codec_id;
+              break;
+            }
+          i++;
+        }
+      free(mime_type);
+    }
+
+  if (is_image)
+    return extract_image (image_codec_id, data, size, proc, proc_cls, options);
+  else
+    return extract_video (data, size, proc, proc_cls, options);
+}
+
+int 
+EXTRACTOR_thumbnail_extract (const unsigned char *data,
+                            size_t size,
+                            EXTRACTOR_MetaDataProcessor proc,
+                            void *proc_cls,
+                            const char *options)
+{
+  return EXTRACTOR_thumbnailffmpeg_extract (data, size, proc, proc_cls, 
options);
+}
+
+/* end of thumbnailffmpeg_extractor.c */

Copied: Extractor/src/plugins/old/thumbnailgtk_extractor.c (from rev 23239, 
Extractor/src/plugins/thumbnailgtk_extractor.c)
===================================================================
--- Extractor/src/plugins/old/thumbnailgtk_extractor.c                          
(rev 0)
+++ Extractor/src/plugins/old/thumbnailgtk_extractor.c  2012-08-14 23:02:49 UTC 
(rev 23241)
@@ -0,0 +1,162 @@
+/*
+     This file is part of libextractor.
+     (C) 2005, 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.
+ */
+
+/**
+ * @file thumbnailextractor.c
+ * @author Christian Grothoff
+ * @brief this extractor produces a binary (!) encoded
+ * thumbnail of images (using gdk pixbuf).  The bottom
+ * of the file includes a decoder method that can be used
+ * to reproduce the 128x128 PNG thumbnails.
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include <glib.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#define THUMBSIZE 128
+
+/* using libgobject, needs init! */
+void __attribute__ ((constructor)) ole_gobject_init ()
+{
+  g_type_init ();
+}
+
+
+const char *
+EXTRACTOR_thumbnailgtk_options ()
+{
+  /* 
+     Since the Gnome developers think that being unable to
+     unload plugins is an 'acceptable' limitation, we
+     require out-of-process execution for plugins depending
+     on libgsf and other glib-based plugins.
+     See also https://bugzilla.gnome.org/show_bug.cgi?id=374940 
+  */
+  return "oop-only"; 
+}
+
+
+int 
+EXTRACTOR_thumbnailgtk_extract (const char *data,
+                               size_t size,
+                               EXTRACTOR_MetaDataProcessor proc,
+                               void *proc_cls,
+                               const char *options)
+{
+  GdkPixbufLoader *loader;
+  GdkPixbuf *in;
+  GdkPixbuf *out;
+  size_t length;
+  char *thumb;
+  unsigned long width;
+  unsigned long height;
+  char format[64];
+  int ret;
+
+  loader = gdk_pixbuf_loader_new ();
+  gdk_pixbuf_loader_write (loader, 
+                          (const unsigned char*) data, 
+                          size, NULL);
+  in = gdk_pixbuf_loader_get_pixbuf (loader);
+  gdk_pixbuf_loader_close (loader, NULL);
+  if (in == NULL)
+    {
+      g_object_unref (loader);
+      return 0;
+    }
+  g_object_ref (in);
+  g_object_unref (loader);
+  height = gdk_pixbuf_get_height (in);
+  width = gdk_pixbuf_get_width (in);
+  snprintf (format, 
+           sizeof(format),
+           "%ux%u",
+           (unsigned int) width, 
+           (unsigned int) height);
+  if (0 != proc (proc_cls,
+                "thumbnailgtk",
+                EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
+                EXTRACTOR_METAFORMAT_UTF8,
+                "text/plain",
+                format,
+                strlen (format) + 1))
+    {
+      g_object_unref (in);
+      return 1;
+    }
+  if ((height <= THUMBSIZE) && (width <= THUMBSIZE))
+    {
+      g_object_unref (in);
+      return 0;
+    }
+  if (height > THUMBSIZE)
+    {
+      width = width * THUMBSIZE / height;
+      height = THUMBSIZE;
+    }
+  if (width > THUMBSIZE)
+    {
+      height = height * THUMBSIZE / width;
+      width = THUMBSIZE;
+    }
+  if ( (height == 0) || (width == 0) )
+    {
+      g_object_unref (in);
+      return 0;
+    }
+  out = gdk_pixbuf_scale_simple (in, width, height, GDK_INTERP_BILINEAR);
+  g_object_unref (in);
+  thumb = NULL;
+  length = 0;
+  if (out == NULL)
+    return 0;
+  if (!gdk_pixbuf_save_to_buffer (out, &thumb, &length, "png", NULL, 
+                                 "compression", "9", NULL))
+    {
+      g_object_unref (out);
+      return 0;
+    }
+  g_object_unref (out);
+  if (thumb == NULL)
+    return 0;
+  ret = proc (proc_cls,
+             "thumbnailgtk",
+             EXTRACTOR_METATYPE_THUMBNAIL,
+             EXTRACTOR_METAFORMAT_BINARY,
+             "image/png",
+             thumb, length);  
+  free (thumb);
+  return ret;
+}
+
+int 
+EXTRACTOR_thumbnail_extract (const char *data,
+                            size_t size,
+                            EXTRACTOR_MetaDataProcessor proc,
+                            void *proc_cls,
+                            const char *options)
+{
+  return EXTRACTOR_thumbnailgtk_extract (data, size, proc, proc_cls, options);
+}
+
+
+/* end of thumbnailgtk_extractor.c */

Copied: Extractor/src/plugins/old/tiff_extractor.c (from rev 23239, 
Extractor/src/plugins/tiff_extractor.c)
===================================================================
--- Extractor/src/plugins/old/tiff_extractor.c                          (rev 0)
+++ Extractor/src/plugins/old/tiff_extractor.c  2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,262 @@
+/*
+     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.
+ */
+
+#include "platform.h"
+#include "extractor.h"
+#include "pack.h"
+
+#define DEBUG 0
+
+static int
+addKeyword (EXTRACTOR_MetaDataProcessor proc,
+           void *proc_cls,
+            const char *keyword, 
+           enum EXTRACTOR_MetaType type)
+{
+  if (keyword == NULL)
+    return 0;
+  return proc (proc_cls,
+              "tiff",
+              type,
+              EXTRACTOR_METAFORMAT_UTF8,
+              "text/plain",
+              keyword,
+              strlen(keyword)+1);
+}
+
+typedef struct
+{
+  unsigned short byteorder;
+  unsigned short fourty_two;
+  unsigned int ifd_offset;
+} TIFF_HEADER;
+#define TIFF_HEADER_SIZE 8
+#define TIFF_HEADER_FIELDS(p) \
+  &(p)->byteorder,           \
+    &(p)->fourty_two,        \
+    &(p)->ifd_offset
+static char *TIFF_HEADER_SPECS[] = {
+  "hhw",
+  "HHW",
+};
+
+typedef struct
+{
+  unsigned short tag;
+  unsigned short type;
+  unsigned int count;
+  unsigned int value_or_offset;
+} DIRECTORY_ENTRY;
+#define DIRECTORY_ENTRY_SIZE 12
+#define DIRECTORY_ENTRY_FIELDS(p)              \
+  &(p)->tag,                                   \
+    &(p)->type,                                        \
+    &(p)->count,                               \
+    &(p)->value_or_offset
+static char *DIRECTORY_ENTRY_SPECS[] = {
+  "hhww",
+  "HHWW"
+};
+
+#define TAG_LENGTH 0x101
+#define TAG_WIDTH 0x100
+#define TAG_SOFTWARE 0x131
+#define TAG_DAYTIME 0x132
+#define TAG_ARTIST 0x315
+#define TAG_COPYRIGHT 0x8298
+#define TAG_DESCRIPTION 0x10E
+#define TAG_DOCUMENT_NAME 0x10D
+#define TAG_HOST 0x13C
+#define TAG_SCANNER 0x110
+#define TAG_ORIENTATION 0x112
+
+#define TYPE_BYTE 1
+#define TYPE_ASCII 2
+#define TYPE_SHORT 3
+#define TYPE_LONG 4
+#define TYPE_RATIONAL 5
+
+static int
+addASCII (EXTRACTOR_MetaDataProcessor proc,
+         void *proc_cls,
+          const char *data,
+          size_t size, DIRECTORY_ENTRY * entry,
+         enum EXTRACTOR_MetaType type)
+{
+  if (entry->count > size)
+    return 0;                     /* invalid! */
+  if (entry->type != TYPE_ASCII)
+    return 0;                     /* huh? */
+  if (entry->count + entry->value_or_offset > size)
+    return 0;
+  if (data[entry->value_or_offset + entry->count - 1] != 0)
+    return 0;
+  return addKeyword (proc, proc_cls,
+                    &data[entry->value_or_offset], type);
+}
+
+
+int 
+EXTRACTOR_tiff_extract (const char *data,
+                       size_t size,
+                       EXTRACTOR_MetaDataProcessor proc,
+                       void *proc_cls,
+                       const char *options)
+{
+  TIFF_HEADER hdr;
+  int byteOrder;                /* 0: do not convert;
+                                   1: do convert */
+  unsigned int current_ifd;
+  unsigned int length = -1;
+  unsigned int width = -1;
+
+  if (size < TIFF_HEADER_SIZE)
+    return 0;                /*  can not be tiff */
+  if ((data[0] == 0x49) && (data[1] == 0x49))
+    byteOrder = 0;
+  else if ((data[0] == 0x4D) && (data[1] == 0x4D))
+    byteOrder = 1;
+  else
+    return 0;                /* can not be tiff */
+#if __BYTE_ORDER == __BIG_ENDIAN
+  byteOrder = 1 - byteOrder;
+#endif
+  EXTRACTOR_common_cat_unpack (data, TIFF_HEADER_SPECS[byteOrder], 
TIFF_HEADER_FIELDS (&hdr));
+  if (hdr.fourty_two != 42)
+    return 0;                /* can not be tiff */
+  if (hdr.ifd_offset + 6 > size)
+    return 0;                /* malformed tiff */
+  if (0 != addKeyword (proc, proc_cls, "image/tiff", 
EXTRACTOR_METATYPE_MIMETYPE))
+    return 1;
+  current_ifd = hdr.ifd_offset;
+  while (current_ifd != 0)
+    {
+      unsigned short len;
+      unsigned int off;
+      int i;
+      if ( (current_ifd + 6 > size) ||
+          (current_ifd + 6 < current_ifd) )
+        return 0;
+      if (byteOrder == 0)
+        len = data[current_ifd + 1] << 8 | data[current_ifd];
+      else
+        len = data[current_ifd] << 8 | data[current_ifd + 1];
+      if (len * DIRECTORY_ENTRY_SIZE + 2 + 4 + current_ifd > size)
+        {
+#if DEBUG
+          printf ("WARNING: malformed tiff\n");
+#endif
+          return 0;
+        }
+      for (i = 0; i < len; i++)
+        {
+          DIRECTORY_ENTRY entry;
+          off = current_ifd + 2 + DIRECTORY_ENTRY_SIZE * i;
+
+          EXTRACTOR_common_cat_unpack (&data[off],
+                      DIRECTORY_ENTRY_SPECS[byteOrder],
+                      DIRECTORY_ENTRY_FIELDS (&entry));
+          switch (entry.tag)
+            {
+            case TAG_LENGTH:
+              if ((entry.type == TYPE_SHORT) && (byteOrder == 1))
+                {
+                  length = entry.value_or_offset >> 16;
+                }
+              else
+                {
+                  length = entry.value_or_offset;
+                }
+              if (width != -1)
+                {
+                  char tmp[128];
+                  snprintf (tmp, 
+                           sizeof(tmp), "%ux%u",
+                           width, length);
+                  addKeyword (proc, 
+                             proc_cls, 
+                             tmp, 
+                             EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
+                }
+              break;
+            case TAG_WIDTH:
+              if ((entry.type == TYPE_SHORT) && (byteOrder == 1))
+                width = entry.value_or_offset >> 16;
+              else
+                width = entry.value_or_offset;
+              if (length != -1)
+                {
+                  char tmp[128];
+                  snprintf (tmp, 
+                           sizeof(tmp), 
+                           "%ux%u",
+                           width, length);
+                  addKeyword (proc, proc_cls, 
+                             tmp, 
+                             EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
+                }
+              break;
+            case TAG_SOFTWARE:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE))
+               return 1;
+              break;
+            case TAG_ARTIST:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_ARTIST))
+               return 1;
+              break;
+            case TAG_DOCUMENT_NAME:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_TITLE))
+               return 1;
+              break;
+            case TAG_COPYRIGHT:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_COPYRIGHT))
+               return 1;
+              break;
+            case TAG_DESCRIPTION:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_DESCRIPTION))
+               return 1;
+              break;
+            case TAG_HOST:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_BUILDHOST))
+               return 1;
+              break;
+            case TAG_SCANNER:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_SOURCE))
+               return 1;
+              break;
+            case TAG_DAYTIME:
+              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_CREATION_DATE))
+               return 1;
+              break;
+            }
+        }
+
+      off = current_ifd + 2 + DIRECTORY_ENTRY_SIZE * len;
+      if (byteOrder == 0)
+        current_ifd =
+          data[off + 3] << 24 | data[off + 2] << 16 | 
+         data[off + 1] << 8  | data[off];
+      else
+        current_ifd =
+          data[off] << 24 | data[off + 1] << 16 |
+         data[off + 2] << 8 | data[off + 3];
+    }
+  return 0;
+}

Deleted: Extractor/src/plugins/ps_extractor.c
===================================================================
--- Extractor/src/plugins/ps_extractor.c        2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/ps_extractor.c        2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,197 +0,0 @@
-/*
-     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"
-
-
-static char *
-readline (const char *data, size_t size, size_t pos)
-{
-  size_t end;
-  char *res;
-
-  while ((pos < size) &&
-         ((data[pos] == (char) 0x0d) || (data[pos] == (char) 0x0a)))
-    pos++;
-
-  if (pos >= size)
-    return NULL;                /* end of file */
-  end = pos;
-  while ((end < size) &&
-         (data[end] != (char) 0x0d) && (data[end] != (char) 0x0a))
-    end++;
-  res = malloc (end - pos + 1);
-  if (res == NULL)
-    return NULL;
-  memcpy (res, &data[pos], end - pos);
-  res[end - pos] = '\0';
-
-  return res;
-}
-
-
-static int
-testmeta (char *line,
-          const char *match,
-          enum EXTRACTOR_MetaType type, 
-         EXTRACTOR_MetaDataProcessor proc,
-         void *proc_cls)
-{
-  char *key;
-
-  if ( (strncmp (line, match, strlen (match)) == 0) &&
-       (strlen (line) > strlen (match)) )
-    {
-      if ((line[strlen (line) - 1] == ')') && (line[strlen (match)] == '('))
-        {
-          key = &line[strlen (match) + 1];
-          key[strlen (key) - 1] = '\0'; /* remove ")" */
-        }
-      else
-        {
-          key = &line[strlen (match)];
-        }
-      if (0 != proc (proc_cls,
-                    "ps",
-                    type,
-                    EXTRACTOR_METAFORMAT_UTF8,
-                    "text/plain",
-                    key,
-                    strlen (key)+1))
-       return 1;
-    }
-  return 0;
-}
-
-typedef struct
-{
-  const char *prefix;
-  enum EXTRACTOR_MetaType type;
-} Matches;
-
-static Matches tests[] = {
-  {"%%Title: ", EXTRACTOR_METATYPE_TITLE},
-  {"%%Author: ", EXTRACTOR_METATYPE_AUTHOR_NAME},
-  {"%%Version: ", EXTRACTOR_METATYPE_REVISION_NUMBER},
-  {"%%Creator: ", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
-  {"%%CreationDate: ", EXTRACTOR_METATYPE_CREATION_DATE},
-  {"%%Pages: ", EXTRACTOR_METATYPE_PAGE_COUNT},
-  {"%%Orientation: ", EXTRACTOR_METATYPE_PAGE_ORIENTATION},
-  {"%%DocumentPaperSizes: ", EXTRACTOR_METATYPE_PAPER_SIZE},
-  {"%%PageOrder: ", EXTRACTOR_METATYPE_PAGE_ORDER},
-  {"%%LanguageLevel: ", EXTRACTOR_METATYPE_FORMAT_VERSION},
-  {"%%Magnification: ", EXTRACTOR_METATYPE_MAGNIFICATION},
-
-  /* Also widely used but not supported since they
-     probably make no sense:
-     "%%BoundingBox: ",
-     "%%DocumentNeededResources: ",
-     "%%DocumentSuppliedResources: ",
-     "%%DocumentProcSets: ",
-     "%%DocumentData: ", */
-
-  {NULL, 0}
-};
-
-#define PS_HEADER "%!PS-Adobe"
-
-/* mimetype = application/postscript */
-int 
-EXTRACTOR_ps_extract (const char *data,
-                     size_t size,
-                     EXTRACTOR_MetaDataProcessor proc,
-                     void *proc_cls,
-                     const char *options)
-{
-  size_t pos;
-  char *line;
-  int i;
-  int lastLine;
-  int ret;
-
-  pos = strlen (PS_HEADER);
-  if ( (size < pos) ||
-       (0 != strncmp (PS_HEADER,
-                     data,
-                     pos)) )
-    return 0;
-  ret = 0;
-
-  if (0 != proc (proc_cls,
-                "ps",
-                EXTRACTOR_METATYPE_MIMETYPE,
-                EXTRACTOR_METAFORMAT_UTF8,
-                "text/plain",
-                "application/postscript",
-                strlen ("application/postscript")+1))
-    return 1;
-  /* skip rest of first line */
-  while ((pos < size) && (data[pos] != '\n'))
-    pos++;
-
-  lastLine = -1;
-  line = NULL;
-  /* while Windows-PostScript does not seem to (always?) put
-     "%%EndComments", this should allow us to not read through most of
-     the file for all the sane applications... For Windows-generated
-     PS files, we will bail out at the end of the file. */
-  while ( (line == NULL) ||
-         (0 != strncmp ("%%EndComments", line, strlen ("%%EndComments"))) )
-    {
-      if (line != NULL)
-       free (line);
-      line = readline (data, size, pos);
-      if (line == NULL)
-        break;
-      i = 0;
-      while (tests[i].prefix != NULL)
-        {
-          ret = testmeta (line, tests[i].prefix, tests[i].type, proc, 
proc_cls);
-         if (ret != 0)
-           break;
-          i++;
-        }
-      if (ret != 0)
-       break;
-
-      /* %%+ continues previous meta-data type... */
-      if ( (lastLine != -1) && (0 == strncmp (line, "%%+ ", strlen ("%%+ "))))
-        {
-          ret = testmeta (line, "%%+ ", tests[lastLine].type, proc, proc_cls);
-        }
-      else
-        {
-          /* update "previous" type */
-          if (tests[i].prefix == NULL)
-            lastLine = -1;
-          else
-            lastLine = i;
-        }
-      if (pos + strlen (line) + 1 <= pos)
-       break; /* overflow */
-      pos += strlen (line) + 1; /* skip newline, too; guarantee progress! */   
   
-    }
-  if (line != NULL)
-    free (line);
-  return ret;
-}
-
-/* end of ps_extractor.c */

Deleted: Extractor/src/plugins/qt_extractor.c
===================================================================
--- Extractor/src/plugins/qt_extractor.c        2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/qt_extractor.c        2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,1148 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2006 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 <zlib.h>
-#include <math.h>
-
-#define DEBUG 0
-
-/* verbatim from mp3extractor */
-static const char *const genre_names[] = {
-  gettext_noop ("Blues"),
-  gettext_noop ("Classic Rock"),
-  gettext_noop ("Country"),
-  gettext_noop ("Dance"),
-  gettext_noop ("Disco"),
-  gettext_noop ("Funk"),
-  gettext_noop ("Grunge"),
-  gettext_noop ("Hip-Hop"),
-  gettext_noop ("Jazz"),
-  gettext_noop ("Metal"),
-  gettext_noop ("New Age"),
-  gettext_noop ("Oldies"),
-  gettext_noop ("Other"),
-  gettext_noop ("Pop"),
-  gettext_noop ("R&B"),
-  gettext_noop ("Rap"),
-  gettext_noop ("Reggae"),
-  gettext_noop ("Rock"),
-  gettext_noop ("Techno"),
-  gettext_noop ("Industrial"),
-  gettext_noop ("Alternative"),
-  gettext_noop ("Ska"),
-  gettext_noop ("Death Metal"),
-  gettext_noop ("Pranks"),
-  gettext_noop ("Soundtrack"),
-  gettext_noop ("Euro-Techno"),
-  gettext_noop ("Ambient"),
-  gettext_noop ("Trip-Hop"),
-  gettext_noop ("Vocal"),
-  gettext_noop ("Jazz+Funk"),
-  gettext_noop ("Fusion"),
-  gettext_noop ("Trance"),
-  gettext_noop ("Classical"),
-  gettext_noop ("Instrumental"),
-  gettext_noop ("Acid"),
-  gettext_noop ("House"),
-  gettext_noop ("Game"),
-  gettext_noop ("Sound Clip"),
-  gettext_noop ("Gospel"),
-  gettext_noop ("Noise"),
-  gettext_noop ("Alt. Rock"),
-  gettext_noop ("Bass"),
-  gettext_noop ("Soul"),
-  gettext_noop ("Punk"),
-  gettext_noop ("Space"),
-  gettext_noop ("Meditative"),
-  gettext_noop ("Instrumental Pop"),
-  gettext_noop ("Instrumental Rock"),
-  gettext_noop ("Ethnic"),
-  gettext_noop ("Gothic"),
-  gettext_noop ("Darkwave"),
-  gettext_noop ("Techno-Industrial"),
-  gettext_noop ("Electronic"),
-  gettext_noop ("Pop-Folk"),
-  gettext_noop ("Eurodance"),
-  gettext_noop ("Dream"),
-  gettext_noop ("Southern Rock"),
-  gettext_noop ("Comedy"),
-  gettext_noop ("Cult"),
-  gettext_noop ("Gangsta Rap"),
-  gettext_noop ("Top 40"),
-  gettext_noop ("Christian Rap"),
-  gettext_noop ("Pop/Funk"),
-  gettext_noop ("Jungle"),
-  gettext_noop ("Native American"),
-  gettext_noop ("Cabaret"),
-  gettext_noop ("New Wave"),
-  gettext_noop ("Psychedelic"),
-  gettext_noop ("Rave"),
-  gettext_noop ("Showtunes"),
-  gettext_noop ("Trailer"),
-  gettext_noop ("Lo-Fi"),
-  gettext_noop ("Tribal"),
-  gettext_noop ("Acid Punk"),
-  gettext_noop ("Acid Jazz"),
-  gettext_noop ("Polka"),
-  gettext_noop ("Retro"),
-  gettext_noop ("Musical"),
-  gettext_noop ("Rock & Roll"),
-  gettext_noop ("Hard Rock"),
-  gettext_noop ("Folk"),
-  gettext_noop ("Folk/Rock"),
-  gettext_noop ("National Folk"),
-  gettext_noop ("Swing"),
-  gettext_noop ("Fast-Fusion"),
-  gettext_noop ("Bebob"),
-  gettext_noop ("Latin"),
-  gettext_noop ("Revival"),
-  gettext_noop ("Celtic"),
-  gettext_noop ("Bluegrass"),
-  gettext_noop ("Avantgarde"),
-  gettext_noop ("Gothic Rock"),
-  gettext_noop ("Progressive Rock"),
-  gettext_noop ("Psychedelic Rock"),
-  gettext_noop ("Symphonic Rock"),
-  gettext_noop ("Slow Rock"),
-  gettext_noop ("Big Band"),
-  gettext_noop ("Chorus"),
-  gettext_noop ("Easy Listening"),
-  gettext_noop ("Acoustic"),
-  gettext_noop ("Humour"),
-  gettext_noop ("Speech"),
-  gettext_noop ("Chanson"),
-  gettext_noop ("Opera"),
-  gettext_noop ("Chamber Music"),
-  gettext_noop ("Sonata"),
-  gettext_noop ("Symphony"),
-  gettext_noop ("Booty Bass"),
-  gettext_noop ("Primus"),
-  gettext_noop ("Porn Groove"),
-  gettext_noop ("Satire"),
-  gettext_noop ("Slow Jam"),
-  gettext_noop ("Club"),
-  gettext_noop ("Tango"),
-  gettext_noop ("Samba"),
-  gettext_noop ("Folklore"),
-  gettext_noop ("Ballad"),
-  gettext_noop ("Power Ballad"),
-  gettext_noop ("Rhythmic Soul"),
-  gettext_noop ("Freestyle"),
-  gettext_noop ("Duet"),
-  gettext_noop ("Punk Rock"),
-  gettext_noop ("Drum Solo"),
-  gettext_noop ("A Cappella"),
-  gettext_noop ("Euro-House"),
-  gettext_noop ("Dance Hall"),
-  gettext_noop ("Goa"),
-  gettext_noop ("Drum & Bass"),
-  gettext_noop ("Club-House"),
-  gettext_noop ("Hardcore"),
-  gettext_noop ("Terror"),
-  gettext_noop ("Indie"),
-  gettext_noop ("BritPop"),
-  gettext_noop ("Negerpunk"),
-  gettext_noop ("Polsk Punk"),
-  gettext_noop ("Beat"),
-  gettext_noop ("Christian Gangsta Rap"),
-  gettext_noop ("Heavy Metal"),
-  gettext_noop ("Black Metal"),
-  gettext_noop ("Crossover"),
-  gettext_noop ("Contemporary Christian"),
-  gettext_noop ("Christian Rock"),
-  gettext_noop ("Merengue"),
-  gettext_noop ("Salsa"),
-  gettext_noop ("Thrash Metal"),
-  gettext_noop ("Anime"),
-  gettext_noop ("JPop"),
-  gettext_noop ("Synthpop"),
-};
-
-#define GENRE_NAME_COUNT \
-    ((unsigned int)(sizeof genre_names / sizeof (const char *const)))
-
-
-static const char *languages[] = {
-  "English",
-  "French",
-  "German",
-  "Italian",
-  "Dutch",
-  "Swedish",
-  "Spanish",
-  "Danish",
-  "Portuguese",
-  "Norwegian",
-  "Hebrew",
-  "Japanese",
-  "Arabic",
-  "Finnish",
-  "Greek",
-  "Icelandic",
-  "Maltese",
-  "Turkish",
-  "Croatian",
-  "Traditional Chinese",
-  "Urdu",
-  "Hindi",
-  "Thai",
-  "Korean",
-  "Lithuanian",
-  "Polish",
-  "Hungarian",
-  "Estonian",
-  "Lettish",
-  "Saamisk",
-  "Lappish",
-  "Faeroese",
-  "Farsi",
-  "Russian",
-  "Simplified Chinese",
-  "Flemish",
-  "Irish",
-  "Albanian",
-  "Romanian",
-  "Czech",
-  "Slovak",
-  "Slovenian",
-  "Yiddish",
-  "Serbian",
-  "Macedonian",
-  "Bulgarian",
-  "Ukrainian",
-  "Byelorussian",
-  "Uzbek",
-  "Kazakh",
-  "Azerbaijani",
-  "AzerbaijanAr",
-  "Armenian",
-  "Georgian",
-  "Moldavian",
-  "Kirghiz",
-  "Tajiki",
-  "Turkmen",
-  "Mongolian",
-  "MongolianCyr",
-  "Pashto",
-  "Kurdish",
-  "Kashmiri",
-  "Sindhi",
-  "Tibetan",
-  "Nepali",
-  "Sanskrit",
-  "Marathi",
-  "Bengali",
-  "Assamese",
-  "Gujarati",
-  "Punjabi",
-  "Oriya",
-  "Malayalam",
-  "Kannada",
-  "Tamil",
-  "Telugu",
-  "Sinhalese",
-  "Burmese",
-  "Khmer",
-  "Lao",
-  "Vietnamese",
-  "Indonesian",
-  "Tagalog",
-  "MalayRoman",
-  "MalayArabic",
-  "Amharic",
-  "Tigrinya",
-  "Galla",
-  "Oromo",
-  "Somali",
-  "Swahili",
-  "Ruanda",
-  "Rundi",
-  "Chewa",
-  "Malagasy",
-  "Esperanto",
-  "Welsh",
-  "Basque",
-  "Catalan",
-  "Latin",
-  "Quechua",
-  "Guarani",
-  "Aymara",
-  "Tatar",
-  "Uighur",
-  "Dzongkha",
-  "JavaneseRom",
-};
-
-
-typedef struct
-{
-  const char *ext;
-  const char *mime;
-} C2M;
-
-/* see http://www.mp4ra.org/filetype.html 
- *     http://www.ftyps.com/ */
-static C2M ftMap[] = {
-  {"qt  ", "video/quicktime"},
-  {"isom", "video/mp4"},        /* ISO Base Media files */
-  {"iso2", "video/mp4"},
-  {"mp41", "video/mp4"},        /* MPEG-4 (ISO/IEC 14491-1) version 1 */
-  {"mp42", "video/mp4"},        /* MPEG-4 (ISO/IEC 14491-1) version 2 */
-  {"3gp1", "video/3gpp"},
-  {"3gp2", "video/3gpp"},
-  {"3gp3", "video/3gpp"},
-  {"3gp4", "video/3gpp"},
-  {"3gp5", "video/3gpp"},
-  {"3g2a", "video/3gpp2"},
-  {"mmp4", "video/mp4"},        /* Mobile MPEG-4 */
-  {"M4A ", "audio/mp4"},
-  {"M4B ", "audio/mp4"},
-  {"M4P ", "audio/mp4"},
-  {"M4V ", "video/mp4"},
-  {"mj2s", "video/mj2"},        /* Motion JPEG 2000 */
-  {"mjp2", "video/mj2"},
-  {NULL, NULL},
-};
-
-typedef struct CHE
-{
-  const char *pfx;
-  enum EXTRACTOR_MetaType type;
-} CHE;
-
-static CHE cHm[] = {
-  {"aut", EXTRACTOR_METATYPE_AUTHOR_NAME},
-  {"cpy", EXTRACTOR_METATYPE_COPYRIGHT},
-  {"day", EXTRACTOR_METATYPE_CREATION_DATE},
-  {"ed1", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed2", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed3", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed4", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed5", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed6", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed7", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed8", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"ed9", EXTRACTOR_METATYPE_MODIFICATION_DATE},
-  {"cmt", EXTRACTOR_METATYPE_COMMENT},
-  {"url", EXTRACTOR_METATYPE_URL},
-  {"enc", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
-  {"hst", EXTRACTOR_METATYPE_BUILDHOST},
-  {"nam", EXTRACTOR_METATYPE_TITLE},
-  {"gen", EXTRACTOR_METATYPE_GENRE},
-  {"mak", EXTRACTOR_METATYPE_CAMERA_MAKE},
-  {"mod", EXTRACTOR_METATYPE_CAMERA_MODEL},
-  {"des", EXTRACTOR_METATYPE_DESCRIPTION},
-  {"dis", EXTRACTOR_METATYPE_DISCLAIMER},
-  {"dir", EXTRACTOR_METATYPE_MOVIE_DIRECTOR},
-  {"src", EXTRACTOR_METATYPE_CONTRIBUTOR_NAME},
-  {"prf", EXTRACTOR_METATYPE_PERFORMER },
-  {"prd", EXTRACTOR_METATYPE_PRODUCER},
-  {"PRD", EXTRACTOR_METATYPE_PRODUCT_VERSION}, 
-  {"swr", EXTRACTOR_METATYPE_PRODUCED_BY_SOFTWARE},
-  {"isr", EXTRACTOR_METATYPE_ISRC},
-  {"wrt", EXTRACTOR_METATYPE_WRITER},
-  {"wrn", EXTRACTOR_METATYPE_WARNING},
-  {"chp", EXTRACTOR_METATYPE_CHAPTER_NAME},
-  {"inf", EXTRACTOR_METATYPE_DESCRIPTION},
-  {"req", EXTRACTOR_METATYPE_TARGET_PLATFORM},      /* hardware requirements */
-  {"fmt", EXTRACTOR_METATYPE_FORMAT},
-  {NULL, EXTRACTOR_METATYPE_RESERVED },
-};
-
-
-typedef struct
-{
-  const char *atom_type;
-  enum EXTRACTOR_MetaType type;
-} ITTagConversionEntry;
-
-/* iTunes Tags:
- * see http://atomicparsley.sourceforge.net/mpeg-4files.html */
-static ITTagConversionEntry it_to_extr_table[] = {
-  {"\xa9" "alb", EXTRACTOR_METATYPE_ALBUM},
-  {"\xa9" "ART", EXTRACTOR_METATYPE_ARTIST},
-  {"aART", EXTRACTOR_METATYPE_ARTIST},
-  {"\xa9" "cmt", EXTRACTOR_METATYPE_COMMENT},
-  {"\xa9" "day", EXTRACTOR_METATYPE_UNKNOWN_DATE},
-  {"\xa9" "nam", EXTRACTOR_METATYPE_TITLE},
-  {"trkn", EXTRACTOR_METATYPE_TRACK_NUMBER},
-  {"disk", EXTRACTOR_METATYPE_DISC_NUMBER},
-  {"\xa9" "gen", EXTRACTOR_METATYPE_GENRE},
-  {"gnre", EXTRACTOR_METATYPE_GENRE},
-  {"\xa9" "wrt", EXTRACTOR_METATYPE_WRITER},
-  {"\xa9" "too", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE},
-  {"cprt", EXTRACTOR_METATYPE_COPYRIGHT},
-  {"\xa9" "grp", EXTRACTOR_METATYPE_GROUP},
-  {"catg", EXTRACTOR_METATYPE_SECTION},
-  {"keyw", EXTRACTOR_METATYPE_KEYWORDS},
-  {"desc", EXTRACTOR_METATYPE_DESCRIPTION},
-  {"tvnn", EXTRACTOR_METATYPE_NETWORK_NAME},
-  {"tvsh", EXTRACTOR_METATYPE_SHOW_NAME}, 
-  {"tven", EXTRACTOR_METATYPE_NETWORK_NAME},
-  {NULL, EXTRACTOR_METATYPE_RESERVED}
-};
-
-
-typedef struct
-{
-  unsigned int size;
-  unsigned int type;
-} Atom;
-
-typedef struct
-{
-  unsigned int one;
-  unsigned int type;
-  unsigned long long size;
-} LongAtom;
-
-static unsigned long long
-ntohll (unsigned long long n)
-{
-#if __BYTE_ORDER == __BIG_ENDIAN
-  return n;
-#else
-  return (((unsigned long long) ntohl (n)) << 32) + ntohl (n >> 32);
-#endif
-}
-
-
-/**
- * Check if at position pos there is a valid atom.
- * @return 0 if the atom is invalid, 1 if it is valid
- */
-static int
-checkAtomValid (const char *buffer, size_t size, size_t pos)
-{
-  unsigned long long atomSize;
-  const Atom *atom;
-  const LongAtom *latom;
-  if ((pos >= size) ||
-      (pos + sizeof (Atom) > size) || (pos + sizeof (Atom) < pos))
-    return 0;
-  atom = (const Atom *) &buffer[pos];
-  if (ntohl (atom->size) == 1)
-    {
-      if ((pos + sizeof (LongAtom) > size) || (pos + sizeof (LongAtom) < pos))
-        return 0;
-      latom = (const LongAtom *) &buffer[pos];
-      atomSize = ntohll (latom->size);
-      if ((atomSize < sizeof (LongAtom)) ||
-          (atomSize + pos > size) || (atomSize + pos < atomSize))
-        return 0;
-    }
-  else
-    {
-      atomSize = ntohl (atom->size);
-      if ((atomSize < sizeof (Atom)) ||
-          (atomSize + pos > size) || (atomSize + pos < atomSize))
-        return 0;
-    }
-  return 1;
-}
-
-/**
- * Assumes that checkAtomValid has already been called.
- */
-static unsigned long long
-getAtomSize (const char *buf)
-{
-  const Atom *atom;
-  const LongAtom *latom;
-  atom = (const Atom *) buf;
-  if (ntohl (atom->size) == 1)
-    {
-      latom = (const LongAtom *) buf;
-      return ntohll (latom->size);
-    }
-  return ntohl (atom->size);
-}
-
-/**
- * Assumes that checkAtomValid has already been called.
- */
-static unsigned int
-getAtomHeaderSize (const char *buf)
-{
-  const Atom *atom;
-
-  atom = (const Atom *) buf;
-  if (ntohl (atom->size) == 1)
-    return sizeof (const LongAtom);
-  return sizeof (Atom);
-}
-
-struct ExtractContext
-{
-  EXTRACTOR_MetaDataProcessor proc;
-  void *proc_cls;
-  int ret;
-};
-
-static void
-addKeyword (enum EXTRACTOR_MetaType type,
-           const char *str,
-           struct ExtractContext *ec)
-{
-  if (ec->ret != 0)
-    return;
-  ec->ret = ec->proc (ec->proc_cls,
-                     "qt",
-                     type,
-                     EXTRACTOR_METAFORMAT_UTF8,
-                     "text/plain",
-                     str,
-                     strlen(str)+1);
-}
-
-
-
-/**
- * Assumes that checkAtomValid has already been called.
- */
-typedef int (*AtomHandler) (const char *input,
-                            size_t size,
-                            size_t pos, struct ExtractContext *ec);
-
-typedef struct
-{
-  char *name;
-  AtomHandler handler;
-} HandlerEntry;
-
-/**
- * Call the handler for the atom at the given position.
- * Will check validity of the given atom.
- *
- * @return 0 on error, 1 for success, -1 for unknown atom type
- */
-static int handleAtom (HandlerEntry *handlers,
-                       const char *input,
-                       size_t size,
-                       size_t pos, 
-                      struct ExtractContext *ec);
-
-static HandlerEntry all_handlers[];
-static HandlerEntry ilst_handlers[];
-
-/**
- * Process atoms.
- * @return 0 on error, 1 for success, -1 for unknown atom type
- */
-static int
-processAtoms (HandlerEntry *handlers, const char *input,
-                 size_t size, struct ExtractContext *ec)
-{
-  size_t pos;
-
-  if (size < sizeof (Atom))
-    return 1;
-  pos = 0;
-  while (pos < size - sizeof (Atom))
-    {
-      if (0 == handleAtom (handlers, input, size, pos, ec))
-        return 0;
-      pos += getAtomSize (&input[pos]);
-    }
-  return 1;
-}
-
-/**
- * Process all atoms.
- * @return 0 on error, 1 for success, -1 for unknown atom type
- */
-static int
-processAllAtoms (const char *input,
-                 size_t size, struct ExtractContext *ec)
-{
-  return processAtoms(all_handlers, input, size, ec);
-}
-
-/**
- * Handle the moov atom.
- * @return 0 on error, 1 for success, -1 for unknown atom type
- */
-static int
-moovHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  unsigned int hdr = getAtomHeaderSize (&input[pos]);
-  return processAllAtoms (&input[pos + hdr],
-                          getAtomSize (&input[pos]) - hdr, ec);
-}
-
-/* see 
http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap1/chapter_2_section_5.html
 */
-typedef struct
-{
-  Atom header;
-  /* major brand */
-  char type[4];
-  /* minor version */
-  unsigned int version;
-  /* compatible brands */
-  char compatibility[4];
-} FileType;
-
-static int
-ftypHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  const FileType *ft;
-  int i;
-
-  if (getAtomSize (&input[pos]) < sizeof (FileType)) {
-    return 0;
-  }
-  ft = (const FileType *) &input[pos];
-
-  i = 0;
-  while ((ftMap[i].ext != NULL) && (0 != memcmp (ft->type, ftMap[i].ext, 4)))
-    i++;
-  if (ftMap[i].ext != NULL)
-    addKeyword (EXTRACTOR_METATYPE_MIMETYPE, ftMap[i].mime, ec);
-  return 1;
-}
-
-typedef struct
-{
-  Atom hdr;
-  unsigned char version;
-  unsigned char flags[3];
-  /* in seconds since midnight, January 1, 1904 */
-  unsigned int creationTime;
-  /* in seconds since midnight, January 1, 1904 */
-  unsigned int modificationTime;
-  /* number of time units that pass per second in the movies time
-     coordinate system */
-  unsigned int timeScale;
-  /* A time value that indicates the duration of the movie in time
-     scale units. */
-  unsigned int duration;
-  unsigned int preferredRate;
-  /* A 16-bit fixed-point number that specifies how loud to
-     play. 1.0 indicates full volume */
-  unsigned short preferredVolume;
-  unsigned char reserved[10];
-  unsigned char matrix[36];
-  unsigned int previewTime;
-  unsigned int previewDuration;
-  unsigned int posterTime;
-  unsigned int selectionTime;
-  unsigned int selectionDuration;
-  unsigned int currentTime;
-  unsigned int nextTrackId;
-} MovieHeaderAtom;
-
-static int
-mvhdHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  const MovieHeaderAtom *m;
-  char duration[16];
-  if (getAtomSize (&input[pos]) != sizeof (MovieHeaderAtom))
-    return 0;
-  m = (const MovieHeaderAtom *) &input[pos];
-  snprintf (duration,
-           sizeof(duration),
-           "%us",
-           ntohl (m->duration) / ntohl (m->timeScale));
-  addKeyword (EXTRACTOR_METATYPE_DURATION, duration, ec);
-  return 1;
-}
-
-typedef struct
-{
-  Atom cmovAtom;
-  Atom dcomAtom;
-  char compressor[4];
-  Atom cmvdAtom;
-  unsigned int decompressedSize;
-} CompressedMovieHeaderAtom;
-
-static int
-cmovHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  const CompressedMovieHeaderAtom *c;
-  unsigned int s;
-  char *buf;
-  int ret;
-  z_stream z_state;
-  int z_ret_code;
-
-
-  if (getAtomSize (&input[pos]) < sizeof (CompressedMovieHeaderAtom))
-    return 0;
-  c = (const CompressedMovieHeaderAtom *) &input[pos];
-  if ((ntohl (c->dcomAtom.size) != 12) ||
-      (0 != memcmp (&c->dcomAtom.type, "dcom", 4)) ||
-      (0 != memcmp (c->compressor, "zlib", 4)) ||
-      (0 != memcmp (&c->cmvdAtom.type, "cmvd", 4)) ||
-      (ntohl (c->cmvdAtom.size) !=
-       getAtomSize (&input[pos]) - sizeof (Atom) * 2 - 4))
-    {
-      return 0;                 /* dcom must be 12 bytes */
-    }
-  s = ntohl (c->decompressedSize);
-  if (s > 16 * 1024 * 1024)
-    return 1;                   /* ignore, too big! */
-  buf = malloc (s);
-  if (buf == NULL)
-    return 1;                   /* out of memory, handle gracefully */
-
-  z_state.next_in = (unsigned char *) &c[1];
-  z_state.avail_in = ntohl (c->cmvdAtom.size);
-  z_state.avail_out = s;
-  z_state.next_out = (unsigned char *) buf;
-  z_state.zalloc = (alloc_func) 0;
-  z_state.zfree = (free_func) 0;
-  z_state.opaque = (voidpf) 0;
-  z_ret_code = inflateInit (&z_state);
-  if (Z_OK != z_ret_code)
-    {
-      free (buf);
-      return 0;                 /* crc error? */
-    }
-  z_ret_code = inflate (&z_state, Z_NO_FLUSH);
-  if ((z_ret_code != Z_OK) && (z_ret_code != Z_STREAM_END))
-    {
-      free (buf);
-      return 0;                 /* decode error? */
-    }
-  z_ret_code = inflateEnd (&z_state);
-  if (Z_OK != z_ret_code)
-    {
-      free (buf);
-      return 0;                 /* decode error? */
-    }
-  ret = handleAtom (all_handlers, buf, s, 0, ec);
-  free (buf);
-  return ret;
-}
-
-typedef struct
-{
-  short integer;
-  short fraction;
-} QTFixed;
-
-typedef struct
-{
-  Atom hdr;
-  unsigned int flags;           /* 1 byte of version, 3 bytes of flags */
-  /* in seconds since midnight, January 1, 1904 */
-  unsigned int creationTime;
-  /* in seconds since midnight, January 1, 1904 */
-  unsigned int modificationTime;
-  unsigned int trackID;
-  unsigned int reserved_0;
-  unsigned int duration;
-  unsigned int reserved_1;
-  unsigned int reserved_2;
-  unsigned short layer;
-  unsigned short alternate_group;
-  unsigned short volume;
-  unsigned short reserved_3;
-  QTFixed matrix[3][3];
-  /* in pixels */
-  QTFixed track_width;
-  /* in pixels */
-  QTFixed track_height;
-} TrackAtom;
-
-static int
-tkhdHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  const TrackAtom *m;
-  char dimensions[40];
-
-  if (getAtomSize (&input[pos]) < sizeof (TrackAtom))
-    return 0;
-  m = (const TrackAtom *) &input[pos];
-  if (ntohs (m->track_width.integer) != 0)
-    {
-      /* if actually a/the video track */
-      snprintf (dimensions,
-                sizeof(dimensions),
-                "%dx%d",
-                ntohs (m->track_width.integer),
-                ntohs (m->track_height.integer));
-      addKeyword (EXTRACTOR_METATYPE_IMAGE_DIMENSIONS, dimensions, ec);
-    }
-  return 1;
-}
-
-static int
-trakHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  unsigned int hdr = getAtomHeaderSize (&input[pos]);
-  return processAllAtoms (&input[pos + hdr],
-                          getAtomSize (&input[pos]) - hdr, ec);
-}
-
-static int
-metaHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  unsigned int hdr = getAtomHeaderSize (&input[pos]);
-  if (getAtomSize (&input[pos]) < hdr + 4)
-    return 0;
-  return processAllAtoms (&input[pos + hdr + 4],
-                          getAtomSize (&input[pos]) - hdr - 4, ec);
-}
-
-typedef struct
-{
-  Atom header;
-  unsigned short length;
-  unsigned short language;
-} InternationalText;
-
-/*
- * see 
http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter
-_3_section_2.html
- *   "User Data Text Strings and Language Codes"
- * TODO: make conformant
- */
-static int
-processTextTag (const char *input,
-                size_t size,
-                size_t pos,
-                enum EXTRACTOR_MetaType type, struct ExtractContext *ec)
-{
-  unsigned long long as;
-  unsigned short len;
-  unsigned short lang;
-  const InternationalText *txt;
-  char *meta;
-  int i;
-
-  /* contains "international text":
-     16-bit size + 16 bit language code */
-  as = getAtomSize (&input[pos]);
-  if (as < sizeof (InternationalText))
-    return 0;                   /* invalid */
-  txt = (const InternationalText *) &input[pos];
-  len = ntohs (txt->length);
-  if (len + sizeof (InternationalText) > as)
-    return 0;                   /* invalid */
-  lang = ntohs (txt->language);
-  if (lang >= sizeof (languages) / sizeof (char *))
-    return 0;                   /* invalid */
-  addKeyword (EXTRACTOR_METATYPE_LANGUAGE, languages[lang], ec);
-
-  meta = malloc (len + 1);
-  if (meta == NULL)
-    return 0;
-  memcpy (meta, &txt[1], len);
-  meta[len] = '\0';
-  for (i = 0; i < len; i++)
-    if (meta[i] == '\r')
-      meta[i] = '\n';
-  addKeyword (type, meta, ec);
-  free (meta);
-  return 1;
-}
-
-
-static int
-c_Handler (const char *input,
-           size_t size, size_t pos, struct ExtractContext *ec)
-{
-  int i;
-
-  i = 0;
-  while ((cHm[i].pfx != NULL) && (0 != memcmp (&input[pos+5], cHm[i].pfx, 3)))
-    i++;
-  if (cHm[i].pfx != NULL)
-    return processTextTag (input, size, pos, cHm[i].type, ec);
-  return -1;                    /* not found */
-}
-
-static int
-udtaHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  unsigned int hdr = getAtomHeaderSize (&input[pos]);
-  return processAllAtoms (&input[pos + hdr],
-                          getAtomSize (&input[pos]) - hdr, ec);
-}
-
-static int
-processDataAtom (const char *input,
-                size_t size, /* parent atom size */
-                size_t pos,
-                const char *patom,
-                enum EXTRACTOR_MetaType type,
-                struct ExtractContext *ec)
-{
-  char *meta;
-  unsigned char version;
-  unsigned int flags;
-  unsigned long long asize;
-  unsigned int len;
-  unsigned int hdr;
-  int i;
-
-  hdr = getAtomHeaderSize (&input[pos]);
-  asize = getAtomSize (&input[pos]);
-  if (memcmp(&input[pos+4], "data", 4) != 0)
-    return -1;
-
-  if (asize < hdr + 8 || /* header + u32 flags + u32 reserved */
-      asize > (getAtomSize(&patom[0]) - 8))
-    return 0;
-
-  len = (unsigned int)(asize - (hdr + 8));
-
-  version = input[pos+8];
-  flags = ((unsigned char)input[pos+9]<<16) |
-          ((unsigned char)input[pos+10]<<8) | 
-          (unsigned char)input[pos+11];
-#if DEBUG
-  printf("[data] version:%02x flags:%08x txtlen:%d\n", version, flags, len);
-#endif
-
-  if (version != 0)
-    return -1;
-
-  if (flags == 0x0) { /* binary data */
-    if (memcmp(&patom[4], "gnre", 4) == 0) {
-      if (len >= 2) {
-        unsigned short genre = ((unsigned char)input[pos+16] << 8) |
-                                (unsigned char)input[pos+17];
-        if (genre > 0 && genre < GENRE_NAME_COUNT)
-          addKeyword(type, genre_names[genre-1], ec);
-      }
-      return 1;
-    }
-    else if ((memcmp(&patom[4], "trkn", 4) == 0) || 
-        (memcmp(&patom[4], "disk", 4) == 0)) {
-      if (len >= 4) {
-        unsigned short n = ((unsigned char)input[pos+18] << 8) |
-                            (unsigned char)input[pos+19];
-        char s[8];
-       snprintf(s, 8, "%d", n);
-        addKeyword(type, s, ec);
-      }
-    }
-    else {
-      return -1;
-    }
-  }
-  else if (flags == 0x1) { /* text data */
-    meta = malloc (len + 1);
-    if (meta == NULL)
-      return 0;
-    memcpy (meta, &input[pos+16], len);
-    meta[len] = '\0';
-    for (i = 0; i < len; i++)
-      if (meta[i] == '\r')
-        meta[i] = '\n';
-    addKeyword (type, meta, ec);
-    free (meta);
-    return 1;
-  }
-
-  return -1;
-}
-
-/* NOTE: iTunes tag processing should, in theory, be limited to iTunes
- * file types (from ftyp), but, in reality, it seems that there are other
- * files, like 3gpp, out in the wild with iTunes tags. */
-static int
-iTunesTagHandler (const char *input,
-           size_t size, size_t pos, struct ExtractContext *ec)
-{
-  unsigned long long asize;
-  unsigned int hdr;
-  int i;
-
-  hdr = getAtomHeaderSize (&input[pos]);
-  asize = getAtomSize (&input[pos]);
-
-  if (asize < hdr + 8) /* header + at least one atom */
-    return 0;
-
-  i = 0;
-  while ((it_to_extr_table[i].atom_type != NULL) && 
-         (0 != memcmp (&input[pos+4], it_to_extr_table[i].atom_type, 4)))
-    i++;
-  if (it_to_extr_table[i].atom_type != NULL)
-    return processDataAtom(input, asize, pos+hdr, &input[pos],  
-                           it_to_extr_table[i].type, ec);
-
-  return -1;
-}
-
-
-static int 
-ilstHandler (const char *input,
-             size_t size, size_t pos, struct ExtractContext *ec)
-{
-  unsigned int hdr = getAtomHeaderSize (&input[pos]);
-  return processAtoms(ilst_handlers, &input[pos + hdr],
-                      getAtomSize(&input[pos]) - hdr, ec);
-}
-
-
-static HandlerEntry all_handlers[] = {
-  {"moov", &moovHandler},
-  {"cmov", &cmovHandler},
-  {"mvhd", &mvhdHandler},
-  {"trak", &trakHandler},
-  {"tkhd", &tkhdHandler},
-  {"ilst", &ilstHandler},
-  {"meta", &metaHandler},
-  {"udta", &udtaHandler},
-  {"ftyp", &ftypHandler},
-  {"\xa9" "swr", &c_Handler},
-  {"\xa9" "cpy", &c_Handler},
-  {"\xa9" "day", &c_Handler},
-  {"\xa9" "dir", &c_Handler},
-  {"\xa9" "ed1", &c_Handler},
-  {"\xa9" "ed2", &c_Handler},
-  {"\xa9" "ed3", &c_Handler},
-  {"\xa9" "ed4", &c_Handler},
-  {"\xa9" "ed5", &c_Handler},
-  {"\xa9" "ed6", &c_Handler},
-  {"\xa9" "ed7", &c_Handler},
-  {"\xa9" "ed8", &c_Handler},
-  {"\xa9" "ed9", &c_Handler},
-  {"\xa9" "fmt", &c_Handler},
-  {"\xa9" "inf", &c_Handler},
-  {"\xa9" "prd", &c_Handler},
-  {"\xa9" "prf", &c_Handler},
-  {"\xa9" "req", &c_Handler},
-  {"\xa9" "src", &c_Handler},
-  {"\xa9" "wrt", &c_Handler},
-  {"\xa9" "aut", &c_Handler},
-  {"\xa9" "hst", &c_Handler},
-  {"\xa9" "wrt", &c_Handler},
-  {"\xa9" "cmt", &c_Handler},
-  {"\xa9" "mak", &c_Handler},
-  {"\xa9" "mod", &c_Handler},
-  {"\xa9" "nam", &c_Handler},
-  {"\xa9" "des", &c_Handler},
-  {"\xa9" "PRD", &c_Handler},
-  {"\xa9" "wrn", &c_Handler},
-  {"\xa9" "chp", &c_Handler},
-  /*  { "name", &nameHandler }, */
-  {NULL, NULL},
-};
-
-static HandlerEntry ilst_handlers[] = {
-  {"\xa9" "alb", &iTunesTagHandler},
-  {"\xa9" "ART", &iTunesTagHandler},
-  {"aART", &iTunesTagHandler},
-  {"\xa9" "cmt", &iTunesTagHandler},
-  {"\xa9" "day", &iTunesTagHandler},
-  {"\xa9" "nam", &iTunesTagHandler},
-  {"\xa9" "gen", &iTunesTagHandler},
-  {"gnre", &iTunesTagHandler},
-  {"trkn", &iTunesTagHandler},
-  {"disk", &iTunesTagHandler},
-  {"\xa9" "wrt", &iTunesTagHandler},
-  {"\xa9" "too", &iTunesTagHandler},
-  {"tmpo", &iTunesTagHandler},
-  {"cprt", &iTunesTagHandler},
-  {"cpil", &iTunesTagHandler},
-  {"covr", &iTunesTagHandler},
-  {"rtng", &iTunesTagHandler},
-  {"\xa9" "grp", &iTunesTagHandler},
-  {"stik", &iTunesTagHandler},
-  {"pcst", &iTunesTagHandler},
-  {"catg", &iTunesTagHandler},
-  {"keyw", &iTunesTagHandler},
-  {"purl", &iTunesTagHandler},
-  {"egid", &iTunesTagHandler},
-  {"desc", &iTunesTagHandler},
-  {"\xa9" "lyr", &iTunesTagHandler},
-  {"tvnn", &iTunesTagHandler},
-  {"tvsh", &iTunesTagHandler},
-  {"tven", &iTunesTagHandler},
-  {"tvsn", &iTunesTagHandler},
-  {"tves", &iTunesTagHandler},
-  {"purd", &iTunesTagHandler},
-  {"pgap", &iTunesTagHandler},
-  {NULL, NULL},
-};
-
-/**
- * Call the handler for the atom at the given position.
- * @return 0 on error, 1 for success, -1 for unknown atom type
- */
-static int
-handleAtom (HandlerEntry *handlers, const char *input,
-            size_t size, size_t pos, struct ExtractContext *ec)
-{
-  int i;
-  if (0 == checkAtomValid (input, size, pos))
-    {
-      return 0;
-    }
-  i = 0;
-  while ((handlers[i].name != NULL) &&
-         (0 != memcmp (&input[pos + 4], handlers[i].name, 4)))
-    i++;
-  if (handlers[i].name == NULL)
-    {
-#if DEBUG
-      char b[5];
-      memcpy (b, &input[pos + 4], 4);
-      b[4] = '\0';
-      printf ("No handler for `%s'\n", b);
-#endif
-      return -1;
-    }
-  i = handlers[i].handler (input, size, pos, ec);
-#if DEBUG
-  printf ("Running handler for `%4s' at %u completed with result %d\n",
-          &input[pos + 4], pos, i);
-#endif
-  return i;
-}
-
-/* mimetypes:
-   video/quicktime: mov,qt: Quicktime animation;
-   video/x-quicktime: mov,qt: Quicktime animation;
-   application/x-quicktimeplayer: qtl: Quicktime list;
- */
-
-int 
-EXTRACTOR_qt_extract (const char *data,
-                     size_t size,
-                     EXTRACTOR_MetaDataProcessor proc,
-                     void *proc_cls,
-                     const char *options)
-{
-  struct ExtractContext ec;
-  ec.proc = proc;
-  ec.proc_cls = proc_cls;
-  ec.ret = 0;
-  processAllAtoms (data, size, &ec);
-  return ec.ret;
-}
-
-/*  end of qt_extractor.c */

Deleted: Extractor/src/plugins/real_extractor.c
===================================================================
--- Extractor/src/plugins/real_extractor.c      2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/real_extractor.c      2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,434 +0,0 @@
-/*
-     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 <stdint.h>
-
-#define UINT32 uint32_t
-#define UINT16 uint16_t
-#define UINT8 uint8_t
-
-typedef struct
-{
-  UINT32 object_id;
-  UINT32 size;
-  UINT16 object_version;        /* must be 0 */
-  UINT16 stream_number;
-  UINT32 max_bit_rate;
-  UINT32 avg_bit_rate;
-  UINT32 max_packet_size;
-  UINT32 avg_packet_size;
-  UINT32 start_time;
-  UINT32 preroll;
-  UINT32 duration;
-  UINT8 stream_name_size;
-  UINT8 data[0];                /* variable length section */
-  /*
-     UINT8[stream_name_size]     stream_name;
-     UINT8                       mime_type_size;
-     UINT8[mime_type_size]       mime_type;
-     UINT32                      type_specific_len;
-     UINT8[type_specific_len]    type_specific_data;
-   */
-} Media_Properties;
-
-typedef struct
-{
-  UINT32 object_id;
-  UINT32 size;
-  UINT16 object_version;        /* must be 0 */
-  UINT16 title_len;
-  UINT8 data[0];                /* variable length section */
-  /*
-     UINT8[title_len]  title;
-     UINT16    author_len;
-     UINT8[author_len]  author;
-     UINT16    copyright_len;
-     UINT8[copyright_len]  copyright;
-     UINT16    comment_len;
-     UINT8[comment_len]  comment;
-   */
-} Content_Description;
-/* author, copyright and comment are supposed to be ASCII */
-
-#define REAL_HEADER 0x2E524d46
-#define MDPR_HEADER 0x4D445052
-#define CONT_HEADER 0x434F4e54
-
-#define RAFF4_HEADER 0x2E7261FD
-
-
-static int
-processMediaProperties (const Media_Properties * prop,
-                       EXTRACTOR_MetaDataProcessor proc,
-                       void *proc_cls)
-{
-
-  UINT8 mime_type_size;
-  UINT32 prop_size;
-
-  prop_size = ntohl (prop->size);
-  if (prop_size <= sizeof (Media_Properties))
-    return 0;
-  if (0 != prop->object_version)
-    return 0;
-  if (prop_size <= prop->stream_name_size + sizeof (UINT8)
-      + sizeof (Media_Properties))
-    return 0;
-
-  mime_type_size = prop->data[prop->stream_name_size];
-  if (prop_size > prop->stream_name_size + sizeof (UINT8) +
-      +mime_type_size + sizeof (Media_Properties))
-    {
-      char data[mime_type_size + 1];
-      memcpy (data, &prop->data[prop->stream_name_size + 1], mime_type_size);
-      data[mime_type_size] = '\0';
-      
-      return proc (proc_cls,
-                  "real",
-                  EXTRACTOR_METATYPE_MIMETYPE,
-                  EXTRACTOR_METAFORMAT_UTF8,
-                  "text/plain",
-                  data,
-                  strlen (data));
-    }
-  return 0;
-}
-
-static int
-processContentDescription (const Content_Description * prop,
-                          EXTRACTOR_MetaDataProcessor proc,
-                          void *proc_cls)
-{
-  UINT16 author_len;
-  UINT16 copyright_len;
-  UINT16 comment_len;
-  UINT16 title_len;
-  char *title;
-  char *author;
-  char *copyright;
-  char *comment;
-  UINT32 prop_size;
-  int ret;
-
-  prop_size = ntohl (prop->size);
-  if (prop_size <= sizeof (Content_Description))
-    return 0;
-  if (0 != prop->object_version)
-    return 0;
-  title_len = ntohs (prop->title_len);
-  if (prop_size <= title_len + sizeof (UINT16) + sizeof (Content_Description))
-    return 0;
-  author_len = ntohs (*(UINT16 *) & prop->data[title_len]);
-  if (prop_size <= title_len + sizeof (UINT16)
-      + author_len + sizeof (Content_Description))
-    return 0;
-
-  copyright_len = ntohs (*(UINT16 *) & prop->data[title_len +
-                                                  author_len +
-                                                  sizeof (UINT16)]);
-
-  if (prop_size <= title_len + 2 * sizeof (UINT16)
-      + author_len + copyright_len + sizeof (Content_Description))
-    return 0;
-
-  comment_len = ntohs (*(UINT16 *) & prop->data[title_len +
-                                                author_len +
-                                                copyright_len +
-                                                2 * sizeof (UINT16)]);
-
-  if (prop_size < title_len + 3 * sizeof (UINT16)
-      + author_len + copyright_len + comment_len
-      + sizeof (Content_Description))
-    return 0;
-
-  ret = 0;
-  title = malloc (title_len + 1);
-  if (title != NULL)
-    {
-      memcpy (title, &prop->data[0], title_len);
-      title[title_len] = '\0';
-      ret = proc (proc_cls,
-                 "real",
-                 EXTRACTOR_METATYPE_TITLE,
-                 EXTRACTOR_METAFORMAT_UTF8,
-                 "text/plain",
-                 title,
-                 strlen (title)+1);
-      free (title);
-    }
-  if (ret != 0)
-    return ret;
-
-  author = malloc (author_len + 1);
-  if (author != NULL)
-    {
-      memcpy (author, &prop->data[title_len + sizeof (UINT16)], author_len);
-      author[author_len] = '\0';
-      ret = proc (proc_cls,
-                 "real",
-                 EXTRACTOR_METATYPE_AUTHOR_NAME,
-                 EXTRACTOR_METAFORMAT_UTF8,
-                 "text/plain",
-                 author,
-                 strlen (author)+1);
-      free (author);
-    }
-  if (ret != 0)
-    return ret;
-
-  copyright = malloc (copyright_len + 1);
-  if (copyright != NULL)
-    {
-      memcpy (copyright,
-             &prop->data[title_len + sizeof (UINT16) * 2 + author_len],
-             copyright_len);
-      copyright[copyright_len] = '\0';
-      ret = proc (proc_cls,
-                 "real",
-                 EXTRACTOR_METATYPE_COPYRIGHT,
-                 EXTRACTOR_METAFORMAT_UTF8,
-                 "text/plain",
-                 copyright,
-                 strlen (copyright)+1);
-      free (copyright);
-    }
-  if (ret != 0)
-    return ret;
-
-  comment = malloc (comment_len + 1);
-  if (comment != NULL)
-    {
-      memcpy (comment,
-             &prop->data[title_len + sizeof (UINT16) * 3 + author_len +
-                         copyright_len], comment_len);
-      comment[comment_len] = '\0';
-      ret = proc (proc_cls,
-                 "real",
-                 EXTRACTOR_METATYPE_COMMENT,
-                 EXTRACTOR_METAFORMAT_UTF8,
-                 "text/plain",
-                 comment,
-                 strlen (comment)+1);
-      free (comment);
-    }
-  if (ret != 0)
-    return ret;
-  return 0;
-}
-
-typedef struct RAFF4_header
-{
-  unsigned short version;
-  unsigned short revision;
-  unsigned short header_length;
-  unsigned short compression_type;
-  unsigned int granularity;
-  unsigned int total_bytes;
-  unsigned int bytes_per_minute;
-  unsigned int bytes_per_minute2;
-  unsigned short interleave_factor;
-  unsigned short interleave_block_size;
-  unsigned int user_data;
-  float sample_rate;
-  unsigned short sample_size;
-  unsigned short channels;
-  unsigned char interleave_code[5];
-  unsigned char compression_code[5];
-  unsigned char is_interleaved;
-  unsigned char copy_byte;
-  unsigned char stream_type;
-  /*
-     unsigned char tlen;
-     unsigned char title[tlen];
-     unsigned char alen;
-     unsigned char author[alen];
-     unsigned char clen;
-     unsigned char copyright[clen];
-     unsigned char aplen;
-     unsigned char app[aplen]; */
-} RAFF4_header;
-
-#define RAFF4_HDR_SIZE 53
-
-static char *
-stndup (const char *str, size_t n)
-{
-  char *tmp;
-  tmp = malloc (n + 1);
-  if (tmp == NULL)
-    return NULL;
-  tmp[n] = '\0';
-  memcpy (tmp, str, n);
-  return tmp;
-}
-
-/* audio/vnd.rn-realaudio */
-int 
-EXTRACTOR_real_extract (const unsigned char *data,
-                       size_t size,
-                       EXTRACTOR_MetaDataProcessor proc,
-                       void *proc_cls,
-                       const char *options)
-{
-  const unsigned char *pos;
-  const unsigned char *end;
-  unsigned int length;
-  const RAFF4_header *hdr;
-  unsigned char tlen;
-  unsigned char alen;
-  unsigned char clen;
-  unsigned char aplen;
-  char *x;
-  int ret;
-
-  if (size <= 2 * sizeof (int))
-    return 0;
-  if (RAFF4_HEADER == ntohl (*(int *) data))
-    {
-      /* HELIX */
-      if (size <= RAFF4_HDR_SIZE + 16 + 4)
-        return 0;
-      if (0 != proc (proc_cls,
-                    "real",
-                    EXTRACTOR_METATYPE_MIMETYPE,
-                    EXTRACTOR_METAFORMAT_UTF8,
-                    "text/plain",
-                    "audio/vnd.rn-realaudio",
-                    strlen ("audio/vnd.rn-realaudio")+1))
-       return 1;
-      hdr = (const RAFF4_header *) &data[16];
-      if (ntohs (hdr->header_length) + 16 > size)
-        return 0;
-      tlen = data[16 + RAFF4_HDR_SIZE];
-      if (tlen + RAFF4_HDR_SIZE + 20 > size)
-        return 0;
-      alen = data[17 + tlen + RAFF4_HDR_SIZE];
-      if (tlen + alen + RAFF4_HDR_SIZE + 20 > size)
-        return 0;
-      clen = data[18 + tlen + alen + RAFF4_HDR_SIZE];
-      if (tlen + alen + clen + RAFF4_HDR_SIZE + 20 > size)
-        return 0;
-      aplen = data[19 + tlen + clen + alen + RAFF4_HDR_SIZE];
-      if (tlen + alen + clen + aplen + RAFF4_HDR_SIZE + 20 > size)
-        return 0;
-      ret = 0;
-      if ( (tlen > 0) && (ret == 0) )
-       {
-         x = stndup ((const char *) &data[17 + RAFF4_HDR_SIZE], tlen);
-         if (x != NULL)
-           {
-             ret = proc (proc_cls,
-                         "real",
-                         EXTRACTOR_METATYPE_MIMETYPE,
-                         EXTRACTOR_METAFORMAT_UTF8,
-                         "text/plain",
-                         x,
-                         strlen (x)+1);
-             free (x);
-           }
-       }
-      if ( (alen > 0) && (ret == 0) )
-       {
-         x = stndup ((const char *) &data[18 + RAFF4_HDR_SIZE + tlen], alen);
-         if (x != NULL)
-           {
-             ret = proc (proc_cls,
-                         "real",
-                         EXTRACTOR_METATYPE_MIMETYPE,
-                         EXTRACTOR_METAFORMAT_UTF8,
-                         "text/plain",
-                         x,
-                         strlen (x)+1);
-             free (x);
-           }
-       }
-      if ( (clen > 0) && (ret == 0) )
-       {
-         x = stndup ((const char *) &data[19 + RAFF4_HDR_SIZE + tlen + alen], 
clen);
-         if (x != NULL)
-           {
-             ret = proc (proc_cls,
-                         "real",
-                         EXTRACTOR_METATYPE_MIMETYPE,
-                         EXTRACTOR_METAFORMAT_UTF8,
-                         "text/plain",
-                         x,
-                         strlen (x)+1);
-             free (x);
-           }
-       }
-      if ( (aplen > 0) && (ret == 0) )
-       {
-         x = stndup ((const char *) &data[20 + RAFF4_HDR_SIZE + tlen + alen + 
clen], aplen);
-         if (x != NULL)
-           {
-             ret = proc (proc_cls,
-                         "real",
-                         EXTRACTOR_METATYPE_MIMETYPE,
-                         EXTRACTOR_METAFORMAT_UTF8,
-                         "text/plain",
-                         x,
-                         strlen (x)+1);
-             free (x);
-           }
-       }
-      return ret;
-    }
-  if (REAL_HEADER == ntohl (*(int *) data))
-    {
-      /* old real */
-      end = &data[size];
-      pos = &data[0];
-      ret = 0;
-      while (0 == ret)
-        {
-          if ((pos + 8 >= end) || (pos + 8 < pos))
-            break;
-          length = ntohl (*(((unsigned int *) pos) + 1));
-          if (length <= 0)
-            break;
-          if ((pos + length >= end) || (pos + length < pos))
-            break;
-          switch (ntohl (*((unsigned int *) pos)))
-            {
-            case MDPR_HEADER:
-              ret = processMediaProperties ((Media_Properties *) pos,
-                                               proc,
-                                              proc_cls);
-              pos += length;
-              break;
-            case CONT_HEADER:
-              ret = processContentDescription ((Content_Description *) pos,
-                                              proc,
-                                              proc_cls);
-              pos += length;
-              break;
-            case REAL_HEADER:  /* treat like default */
-            default:
-              pos += length;
-              break;
-            }
-        }
-      return ret;
-    }
-  return 0;
-}

Deleted: Extractor/src/plugins/riff_extractor.c
===================================================================
--- Extractor/src/plugins/riff_extractor.c      2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/riff_extractor.c      2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,123 +0,0 @@
-/*
-     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 AVInfo 1.0 alpha 11
-     (c) George Shuklin, gs]AT[shounen.ru, 2002-2004
-     http://shounen.ru/soft/avinfo/
-
-     and bitcollider 0.6.0
-     (PD) 2004 The Bitzi Corporation
-     http://bitzi.com/
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include <math.h>
-
-/**
- * Read the specified number of bytes as a little-endian (least
- * significant byte first) integer.
- */
-static unsigned int
-fread_le (const char *data)
-{
-  int x;
-  unsigned int result = 0;
-
-  for (x = 0; x < 4; x++)
-    result |= ((unsigned char) data[x]) << (x * 8);
-  return result;
-}
-
-/* We implement our own rounding function, because the availability of
- * C99's round(), nearbyint(), rint(), etc. seems to be spotty, whereas
- * floor() is available in math.h on all C compilers.
- */
-static double
-round_double (double num)
-{
-  return floor (num + 0.5);
-}
-
-#define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "riff", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto FINISH; } while 
(0)
-
-/* video/x-msvideo */
-int 
-EXTRACTOR_riff_extract (const char *xdata,
-                       size_t xsize,
-                       EXTRACTOR_MetaDataProcessor proc,
-                       void *proc_cls,
-                       const char *options)
-{
-  unsigned int blockLen;
-  unsigned int fps;
-  unsigned int duration;
-  size_t pos;
-  unsigned int width;
-  unsigned int height;
-  char codec[5];
-  char format[256];
-  int ret;
-
-  if (xsize < 32)
-    return 0;
-  if ((memcmp (&xdata[0],
-               "RIFF", 4) != 0) || (memcmp (&xdata[8], "AVI ", 4) != 0))
-    return 0;
-  if (memcmp (&xdata[12], "LIST", 4) != 0)
-    return 0;
-  if (memcmp (&xdata[20], "hdrlavih", 8) != 0)
-    return 0;
-
-  blockLen = fread_le (&xdata[28]);
-
-  /* begin of AVI header at 32 */
-  fps = (unsigned int) round_double ((double) 1.0e6 / fread_le (&xdata[32]));
-  duration = (unsigned int) round_double ((double) fread_le (&xdata[48])
-                                          * 1000 / fps);
-  width = fread_le (&xdata[64]);
-  height = fread_le (&xdata[68]);
-  /* pos: begin of video stream header */
-  pos = blockLen + 32;
-
-  if ((pos < blockLen) || (pos + 32 > xsize) || (pos > xsize))
-    return 0;
-  if (memcmp (&xdata[pos], "LIST", 4) != 0)
-    return 0;
-  blockLen = fread_le (&xdata[pos + 4]);
-  if (memcmp (&xdata[pos + 8], "strlstrh", 8) != 0)
-    return 0;
-  if (memcmp (&xdata[pos + 20], "vids", 4) != 0)
-    return 0;
-  ret = 0;
-  /* pos + 24: video stream header */
-  memcpy (codec, &xdata[pos + 24], 4);
-  codec[4] = '\0';
-  snprintf (format,
-           sizeof(format),
-           _("codec: %s, %u fps, %u ms"), codec, fps, duration);
-  ADD (format, EXTRACTOR_METATYPE_FORMAT);
-  snprintf (format, 
-           sizeof(format), 
-           "%ux%u", width, height);
-  ADD (format, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
-  ADD ("video/x-msvideo", EXTRACTOR_METATYPE_MIMETYPE);
- FINISH:
-  return ret;
-}

Deleted: Extractor/src/plugins/tar_extractor.c
===================================================================
--- Extractor/src/plugins/tar_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/tar_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,855 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003, 2004, 2005, 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"
-
-/*
- * Note that this code is not complete!
- *
- * References:
- *
- * http://www.mkssoftware.com/docs/man4/tar.4.asp
- * (does document USTAR format common nowadays,
- *  but not other extended formats such as the one produced
- *  by GNU tar 1.13 when very long filenames are met.)
- *
- * http://gd.tuwien.ac.at/utils/archivers/star/README.otherbugs
- * (J. Schilling's remarks on TAR formats compatibility issues.)
- */
-
-/*
- * Define known TAR archive member variants.
- * In theory different variants
- * can coexist within a single TAR archive file
- * although this will be uncommon.
- */
-#define TAR_V7ORIGINAL_FORMAT    (1)
-#define TAR_V7EXTENDED_FORMAT    (1 << 1)
-#define TAR_SCHILLING1985_FORMAT (1 << 2)
-#define TAR_POSIX1988_FORMAT     (1 << 3)
-#define TAR_GNU1991_FORMAT       (1 << 4)
-#define TAR_SCHILLING1994_FORMAT (1 << 5)
-#define TAR_GNU1997_FORMAT       (1 << 6)
-#define TAR_POSIX2001_FORMAT     (1 << 7)
-#define TAR_SCHILLING2001_FORMAT (1 << 8)
-#define TAR_SOLARIS2001_FORMAT   (1 << 9)
-#define TAR_GNU2004_FORMAT       (1 << 10)
-
-/*
- * TAR header structure, modelled after POSIX.1-1988
- */
-typedef struct
-{
-  char fileName[100];
-  char mode[8];
-  char userId[8];
-  char groupId[8];
-  char fileSize[12];
-  char lastModTime[12];
-  char chksum[8];
-  char link;
-  char linkName[100];
-  /*
-   * All fields below are a
-   * either zero-filled or undefined
-   * for UNIX V7 TAR archive members ;
-   * their header is always 512 octets long nevertheless.
-   */
-  char ustarMagic[6];
-  char version[2];
-  char userName[32];
-  char groupName[32];
-  char devMajor[8];
-  char devMinor[8];
-  char prefix[155];
-  char filler[12];
-} TarHeader;
-
-#define TAR_HEADER_SIZE (sizeof(TarHeader))
-#define TAR_TIME_FENCE  ((long long) (-(1LL << 62)))
-
-static size_t
-tar_roundup (size_t size)
-{
-  size_t diff = (size % TAR_HEADER_SIZE);
-
-  return (0 == diff) ? size : (size + (TAR_HEADER_SIZE - diff));
-}
-
-static int
-tar_isnonzero (const char *data, unsigned int length)
-{
-  unsigned int total = 0;
-
-  while (total < length)
-    {
-      if (0 != data[total])
-        return 1;
-      total++;
-    }
-
-  return 0;
-}
-
-static unsigned int
-tar_octalvalue (const char *data, size_t size, unsigned long long *valueptr)
-{
-  unsigned int result = 0;
-
-  if (NULL != data && 0 < size)
-    {
-      const char *p = data;
-      int found = 0;
-      unsigned long long value = 0;
-
-      while ((p < data + size) && (' ' == *p))
-        p += 1;
-
-      while ((p < data + size) && ('0' <= *p) && (*p < '8'))
-        {
-          found = 1;
-          value *= 8;
-          value += (*p - '0');
-          p += 1;
-        }
-
-      if (0 != found)
-        {
-          while ((p < data + size) && ((0 == *p) || (' ' == *p)))
-            p += 1;
-
-          result = (p - data);
-        }
-
-      if ((0 < result) && (NULL != valueptr))
-        *valueptr = value;
-    }
-
-  return result;
-}
-
-#ifndef EOVERFLOW
-#define EOVERFLOW -1
-#endif
-
-static int
-tar_time (long long timeval, char *rtime, unsigned int rsize)
-{
-  int retval = 0;
-
-  /*
-   * shift epoch to proleptic times
-   * to make subsequent modulo operations safer.
-   */
-  long long my_timeval = timeval
-    + ((long long) ((1970 * 365) + 478) * (long long) 86400);
-
-  unsigned int seconds = (unsigned int) (my_timeval % 60);
-  unsigned int minutes = (unsigned int) ((my_timeval / 60) % 60);
-  unsigned int hours = (unsigned int) ((my_timeval / 3600) % 24);
-
-  unsigned int year = 0;
-  unsigned int month = 1;
-
-  unsigned int days = (unsigned int) (my_timeval / (24 * 3600));
-
-  unsigned int days_in_month[] =
-    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
-  unsigned int diff = 0;
-
-  if ((long long) 0 > my_timeval)
-    return EDOM;
-
-  /*
-   * 400-year periods
-   */
-  year += (400 * (days / ((365 * 400) + 97)));
-  days %= ((365 * 400) + 97);
-
-  /*
-   * 100-year periods
-   */
-  diff = (days / ((365 * 100) + 24));
-  if (4 <= diff)
-    {
-      year += 399;
-      days = 364;
-    }
-  else
-    {
-      year += (100 * diff);
-      days %= ((365 * 100) + 24);
-    }
-
-  /*
-   * remaining leap years
-   */
-  year += (4 * (days / ((365 * 4) + 1)));
-  days %= ((365 * 4) + 1);
-
-  while (1)
-    {
-      if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
-        {
-          if (366 > days)
-            {
-              break;
-            }
-          else
-            {
-              days -= 366;
-              year++;
-            }
-        }
-      else
-        {
-          if (365 > days)
-            {
-              break;
-            }
-          else
-            {
-              days -= 365;
-              year++;
-            }
-        }
-    }
-
-  if ((0 == (year % 400)) || ((0 == (year % 4)) && (0 != (year % 100))))
-    days_in_month[1] = 29;
-
-  for (month = 0; (month < 12) && (days >= days_in_month[month]); month += 1)
-    days -= days_in_month[month];
-
-  retval = snprintf (rtime, rsize, "%04u-%02u-%02uT%02u:%02u:%02uZ",
-                     year, month + 1, days + 1, hours, minutes, seconds);
-
-  return (retval < rsize) ? 0 : EOVERFLOW;
-}
-
-#define ADD(t,s) do { if (0 != (ret = proc (proc_cls, "tar", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto FINISH; } while 
(0)
-#define ADDF(t,s) do { if (0 != (ret = proc (proc_cls, "tar", t, 
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) { free(s); goto 
FINISH; } free (s); } while (0)
-
-int
-EXTRACTOR_tar_extract (const char *data,
-                       size_t size,
-                       EXTRACTOR_MetaDataProcessor proc,
-                       void *proc_cls, const char *options)
-{
-  char *fname = NULL;
-  size_t pos;
-  int contents_are_empty = 1;
-  long long maxftime = TAR_TIME_FENCE;
-  unsigned int format_archive = 0;
-  int ret;
-
-  if (512 != TAR_HEADER_SIZE)
-    return 0;                   /* compiler should remove this when optimising 
*/
-  if (0 != (size % TAR_HEADER_SIZE))
-    return 0;                   /* cannot be tar! */
-  if (size < TAR_HEADER_SIZE)
-    return 0;                   /* too short, or somehow truncated */
-
-  ret = 0;
-  pos = 0;
-  while ((pos + TAR_HEADER_SIZE) <= size)
-    {
-      const TarHeader *tar = NULL;
-      unsigned format_member = 0;
-      unsigned long long fmode;
-      unsigned long long fsize;
-      long long ftime = TAR_TIME_FENCE;
-      char typeFlag = -1;
-      const char *nul_pos;
-      unsigned int tar_prefix_length = 0;
-      unsigned int tar_name_length = 0;
-      unsigned int checksum_offset;
-      int checksum_computed_500s = 0;
-      int checksum_computed_512s = 0;
-      unsigned int checksum_computed_500u = 0;
-      unsigned int checksum_computed_512u = 0;
-      unsigned long long checksum_stored = 0;
-
-      /*
-       * Compute TAR header checksum and compare with stored value.
-       * Allow for non-conformant checksums computed with signed values,
-       * such as those produced by early Solaris tar.
-       * Allow for non-conformant checksums computed on first 500 octets,
-       * such as those produced by SunOS 4.x tar according to J. Schilling.
-       * This will also detect EOF marks, since a zero-filled block
-       * cannot possibly hold octal values.
-       */
-      for (checksum_offset = 0; checksum_offset < 148; checksum_offset += 1)
-        {
-          checksum_computed_500u +=
-            (unsigned char) data[pos + checksum_offset];
-          checksum_computed_500s += (signed char) data[pos + checksum_offset];
-        }
-      if (8 >
-          tar_octalvalue (data + pos + checksum_offset, 8, &checksum_stored))
-        break;
-      for (; checksum_offset < 156; checksum_offset += 1)
-        {
-          checksum_computed_500u += (unsigned char) ' ';
-          checksum_computed_500s += (signed char) ' ';
-        }
-      for (; checksum_offset < 500; checksum_offset += 1)
-        {
-          checksum_computed_500u +=
-            (unsigned char) data[pos + checksum_offset];
-          checksum_computed_500s += (signed char) data[pos + checksum_offset];
-        }
-
-      checksum_computed_512u = checksum_computed_500u;
-      checksum_computed_512s = checksum_computed_500s;
-      for (; checksum_offset < TAR_HEADER_SIZE; checksum_offset += 1)
-        {
-          checksum_computed_512u +=
-            (unsigned char) data[pos + checksum_offset];
-          checksum_computed_512s += (signed char) data[pos + checksum_offset];
-        }
-
-      /*
-       * Suggestion: use signed checksum matches to refine
-       * TAR format detection.
-       */
-      if ((checksum_stored != (unsigned long long) checksum_computed_512u)
-          && (checksum_stored != (unsigned long long) checksum_computed_512s)
-          && (checksum_stored != (unsigned long long) checksum_computed_500s)
-          && (checksum_stored != (unsigned long long) checksum_computed_500u))
-        break;
-
-      tar = (const TarHeader *) &data[pos];
-      typeFlag = tar->link;
-      pos += TAR_HEADER_SIZE;
-
-      /*
-       * Checking all octal fields helps reduce
-       * the possibility of false positives ;
-       * only the file size, time and mode are used for now.
-       *
-       * This will fail over GNU and Schilling TAR huge size fields
-       * using non-octal encodings used for very large file lengths (> 8 GB).
-       */
-      if ((12 > tar_octalvalue (tar->fileSize, 12,
-                                &fsize))
-          || (12 > tar_octalvalue (tar->lastModTime, 12,
-                                   (unsigned long long *) &ftime))
-          || (8 > tar_octalvalue (tar->mode, 8,
-                                  (unsigned long long *) &fmode))
-          || (8 > tar_octalvalue (tar->userId, 8, NULL))
-          || (8 > tar_octalvalue (tar->groupId, 8, NULL)))
-        break;
-
-      /*
-       * Find out which TAR variant is here.
-       */
-      if (0 == memcmp (tar->ustarMagic, "ustar  ", 7))
-        {
-
-          if (' ' == tar->mode[6])
-            format_member = TAR_GNU1991_FORMAT;
-          else if (('K' == typeFlag) || ('L' == typeFlag))
-            {
-              format_member = TAR_GNU1997_FORMAT;
-              ftime = TAR_TIME_FENCE;
-            }
-          else
-            format_member =
-              (((unsigned) fmode) !=
-               (((unsigned) fmode) & 03777)) ? TAR_GNU1997_FORMAT :
-              TAR_GNU2004_FORMAT;
-
-        }
-      else if (0 == memcmp (tar->ustarMagic, "ustar", 6))
-        {
-
-          /*
-           * It is important to perform test for SCHILLING1994 before GNU1997
-           * because certain extension type flags ('L' and 'S' for instance)
-           * are used by both.
-           */
-          if ((0 == tar->prefix[130])
-              && (12 <= tar_octalvalue (tar->prefix + 131, 12, NULL))
-              && (12 <= tar_octalvalue (tar->prefix + 143, 12, NULL))
-              && (0 == tar_isnonzero (tar->filler, 8))
-              && (0 == memcmp (tar->filler + 8, "tar", 4)))
-            {
-
-              format_member = TAR_SCHILLING1994_FORMAT;
-
-            }
-          else if (('D' == typeFlag) || ('K' == typeFlag)
-                   || ('L' == typeFlag) || ('M' == typeFlag)
-                   || ('N' == typeFlag) || ('S' == typeFlag)
-                   || ('V' == typeFlag))
-            {
-
-              format_member = TAR_GNU1997_FORMAT;
-
-            }
-          else if (('g' == typeFlag)
-                   || ('x' == typeFlag) || ('X' == typeFlag))
-            {
-
-              format_member = TAR_POSIX2001_FORMAT;
-              ftime = TAR_TIME_FENCE;
-
-            }
-          else
-            {
-
-              format_member = TAR_POSIX1988_FORMAT;
-
-            }
-        }
-      else if ((0 == memcmp (tar->filler + 8, "tar", 4))
-               && (0 == tar_isnonzero (tar->filler, 8)))
-        {
-
-          format_member = TAR_SCHILLING1985_FORMAT;
-
-        }
-      else if (('0' <= typeFlag) && (typeFlag <= '2'))
-        {
-
-          format_member = TAR_V7ORIGINAL_FORMAT;
-
-        }
-      else
-        {
-
-          format_member = TAR_V7EXTENDED_FORMAT;
-
-        }
-
-      /*
-       * Locate the file names.
-       */
-      if ((0 != (format_member & TAR_POSIX2001_FORMAT))
-         && (('x' == typeFlag) || ('X' == typeFlag)))
-       {
-         
-         if (size <= pos)
-           break;
-         
-         else if ((8 <= fsize) && fsize <= (unsigned long long) (size - pos))
-           {
-             const char *keyptr = data + pos;
-             const char *valptr = NULL;
-             const char *nameptr = NULL;
-             unsigned int keylength = 0;
-             unsigned int namelength = 0;
-             
-             while (keyptr < data + pos + (size_t) fsize)
-               {
-                 if (('0' > *keyptr) || ('9' < *keyptr))
-                   {
-                     keyptr += 1;
-                     continue;
-                   }
-                 
-                 keylength =
-                   (unsigned int) strtoul (keyptr, (char **) &valptr, 10);
-                 if ((0 < keylength) && (NULL != valptr)
-                     && (keyptr != valptr))
-                   {
-                     while ((valptr < data + pos + (size_t) fsize)
-                            && (' ' == *valptr))
-                       valptr += 1;
-                     if (0 == memcmp (valptr, "path=", 5))
-                       {
-                         nameptr = valptr + 5;
-                         namelength = keylength - (nameptr - keyptr);
-                       }
-                     else
-                       {
-                         
-                         if ((keylength > (valptr - keyptr) + 4 + 2)
-                             && (0 == memcmp (valptr, "GNU.", 4)))
-                           format_archive |= TAR_GNU2004_FORMAT;
-                         
-                         else if ((keylength > (valptr - keyptr) + 7 + 2)
-                                  && (0 == memcmp (valptr, "SCHILY.", 7)))
-                           format_archive |= TAR_SCHILLING2001_FORMAT;
-                         
-                         else if ((keylength > (valptr - keyptr) + 4 + 2)
-                                  && (0 == memcmp (valptr, "SUN.", 4)))
-                           format_archive |= TAR_SOLARIS2001_FORMAT;
-                       }
-                     
-                     keyptr += keylength;
-                   }
-                 else
-                   {
-                     nameptr = NULL;
-                     break;
-                   }
-                }
-             
-              if ((NULL != nameptr) && (0 != *nameptr)
-                  && ((size - (nameptr - data)) >= namelength)
-                  && (1 < namelength) )
-                {
-                  /*
-                   * There is an 1-offset because POSIX.1-2001
-                   * field separator is counted in field length.
-                   */
-                 if (fname != NULL)
-                   free (fname);
-                  fname = malloc (namelength);
-                  if (NULL != fname)
-                    {
-                      memcpy (fname, nameptr, namelength - 1);
-                      fname[namelength - 1] = '\0';
-
-                      pos += tar_roundup ((size_t) fsize);
-                      format_archive |= format_member;
-                      continue;
-                    }
-                }
-            }
-        }
-
-      else if ((0 != (format_member
-                      & (TAR_SCHILLING1994_FORMAT
-                         | TAR_GNU1997_FORMAT | TAR_GNU2004_FORMAT)))
-               && ('L' == typeFlag))
-        {
-
-          if (size <= pos)
-            break;
-
-          else if ((0 < fsize) && fsize <= (unsigned long long) (size - pos))
-            {
-
-              size_t length = (size_t) fsize;
-
-              nul_pos = memchr (data + pos, 0, length);
-              if (NULL != nul_pos)
-                length = (nul_pos - (data + pos));
-
-              if (0 < length)
-                {
-                 if (fname != NULL)
-                   free (fname);
-                  fname = malloc (1 + length);
-                  if (NULL != fname)
-                    {
-                      memcpy (fname, data + pos, length);
-                      fname[length] = '\0';
-                    }
-
-                  pos += tar_roundup ((size_t) fsize);
-                  format_archive |= format_member;
-                  continue;
-                }
-            }
-        }
-      else
-        {
-
-          nul_pos = memchr (tar->fileName, 0, sizeof tar->fileName);
-          tar_name_length = (0 == nul_pos)
-            ? sizeof (tar->fileName) : (nul_pos - tar->fileName);
-
-          if ((0 !=
-               (format_member & (TAR_GNU1997_FORMAT | TAR_GNU2004_FORMAT)))
-              && ('S' == typeFlag))
-            {
-
-              if ((0 == tar->prefix[40])
-                  && (0 != tar->prefix[137])
-                  && (12 <= tar_octalvalue (tar->prefix + 41, 12, NULL))
-                  && (12 <= tar_octalvalue (tar->prefix + 53, 12, NULL)))
-                {
-                  /*
-                   * fsize needs adjustment when there are more than 4 sparse 
blocks
-                   */
-                  size_t diffpos = 0;
-                  fsize += TAR_HEADER_SIZE;
-
-                  while ((pos + diffpos + TAR_HEADER_SIZE < size)
-                         && (0 != *(data + pos + diffpos + 504)))
-                    {
-                      diffpos += TAR_HEADER_SIZE;
-                      fsize += TAR_HEADER_SIZE;
-                    }
-                }
-
-              typeFlag = '0';
-
-            }
-          else if (0 != (format_member & TAR_SCHILLING1994_FORMAT))
-            {
-
-              nul_pos = memchr (tar->prefix, 0, 130);
-              tar_prefix_length = (0 == nul_pos)
-                ? 130 : (nul_pos - tar->prefix);
-
-              if ('S' == typeFlag)
-                typeFlag = '0';
-
-            }
-          else if (0 != (format_member & TAR_SCHILLING1985_FORMAT))
-            {
-
-              nul_pos = memchr (tar->prefix, 0, 155);
-              tar_prefix_length = (0 == nul_pos)
-                ? 155 : (nul_pos - tar->prefix);
-
-
-              if ('S' == typeFlag)
-                typeFlag = '0';
-
-            }
-          else if (0 != (format_member & TAR_POSIX1988_FORMAT))
-            {
-
-              nul_pos = memchr (tar->prefix, 0, sizeof tar->prefix);
-              tar_prefix_length = (0 == nul_pos)
-                ? sizeof tar->prefix : nul_pos - tar->prefix;
-
-            }
-        }
-
-      /*
-       * Update position so that next loop iteration will find
-       * either a TAR header or TAR EOF mark or just EOF.
-       *
-       * Consider archive member size to be zero
-       * with no data following the header in the following cases :
-       * '1' : hard link, '2' : soft link,
-       * '3' : character device, '4' : block device,
-       * '5' : directory, '6' : named pipe.
-       */
-      if ('1' != typeFlag && '2' != typeFlag
-          && '3' != typeFlag && '4' != typeFlag
-          && '5' != typeFlag && '6' != typeFlag)
-        {
-          if ((fsize > (unsigned long long) size)
-              || (fsize + (unsigned long long) pos >
-                  (unsigned long long) size))
-            break;
-
-          pos += tar_roundup ((size_t) fsize);
-        }
-      if (pos - 1 > size)
-        break;
-
-      format_archive |= format_member;
-
-      /*
-       * Store the file name in libextractor list.
-       *
-       * For the time being, only file types listed in POSIX.1-1988 ('0'..'7')
-       * are retained, leaving out labels, access control lists, etc.
-       */
-      if ((0 == typeFlag) || (('0' <= typeFlag) && (typeFlag <= '7')))
-        {
-          if (NULL == fname)
-            {
-              if (0 < tar_prefix_length + tar_name_length)
-                {
-                  fname = malloc (2 + tar_prefix_length + tar_name_length);
-
-                  if (NULL != fname)
-                    {
-                      if (0 < tar_prefix_length)
-                        {
-                          memcpy (fname, tar->prefix, tar_prefix_length);
-
-                          if (('/' != tar->prefix[tar_prefix_length - 1])
-                              && (0 < tar_name_length)
-                              && ('/' != tar->fileName[0]))
-                            {
-                              fname[tar_prefix_length] = '/';
-                              tar_prefix_length += 1;
-                            }
-                        }
-
-                      if (0 < tar_name_length)
-                        memcpy (fname + tar_prefix_length, tar->fileName,
-                                tar_name_length);
-
-                      fname[tar_prefix_length + tar_name_length] = '\0';
-                    }
-                }
-            }
-
-          if ((NULL != fname) && (0 != *fname))
-            {
-#if 0
-              fprintf (stdout,
-                       "(%u) flag = %c, size = %u, tname = (%s), fname = 
(%s)\n",
-                       __LINE__, typeFlag, (unsigned int) fsize,
-                       (NULL == tar->fileName) ? "" : tar->fileName,
-                       (NULL == fname) ? "" : fname);
-#endif
-
-              ADDF (EXTRACTOR_METATYPE_FILENAME, fname);
-              fname = NULL;
-              if (ftime > maxftime)
-                maxftime = ftime;
-              contents_are_empty = 0;
-            }
-        }
-
-      if (NULL != fname)
-        {
-          free (fname);
-          fname = NULL;
-        }
-    }
-
-  if (NULL != fname)
-    {
-      free (fname);
-      fname = NULL;
-    }
-
-  /*
-   * Report mimetype; report also format(s) and most recent date
-   * when at least one archive member was found.
-   */
-  if (0 == format_archive)
-    return ret;
-  if (0 == contents_are_empty)
-    {
-
-      const char *formats[5] = { NULL, NULL, NULL, NULL, NULL };
-      unsigned int formats_count = 0;
-      unsigned int formats_u = 0;
-      unsigned int format_length = 0;
-      char *format = NULL;
-
-      if (TAR_TIME_FENCE < maxftime)
-        {
-          char iso8601_time[24];
-
-          if (0 == tar_time (maxftime, iso8601_time, sizeof (iso8601_time)))
-            ADD (EXTRACTOR_METATYPE_CREATION_DATE, iso8601_time);
-        }
-
-      /*
-       * We only keep the most recent POSIX format.
-       */
-      if (0 != (format_archive & TAR_POSIX2001_FORMAT))
-        formats[formats_count++] = "POSIX 2001";
-
-      else if (0 != (format_archive & TAR_POSIX1988_FORMAT))
-        formats[formats_count++] = "POSIX 1988";
-
-      /*
-       * We only keep the most recent GNU format.
-       */
-      if (0 != (format_archive & TAR_GNU2004_FORMAT))
-        formats[formats_count++] = "GNU 2004";
-
-      else if (0 != (format_archive & TAR_GNU1997_FORMAT))
-        formats[formats_count++] = "GNU 1997";
-
-      else if (0 != (format_archive & TAR_GNU1991_FORMAT))
-        formats[formats_count++] = "GNU 1991";
-
-      /*
-       * We only keep the most recent Schilling format.
-       */
-      if (0 != (format_archive & TAR_SCHILLING2001_FORMAT))
-        formats[formats_count++] = "Schilling 2001";
-
-      else if (0 != (format_archive & TAR_SCHILLING1994_FORMAT))
-        formats[formats_count++] = "Schilling 1994";
-
-      else if (0 != (format_archive & TAR_SCHILLING1985_FORMAT))
-        formats[formats_count++] = "Schilling 1985";
-
-      /*
-       * We only keep the most recent Solaris format.
-       */
-      if (0 != (format_archive & TAR_SOLARIS2001_FORMAT))
-        formats[formats_count++] = "Solaris 2001";
-
-      /*
-       * We only keep the (supposedly) most recent UNIX V7 format.
-       */
-      if (0 != (format_archive & TAR_V7EXTENDED_FORMAT))
-        formats[formats_count++] = "UNIX extended V7";
-
-      else if (0 != (format_archive & TAR_V7ORIGINAL_FORMAT))
-        formats[formats_count++] = "UNIX original V7";
-
-      /*
-       * Build the format string
-       */
-      for (formats_u = 0; formats_u < formats_count; formats_u += 1)
-        {
-          if ((NULL != formats[formats_u]) && (0 != *formats[formats_u]))
-            {
-              if (0 < format_length)
-                format_length += 3;
-              format_length += strlen (formats[formats_u]);
-            }
-        }
-
-      if (0 < format_length)
-        {
-         if (fname != NULL)
-           free (fname);
-          format = malloc (format_length + 5);
-
-          if (NULL != format)
-            {
-
-              format_length = 0;
-
-              for (formats_u = 0; formats_u < formats_count; formats_u += 1)
-                {
-                  if ((NULL != formats[formats_u])
-                      && (0 != *formats[formats_u]))
-                    {
-                      if (0 < format_length)
-                        {
-                          strcpy (format + format_length, " + ");
-                          format_length += 3;
-                        }
-                      strcpy (format + format_length, formats[formats_u]);
-                      format_length += strlen (formats[formats_u]);
-                    }
-                }
-
-              if (0 < format_length)
-                {
-                  strcpy (format + format_length, " TAR");
-                  ADDF (EXTRACTOR_METATYPE_FORMAT_VERSION, format);
-                }
-              else
-                {
-                  free (format);
-                }
-            }
-        }
-    }
-
-  ADD (EXTRACTOR_METATYPE_MIMETYPE, "application/x-tar");
-FINISH:
-  return ret;
-}

Deleted: Extractor/src/plugins/thumbnailffmpeg_extractor.c
===================================================================
--- Extractor/src/plugins/thumbnailffmpeg_extractor.c   2012-08-14 22:58:15 UTC 
(rev 23240)
+++ Extractor/src/plugins/thumbnailffmpeg_extractor.c   2012-08-14 23:02:49 UTC 
(rev 23241)
@@ -1,655 +0,0 @@
-/*
-     This file is part of libextractor.
-     Copyright (C) 2008 Heikki Lindholm
-
-     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.
- */
-
-/**
- * @file thumbnailffmpeg_extractor.c
- * @author Heikki Lindholm
- * @brief this extractor produces a binary encoded
- * thumbnail of images and videos using the ffmpeg libs.
- */
-
-/* This is a thumbnail extractor using the ffmpeg libraries that will 
eventually
-   support extracting thumbnails from both image and video files. 
-
-   Note that ffmpeg has a few issues:
-   (1) there are no recent official releases of the ffmpeg libs
-   (2) ffmpeg has a history of having security issues (parser is not robust)
-
-   So this plugin cannot be recommended for system with high security
-   requirements. 
-*/
-
-#include "platform.h"
-#include "extractor.h"
-#if HAVE_LIBAVUTIL_AVUTIL_H
-#include <libavutil/avutil.h>
-#elif HAVE_FFMPEG_AVUTIL_H
-#include <ffmpeg/avutil.h>
-#endif
-#if HAVE_LIBAVFORMAT_AVFORMAT_H
-#include <libavformat/avformat.h>
-#elif HAVE_FFMPEG_AVFORMAT_H
-#include <ffmpeg/avformat.h>
-#endif
-#if HAVE_LIBAVCODEC_AVCODEC_H
-#include <libavcodec/avcodec.h>
-#elif HAVE_FFMPEG_AVCODEC_H
-#include <ffmpeg/avcodec.h>
-#endif
-#if HAVE_LIBSWSCALE_SWSCALE_H
-#include <libswscale/swscale.h>
-#elif HAVE_FFMPEG_SWSCALE_H
-#include <ffmpeg/swscale.h>
-#endif
-
-#include "mime_extractor.c" /* TODO: do this cleaner */
-
-#define DEBUG 0
-
-static void thumbnailffmpeg_av_log_callback(void* ptr, 
-                                            int level,
-                                            const char *format,
-                                            va_list ap)
-{
-#if DEBUG
-  vfprintf(stderr, format, ap);
-#endif
-}
-
-void __attribute__ ((constructor)) ffmpeg_lib_init (void)
-{
-  av_log_set_callback (thumbnailffmpeg_av_log_callback);
-  av_register_all ();
-}
-
-#define MAX_THUMB_DIMENSION 128         /* max dimension in pixels */
-#define MAX_THUMB_BYTES (100*1024)
-
-/*
- * Rescale and encode a PNG thumbnail
- * on success, fills in output_data and returns the number of bytes used
- */
-static size_t create_thumbnail(
-  int src_width, int src_height, int src_stride[],
-  enum PixelFormat src_pixfmt, const uint8_t * const src_data[],
-  int dst_width, int dst_height,
-  uint8_t **output_data, size_t output_max_size)
-{
-  AVCodecContext *encoder_codec_ctx = NULL;
-  AVCodec *encoder_codec = NULL;
-  struct SwsContext *scaler_ctx = NULL;
-  int sws_flags = SWS_BILINEAR;
-  AVFrame *dst_frame = NULL;
-  uint8_t *dst_buffer = NULL;
-  uint8_t *encoder_output_buffer = NULL;
-  size_t encoder_output_buffer_size;
-  int err;
-
-  encoder_codec = avcodec_find_encoder_by_name ("png");
-  if (encoder_codec == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-              "Couldn't find a PNG encoder\n");
-#endif
-      return 0;
-    }
-
-  /* NOTE: the scaler will be used even if the src and dst image dimensions
-   * match, because the scaler will also perform colour space conversion */
-  scaler_ctx =
-    sws_getContext (src_width, src_height, src_pixfmt,
-                    dst_width, dst_height, PIX_FMT_RGB24, 
-                    sws_flags, NULL, NULL, NULL);
-  if (scaler_ctx == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to get a scaler context\n");
-#endif
-      return 0;
-    }
-
-  dst_frame = avcodec_alloc_frame ();
-  if (dst_frame == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate the destination image frame\n");
-#endif
-      sws_freeContext(scaler_ctx);
-      return 0;
-    }
-  dst_buffer =
-    av_malloc (avpicture_get_size (PIX_FMT_RGB24, dst_width, dst_height));
-  if (dst_buffer == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate the destination image buffer\n");
-#endif
-      av_free (dst_frame);
-      sws_freeContext(scaler_ctx);
-      return 0;
-    }
-  avpicture_fill ((AVPicture *) dst_frame, dst_buffer,
-                  PIX_FMT_RGB24, dst_width, dst_height);
-      
-  sws_scale (scaler_ctx,
-             src_data, 
-             src_stride,
-             0, src_height, 
-             dst_frame->data, 
-             dst_frame->linesize);
-
-  encoder_output_buffer_size = output_max_size;
-  encoder_output_buffer = av_malloc (encoder_output_buffer_size);
-  if (encoder_output_buffer == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate the encoder output buffer\n");
-#endif
-      av_free (dst_buffer);
-      av_free (dst_frame);
-      sws_freeContext(scaler_ctx);
-      return 0;
-    }
-
-  encoder_codec_ctx = avcodec_alloc_context ();
-  if (encoder_codec_ctx == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate the encoder codec context\n");
-#endif
-      av_free (encoder_output_buffer);
-      av_free (dst_buffer);
-      av_free (dst_frame);
-      sws_freeContext(scaler_ctx);
-      return 0;
-    }
-  encoder_codec_ctx->width = dst_width;
-  encoder_codec_ctx->height = dst_height;
-  encoder_codec_ctx->pix_fmt = PIX_FMT_RGB24;
-
-  if (avcodec_open (encoder_codec_ctx, encoder_codec) < 0)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to open the encoder\n");
-#endif
-      av_free (encoder_codec_ctx);
-      av_free (encoder_output_buffer);
-      av_free (dst_buffer);
-      av_free (dst_frame);
-      sws_freeContext(scaler_ctx);
-      return 0;
-    }
-
-  err = avcodec_encode_video (encoder_codec_ctx,
-                              encoder_output_buffer,
-                              encoder_output_buffer_size, dst_frame);
-
-  avcodec_close (encoder_codec_ctx);
-  av_free (encoder_codec_ctx);
-  av_free (dst_buffer);
-  av_free (dst_frame);
-  sws_freeContext(scaler_ctx);
-
-  *output_data = encoder_output_buffer;
-
-  return err < 0 ? 0 : err;
-}
-
-struct MIMEToDecoderMapping
-{
- const char *mime_type;
- enum CodecID codec_id;
-};
-
-/* map MIME image types to an ffmpeg decoder */
-static const struct MIMEToDecoderMapping m2d_map[] = {
-  {"image/x-bmp", CODEC_ID_BMP},
-  {"image/gif", CODEC_ID_GIF},
-  {"image/jpeg", CODEC_ID_MJPEG},
-  {"image/png", CODEC_ID_PNG},
-  {"image/x-png", CODEC_ID_PNG},
-  {"image/x-portable-pixmap", CODEC_ID_PPM},
-  {NULL, CODEC_ID_NONE}
-};
-
-static char *mime_type;
-
-static int
-mime_processor (void *cls,
-                        const char *plugin_name,
-                        enum EXTRACTOR_MetaType type,
-                        enum EXTRACTOR_MetaFormat format,
-                        const char *data_mime_type,
-                        const char *data,
-                        size_t data_len)
-{ 
-  switch (format)
-    {
-    case EXTRACTOR_METAFORMAT_UTF8:
-      mime_type = strdup(data);
-      break;
-    default:
-      break;
-    }
-  return 0;
-}
-
-/* calculate the thumbnail dimensions, taking pixel aspect into account */
-static void calculate_thumbnail_dimensions(int src_width,
-                                           int src_height,
-                                           int src_sar_num,
-                                           int src_sar_den,
-                                           int *dst_width,
-                                           int *dst_height)
-{
-  if (src_sar_num <= 0 || src_sar_den <= 0)
-    {
-      src_sar_num = 1;
-      src_sar_den = 1;
-    }
-  if ((src_width * src_sar_num) / src_sar_den > src_height)
-    {
-      *dst_width = MAX_THUMB_DIMENSION;
-      *dst_height = (*dst_width * src_height) /
-                     ((src_width * src_sar_num) / src_sar_den);
-    }
-  else
-    {
-      *dst_height = MAX_THUMB_DIMENSION;
-      *dst_width = (*dst_height *
-                    ((src_width * src_sar_num) / src_sar_den)) /
-                    src_height;
-    }
-  if (*dst_width < 8)
-    *dst_width = 8;
-  if (*dst_height < 1)
-    *dst_height = 1;
-#if DEBUG
-  fprintf (stderr,
-           "Thumbnail dimensions: %d %d\n", 
-           *dst_width, *dst_height);
-#endif
-}
-
-static int 
-extract_image (enum CodecID image_codec_id,
-               const unsigned char *data,
-               size_t size,
-               EXTRACTOR_MetaDataProcessor proc,
-               void *proc_cls,
-               const char *options)
-{
-  AVCodecContext *codec_ctx;
-  AVCodec *codec = NULL;
-  AVFrame *frame = NULL;
-  uint8_t *encoded_thumbnail;
-  int thumb_width;
-  int thumb_height;
-  int err;
-  int frame_finished;
-  int ret = 0;
-
-  codec_ctx = avcodec_alloc_context ();
-  if (codec_ctx == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate codec context\n");
-#endif
-      return 0;
-    }
-
-  codec = avcodec_find_decoder (image_codec_id);
-  if (codec != NULL)
-    {
-      if (avcodec_open (codec_ctx, codec) != 0)
-        {
-#if DEBUG
-          fprintf (stderr,
-                   "Failed to open image codec\n");
-#endif
-          av_free (codec_ctx);
-          return 0;
-        }
-    }
-  else
-    {
-#if DEBUG
-      fprintf (stderr,
-               "No suitable codec found\n");
-#endif
-      av_free (codec_ctx);
-      return 0;
-    }
-
-  frame = avcodec_alloc_frame ();
-  if (frame == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate frame\n");
-#endif
-      avcodec_close (codec_ctx);
-      av_free (codec_ctx);
-      return 0;
-    }
-
-  avcodec_decode_video (codec_ctx, frame, &frame_finished, data, size);
-
-  if (!frame_finished)
-    {
-      fprintf (stderr,
-              "Failed to decode a complete frame\n");
-      av_free (frame);
-      avcodec_close (codec_ctx);
-      av_free (codec_ctx);
-      return 0;
-    }
-
-  calculate_thumbnail_dimensions (codec_ctx->width, codec_ctx->height,
-                                  codec_ctx->sample_aspect_ratio.num,
-                                  codec_ctx->sample_aspect_ratio.den,
-                                  &thumb_width, &thumb_height);
-
-  err = create_thumbnail (codec_ctx->width, codec_ctx->height,
-                          frame->linesize, codec_ctx->pix_fmt, 
-                         (const uint8_t * const*) frame->data,
-                          thumb_width, thumb_height,
-                          &encoded_thumbnail, MAX_THUMB_BYTES);
-
-  if (err > 0)
-    {
-      ret = proc (proc_cls,
-                  "thumbnailffmpeg",
-                  EXTRACTOR_METATYPE_THUMBNAIL,
-                  EXTRACTOR_METAFORMAT_BINARY,
-                  "image/png",
-                  (const char*) encoded_thumbnail,
-                  err);
-      av_free (encoded_thumbnail);
-    }
-
-  av_free (frame);
-  avcodec_close (codec_ctx);
-  av_free (codec_ctx);
-  return ret;
-}
-
-static int 
-extract_video (const unsigned char *data,
-               size_t size,
-               EXTRACTOR_MetaDataProcessor proc,
-               void *proc_cls,
-               const char *options)
-{
-  AVProbeData pd; 
-  AVPacket packet;
-  AVInputFormat *input_format;
-  int input_format_nofileflag;
-  ByteIOContext *bio_ctx;
-  struct AVFormatContext *format_ctx;
-  AVCodecContext *codec_ctx;
-  AVCodec *codec = NULL;
-  AVFrame *frame = NULL;
-  uint8_t *encoded_thumbnail;
-  int video_stream_index = -1;
-  int thumb_width;
-  int thumb_height;
-  int i;
-  int err;
-  int frame_finished;
-  int ret = 0;
-
-#if DEBUG
-  fprintf (stderr,
-          "ffmpeg starting\n");
-#endif
-  /* probe format
-   * initial try with a smaller probe size for efficiency */
-  pd.filename = "";
-  pd.buf = (void *) data; 
-  pd.buf_size = 128*1024 > size ? size : 128*1024;
-RETRY_PROBE: 
-  if (NULL == (input_format = av_probe_input_format(&pd, 1))) 
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to probe input format\n");
-#endif
-      if (pd.buf_size != size) /* retry probe once with full data size */
-        {
-          pd.buf_size = size;
-          goto RETRY_PROBE;
-        }
-      return 0;
-    }
-  input_format_nofileflag = input_format->flags & AVFMT_NOFILE;
-  input_format->flags |= AVFMT_NOFILE;
-  bio_ctx = NULL; 
-  pd.buf_size = size;
-  url_open_buf(&bio_ctx, pd.buf, pd.buf_size, URL_RDONLY);
-  bio_ctx->is_streamed = 1;  
-  if ((av_open_input_stream(&format_ctx, bio_ctx, pd.filename, input_format, 
NULL)) < 0)
-    {
- #if DEBUG
-      fprintf (stderr,
-               "Failed to open input stream\n");
-#endif
-      url_close_buf (bio_ctx);
-      if (!input_format_nofileflag)
-        input_format->flags ^= AVFMT_NOFILE;
-      return 0;
-    }
-  if (0 > av_find_stream_info (format_ctx))
-    {
- #if DEBUG
-      fprintf (stderr,
-               "Failed to read stream info\n");
-#endif
-      av_close_input_stream (format_ctx);
-      url_close_buf (bio_ctx);
-      if (!input_format_nofileflag)
-        input_format->flags ^= AVFMT_NOFILE;
-      return 0;
-    }
-
-  codec_ctx = NULL;
-  for (i=0; i<format_ctx->nb_streams; i++)
-    {
-      codec_ctx = format_ctx->streams[i]->codec;
-      if (codec_ctx->codec_type != CODEC_TYPE_VIDEO)
-        continue;
-      codec = avcodec_find_decoder (codec_ctx->codec_id);
-      if (codec == NULL)
-        continue;
-      err = avcodec_open (codec_ctx, codec);
-      if (err != 0)
-        {
-          codec = NULL;
-          continue;
-        }
-      video_stream_index = i;
-      break;
-    }
-
-  if ( (video_stream_index == -1) ||
-       (codec_ctx->width == 0) || 
-       (codec_ctx->height == 0) )
-    {
-#if DEBUG
-      fprintf (stderr,
-               "No video streams or no suitable codec found\n");
-#endif
-      if (codec != NULL)
-        avcodec_close (codec_ctx);
-      av_close_input_stream (format_ctx);
-      url_close_buf (bio_ctx);
-      if (!input_format_nofileflag)
-        input_format->flags ^= AVFMT_NOFILE;
-      return 0;
-    }
-
-  frame = avcodec_alloc_frame ();
-  if (frame == NULL)
-    {
-#if DEBUG
-      fprintf (stderr,
-               "Failed to allocate frame\n");
-#endif
-      avcodec_close (codec_ctx);
-      av_close_input_stream (format_ctx);
-      url_close_buf (bio_ctx);
-      if (!input_format_nofileflag)
-        input_format->flags ^= AVFMT_NOFILE;
-      return 0;
-    }
-#if DEBUG
-  if (format_ctx->duration == AV_NOPTS_VALUE)
-    fprintf (stderr,
-            "Duration unknown\n");
-  else
-    fprintf (stderr,
-            "Duration: %lld\n", 
-            format_ctx->duration);      
-#endif
-  /* TODO: if duration is known, seek to some better place,
-   * but use 10 sec into stream for now */
-  err = av_seek_frame (format_ctx, -1, 10 * AV_TIME_BASE, 0);
-  if (err >= 0)        
-    avcodec_flush_buffers (codec_ctx);        
-  frame_finished = 0;
-
-  while (1)
-    {
-      err = av_read_frame (format_ctx, &packet);
-      if (err < 0)
-        break;
-      if (packet.stream_index == video_stream_index)
-        {
-          avcodec_decode_video (codec_ctx,
-                                frame,
-                                &frame_finished,
-                                packet.data, packet.size);
-          if (frame_finished && frame->key_frame)
-            {
-              av_free_packet (&packet);
-              break;
-            }
-        }
-      av_free_packet (&packet);
-    }
-  if (!frame_finished)
-    {
-      fprintf (stderr,
-              "Failed to decode a complete frame\n");
-      av_free (frame);
-      avcodec_close (codec_ctx);
-      av_close_input_stream (format_ctx);
-      url_close_buf (bio_ctx);
-      if (!input_format_nofileflag)
-        input_format->flags ^= AVFMT_NOFILE;
-      return 0;
-    }
-
-  calculate_thumbnail_dimensions (codec_ctx->width, codec_ctx->height,
-                                  codec_ctx->sample_aspect_ratio.num,
-                                  codec_ctx->sample_aspect_ratio.den,
-                                  &thumb_width, &thumb_height);
-
-  err = create_thumbnail (codec_ctx->width, codec_ctx->height,
-                          frame->linesize, codec_ctx->pix_fmt,
-                         (const uint8_t* const *) frame->data,
-                          thumb_width, thumb_height,
-                          &encoded_thumbnail, MAX_THUMB_BYTES);
-
-  if (err > 0)
-    {
-      ret = proc (proc_cls,
-                  "thumbnailffmpeg",
-                  EXTRACTOR_METATYPE_THUMBNAIL,
-                  EXTRACTOR_METAFORMAT_BINARY,
-                  "image/png",
-                  (const char*) encoded_thumbnail,
-                  err);
-      av_free (encoded_thumbnail);
-    }
-
-  av_free (frame);
-  avcodec_close (codec_ctx);
-  av_close_input_stream (format_ctx);
-  url_close_buf (bio_ctx);
-  if (!input_format_nofileflag)
-    input_format->flags ^= AVFMT_NOFILE;
-  return ret;
-}
-
-int 
-EXTRACTOR_thumbnailffmpeg_extract (const unsigned char *data,
-                                  size_t size,
-                                  EXTRACTOR_MetaDataProcessor proc,
-                                  void *proc_cls,
-                                  const char *options)
-{
-  enum CodecID image_codec_id;
-  int is_image = 0;
-  int i;
-
-  mime_type = NULL;
-  EXTRACTOR_mime_extract((const char*) data, size, mime_processor, NULL, NULL);
-  if (mime_type != NULL) 
-    {
-      i = 0;
-      while (m2d_map[i].mime_type != NULL)
-        {
-          if (!strcmp (m2d_map[i].mime_type, mime_type))
-            {
-              is_image = 1;
-              image_codec_id = m2d_map[i].codec_id;
-              break;
-            }
-          i++;
-        }
-      free(mime_type);
-    }
-
-  if (is_image)
-    return extract_image (image_codec_id, data, size, proc, proc_cls, options);
-  else
-    return extract_video (data, size, proc, proc_cls, options);
-}
-
-int 
-EXTRACTOR_thumbnail_extract (const unsigned char *data,
-                            size_t size,
-                            EXTRACTOR_MetaDataProcessor proc,
-                            void *proc_cls,
-                            const char *options)
-{
-  return EXTRACTOR_thumbnailffmpeg_extract (data, size, proc, proc_cls, 
options);
-}
-
-/* end of thumbnailffmpeg_extractor.c */

Deleted: Extractor/src/plugins/thumbnailgtk_extractor.c
===================================================================
--- Extractor/src/plugins/thumbnailgtk_extractor.c      2012-08-14 22:58:15 UTC 
(rev 23240)
+++ Extractor/src/plugins/thumbnailgtk_extractor.c      2012-08-14 23:02:49 UTC 
(rev 23241)
@@ -1,162 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2005, 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.
- */
-
-/**
- * @file thumbnailextractor.c
- * @author Christian Grothoff
- * @brief this extractor produces a binary (!) encoded
- * thumbnail of images (using gdk pixbuf).  The bottom
- * of the file includes a decoder method that can be used
- * to reproduce the 128x128 PNG thumbnails.
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include <glib.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#define THUMBSIZE 128
-
-/* using libgobject, needs init! */
-void __attribute__ ((constructor)) ole_gobject_init ()
-{
-  g_type_init ();
-}
-
-
-const char *
-EXTRACTOR_thumbnailgtk_options ()
-{
-  /* 
-     Since the Gnome developers think that being unable to
-     unload plugins is an 'acceptable' limitation, we
-     require out-of-process execution for plugins depending
-     on libgsf and other glib-based plugins.
-     See also https://bugzilla.gnome.org/show_bug.cgi?id=374940 
-  */
-  return "oop-only"; 
-}
-
-
-int 
-EXTRACTOR_thumbnailgtk_extract (const char *data,
-                               size_t size,
-                               EXTRACTOR_MetaDataProcessor proc,
-                               void *proc_cls,
-                               const char *options)
-{
-  GdkPixbufLoader *loader;
-  GdkPixbuf *in;
-  GdkPixbuf *out;
-  size_t length;
-  char *thumb;
-  unsigned long width;
-  unsigned long height;
-  char format[64];
-  int ret;
-
-  loader = gdk_pixbuf_loader_new ();
-  gdk_pixbuf_loader_write (loader, 
-                          (const unsigned char*) data, 
-                          size, NULL);
-  in = gdk_pixbuf_loader_get_pixbuf (loader);
-  gdk_pixbuf_loader_close (loader, NULL);
-  if (in == NULL)
-    {
-      g_object_unref (loader);
-      return 0;
-    }
-  g_object_ref (in);
-  g_object_unref (loader);
-  height = gdk_pixbuf_get_height (in);
-  width = gdk_pixbuf_get_width (in);
-  snprintf (format, 
-           sizeof(format),
-           "%ux%u",
-           (unsigned int) width, 
-           (unsigned int) height);
-  if (0 != proc (proc_cls,
-                "thumbnailgtk",
-                EXTRACTOR_METATYPE_IMAGE_DIMENSIONS,
-                EXTRACTOR_METAFORMAT_UTF8,
-                "text/plain",
-                format,
-                strlen (format) + 1))
-    {
-      g_object_unref (in);
-      return 1;
-    }
-  if ((height <= THUMBSIZE) && (width <= THUMBSIZE))
-    {
-      g_object_unref (in);
-      return 0;
-    }
-  if (height > THUMBSIZE)
-    {
-      width = width * THUMBSIZE / height;
-      height = THUMBSIZE;
-    }
-  if (width > THUMBSIZE)
-    {
-      height = height * THUMBSIZE / width;
-      width = THUMBSIZE;
-    }
-  if ( (height == 0) || (width == 0) )
-    {
-      g_object_unref (in);
-      return 0;
-    }
-  out = gdk_pixbuf_scale_simple (in, width, height, GDK_INTERP_BILINEAR);
-  g_object_unref (in);
-  thumb = NULL;
-  length = 0;
-  if (out == NULL)
-    return 0;
-  if (!gdk_pixbuf_save_to_buffer (out, &thumb, &length, "png", NULL, 
-                                 "compression", "9", NULL))
-    {
-      g_object_unref (out);
-      return 0;
-    }
-  g_object_unref (out);
-  if (thumb == NULL)
-    return 0;
-  ret = proc (proc_cls,
-             "thumbnailgtk",
-             EXTRACTOR_METATYPE_THUMBNAIL,
-             EXTRACTOR_METAFORMAT_BINARY,
-             "image/png",
-             thumb, length);  
-  free (thumb);
-  return ret;
-}
-
-int 
-EXTRACTOR_thumbnail_extract (const char *data,
-                            size_t size,
-                            EXTRACTOR_MetaDataProcessor proc,
-                            void *proc_cls,
-                            const char *options)
-{
-  return EXTRACTOR_thumbnailgtk_extract (data, size, proc, proc_cls, options);
-}
-
-
-/* end of thumbnailgtk_extractor.c */

Deleted: Extractor/src/plugins/tiff_extractor.c
===================================================================
--- Extractor/src/plugins/tiff_extractor.c      2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/tiff_extractor.c      2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,262 +0,0 @@
-/*
-     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.
- */
-
-#include "platform.h"
-#include "extractor.h"
-#include "pack.h"
-
-#define DEBUG 0
-
-static int
-addKeyword (EXTRACTOR_MetaDataProcessor proc,
-           void *proc_cls,
-            const char *keyword, 
-           enum EXTRACTOR_MetaType type)
-{
-  if (keyword == NULL)
-    return 0;
-  return proc (proc_cls,
-              "tiff",
-              type,
-              EXTRACTOR_METAFORMAT_UTF8,
-              "text/plain",
-              keyword,
-              strlen(keyword)+1);
-}
-
-typedef struct
-{
-  unsigned short byteorder;
-  unsigned short fourty_two;
-  unsigned int ifd_offset;
-} TIFF_HEADER;
-#define TIFF_HEADER_SIZE 8
-#define TIFF_HEADER_FIELDS(p) \
-  &(p)->byteorder,           \
-    &(p)->fourty_two,        \
-    &(p)->ifd_offset
-static char *TIFF_HEADER_SPECS[] = {
-  "hhw",
-  "HHW",
-};
-
-typedef struct
-{
-  unsigned short tag;
-  unsigned short type;
-  unsigned int count;
-  unsigned int value_or_offset;
-} DIRECTORY_ENTRY;
-#define DIRECTORY_ENTRY_SIZE 12
-#define DIRECTORY_ENTRY_FIELDS(p)              \
-  &(p)->tag,                                   \
-    &(p)->type,                                        \
-    &(p)->count,                               \
-    &(p)->value_or_offset
-static char *DIRECTORY_ENTRY_SPECS[] = {
-  "hhww",
-  "HHWW"
-};
-
-#define TAG_LENGTH 0x101
-#define TAG_WIDTH 0x100
-#define TAG_SOFTWARE 0x131
-#define TAG_DAYTIME 0x132
-#define TAG_ARTIST 0x315
-#define TAG_COPYRIGHT 0x8298
-#define TAG_DESCRIPTION 0x10E
-#define TAG_DOCUMENT_NAME 0x10D
-#define TAG_HOST 0x13C
-#define TAG_SCANNER 0x110
-#define TAG_ORIENTATION 0x112
-
-#define TYPE_BYTE 1
-#define TYPE_ASCII 2
-#define TYPE_SHORT 3
-#define TYPE_LONG 4
-#define TYPE_RATIONAL 5
-
-static int
-addASCII (EXTRACTOR_MetaDataProcessor proc,
-         void *proc_cls,
-          const char *data,
-          size_t size, DIRECTORY_ENTRY * entry,
-         enum EXTRACTOR_MetaType type)
-{
-  if (entry->count > size)
-    return 0;                     /* invalid! */
-  if (entry->type != TYPE_ASCII)
-    return 0;                     /* huh? */
-  if (entry->count + entry->value_or_offset > size)
-    return 0;
-  if (data[entry->value_or_offset + entry->count - 1] != 0)
-    return 0;
-  return addKeyword (proc, proc_cls,
-                    &data[entry->value_or_offset], type);
-}
-
-
-int 
-EXTRACTOR_tiff_extract (const char *data,
-                       size_t size,
-                       EXTRACTOR_MetaDataProcessor proc,
-                       void *proc_cls,
-                       const char *options)
-{
-  TIFF_HEADER hdr;
-  int byteOrder;                /* 0: do not convert;
-                                   1: do convert */
-  unsigned int current_ifd;
-  unsigned int length = -1;
-  unsigned int width = -1;
-
-  if (size < TIFF_HEADER_SIZE)
-    return 0;                /*  can not be tiff */
-  if ((data[0] == 0x49) && (data[1] == 0x49))
-    byteOrder = 0;
-  else if ((data[0] == 0x4D) && (data[1] == 0x4D))
-    byteOrder = 1;
-  else
-    return 0;                /* can not be tiff */
-#if __BYTE_ORDER == __BIG_ENDIAN
-  byteOrder = 1 - byteOrder;
-#endif
-  EXTRACTOR_common_cat_unpack (data, TIFF_HEADER_SPECS[byteOrder], 
TIFF_HEADER_FIELDS (&hdr));
-  if (hdr.fourty_two != 42)
-    return 0;                /* can not be tiff */
-  if (hdr.ifd_offset + 6 > size)
-    return 0;                /* malformed tiff */
-  if (0 != addKeyword (proc, proc_cls, "image/tiff", 
EXTRACTOR_METATYPE_MIMETYPE))
-    return 1;
-  current_ifd = hdr.ifd_offset;
-  while (current_ifd != 0)
-    {
-      unsigned short len;
-      unsigned int off;
-      int i;
-      if ( (current_ifd + 6 > size) ||
-          (current_ifd + 6 < current_ifd) )
-        return 0;
-      if (byteOrder == 0)
-        len = data[current_ifd + 1] << 8 | data[current_ifd];
-      else
-        len = data[current_ifd] << 8 | data[current_ifd + 1];
-      if (len * DIRECTORY_ENTRY_SIZE + 2 + 4 + current_ifd > size)
-        {
-#if DEBUG
-          printf ("WARNING: malformed tiff\n");
-#endif
-          return 0;
-        }
-      for (i = 0; i < len; i++)
-        {
-          DIRECTORY_ENTRY entry;
-          off = current_ifd + 2 + DIRECTORY_ENTRY_SIZE * i;
-
-          EXTRACTOR_common_cat_unpack (&data[off],
-                      DIRECTORY_ENTRY_SPECS[byteOrder],
-                      DIRECTORY_ENTRY_FIELDS (&entry));
-          switch (entry.tag)
-            {
-            case TAG_LENGTH:
-              if ((entry.type == TYPE_SHORT) && (byteOrder == 1))
-                {
-                  length = entry.value_or_offset >> 16;
-                }
-              else
-                {
-                  length = entry.value_or_offset;
-                }
-              if (width != -1)
-                {
-                  char tmp[128];
-                  snprintf (tmp, 
-                           sizeof(tmp), "%ux%u",
-                           width, length);
-                  addKeyword (proc, 
-                             proc_cls, 
-                             tmp, 
-                             EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
-                }
-              break;
-            case TAG_WIDTH:
-              if ((entry.type == TYPE_SHORT) && (byteOrder == 1))
-                width = entry.value_or_offset >> 16;
-              else
-                width = entry.value_or_offset;
-              if (length != -1)
-                {
-                  char tmp[128];
-                  snprintf (tmp, 
-                           sizeof(tmp), 
-                           "%ux%u",
-                           width, length);
-                  addKeyword (proc, proc_cls, 
-                             tmp, 
-                             EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
-                }
-              break;
-            case TAG_SOFTWARE:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE))
-               return 1;
-              break;
-            case TAG_ARTIST:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_ARTIST))
-               return 1;
-              break;
-            case TAG_DOCUMENT_NAME:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_TITLE))
-               return 1;
-              break;
-            case TAG_COPYRIGHT:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_COPYRIGHT))
-               return 1;
-              break;
-            case TAG_DESCRIPTION:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_DESCRIPTION))
-               return 1;
-              break;
-            case TAG_HOST:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_BUILDHOST))
-               return 1;
-              break;
-            case TAG_SCANNER:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_SOURCE))
-               return 1;
-              break;
-            case TAG_DAYTIME:
-              if (0 != addASCII (proc, proc_cls, data, size, &entry, 
EXTRACTOR_METATYPE_CREATION_DATE))
-               return 1;
-              break;
-            }
-        }
-
-      off = current_ifd + 2 + DIRECTORY_ENTRY_SIZE * len;
-      if (byteOrder == 0)
-        current_ifd =
-          data[off + 3] << 24 | data[off + 2] << 16 | 
-         data[off + 1] << 8  | data[off];
-      else
-        current_ifd =
-          data[off] << 24 | data[off + 1] << 16 |
-         data[off + 2] << 8 | data[off + 3];
-    }
-  return 0;
-}

Deleted: Extractor/src/plugins/wav_extractor.c
===================================================================
--- Extractor/src/plugins/wav_extractor.c       2012-08-14 22:58:15 UTC (rev 
23240)
+++ Extractor/src/plugins/wav_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -1,139 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2004, 2009, 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.
-
-     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.
-*/
-/**
- * @file plugins/wav_extractor.c
- * @brief plugin to support WAV files
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "extractor.h"
-
-
-#if BIG_ENDIAN_HOST
-static uint16_t
-little_endian_to_host16 (uint16_t in)
-{
-  unsigned char *ptr = (unsigned char *) &in;
-
-  return ((ptr[1] & 0xFF) << 8) | (ptr[0] & 0xFF);
-}
-
-
-static uint32_t
-little_endian_to_host32 (uint32_t in)
-{
-  unsigned char *ptr = (unsigned char *) &in;
-
-  return ((ptr[3] & 0xFF) << 24) | ((ptr[2] & 0xFF) << 16) | 
-    ((ptr[1] & 0xFF) << 8) | (ptr[0] & 0xFF);
-}
-#endif
-
-
-/**
- * Extract information from WAV files.
- *
- * @param ec extraction context
- *
- * @detail
- * A WAV header looks as follows:
- *
- * Offset  Value    meaning
- * 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
- */
-void
-EXTRACTOR_wav_extract_method (struct EXTRACTOR_ExtractContext *ec)
-{
-  void *data;
-  const unsigned char *buf;
-  uint16_t channels;
-  uint16_t sample_size;
-  uint32_t sample_rate;
-  uint32_t data_len;
-  uint32_t samples;
-  char scratch[256];
-
-  if (44 > 
-      ec->read (ec->cls,  &data, 44))
-    return;
-  buf = data;
-  if ((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;                /* not a WAV file */
-
-  channels = *((uint16_t *) &buf[22]);
-  sample_rate = *((uint32_t *) &buf[24]);
-  sample_size = *((uint16_t *) &buf[34]);
-  data_len = *((uint32_t *) &buf[40]);
-
-#if BIG_ENDIAN_HOST
-  channels = little_endian_to_host16 (channels);
-  sample_size = little_endian_to_host16 (sample_size);
-  sample_rate = little_endian_to_host32 (sample_rate);
-  data_len = little_endian_to_host32 (data_len);
-#endif
-
-  if ( (8 != sample_size) &&
-       (16 != sample_size) )
-    return;                /* invalid sample size found in wav file */
-  if (0 == channels)
-    return;                /* invalid channels value -- avoid division by 0! */
-  samples = data_len / (channels * (sample_size >> 3));
-
-  snprintf (scratch,
-            sizeof (scratch),
-            "%u ms, %d Hz, %s",
-            (samples < sample_rate)
-            ? (samples * 1000 / sample_rate)
-            : (samples / sample_rate) * 1000,
-            sample_rate, (1 == channels) ? _("mono") : _("stereo"));
-  if (0 != ec->proc (ec->cls, 
-                    "wav",
-                    EXTRACTOR_METATYPE_RESOURCE_TYPE,
-                    EXTRACTOR_METAFORMAT_UTF8,
-                    "text/plain",
-                    scratch,
-                    strlen (scratch) + 1))
-    return;
-  if (0 != ec->proc (ec->cls, 
-                    "wav",
-                    EXTRACTOR_METATYPE_MIMETYPE,
-                    EXTRACTOR_METAFORMAT_UTF8,
-                    "text/plain",
-                    "audio/x-wav",
-                    strlen ("audio/x-wav") +1 ))
-    return;
-}
-
-/* end of wav_extractor.c */

Copied: Extractor/src/plugins/wav_extractor.c (from rev 23239, 
Extractor/src/plugins/wav_extractor.c)
===================================================================
--- Extractor/src/plugins/wav_extractor.c                               (rev 0)
+++ Extractor/src/plugins/wav_extractor.c       2012-08-14 23:02:49 UTC (rev 
23241)
@@ -0,0 +1,139 @@
+/*
+     This file is part of libextractor.
+     (C) 2004, 2009, 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.
+
+     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.
+*/
+/**
+ * @file plugins/wav_extractor.c
+ * @brief plugin to support WAV files
+ * @author Christian Grothoff
+ */
+
+#include "platform.h"
+#include "extractor.h"
+
+
+#if BIG_ENDIAN_HOST
+static uint16_t
+little_endian_to_host16 (uint16_t in)
+{
+  unsigned char *ptr = (unsigned char *) &in;
+
+  return ((ptr[1] & 0xFF) << 8) | (ptr[0] & 0xFF);
+}
+
+
+static uint32_t
+little_endian_to_host32 (uint32_t in)
+{
+  unsigned char *ptr = (unsigned char *) &in;
+
+  return ((ptr[3] & 0xFF) << 24) | ((ptr[2] & 0xFF) << 16) | 
+    ((ptr[1] & 0xFF) << 8) | (ptr[0] & 0xFF);
+}
+#endif
+
+
+/**
+ * Extract information from WAV files.
+ *
+ * @param ec extraction context
+ *
+ * @detail
+ * A WAV header looks as follows:
+ *
+ * Offset  Value    meaning
+ * 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
+ */
+void
+EXTRACTOR_wav_extract_method (struct EXTRACTOR_ExtractContext *ec)
+{
+  void *data;
+  const unsigned char *buf;
+  uint16_t channels;
+  uint16_t sample_size;
+  uint32_t sample_rate;
+  uint32_t data_len;
+  uint32_t samples;
+  char scratch[256];
+
+  if (44 > 
+      ec->read (ec->cls,  &data, 44))
+    return;
+  buf = data;
+  if ((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;                /* not a WAV file */
+
+  channels = *((uint16_t *) &buf[22]);
+  sample_rate = *((uint32_t *) &buf[24]);
+  sample_size = *((uint16_t *) &buf[34]);
+  data_len = *((uint32_t *) &buf[40]);
+
+#if BIG_ENDIAN_HOST
+  channels = little_endian_to_host16 (channels);
+  sample_size = little_endian_to_host16 (sample_size);
+  sample_rate = little_endian_to_host32 (sample_rate);
+  data_len = little_endian_to_host32 (data_len);
+#endif
+
+  if ( (8 != sample_size) &&
+       (16 != sample_size) )
+    return;                /* invalid sample size found in wav file */
+  if (0 == channels)
+    return;                /* invalid channels value -- avoid division by 0! */
+  samples = data_len / (channels * (sample_size >> 3));
+
+  snprintf (scratch,
+            sizeof (scratch),
+            "%u ms, %d Hz, %s",
+            (samples < sample_rate)
+            ? (samples * 1000 / sample_rate)
+            : (samples / sample_rate) * 1000,
+            sample_rate, (1 == channels) ? _("mono") : _("stereo"));
+  if (0 != ec->proc (ec->cls, 
+                    "wav",
+                    EXTRACTOR_METATYPE_RESOURCE_TYPE,
+                    EXTRACTOR_METAFORMAT_UTF8,
+                    "text/plain",
+                    scratch,
+                    strlen (scratch) + 1))
+    return;
+  if (0 != ec->proc (ec->cls, 
+                    "wav",
+                    EXTRACTOR_METATYPE_MIMETYPE,
+                    EXTRACTOR_METAFORMAT_UTF8,
+                    "text/plain",
+                    "audio/x-wav",
+                    strlen ("audio/x-wav") +1 ))
+    return;
+}
+
+/* end of wav_extractor.c */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]