libextractor

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

test_gstreamer.c (42876B)


      1 /*
      2      This file is part of libextractor.
      3      Copyright (C) 2012 Vidyut Samanta and Christian Grothoff
      4 
      5      libextractor is free software; you can redistribute it and/or modify
      6      it under the terms of the GNU General Public License as published
      7      by the Free Software Foundation; either version 3, or (at your
      8      option) any later version.
      9 
     10      libextractor is distributed in the hope that it will be useful, but
     11      WITHOUT ANY WARRANTY; without even the implied warranty of
     12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13      General Public License for more details.
     14 
     15      You should have received a copy of the GNU General Public License
     16      along with libextractor; see the file COPYING.  If not, write to the
     17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18      Boston, MA 02110-1301, USA.
     19 */
     20 /**
     21  * @file plugins/test_gstreamer.c
     22  * @brief testcase for gstreamer plugin
     23  * @author LRN
     24  */
     25 #include "platform.h"
     26 #include "test_lib.h"
     27 #include <glib.h>
     28 #include <gst/gst.h>
     29 #include <gst/pbutils/pbutils.h>
     30 #include <sys/wait.h>
     31 
     32 
     33 /**
     34  * This is a miniaturized version of gst-discoverer, its only purpose is
     35  * to detect missing plugins situations and skip a test in such cases.
     36  */
     37 static GstDiscovererResult
     38 discoverer_main (GstDiscoverer *dc, const char *filename)
     39 {
     40   GError *err = NULL;
     41   gchar *uri;
     42   gchar *path;
     43   GstDiscovererInfo *info;
     44   GstDiscovererResult result;
     45 
     46   if (! gst_uri_is_valid (filename))
     47   {
     48     if (! g_path_is_absolute (filename))
     49     {
     50       gchar *cur_dir;
     51 
     52       cur_dir = g_get_current_dir ();
     53       path = g_build_filename (cur_dir, filename, NULL);
     54       g_free (cur_dir);
     55     }
     56     else
     57     {
     58       path = g_strdup (filename);
     59     }
     60 
     61     uri = g_filename_to_uri (path, NULL, &err);
     62     g_free (path);
     63     path = NULL;
     64 
     65     if (err)
     66     {
     67       g_warning ("Couldn't convert filename %s to URI: %s\n", filename,
     68                  err->message);
     69       g_error_free (err);
     70       return GST_DISCOVERER_ERROR;
     71     }
     72   }
     73   else
     74   {
     75     uri = g_strdup (filename);
     76   }
     77   info = gst_discoverer_discover_uri (dc, uri, &err);
     78   result = gst_discoverer_info_get_result (info);
     79   switch (result)
     80   {
     81   case GST_DISCOVERER_OK:
     82     break;
     83   case GST_DISCOVERER_URI_INVALID:
     84     g_print ("URI %s is not valid\n", uri);
     85     break;
     86   case GST_DISCOVERER_ERROR:
     87     g_print ("An error was encountered while discovering the file %s\n",
     88              filename);
     89     g_print (" %s\n", err->message);
     90     break;
     91   case GST_DISCOVERER_TIMEOUT:
     92     g_print ("Analyzing URI %s timed out\n", uri);
     93     break;
     94   case GST_DISCOVERER_BUSY:
     95     g_print ("Discoverer was busy\n");
     96     break;
     97   case GST_DISCOVERER_MISSING_PLUGINS:
     98     g_print ("Will skip %s: missing plugins\n", filename);
     99     break;
    100   default:
    101     g_print ("Unexpected result %d\n", result);
    102     break;
    103   }
    104   if (err)
    105     g_error_free (err);
    106   gst_discoverer_info_unref (info);
    107   g_free (uri);
    108 
    109   return result;
    110 }
    111 
    112 
    113 /**
    114  * Check that the language of every subtitle track of
    115  * testdata/subtitles.mkv is reported.
    116  *
    117  * Must run in a process in which GStreamer has not been initialized:
    118  * ET_main() forks the extraction process, and a GStreamer initialized
    119  * before a fork() does not work in the child.
    120  *
    121  * @return 0 on success (or if GStreamer lacks the plugins to read the
    122  *         file), 1 on failure
    123  */
    124 static int
    125 check_subtitle_languages (void)
    126 {
    127   /* GStreamer normalizes the ISO 639-2 codes of the Matroska tracks
    128      ("eng", "ger", "fre") to ISO 639-1; accept either spelling */
    129   struct SolutionData subtitles_sol[] = {
    130     {
    131       EXTRACTOR_METATYPE_SUBTITLE_LANGUAGE,
    132       EXTRACTOR_METAFORMAT_UTF8,
    133       "text/plain",
    134       "^(en|eng)$",
    135       0,
    136       0,
    137       1
    138     },
    139     {
    140       EXTRACTOR_METATYPE_SUBTITLE_LANGUAGE,
    141       EXTRACTOR_METAFORMAT_UTF8,
    142       "text/plain",
    143       "^(de|ger|deu)$",
    144       0,
    145       0,
    146       1
    147     },
    148     {
    149       EXTRACTOR_METATYPE_SUBTITLE_LANGUAGE,
    150       EXTRACTOR_METAFORMAT_UTF8,
    151       "text/plain",
    152       "^(fr|fre|fra)$",
    153       0,
    154       0,
    155       1
    156     },
    157     { 0, 0, NULL, NULL, 0, -1 }
    158   };
    159   struct ProblemSet ps[] = {
    160     { "testdata/subtitles.mkv", subtitles_sol },
    161     { NULL, NULL }
    162   };
    163   int ret;
    164   GstDiscoverer *dc;
    165 
    166   g_print ("Running subtitle language test on GStreamer:\n");
    167   ret = ET_main ("gstreamer", ps);
    168   if (0 == ret)
    169     return 0;
    170   /* only now may we initialize GStreamer ourselves: find out whether
    171      the failure is just a missing GStreamer plugin */
    172   gst_init (NULL, NULL);
    173   dc = gst_discoverer_new (10 * GST_SECOND, NULL);
    174   if ( (NULL != dc) &&
    175        (GST_DISCOVERER_MISSING_PLUGINS ==
    176         discoverer_main (dc, "testdata/subtitles.mkv")) )
    177     ret = 0;
    178   if (NULL != dc)
    179     g_object_unref (dc);
    180   if (0 != ret)
    181     g_print ("Subtitle language test FAILED\n");
    182   return ret;
    183 }
    184 
    185 
    186 /**
    187  * Main function for the GStreamer testcase.
    188  *
    189  * @param argc number of arguments (ignored)
    190  * @param argv arguments (ignored)
    191  * @return 0 on success
    192  */
    193 int
    194 main (int argc, char *argv[])
    195 {
    196   GError *err = NULL;
    197   GstDiscoverer *dc;
    198   int result = 0;
    199   int subtitles_failed = 0;
    200   GstDiscovererResult pre_test;
    201 
    202   {
    203     pid_t pid;
    204     int status;
    205 
    206     pid = fork ();
    207     if (0 == pid)
    208       _exit (check_subtitle_languages ());
    209     if ( (-1 == pid) ||
    210          (pid != waitpid (pid, &status, 0)) ||
    211          (! WIFEXITED (status)) ||
    212          (0 != WEXITSTATUS (status)) )
    213       subtitles_failed = 1;
    214   }
    215   gst_init (&argc, &argv);
    216   dc = gst_discoverer_new (10 * GST_SECOND, &err);
    217   if (NULL == dc)
    218   {
    219     g_print ("Error initializing: %s\n", err->message);
    220     return 0;
    221   }
    222   if (NULL != err)
    223     g_error_free (err);
    224 
    225   pre_test = discoverer_main (dc, "testdata/gstreamer_30_and_33.asf");
    226   if (GST_DISCOVERER_MISSING_PLUGINS != pre_test)
    227   {
    228     int test_result;
    229     struct SolutionData thirty_and_thirtythree_sol[] = {
    230       {
    231         EXTRACTOR_METATYPE_DURATION,
    232         EXTRACTOR_METAFORMAT_UTF8,
    233         "text/plain",
    234         "0:00:05.061000000",
    235         strlen ("0:00:05.061000000") + 1,
    236         0
    237       },
    238       {
    239         EXTRACTOR_METATYPE_TRACK_NUMBER,
    240         EXTRACTOR_METAFORMAT_UTF8,
    241         "text/plain",
    242         "21",
    243         strlen ("21") + 1,
    244         0
    245       },
    246       {
    247         EXTRACTOR_METATYPE_ALBUM,
    248         EXTRACTOR_METAFORMAT_UTF8,
    249         "text/plain",
    250         "Zee Album",
    251         strlen ("Zee Album") + 1,
    252         0
    253       },
    254       {
    255         EXTRACTOR_METATYPE_CREATION_TIME,
    256         EXTRACTOR_METAFORMAT_UTF8,
    257         "text/plain",
    258         "9999",
    259         strlen ("9999") + 1,
    260         0
    261       },
    262       {
    263         EXTRACTOR_METATYPE_ARTIST,
    264         EXTRACTOR_METAFORMAT_UTF8,
    265         "text/plain",
    266         "All performed by Nobody",
    267         strlen ("All performed by Nobody") + 1,
    268         0
    269       },
    270       {
    271         EXTRACTOR_METATYPE_ARTIST,
    272         EXTRACTOR_METAFORMAT_UTF8,
    273         "text/plain",
    274         "This Artist Contributed",
    275         strlen ("This Artist Contributed") + 1,
    276         0
    277       },
    278       {
    279         EXTRACTOR_METATYPE_TITLE,
    280         EXTRACTOR_METAFORMAT_UTF8,
    281         "text/plain",
    282         "Some title",
    283         strlen ("Some title") + 1,
    284         0
    285       },
    286       /* Suggest a fix to gst devs; should be a comment, not description */
    287       {
    288         EXTRACTOR_METATYPE_DESCRIPTION,
    289         EXTRACTOR_METAFORMAT_UTF8,
    290         "text/plain",
    291         "A witty comment",
    292         strlen ("A witty comment") + 1,
    293         0
    294       },
    295       {
    296         EXTRACTOR_METATYPE_CONTAINER_FORMAT,
    297         EXTRACTOR_METAFORMAT_UTF8,
    298         "text/plain",
    299         "ASF",
    300         strlen ("ASF") + 1,
    301         0
    302       },
    303       {
    304         EXTRACTOR_METATYPE_AUDIO_CODEC,
    305         EXTRACTOR_METAFORMAT_UTF8,
    306         "text/plain",
    307         "WMA Version 8",
    308         strlen ("WMA Version 8") + 1,
    309         0
    310       },
    311       {
    312         EXTRACTOR_METATYPE_MIMETYPE,
    313         EXTRACTOR_METAFORMAT_UTF8,
    314         "text/plain",
    315         "video/x-ms-asf",
    316         strlen ("video/x-ms-asf") + 1,
    317         0
    318       },
    319       {
    320         EXTRACTOR_METATYPE_MIMETYPE,
    321         EXTRACTOR_METAFORMAT_UTF8,
    322         "text/plain",
    323         "audio/x-wma",
    324         strlen ("audio/x-wma") + 1,
    325         0
    326       },
    327       {
    328         EXTRACTOR_METATYPE_UNKNOWN,
    329         EXTRACTOR_METAFORMAT_UTF8,
    330         "text/plain",
    331         "wmaversion=2",
    332         strlen ("wmaversion=2") + 1,
    333         0
    334       },
    335       {
    336         EXTRACTOR_METATYPE_UNKNOWN,
    337         EXTRACTOR_METAFORMAT_UTF8,
    338         "text/plain",
    339         "bitrate=96024",
    340         strlen ("bitrate=96024") + 1,
    341         0
    342       },
    343       {
    344         EXTRACTOR_METATYPE_UNKNOWN,
    345         EXTRACTOR_METAFORMAT_UTF8,
    346         "text/plain",
    347         "block_align=4459",
    348         strlen ("block_align=4459") + 1,
    349         0
    350       },
    351       {
    352         EXTRACTOR_METATYPE_AUDIO_LANGUAGE,
    353         EXTRACTOR_METAFORMAT_UTF8,
    354         "text/plain",
    355         "en",
    356         strlen ("en") + 1,
    357         0
    358       },
    359       {
    360         EXTRACTOR_METATYPE_CHANNELS,
    361         EXTRACTOR_METAFORMAT_UTF8,
    362         "text/plain",
    363         "2",
    364         strlen ("2") + 1,
    365         0
    366       },
    367       {
    368         EXTRACTOR_METATYPE_SAMPLE_RATE,
    369         EXTRACTOR_METAFORMAT_UTF8,
    370         "text/plain",
    371         "44100",
    372         strlen ("44100") + 1,
    373         0
    374       },
    375       {
    376         EXTRACTOR_METATYPE_AUDIO_DEPTH,
    377         EXTRACTOR_METAFORMAT_UTF8,
    378         "text/plain",
    379         "16",
    380         strlen ("16") + 1,
    381         0
    382       },
    383       { 0, 0, NULL, NULL, 0, -1 }
    384     };
    385     struct ProblemSet ps[] = {
    386       { "testdata/gstreamer_30_and_33.asf", thirty_and_thirtythree_sol },
    387       { NULL, NULL }
    388     };
    389     g_print ("Running asf test on GStreamer:\n");
    390     test_result = (0 == ET_main ("gstreamer", ps) ? 0 : 1);
    391     g_print ("asf GStreamer test result: %s\n", test_result == 0 ? "OK" :
    392              "FAILED");
    393     result += test_result;
    394   }
    395 
    396   pre_test = discoverer_main (dc, "testdata/gstreamer_barsandtone.flv");
    397   if (pre_test != GST_DISCOVERER_MISSING_PLUGINS)
    398   {
    399     int test_result;
    400     struct SolutionData barsandtone_sol[] = {
    401       {
    402         EXTRACTOR_METATYPE_DURATION,
    403         EXTRACTOR_METAFORMAT_UTF8,
    404         "text/plain",
    405         "0:00:06.060000000",
    406         strlen ("0:00:06.060000000") + 1,
    407         0
    408       },
    409       {
    410         EXTRACTOR_METATYPE_MIMETYPE,
    411         EXTRACTOR_METAFORMAT_UTF8,
    412         "text/plain",
    413         "video/x-flv",
    414         strlen ("video/x-flv") + 1,
    415         0
    416       },
    417       {
    418         EXTRACTOR_METATYPE_MIMETYPE,
    419         EXTRACTOR_METAFORMAT_UTF8,
    420         "text/plain",
    421         "video/x-vp6-flash",
    422         strlen ("video/x-vp6-flash") + 1,
    423         0
    424       },
    425       {
    426         EXTRACTOR_METATYPE_VIDEO_DURATION,
    427         EXTRACTOR_METAFORMAT_UTF8,
    428         "text/plain",
    429         "0:00:06.000000000",
    430         strlen ("0:00:06.000000000") + 1,
    431         0
    432       },
    433       {
    434         EXTRACTOR_METATYPE_AUDIO_CODEC,
    435         EXTRACTOR_METAFORMAT_UTF8,
    436         "text/plain",
    437         "MPEG-1 Layer 3 (MP3)",
    438         strlen ("MPEG-1 Layer 3 (MP3)") + 1,
    439         0
    440       },
    441       {
    442         EXTRACTOR_METATYPE_VIDEO_CODEC,
    443         EXTRACTOR_METAFORMAT_UTF8,
    444         "text/plain",
    445         "On2 VP6/Flash",
    446         strlen ("On2 VP6/Flash") + 1,
    447         0
    448       },
    449       {
    450         EXTRACTOR_METATYPE_VIDEO_DIMENSIONS,
    451         EXTRACTOR_METAFORMAT_UTF8,
    452         "text/plain",
    453         "368x288",
    454         strlen ("368x288") + 1,
    455         0
    456       },
    457       {
    458         EXTRACTOR_METATYPE_FRAME_RATE,
    459         EXTRACTOR_METAFORMAT_UTF8,
    460         "text/plain",
    461         "10/1",
    462         strlen ("10/1") + 1,
    463         0
    464       },
    465       {
    466         EXTRACTOR_METATYPE_PIXEL_ASPECT_RATIO,
    467         EXTRACTOR_METAFORMAT_UTF8,
    468         "text/plain",
    469         "1/1",
    470         strlen ("1/1") + 1,
    471         0
    472       },
    473       {
    474         EXTRACTOR_METATYPE_MIMETYPE,
    475         EXTRACTOR_METAFORMAT_UTF8,
    476         "text/plain",
    477         "audio/mpeg",
    478         strlen ("audio/mpeg") + 1,
    479         0
    480       },
    481       {
    482         EXTRACTOR_METATYPE_UNKNOWN,
    483         EXTRACTOR_METAFORMAT_UTF8,
    484         "text/plain",
    485         "mpegversion=1",
    486         strlen ("mpegversion=1") + 1,
    487         0
    488       },
    489       {
    490         EXTRACTOR_METATYPE_UNKNOWN,
    491         EXTRACTOR_METAFORMAT_UTF8,
    492         "text/plain",
    493         "mpegaudioversion=1",
    494         strlen ("mpegaudioversion=1") + 1,
    495         0
    496       },
    497       {
    498         EXTRACTOR_METATYPE_UNKNOWN,
    499         EXTRACTOR_METAFORMAT_UTF8,
    500         "text/plain",
    501         "layer=3",
    502         strlen ("layer=3") + 1,
    503         0
    504       },
    505       {
    506         EXTRACTOR_METATYPE_UNKNOWN,
    507         EXTRACTOR_METAFORMAT_UTF8,
    508         "text/plain",
    509         "parsed=true",
    510         strlen ("parsed=true") + 1,
    511         0
    512       },
    513       {
    514         EXTRACTOR_METATYPE_AUDIO_DURATION,
    515         EXTRACTOR_METAFORMAT_UTF8,
    516         "text/plain",
    517         "0:00:06.000000000",
    518         strlen ("0:00:06.000000000") + 1,
    519         0
    520       },
    521       /* Yes, again. This seems to be a bug/feature of the element that
    522        * gives us these streams; this doesn't happen when discovering
    523        * Matroska files, for example. Or maybe file itself is made that way.
    524        */
    525       {
    526         EXTRACTOR_METATYPE_AUDIO_CODEC,
    527         EXTRACTOR_METAFORMAT_UTF8,
    528         "text/plain",
    529         "MPEG-1 Layer 3 (MP3)",
    530         strlen ("MPEG-1 Layer 3 (MP3)") + 1,
    531         0
    532       },
    533       {
    534         EXTRACTOR_METATYPE_VIDEO_CODEC,
    535         EXTRACTOR_METAFORMAT_UTF8,
    536         "text/plain",
    537         "On2 VP6/Flash",
    538         strlen ("On2 VP6/Flash") + 1,
    539         0
    540       },
    541       {
    542         EXTRACTOR_METATYPE_UNKNOWN,
    543         EXTRACTOR_METAFORMAT_UTF8,
    544         "text/plain",
    545         "has-crc=false",
    546         strlen ("has-crc=false") + 1,
    547         0
    548       },
    549       {
    550         EXTRACTOR_METATYPE_UNKNOWN,
    551         EXTRACTOR_METAFORMAT_UTF8,
    552         "text/plain",
    553         "channel-mode=joint-stereo",
    554         strlen ("channel-mode=joint-stereo") + 1,
    555         0
    556       },
    557       {
    558         EXTRACTOR_METATYPE_CHANNELS,
    559         EXTRACTOR_METAFORMAT_UTF8,
    560         "text/plain",
    561         "2",
    562         strlen ("2") + 1,
    563         0
    564       },
    565       {
    566         EXTRACTOR_METATYPE_SAMPLE_RATE,
    567         EXTRACTOR_METAFORMAT_UTF8,
    568         "text/plain",
    569         "44100",
    570         strlen ("44100") + 1,
    571         0
    572       },
    573       {
    574         EXTRACTOR_METATYPE_AUDIO_BITRATE,
    575         EXTRACTOR_METAFORMAT_UTF8,
    576         "text/plain",
    577         "96000",
    578         strlen ("96000") + 1,
    579         0
    580       },
    581       { 0, 0, NULL, NULL, 0, -1 }
    582     };
    583     struct ProblemSet ps[] = {
    584       { "testdata/gstreamer_barsandtone.flv", barsandtone_sol },
    585       { NULL, NULL }
    586     };
    587     g_print ("Running flv test on GStreamer:\n");
    588     test_result = (0 == ET_main ("gstreamer", ps) ? 0 : 1);
    589     g_print ("flv GStreamer test result: %s\n", test_result == 0 ? "OK" :
    590              "FAILED");
    591     result += test_result;
    592   }
    593   pre_test = discoverer_main (dc, "testdata/gstreamer_sample_sorenson.mov");
    594   if (pre_test != GST_DISCOVERER_MISSING_PLUGINS)
    595   {
    596     int test_result;
    597     struct SolutionData sample_sorenson_sol[] = {
    598       {
    599         EXTRACTOR_METATYPE_DURATION,
    600         EXTRACTOR_METAFORMAT_UTF8,
    601         "text/plain",
    602         "0:00:05.000000000",
    603         strlen ("0:00:05.000000000") + 1,
    604         0
    605       },
    606       {
    607         EXTRACTOR_METATYPE_MIMETYPE,
    608         EXTRACTOR_METAFORMAT_UTF8,
    609         "text/plain",
    610         "video/quicktime",
    611         strlen ("video/quicktime") + 1,
    612         0
    613       },
    614       {
    615         EXTRACTOR_METATYPE_MIMETYPE,
    616         EXTRACTOR_METAFORMAT_UTF8,
    617         "text/plain",
    618         "audio/x-qdm2",
    619         strlen ("audio/x-qdm2") + 1,
    620         0
    621       },
    622       {
    623         EXTRACTOR_METATYPE_UNKNOWN,
    624         EXTRACTOR_METAFORMAT_UTF8,
    625         "text/plain",
    626         "samplesize=16",
    627         strlen ("samplesize=16") + 1,
    628         0
    629       },
    630       {
    631         EXTRACTOR_METATYPE_AUDIO_CODEC,
    632         EXTRACTOR_METAFORMAT_UTF8,
    633         "text/plain",
    634         "QDesign Music v.2",
    635         strlen ("QDesign Music v.2") + 1,
    636         0
    637       },
    638       {
    639         EXTRACTOR_METATYPE_CREATION_TIME,
    640         EXTRACTOR_METAFORMAT_UTF8,
    641         "text/plain",
    642         "2001-02-19T16:45:54Z",
    643         strlen ("2001-02-19T16:45:54Z") + 1,
    644         0
    645       },
    646       {
    647         EXTRACTOR_METATYPE_TITLE,
    648         EXTRACTOR_METAFORMAT_UTF8,
    649         "text/plain",
    650         "QuickTime Sample Movie",
    651         strlen ("QuickTime Sample Movie") + 1,
    652         0
    653       },
    654       {
    655         EXTRACTOR_METATYPE_COPYRIGHT,
    656         EXTRACTOR_METAFORMAT_UTF8,
    657         "text/plain",
    658         "© Apple Computer, Inc. 2001",
    659         strlen ("© Apple Computer, Inc. 2001") + 1,
    660         0
    661       },
    662       {
    663         EXTRACTOR_METATYPE_CONTAINER_FORMAT,
    664         EXTRACTOR_METAFORMAT_UTF8,
    665         "text/plain",
    666         "ISO MP4/M4A",
    667         strlen ("ISO MP4/M4A") + 1,
    668         0
    669       },
    670       {
    671         EXTRACTOR_METATYPE_AUDIO_LANGUAGE,
    672         EXTRACTOR_METAFORMAT_UTF8,
    673         "text/plain",
    674         "en",
    675         strlen ("en") + 1,
    676         0
    677       },
    678       {
    679         EXTRACTOR_METATYPE_CHANNELS,
    680         EXTRACTOR_METAFORMAT_UTF8,
    681         "text/plain",
    682         "2",
    683         strlen ("2") + 1,
    684         0
    685       },
    686       {
    687         EXTRACTOR_METATYPE_SAMPLE_RATE,
    688         EXTRACTOR_METAFORMAT_UTF8,
    689         "text/plain",
    690         "22050",
    691         strlen ("22050") + 1,
    692         0
    693       },
    694       {
    695         EXTRACTOR_METATYPE_MIMETYPE,
    696         EXTRACTOR_METAFORMAT_UTF8,
    697         "text/plain",
    698         "video/x-svq",
    699         strlen ("video/x-svq") + 1,
    700         0
    701       },
    702       {
    703         EXTRACTOR_METATYPE_UNKNOWN,
    704         EXTRACTOR_METAFORMAT_UTF8,
    705         "text/plain",
    706         "svqversion=1",
    707         strlen ("svqversion=1") + 1,
    708         0
    709       },
    710       /* Yep, again... */
    711       {
    712         EXTRACTOR_METATYPE_CREATION_TIME,
    713         EXTRACTOR_METAFORMAT_UTF8,
    714         "text/plain",
    715         "2001-02-19T16:45:54Z",
    716         strlen ("2001-02-19T16:45:54Z") + 1,
    717         0
    718       },
    719       {
    720         EXTRACTOR_METATYPE_TITLE,
    721         EXTRACTOR_METAFORMAT_UTF8,
    722         "text/plain",
    723         "QuickTime Sample Movie",
    724         strlen ("QuickTime Sample Movie") + 1,
    725         0
    726       },
    727       {
    728         EXTRACTOR_METATYPE_COPYRIGHT,
    729         EXTRACTOR_METAFORMAT_UTF8,
    730         "text/plain",
    731         "© Apple Computer, Inc. 2001",
    732         strlen ("© Apple Computer, Inc. 2001") + 1,
    733         0
    734       },
    735       {
    736         EXTRACTOR_METATYPE_CONTAINER_FORMAT,
    737         EXTRACTOR_METAFORMAT_UTF8,
    738         "text/plain",
    739         "ISO MP4/M4A",
    740         strlen ("ISO MP4/M4A") + 1,
    741         0
    742       },
    743       {
    744         EXTRACTOR_METATYPE_VIDEO_CODEC,
    745         EXTRACTOR_METAFORMAT_UTF8,
    746         "text/plain",
    747         "Sorensen video v.1",
    748         strlen ("Sorensen video v.1") + 1,
    749         0
    750       },
    751       {
    752         EXTRACTOR_METATYPE_VIDEO_LANGUAGE,
    753         EXTRACTOR_METAFORMAT_UTF8,
    754         "text/plain",
    755         "en",
    756         strlen ("en") + 1,
    757         0
    758       },
    759       {
    760         EXTRACTOR_METATYPE_VIDEO_DIMENSIONS,
    761         EXTRACTOR_METAFORMAT_UTF8,
    762         "text/plain",
    763         "190x240",
    764         strlen ("190x240") + 1,
    765         0
    766       },
    767       {
    768         EXTRACTOR_METATYPE_FRAME_RATE,
    769         EXTRACTOR_METAFORMAT_UTF8,
    770         "text/plain",
    771         "12/1",
    772         strlen ("12/1") + 1,
    773         0
    774       },
    775       {
    776         EXTRACTOR_METATYPE_PIXEL_ASPECT_RATIO,
    777         EXTRACTOR_METAFORMAT_UTF8,
    778         "text/plain",
    779         "1/1",
    780         strlen ("1/1") + 1,
    781         0
    782       },
    783       { 0, 0, NULL, NULL, 0, -1 }
    784     };
    785     struct ProblemSet ps[] = {
    786       { "testdata/gstreamer_sample_sorenson.mov", sample_sorenson_sol },
    787       { NULL, NULL }
    788     };
    789     g_print ("Running mov test on GStreamer:\n");
    790     test_result = (0 == ET_main ("gstreamer", ps) ? 0 : 1);
    791     g_print ("mov GStreamer test result: %s\n", test_result == 0 ? "OK" :
    792              "FAILED");
    793     result += test_result;
    794   }
    795 
    796   pre_test = discoverer_main (dc, "testdata/matroska_flame.mkv");
    797   if (pre_test != GST_DISCOVERER_MISSING_PLUGINS)
    798   {
    799     int result_stock;
    800     int result_patched;
    801     struct SolutionData matroska_flame_stock_sol[] = {
    802       {
    803         EXTRACTOR_METATYPE_DURATION,
    804         EXTRACTOR_METAFORMAT_UTF8,
    805         "text/plain",
    806         "0:00:03.143000000",
    807         strlen ("0:00:03.143000000") + 1,
    808         0
    809       },
    810       {
    811         EXTRACTOR_METATYPE_MIMETYPE,
    812         EXTRACTOR_METAFORMAT_UTF8,
    813         "text/plain",
    814         "video/x-matroska",
    815         strlen ("video/x-matroska") + 1,
    816         0
    817       },
    818       {
    819         EXTRACTOR_METATYPE_MIMETYPE,
    820         EXTRACTOR_METAFORMAT_UTF8,
    821         "text/plain",
    822         "video/x-indeo",
    823         strlen ("video/x-indeo") + 1,
    824         0
    825       },
    826       {
    827         EXTRACTOR_METATYPE_UNKNOWN,
    828         EXTRACTOR_METAFORMAT_UTF8,
    829         "text/plain",
    830         "indeoversion=4",
    831         strlen ("indeoversion=4") + 1,
    832         0
    833       },
    834       {
    835         EXTRACTOR_METATYPE_TITLE,
    836         EXTRACTOR_METAFORMAT_UTF8,
    837         "text/plain",
    838         "filesegmenttitle",
    839         strlen ("filesegmenttitle") + 1,
    840         0
    841       },
    842       {
    843         EXTRACTOR_METATYPE_TITLE,
    844         EXTRACTOR_METAFORMAT_UTF8,
    845         "text/plain",
    846         "TITLE",
    847         strlen ("TITLE") + 1,
    848         0
    849       },
    850       {
    851         EXTRACTOR_METATYPE_ARTIST,
    852         EXTRACTOR_METAFORMAT_UTF8,
    853         "text/plain",
    854         "ALBUM/ARTIST",
    855         strlen ("ALBUM/ARTIST") + 1,
    856         0
    857       },
    858       {
    859         EXTRACTOR_METATYPE_ARTIST,
    860         EXTRACTOR_METAFORMAT_UTF8,
    861         "text/plain",
    862         "ARTIST",
    863         strlen ("ARTIST") + 1,
    864         0
    865       },
    866       {
    867         EXTRACTOR_METATYPE_COPYRIGHT,
    868         EXTRACTOR_METAFORMAT_UTF8,
    869         "text/plain",
    870         "COPYRIGHT",
    871         strlen ("COPYRIGHT") + 1,
    872         0
    873       },
    874       {
    875         EXTRACTOR_METATYPE_COMPOSER,
    876         EXTRACTOR_METAFORMAT_UTF8,
    877         "text/plain",
    878         "COMPOSER",
    879         strlen ("COMPOSER") + 1,
    880         0
    881       },
    882       {
    883         EXTRACTOR_METATYPE_GENRE,
    884         EXTRACTOR_METAFORMAT_UTF8,
    885         "text/plain",
    886         "GENRE",
    887         strlen ("GENRE") + 1,
    888         0
    889       },
    890       {
    891         EXTRACTOR_METATYPE_ENCODER,
    892         EXTRACTOR_METAFORMAT_UTF8,
    893         "text/plain",
    894         "ENCODER",
    895         strlen ("ENCODER") + 1,
    896         0
    897       },
    898       {
    899         EXTRACTOR_METATYPE_ISRC,
    900         EXTRACTOR_METAFORMAT_UTF8,
    901         "text/plain",
    902         "ISRC",
    903         strlen ("ISRC") + 1,
    904         0
    905       },
    906       {
    907         EXTRACTOR_METATYPE_CONTAINER_FORMAT,
    908         EXTRACTOR_METAFORMAT_UTF8,
    909         "text/plain",
    910         "Matroska",
    911         strlen ("Matroska") + 1,
    912         0
    913       },
    914       {
    915         EXTRACTOR_METATYPE_VIDEO_CODEC,
    916         EXTRACTOR_METAFORMAT_UTF8,
    917         "text/plain",
    918         "Intel Video 4",
    919         strlen ("Intel Video 4") + 1,
    920         0
    921       },
    922       {
    923         EXTRACTOR_METATYPE_VIDEO_LANGUAGE,
    924         EXTRACTOR_METAFORMAT_UTF8,
    925         "text/plain",
    926         "it",
    927         strlen ("it") + 1,
    928         0
    929       },
    930       {
    931         EXTRACTOR_METATYPE_VIDEO_DIMENSIONS,
    932         EXTRACTOR_METAFORMAT_UTF8,
    933         "text/plain",
    934         "256x240",
    935         strlen ("256x240") + 1,
    936         0
    937       },
    938       {
    939         EXTRACTOR_METATYPE_FRAME_RATE,
    940         EXTRACTOR_METAFORMAT_UTF8,
    941         "text/plain",
    942         "35/1",
    943         strlen ("35/1") + 1,
    944         0
    945       },
    946       {
    947         EXTRACTOR_METATYPE_PIXEL_ASPECT_RATIO,
    948         EXTRACTOR_METAFORMAT_UTF8,
    949         "text/plain",
    950         "1/1",
    951         strlen ("1/1") + 1,
    952         0
    953       },
    954       { 0, 0, NULL, NULL, 0, -1 }
    955     };
    956     struct ProblemSet stock_ps[] = {
    957       { "testdata/matroska_flame.mkv", matroska_flame_stock_sol },
    958       { NULL, NULL }
    959     };
    960 
    961 
    962     struct SolutionData matroska_flame_patched_sol[] = {
    963       {
    964         EXTRACTOR_METATYPE_DURATION,
    965         EXTRACTOR_METAFORMAT_UTF8,
    966         "text/plain",
    967         "0:00:03.143000000",
    968         strlen ("0:00:03.143000000") + 1,
    969         0
    970       },
    971       {
    972         EXTRACTOR_METATYPE_MIMETYPE,
    973         EXTRACTOR_METAFORMAT_UTF8,
    974         "text/plain",
    975         "video/x-matroska",
    976         strlen ("video/x-matroska") + 1,
    977         0
    978       },
    979       {
    980         EXTRACTOR_METATYPE_MIMETYPE,
    981         EXTRACTOR_METAFORMAT_UTF8,
    982         "text/plain",
    983         "video/x-indeo",
    984         strlen ("video/x-indeo") + 1,
    985         0
    986       },
    987       {
    988         EXTRACTOR_METATYPE_UNKNOWN,
    989         EXTRACTOR_METAFORMAT_UTF8,
    990         "text/plain",
    991         "indeoversion=4",
    992         strlen ("indeoversion=4") + 1,
    993         0
    994       },
    995       {
    996         EXTRACTOR_METATYPE_TITLE,
    997         EXTRACTOR_METAFORMAT_UTF8,
    998         "text/plain",
    999         "filesegmenttitle",
   1000         strlen ("filesegmenttitle") + 1,
   1001         0
   1002       },
   1003       {
   1004         EXTRACTOR_METATYPE_ALBUM,
   1005         EXTRACTOR_METAFORMAT_UTF8,
   1006         "text/plain",
   1007         "ALBUM/TITLE",
   1008         strlen ("ALBUM/TITLE") + 1,
   1009         0
   1010       },
   1011       {
   1012         EXTRACTOR_METATYPE_TITLE,
   1013         EXTRACTOR_METAFORMAT_UTF8,
   1014         "text/plain",
   1015         "TITLE",
   1016         strlen ("TITLE") + 1,
   1017         0
   1018       },
   1019       {
   1020         EXTRACTOR_METATYPE_TITLE,
   1021         EXTRACTOR_METAFORMAT_UTF8,
   1022         "text/plain",
   1023         "SUBTITLE",
   1024         strlen ("SUBTITLE") + 1,
   1025         0
   1026       },
   1027       {
   1028         EXTRACTOR_METATYPE_TITLE,
   1029         EXTRACTOR_METAFORMAT_UTF8,
   1030         "text/plain",
   1031         "VIDEO/TITLE",
   1032         strlen ("VIDEO/TITLE") + 1,
   1033         0
   1034       },
   1035       {
   1036         EXTRACTOR_METATYPE_ARTIST,
   1037         EXTRACTOR_METAFORMAT_UTF8,
   1038         "text/plain",
   1039         "ALBUM/ARTIST",
   1040         strlen ("ALBUM/ARTIST") + 1,
   1041         0
   1042       },
   1043       {
   1044         EXTRACTOR_METATYPE_ARTIST,
   1045         EXTRACTOR_METAFORMAT_UTF8,
   1046         "text/plain",
   1047         "ARTIST",
   1048         strlen ("ARTIST") + 1,
   1049         0
   1050       },
   1051       {
   1052         EXTRACTOR_METATYPE_SONG_COUNT,
   1053         EXTRACTOR_METAFORMAT_UTF8,
   1054         "text/plain",
   1055         "20",
   1056         strlen ("20") + 1,
   1057         0
   1058       },
   1059       {
   1060         EXTRACTOR_METATYPE_UNKNOWN,
   1061         EXTRACTOR_METAFORMAT_UTF8,
   1062         "text/plain",
   1063         "PART_OFFSET=5",
   1064         strlen ("PART_OFFSET=5") + 1,
   1065         0
   1066       },
   1067       {
   1068         EXTRACTOR_METATYPE_UNKNOWN,
   1069         EXTRACTOR_METAFORMAT_UTF8,
   1070         "text/plain",
   1071         "ARTIST/INSTRUMENTS=ARTIST/INSTRUMENTS",
   1072         strlen ("ARTIST/INSTRUMENTS=ARTIST/INSTRUMENTS") + 1,
   1073         0
   1074       },
   1075       {
   1076         EXTRACTOR_METATYPE_UNKNOWN,
   1077         EXTRACTOR_METAFORMAT_UTF8,
   1078         "text/plain",
   1079         "LEAD_PERFORMER=LEAD_PERFORMER",
   1080         strlen ("LEAD_PERFORMER=LEAD_PERFORMER") + 1,
   1081         0
   1082       },
   1083       {
   1084         EXTRACTOR_METATYPE_UNKNOWN,
   1085         EXTRACTOR_METAFORMAT_UTF8,
   1086         "text/plain",
   1087         "ARRANGER=ARRANGER",
   1088         strlen ("ARRANGER=ARRANGER") + 1,
   1089         0
   1090       },
   1091       {
   1092         EXTRACTOR_METATYPE_UNKNOWN,
   1093         EXTRACTOR_METAFORMAT_UTF8,
   1094         "text/plain",
   1095         "LYRICIST=LYRICIST",
   1096         strlen ("LYRICIST=LYRICIST") + 1,
   1097         0
   1098       },
   1099       {
   1100         EXTRACTOR_METATYPE_MOVIE_DIRECTOR,
   1101         EXTRACTOR_METAFORMAT_UTF8,
   1102         "text/plain",
   1103         "DIRECTOR",
   1104         strlen ("DIRECTOR") + 1,
   1105         0
   1106       },
   1107       {
   1108         EXTRACTOR_METATYPE_UNKNOWN,
   1109         EXTRACTOR_METAFORMAT_UTF8,
   1110         "text/plain",
   1111         "ASSISTANT_DIRECTOR=ASSISTANT_DIRECTOR",
   1112         strlen ("ASSISTANT_DIRECTOR=ASSISTANT_DIRECTOR") + 1,
   1113         0
   1114       },
   1115       {
   1116         EXTRACTOR_METATYPE_UNKNOWN,
   1117         EXTRACTOR_METAFORMAT_UTF8,
   1118         "text/plain",
   1119         "DIRECTOR_OF_PHOTOGRAPHY=DIRECTOR_OF_PHOTOGRAPHY",
   1120         strlen ("DIRECTOR_OF_PHOTOGRAPHY=DIRECTOR_OF_PHOTOGRAPHY") + 1,
   1121         0
   1122       },
   1123       {
   1124         EXTRACTOR_METATYPE_UNKNOWN,
   1125         EXTRACTOR_METAFORMAT_UTF8,
   1126         "text/plain",
   1127         "SOUND_ENGINEER=SOUND_ENGINEER",
   1128         strlen ("SOUND_ENGINEER=SOUND_ENGINEER") + 1,
   1129         0
   1130       },
   1131       {
   1132         EXTRACTOR_METATYPE_UNKNOWN,
   1133         EXTRACTOR_METAFORMAT_UTF8,
   1134         "text/plain",
   1135         "ART_DIRECTOR=ART_DIRECTOR",
   1136         strlen ("ART_DIRECTOR=ART_DIRECTOR") + 1,
   1137         0
   1138       },
   1139       {
   1140         EXTRACTOR_METATYPE_UNKNOWN,
   1141         EXTRACTOR_METAFORMAT_UTF8,
   1142         "text/plain",
   1143         "PRODUCTION_DESIGNER=PRODUCTION_DESIGNER",
   1144         strlen ("PRODUCTION_DESIGNER=PRODUCTION_DESIGNER") + 1,
   1145         0
   1146       },
   1147       {
   1148         EXTRACTOR_METATYPE_UNKNOWN,
   1149         EXTRACTOR_METAFORMAT_UTF8,
   1150         "text/plain",
   1151         "CHOREGRAPHER=CHOREGRAPHER",
   1152         strlen ("CHOREGRAPHER=CHOREGRAPHER") + 1,
   1153         0
   1154       },
   1155       {
   1156         EXTRACTOR_METATYPE_UNKNOWN,
   1157         EXTRACTOR_METAFORMAT_UTF8,
   1158         "text/plain",
   1159         "COSTUME_DESIGNER=COSTUME_DESIGNER",
   1160         strlen ("COSTUME_DESIGNER=COSTUME_DESIGNER") + 1,
   1161         0
   1162       },
   1163       {
   1164         EXTRACTOR_METATYPE_UNKNOWN,
   1165         EXTRACTOR_METAFORMAT_UTF8,
   1166         "text/plain",
   1167         "ACTOR=ACTOR",
   1168         strlen ("ACTOR=ACTOR") + 1,
   1169         0
   1170       },
   1171       {
   1172         EXTRACTOR_METATYPE_UNKNOWN,
   1173         EXTRACTOR_METAFORMAT_UTF8,
   1174         "text/plain",
   1175         "CHARACTER=CHARACTER",
   1176         strlen ("CHARACTER=CHARACTER") + 1,
   1177         0
   1178       },
   1179       {
   1180         EXTRACTOR_METATYPE_WRITER,
   1181         EXTRACTOR_METAFORMAT_UTF8,
   1182         "text/plain",
   1183         "WRITTEN_BY",
   1184         strlen ("WRITTEN_BY") + 1,
   1185         0
   1186       },
   1187       {
   1188         EXTRACTOR_METATYPE_UNKNOWN,
   1189         EXTRACTOR_METAFORMAT_UTF8,
   1190         "text/plain",
   1191         "SCREENPLAY_BY=SCREENPLAY_BY",
   1192         strlen ("SCREENPLAY_BY=SCREENPLAY_BY") + 1,
   1193         0
   1194       },
   1195       {
   1196         EXTRACTOR_METATYPE_UNKNOWN,
   1197         EXTRACTOR_METAFORMAT_UTF8,
   1198         "text/plain",
   1199         "EDITED_BY=EDITED_BY",
   1200         strlen ("EDITED_BY=EDITED_BY") + 1,
   1201         0
   1202       },
   1203       {
   1204         EXTRACTOR_METATYPE_PRODUCER,
   1205         EXTRACTOR_METAFORMAT_UTF8,
   1206         "text/plain",
   1207         "PRODUCER",
   1208         strlen ("PRODUCER") + 1,
   1209         0
   1210       },
   1211       {
   1212         EXTRACTOR_METATYPE_UNKNOWN,
   1213         EXTRACTOR_METAFORMAT_UTF8,
   1214         "text/plain",
   1215         "COPRODUCER=COPRODUCER",
   1216         strlen ("COPRODUCER=COPRODUCER") + 1,
   1217         0
   1218       },
   1219       {
   1220         EXTRACTOR_METATYPE_UNKNOWN,
   1221         EXTRACTOR_METAFORMAT_UTF8,
   1222         "text/plain",
   1223         "EXECUTIVE_PRODUCER=EXECUTIVE_PRODUCER",
   1224         strlen ("EXECUTIVE_PRODUCER=EXECUTIVE_PRODUCER") + 1,
   1225         0
   1226       },
   1227       {
   1228         EXTRACTOR_METATYPE_UNKNOWN,
   1229         EXTRACTOR_METAFORMAT_UTF8,
   1230         "text/plain",
   1231         "DISTRIBUTED_BY=DISTRIBUTED_BY",
   1232         strlen ("DISTRIBUTED_BY=DISTRIBUTED_BY") + 1,
   1233         0
   1234       },
   1235       {
   1236         EXTRACTOR_METATYPE_UNKNOWN,
   1237         EXTRACTOR_METAFORMAT_UTF8,
   1238         "text/plain",
   1239         "MASTERED_BY=MASTERED_BY",
   1240         strlen ("MASTERED_BY=MASTERED_BY") + 1,
   1241         0
   1242       },
   1243       {
   1244         EXTRACTOR_METATYPE_UNKNOWN,
   1245         EXTRACTOR_METAFORMAT_UTF8,
   1246         "text/plain",
   1247         "MIXED_BY=MIXED_BY",
   1248         strlen ("MIXED_BY=MIXED_BY") + 1,
   1249         0
   1250       },
   1251       {
   1252         EXTRACTOR_METATYPE_UNKNOWN,
   1253         EXTRACTOR_METAFORMAT_UTF8,
   1254         "text/plain",
   1255         "REMIXED_BY=REMIXED_BY",
   1256         strlen ("REMIXED_BY=REMIXED_BY") + 1,
   1257         0
   1258       },
   1259       {
   1260         EXTRACTOR_METATYPE_UNKNOWN,
   1261         EXTRACTOR_METAFORMAT_UTF8,
   1262         "text/plain",
   1263         "PRODUCTION_STUDIO=PRODUCTION_STUDIO",
   1264         strlen ("PRODUCTION_STUDIO=PRODUCTION_STUDIO") + 1,
   1265         0
   1266       },
   1267       {
   1268         EXTRACTOR_METATYPE_UNKNOWN,
   1269         EXTRACTOR_METAFORMAT_UTF8,
   1270         "text/plain",
   1271         "THANKS_TO=THANKS_TO",
   1272         strlen ("THANKS_TO=THANKS_TO") + 1,
   1273         0
   1274       },
   1275       {
   1276         EXTRACTOR_METATYPE_PUBLISHER,
   1277         EXTRACTOR_METAFORMAT_UTF8,
   1278         "text/plain",
   1279         "PUBLISHER",
   1280         strlen ("PUBLISHER") + 1,
   1281         0
   1282       },
   1283       {
   1284         EXTRACTOR_METATYPE_UNKNOWN,
   1285         EXTRACTOR_METAFORMAT_UTF8,
   1286         "text/plain",
   1287         "LABEL=LABEL",
   1288         strlen ("LABEL=LABEL") + 1,
   1289         0
   1290       },
   1291       {
   1292         EXTRACTOR_METATYPE_MOOD,
   1293         EXTRACTOR_METAFORMAT_UTF8,
   1294         "text/plain",
   1295         "MOOD",
   1296         strlen ("MOOD") + 1,
   1297         0
   1298       },
   1299       {
   1300         EXTRACTOR_METATYPE_UNKNOWN,
   1301         EXTRACTOR_METAFORMAT_UTF8,
   1302         "text/plain",
   1303         "ORIGINAL_MEDIA_TYPE=ORIGINAL_MEDIA_TYPE",
   1304         strlen ("ORIGINAL_MEDIA_TYPE=ORIGINAL_MEDIA_TYPE") + 1,
   1305         0
   1306       },
   1307       {
   1308         EXTRACTOR_METATYPE_UNKNOWN,
   1309         EXTRACTOR_METAFORMAT_UTF8,
   1310         "text/plain",
   1311         "CONTENT_TYPE=CONTENT_TYPE",
   1312         strlen ("CONTENT_TYPE=CONTENT_TYPE") + 1,
   1313         0
   1314       },
   1315       {
   1316         EXTRACTOR_METATYPE_SUBJECT,
   1317         EXTRACTOR_METAFORMAT_UTF8,
   1318         "text/plain",
   1319         "SUBJECT",
   1320         strlen ("SUBJECT") + 1,
   1321         0
   1322       },
   1323       {
   1324         EXTRACTOR_METATYPE_SUMMARY,
   1325         EXTRACTOR_METAFORMAT_UTF8,
   1326         "text/plain",
   1327         "SUMMARY",
   1328         strlen ("SUMMARY") + 1,
   1329         0
   1330       },
   1331       {
   1332         EXTRACTOR_METATYPE_UNKNOWN,
   1333         EXTRACTOR_METAFORMAT_UTF8,
   1334         "text/plain",
   1335         "SYNOPSIS=SYNOPSIS",
   1336         strlen ("SYNOPSIS=SYNOPSIS") + 1,
   1337         0
   1338       },
   1339       {
   1340         EXTRACTOR_METATYPE_UNKNOWN,
   1341         EXTRACTOR_METAFORMAT_UTF8,
   1342         "text/plain",
   1343         "INITIAL_KEY=INITIAL_KEY",
   1344         strlen ("INITIAL_KEY=INITIAL_KEY") + 1,
   1345         0
   1346       },
   1347       {
   1348         EXTRACTOR_METATYPE_UNKNOWN,
   1349         EXTRACTOR_METAFORMAT_UTF8,
   1350         "text/plain",
   1351         "PERIOD=PERIOD",
   1352         strlen ("PERIOD=PERIOD") + 1,
   1353         0
   1354       },
   1355       {
   1356         EXTRACTOR_METATYPE_UNKNOWN,
   1357         EXTRACTOR_METAFORMAT_UTF8,
   1358         "text/plain",
   1359         "LAW_RATING=LAW_RATING",
   1360         strlen ("LAW_RATING=LAW_RATING") + 1,
   1361         0
   1362       },
   1363       {
   1364         EXTRACTOR_METATYPE_UNKNOWN,
   1365         EXTRACTOR_METAFORMAT_UTF8,
   1366         "text/plain",
   1367         "COMPOSITION_LOCATION=COMPOSITION_LOCATION",
   1368         strlen ("COMPOSITION_LOCATION=COMPOSITION_LOCATION") + 1,
   1369         0
   1370       },
   1371       {
   1372         EXTRACTOR_METATYPE_UNKNOWN,
   1373         EXTRACTOR_METAFORMAT_UTF8,
   1374         "text/plain",
   1375         "COMPOSER_NATIONALITY=COMPOSER_NATIONALITY",
   1376         strlen ("COMPOSER_NATIONALITY=COMPOSER_NATIONALITY") + 1,
   1377         0
   1378       },
   1379       {
   1380         EXTRACTOR_METATYPE_PLAY_COUNTER,
   1381         EXTRACTOR_METAFORMAT_UTF8,
   1382         "text/plain",
   1383         "PLAY_COUNTER",
   1384         strlen ("PLAY_COUNTER") + 1,
   1385         0
   1386       },
   1387       {
   1388         EXTRACTOR_METATYPE_RATING,
   1389         EXTRACTOR_METAFORMAT_UTF8,
   1390         "text/plain",
   1391         "RATING",
   1392         strlen ("RATING") + 1,
   1393         0
   1394       },
   1395       {
   1396         EXTRACTOR_METATYPE_UNKNOWN,
   1397         EXTRACTOR_METAFORMAT_UTF8,
   1398         "text/plain",
   1399         "ENCODER_SETTINGS=ENCODER_SETTINGS",
   1400         strlen ("ENCODER_SETTINGS=ENCODER_SETTINGS") + 1,
   1401         0
   1402       },
   1403       {
   1404         EXTRACTOR_METATYPE_FRAME_RATE,
   1405         EXTRACTOR_METAFORMAT_UTF8,
   1406         "text/plain",
   1407         "FPS",
   1408         strlen ("FPS") + 1,
   1409         0
   1410       },
   1411       {
   1412         EXTRACTOR_METATYPE_UNKNOWN,
   1413         EXTRACTOR_METAFORMAT_UTF8,
   1414         "text/plain",
   1415         "MEASURE=MEASURE",
   1416         strlen ("MEASURE=MEASURE") + 1,
   1417         0
   1418       },
   1419       {
   1420         EXTRACTOR_METATYPE_UNKNOWN,
   1421         EXTRACTOR_METAFORMAT_UTF8,
   1422         "text/plain",
   1423         "TUNING=TUNING",
   1424         strlen ("TUNING=TUNING") + 1,
   1425         0
   1426       },
   1427       {
   1428         EXTRACTOR_METATYPE_UNKNOWN,
   1429         EXTRACTOR_METAFORMAT_UTF8,
   1430         "text/plain",
   1431         "ISBN=ISBN",
   1432         strlen ("ISBN=ISBN") + 1,
   1433         0
   1434       },
   1435       {
   1436         EXTRACTOR_METATYPE_UNKNOWN,
   1437         EXTRACTOR_METAFORMAT_UTF8,
   1438         "text/plain",
   1439         "BARCODE=BARCODE",
   1440         strlen ("BARCODE=BARCODE") + 1,
   1441         0
   1442       },
   1443       {
   1444         EXTRACTOR_METATYPE_UNKNOWN,
   1445         EXTRACTOR_METAFORMAT_UTF8,
   1446         "text/plain",
   1447         "CATALOG_NUMBER=CATALOG_NUMBER",
   1448         strlen ("CATALOG_NUMBER=CATALOG_NUMBER") + 1,
   1449         0
   1450       },
   1451       {
   1452         EXTRACTOR_METATYPE_UNKNOWN,
   1453         EXTRACTOR_METAFORMAT_UTF8,
   1454         "text/plain",
   1455         "LABEL_CODE=LABEL_CODE",
   1456         strlen ("LABEL_CODE=LABEL_CODE") + 1,
   1457         0
   1458       },
   1459       {
   1460         EXTRACTOR_METATYPE_UNKNOWN,
   1461         EXTRACTOR_METAFORMAT_UTF8,
   1462         "text/plain",
   1463         "LCCN=LCCN",
   1464         strlen ("LCCN=LCCN") + 1,
   1465         0
   1466       },
   1467       {
   1468         EXTRACTOR_METATYPE_UNKNOWN,
   1469         EXTRACTOR_METAFORMAT_UTF8,
   1470         "text/plain",
   1471         "PURCHASE_ITEM=PURCHASE_ITEM",
   1472         strlen ("PURCHASE_ITEM=PURCHASE_ITEM") + 1,
   1473         0
   1474       },
   1475       {
   1476         EXTRACTOR_METATYPE_UNKNOWN,
   1477         EXTRACTOR_METAFORMAT_UTF8,
   1478         "text/plain",
   1479         "PURCHASE_INFO=PURCHASE_INFO",
   1480         strlen ("PURCHASE_INFO=PURCHASE_INFO") + 1,
   1481         0
   1482       },
   1483       {
   1484         EXTRACTOR_METATYPE_UNKNOWN,
   1485         EXTRACTOR_METAFORMAT_UTF8,
   1486         "text/plain",
   1487         "PURCHASE_OWNER=PURCHASE_OWNER",
   1488         strlen ("PURCHASE_OWNER=PURCHASE_OWNER") + 1,
   1489         0
   1490       },
   1491       {
   1492         EXTRACTOR_METATYPE_UNKNOWN,
   1493         EXTRACTOR_METAFORMAT_UTF8,
   1494         "text/plain",
   1495         "PURCHASE_PRICE=PURCHASE_PRICE",
   1496         strlen ("PURCHASE_PRICE=PURCHASE_PRICE") + 1,
   1497         0
   1498       },
   1499       {
   1500         EXTRACTOR_METATYPE_UNKNOWN,
   1501         EXTRACTOR_METAFORMAT_UTF8,
   1502         "text/plain",
   1503         "PURCHASE_CURRENCY=PURCHASE_CURRENCY",
   1504         strlen ("PURCHASE_CURRENCY=PURCHASE_CURRENCY") + 1,
   1505         0
   1506       },
   1507       {
   1508         EXTRACTOR_METATYPE_ORIGINAL_TITLE,
   1509         EXTRACTOR_METAFORMAT_UTF8,
   1510         "text/plain",
   1511         "ORIGINAL/TITLE",
   1512         strlen ("ORIGINAL/TITLE") + 1,
   1513         0
   1514       },
   1515       {
   1516         EXTRACTOR_METATYPE_UNKNOWN,
   1517         EXTRACTOR_METAFORMAT_UTF8,
   1518         "text/plain",
   1519         "ORIGINAL/ARTIST/SORT_WITH=ORIGINAL/ARTIST/SORT_WITH",
   1520         strlen ("ORIGINAL/ARTIST/SORT_WITH=ORIGINAL/ARTIST/SORT_WITH") + 1,
   1521         0
   1522       },
   1523       {
   1524         EXTRACTOR_METATYPE_ORIGINAL_ARTIST,
   1525         EXTRACTOR_METAFORMAT_UTF8,
   1526         "text/plain",
   1527         "ORIGINAL/ARTIST",
   1528         strlen ("ORIGINAL/ARTIST") + 1,
   1529         0
   1530       },
   1531       {
   1532         EXTRACTOR_METATYPE_TRACK_NUMBER,
   1533         EXTRACTOR_METAFORMAT_UTF8,
   1534         "text/plain",
   1535         "10",
   1536         strlen ("10") + 1,
   1537         0
   1538       },
   1539       {
   1540         EXTRACTOR_METATYPE_COPYRIGHT,
   1541         EXTRACTOR_METAFORMAT_UTF8,
   1542         "text/plain",
   1543         "COPYRIGHT",
   1544         strlen ("COPYRIGHT") + 1,
   1545         0
   1546       },
   1547       {
   1548         EXTRACTOR_METATYPE_CONTACT_INFORMATION,
   1549         EXTRACTOR_METAFORMAT_UTF8,
   1550         "text/plain",
   1551         "COPYRIGHT/EMAIL",
   1552         strlen ("COPYRIGHT/EMAIL") + 1,
   1553         0
   1554       },
   1555       {
   1556         EXTRACTOR_METATYPE_CONTACT_INFORMATION,
   1557         EXTRACTOR_METAFORMAT_UTF8,
   1558         "text/plain",
   1559         "COPYRIGHT/ADDRESS",
   1560         strlen ("COPYRIGHT/ADDRESS") + 1,
   1561         0
   1562       },
   1563       {
   1564         EXTRACTOR_METATYPE_CREATION_TIME,
   1565         EXTRACTOR_METAFORMAT_UTF8,
   1566         "text/plain",
   1567         "1999-01-01",
   1568         strlen ("1999-01-01") + 1,
   1569         0
   1570       },
   1571       {
   1572         EXTRACTOR_METATYPE_COMMENT,
   1573         EXTRACTOR_METAFORMAT_UTF8,
   1574         "text/plain",
   1575         "The purpose of this file is to hold as many examples of Matroska tags as possible.",
   1576         strlen (
   1577           "The purpose of this file is to hold as many examples of Matroska tags as possible.")
   1578         + 1,
   1579         0
   1580       },
   1581       {
   1582         EXTRACTOR_METATYPE_COMPOSER,
   1583         EXTRACTOR_METAFORMAT_UTF8,
   1584         "text/plain",
   1585         "COMPOSER",
   1586         strlen ("COMPOSER") + 1,
   1587         0
   1588       },
   1589       {
   1590         EXTRACTOR_METATYPE_PERFORMER,
   1591         EXTRACTOR_METAFORMAT_UTF8,
   1592         "text/plain",
   1593         "ACCOMPANIMENT",
   1594         strlen ("ACCOMPANIMENT") + 1,
   1595         0
   1596       },
   1597       {
   1598         EXTRACTOR_METATYPE_PERFORMER,
   1599         EXTRACTOR_METAFORMAT_UTF8,
   1600         "text/plain",
   1601         "CONDUCTOR",
   1602         strlen ("CONDUCTOR") + 1,
   1603         0
   1604       },
   1605       {
   1606         EXTRACTOR_METATYPE_LYRICS,
   1607         EXTRACTOR_METAFORMAT_UTF8,
   1608         "text/plain",
   1609         "LYRICS",
   1610         strlen ("LYRICS") + 1,
   1611         0
   1612       },
   1613       {
   1614         EXTRACTOR_METATYPE_ENCODED_BY,
   1615         EXTRACTOR_METAFORMAT_UTF8,
   1616         "text/plain",
   1617         "ENCODED_BY",
   1618         strlen ("ENCODED_BY") + 1,
   1619         0
   1620       },
   1621       {
   1622         EXTRACTOR_METATYPE_GENRE,
   1623         EXTRACTOR_METAFORMAT_UTF8,
   1624         "text/plain",
   1625         "GENRE",
   1626         strlen ("GENRE") + 1,
   1627         0
   1628       },
   1629       {
   1630         EXTRACTOR_METATYPE_DESCRIPTION,
   1631         EXTRACTOR_METAFORMAT_UTF8,
   1632         "text/plain",
   1633         "DESCRIPTION",
   1634         strlen ("DESCRIPTION") + 1,
   1635         0
   1636       },
   1637       {
   1638         EXTRACTOR_METATYPE_KEYWORDS,
   1639         EXTRACTOR_METAFORMAT_UTF8,
   1640         "text/plain",
   1641         "KEYWORDS",
   1642         strlen ("KEYWORDS") + 1,
   1643         0
   1644       },
   1645       {
   1646         EXTRACTOR_METATYPE_LOCATION_NAME,
   1647         EXTRACTOR_METAFORMAT_UTF8,
   1648         "text/plain",
   1649         "RECORDING_LOCATION",
   1650         strlen ("RECORDING_LOCATION") + 1,
   1651         0
   1652       },
   1653       {
   1654         EXTRACTOR_METATYPE_ENCODER,
   1655         EXTRACTOR_METAFORMAT_UTF8,
   1656         "text/plain",
   1657         "ENCODER",
   1658         strlen ("ENCODER") + 1,
   1659         0
   1660       },
   1661       {
   1662         EXTRACTOR_METATYPE_ISRC,
   1663         EXTRACTOR_METAFORMAT_UTF8,
   1664         "text/plain",
   1665         "ISRC",
   1666         strlen ("ISRC") + 1,
   1667         0
   1668       },
   1669       {
   1670         EXTRACTOR_METATYPE_LICENSE,
   1671         EXTRACTOR_METAFORMAT_UTF8,
   1672         "text/plain",
   1673         "LICENSE",
   1674         strlen ("LICENSE") + 1,
   1675         0
   1676       },
   1677       {
   1678         EXTRACTOR_METATYPE_CONTAINER_FORMAT,
   1679         EXTRACTOR_METAFORMAT_UTF8,
   1680         "text/plain",
   1681         "Matroska",
   1682         strlen ("Matroska") + 1,
   1683         0
   1684       },
   1685       {
   1686         EXTRACTOR_METATYPE_VIDEO_CODEC,
   1687         EXTRACTOR_METAFORMAT_UTF8,
   1688         "text/plain",
   1689         "Intel Video 4",
   1690         strlen ("Intel Video 4") + 1,
   1691         0
   1692       },
   1693       {
   1694         EXTRACTOR_METATYPE_VIDEO_LANGUAGE,
   1695         EXTRACTOR_METAFORMAT_UTF8,
   1696         "text/plain",
   1697         "it",
   1698         strlen ("it") + 1,
   1699         0
   1700       },
   1701       {
   1702         EXTRACTOR_METATYPE_VIDEO_DIMENSIONS,
   1703         EXTRACTOR_METAFORMAT_UTF8,
   1704         "text/plain",
   1705         "256x240",
   1706         strlen ("256x240") + 1,
   1707         0
   1708       },
   1709       {
   1710         EXTRACTOR_METATYPE_FRAME_RATE,
   1711         EXTRACTOR_METAFORMAT_UTF8,
   1712         "text/plain",
   1713         "35/1",
   1714         strlen ("35/1") + 1,
   1715         0
   1716       },
   1717       {
   1718         EXTRACTOR_METATYPE_PIXEL_ASPECT_RATIO,
   1719         EXTRACTOR_METAFORMAT_UTF8,
   1720         "text/plain",
   1721         "1/1",
   1722         strlen ("1/1") + 1,
   1723         0
   1724       },
   1725       { 0, 0, NULL, NULL, 0, -1 }
   1726     };
   1727     struct ProblemSet patched_ps[] = {
   1728       { "testdata/matroska_flame.mkv", matroska_flame_patched_sol },
   1729       { NULL, NULL }
   1730     };
   1731     g_print ("Running mkv test on GStreamer, assuming old version:\n");
   1732     result_stock = (0 == ET_main ("gstreamer", stock_ps));
   1733     g_print ("Old GStreamer test result: %s\n", result_stock == 0 ? "OK" :
   1734              "FAILED");
   1735     g_print ("Running mkv test on GStreamer, assuming new version:\n");
   1736     result_patched = (0 == ET_main ("gstreamer", patched_ps));
   1737     g_print ("New GStreamer test result: %s\n", result_patched == 0 ? "OK" :
   1738              "FAILED");
   1739     if ((! result_stock) && (! result_patched))
   1740       result++;
   1741   }
   1742   g_object_unref (dc);
   1743   if (0 != result)
   1744   {
   1745     fprintf (stderr,
   1746              "gstreamer library did not work perfectly --- consider updating it.\n");
   1747     /* do not fail hard, as we know many users have outdated gstreamer packages */
   1748     result = 0;
   1749   }
   1750   return subtitles_failed;
   1751 }
   1752 
   1753 
   1754 /* end of test_gstreamer.c */