Blame tests/check/elements/subparse.c

Packit 971217
/* GStreamer unit tests for subparse
Packit 971217
 * Copyright (C) 2006-2008 Tim-Philipp Müller <tim centricular net>
Packit 971217
 *
Packit 971217
 * This library is free software; you can redistribute it and/or
Packit 971217
 * modify it under the terms of the GNU Library General Public
Packit 971217
 * License as published by the Free Software Foundation; either
Packit 971217
 * version 2 of the License, or (at your option) any later version.
Packit 971217
 *
Packit 971217
 * This library is distributed in the hope that it will be useful,
Packit 971217
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 971217
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 971217
 * Library General Public License for more details.
Packit 971217
 *
Packit 971217
 * You should have received a copy of the GNU Library General Public
Packit 971217
 * License along with this library; if not, write to the
Packit 971217
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 971217
 * Boston, MA 02110-1301, USA.
Packit 971217
 */
Packit 971217
Packit 971217
#ifdef HAVE_CONFIG_H
Packit 971217
# include <config.h>
Packit 971217
#endif
Packit 971217
Packit 971217
#include <gst/check/gstcheck.h>
Packit 971217
Packit 971217
#include <string.h>
Packit 971217
Packit 971217
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
Packit 971217
    GST_PAD_SINK,
Packit 971217
    GST_PAD_ALWAYS,
Packit 971217
    GST_STATIC_CAPS ("text/x-raw, format = { pango-markup, utf8 }")
Packit 971217
    );
Packit 971217
static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
Packit 971217
    GST_PAD_SRC,
Packit 971217
    GST_PAD_ALWAYS,
Packit 971217
    GST_STATIC_CAPS ("ANY")
Packit 971217
    );
Packit 971217
Packit 971217
static GstElement *subparse;
Packit 971217
static GstPad *mysrcpad, *mysinkpad;
Packit 971217
Packit 971217
static GstBuffer *
Packit 971217
buffer_from_static_string (const gchar * s)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  gsize len;
Packit 971217
Packit 971217
  len = strlen (s);
Packit 971217
Packit 971217
  buf = gst_buffer_new ();
Packit 971217
  gst_buffer_append_memory (buf,
Packit 971217
      gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
Packit 971217
          (gpointer) s, len, 0, len, NULL, NULL));
Packit 971217
Packit 971217
  return buf;
Packit 971217
}
Packit 971217
Packit 971217
typedef struct
Packit 971217
{
Packit 971217
  const gchar *in;
Packit 971217
  GstClockTime from_ts;
Packit 971217
  GstClockTime to_ts;
Packit 971217
  const gchar *out;
Packit 971217
} SubParseInputChunk;
Packit 971217
Packit 971217
static SubParseInputChunk srt_input[] = {
Packit 971217
  {
Packit 971217
        "1\n00:00:01,000 --> 00:00:02,000\nOne\n\n",
Packit 971217
      1 * GST_SECOND, 2 * GST_SECOND, "One"}, {
Packit 971217
        "2\n00:00:02,000 --> 00:00:03,000\nTwo\n\n",
Packit 971217
      2 * GST_SECOND, 3 * GST_SECOND, "Two"}, {
Packit 971217
        "3\n00:00:03,000 --> 00:00:04,000\nThree\n\n",
Packit 971217
      3 * GST_SECOND, 4 * GST_SECOND, "Three"}, {
Packit 971217
        "4\n00:00:04,000 --> 00:00:05,000\nFour\n\n",
Packit 971217
      4 * GST_SECOND, 5 * GST_SECOND, "Four"}, {
Packit 971217
        "5\n00:00:05,000 --> 00:00:06,000\nFive\n\n",
Packit 971217
      5 * GST_SECOND, 6 * GST_SECOND, "Five"}, {
Packit 971217
        /* markup should be preserved */
Packit 971217
        "6\n00:00:06,000 --> 00:00:07,000\nSix\n\n",
Packit 971217
      6 * GST_SECOND, 7 * GST_SECOND, "Six"}, {
Packit 971217
        /* open markup tags should be closed */
Packit 971217
        "7\n00:00:07,000 --> 00:00:08,000\nSeven\n\n",
Packit 971217
      7 * GST_SECOND, 8 * GST_SECOND, "Seven"}, {
Packit 971217
        /* open markup tags should be closed (II) */
Packit 971217
        "8\n00:00:08,000 --> 00:00:09,000\nEight\n\n",
Packit 971217
      8 * GST_SECOND, 9 * GST_SECOND, "Eight"}, {
Packit 971217
        /* broken markup should be fixed */
Packit 971217
        "9\n00:00:09,000 --> 00:00:10,000\n\n\n",
Packit 971217
      9 * GST_SECOND, 10 * GST_SECOND, ""}, {
Packit 971217
        "10\n00:00:10,000 --> 00:00:11,000\n\n\n",
Packit 971217
      10 * GST_SECOND, 11 * GST_SECOND, ""}, {
Packit 971217
        "11\n00:00:11,000 --> 00:00:12,000\nxyz\n\n",
Packit 971217
      11 * GST_SECOND, 12 * GST_SECOND, "xyz"}, {
Packit 971217
        "12\n00:00:12,000 --> 00:00:13,000\nxyz\n\n",
Packit 971217
      12 * GST_SECOND, 13 * GST_SECOND, "xyz"}, {
Packit 971217
        "13\n00:00:13,000 --> 00:00:14,000\nKeep them comiiiiiing\n\n",
Packit 971217
        13 * GST_SECOND, 14 * GST_SECOND,
Packit 971217
      "Keep them comiiiiiing"}, {
Packit 971217
        /* skip a few chunk numbers here, the numbers shouldn't matter */
Packit 971217
        "24\n00:01:00,000 --> 00:02:00,000\nYep, still here\n\n",
Packit 971217
      60 * GST_SECOND, 120 * GST_SECOND, "Yep, still here"}, {
Packit 971217
        /* make sure stuff is escaped properly, but allowed markup stays intact */
Packit 971217
        "25\n00:03:00,000 --> 00:04:00,000\ngave Rock & Roll to\n\n",
Packit 971217
      180 * GST_SECOND, 240 * GST_SECOND, "gave Rock & Roll to"}, {
Packit 971217
        "26\n00:04:00,000 --> 00:05:00,000\nRock & Roll\n\n",
Packit 971217
      240 * GST_SECOND, 300 * GST_SECOND, "Rock & Roll"}, {
Packit 971217
        "27\n00:06:00,000 --> 00:08:00,000\nRock & Roll\n\n",
Packit 971217
      360 * GST_SECOND, 480 * GST_SECOND, "Rock & Roll"}, {
Packit 971217
        "28\n00:10:00,000 --> 00:11:00,000\n"
Packit 971217
        "<font \"#0000FF\"><joj>This is </xxx>in blue but <5</font>\n\n",
Packit 971217
      600 * GST_SECOND, 660 * GST_SECOND, "This is in blue but <5"}, {
Packit 971217
        /* closing tags should be recognised properly even if there's a space */
Packit 971217
        "29\n00:11:00,000 --> 00:12:00,000\n" "italics\n\n",
Packit 971217
      660 * GST_SECOND, 720 * GST_SECOND, "italics"}, {
Packit 971217
        /* closing tags should be escaped and fixed up if not recognised */
Packit 971217
        "30\n00:12:00,000 --> 00:12:01,000\n" "italics</ x>\n\n",
Packit 971217
      720 * GST_SECOND, 721 * GST_SECOND, "italics</ x>"},
Packit 971217
};
Packit 971217
Packit 971217
/* starts with chunk number 0 (not exactly according to spec) */
Packit 971217
static SubParseInputChunk srt_input0[] = {
Packit 971217
  {
Packit 971217
        "0\n00:00:01,000 --> 00:00:02,000\nOne\n\n",
Packit 971217
      1 * GST_SECOND, 2 * GST_SECOND, "One"}, {
Packit 971217
        "1\n00:00:02,000 --> 00:00:03,000\nTwo\n\n",
Packit 971217
      2 * GST_SECOND, 3 * GST_SECOND, "Two"}, {
Packit 971217
        "2\n00:00:03,000 --> 00:00:04,000\nThree\n\n",
Packit 971217
      3 * GST_SECOND, 4 * GST_SECOND, "Three"}
Packit 971217
};
Packit 971217
Packit 971217
/* has spaces instead of doubled zeroes (not exactly according to spec) */
Packit 971217
static SubParseInputChunk srt_input1[] = {
Packit 971217
  {
Packit 971217
        "1\n 0: 0:26, 26 --> 0: 0:28, 17\nI cant see.\n\n",
Packit 971217
        26 * GST_SECOND + 26 * GST_MSECOND,
Packit 971217
      28 * GST_SECOND + 17 * GST_MSECOND, "I cant see."},
Packit 971217
  {
Packit 971217
        "2\n 0: 0:30, 30 --> 0: 0:33, 22\nI really cant see.\n\n",
Packit 971217
        30 * GST_SECOND + 30 * GST_MSECOND,
Packit 971217
      33 * GST_SECOND + 22 * GST_MSECOND, "I really cant see."},
Packit 971217
  {
Packit 971217
        "3\n 0: 0:40, 40 --> 0: 0:44, 44\nI still cant see anything.\n\n",
Packit 971217
        40 * GST_SECOND + 40 * GST_MSECOND,
Packit 971217
      44 * GST_SECOND + 44 * GST_MSECOND, "I still cant see anything."}
Packit 971217
};
Packit 971217
Packit 971217
/* has UTF-8 BOM at the start */
Packit 971217
static SubParseInputChunk srt_input2[] = {
Packit 971217
  {
Packit 971217
        "\xef\xbb\xbf" "1\n00:00:00,000 --> 00:00:03,50\nJust testing.\n\n",
Packit 971217
      0, 3 * GST_SECOND + 500 * GST_MSECOND, "Just testing."}
Packit 971217
};
Packit 971217
Packit 971217
/* starts with chunk number 0 and has less than three digits after the comma
Packit 971217
 * and a few extra spaces before the arrow or at the end of the line */
Packit 971217
static SubParseInputChunk srt_input3[] = {
Packit 971217
  {
Packit 971217
        "0\n00:00:01,0 --> 00:00:02,0\nOne\n\n",
Packit 971217
      1000 * GST_MSECOND, 2000 * GST_MSECOND, "One"}, {
Packit 971217
        "1\n00:00:02,5   --> 00:00:03,  5 \nTwo\n\n",
Packit 971217
      2500 * GST_MSECOND, 3005 * GST_MSECOND, "Two"}, {
Packit 971217
        "2\n00:00:03, 9 --> 00:00:04,0   \nThree\n\n",
Packit 971217
      3090 * GST_MSECOND, 4000 * GST_MSECOND, "Three"}
Packit 971217
};
Packit 971217
Packit 971217
/* Some WebVTT chunks, this format is similar to SRT but should be
Packit 971217
 * parsed differently nonetheless, the WebVTT tags should be stripped
Packit 971217
 * off. */
Packit 971217
static SubParseInputChunk srt_input4[] = {
Packit 971217
  {
Packit 971217
        "1\n00:00:01,000 --> 00:00:02,000\n<v>some text\n\n",
Packit 971217
      1 * GST_SECOND, 2 * GST_SECOND, "some text"}
Packit 971217
  ,
Packit 971217
  {
Packit 971217
        "1\n00:00:01,000 --> 00:00:02,000\n<b.loud>some text\n\n",
Packit 971217
      1 * GST_SECOND, 2 * GST_SECOND, "some text"}
Packit 971217
  ,
Packit 971217
  {
Packit 971217
        "1\n00:00:01,000 --> 00:00:02,000\n<ruby>base text<rt>annotation</rt></ruby>\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND,
Packit 971217
      "base textannotation"}
Packit 971217
  ,
Packit 971217
};
Packit 971217
Packit 971217
static void
Packit 971217
setup_subparse (void)
Packit 971217
{
Packit 971217
  GstSegment segment;
Packit 971217
  subparse = gst_check_setup_element ("subparse");
Packit 971217
Packit 971217
  mysrcpad = gst_check_setup_src_pad (subparse, &srctemplate);
Packit 971217
  mysinkpad = gst_check_setup_sink_pad (subparse, &sinktemplate);
Packit 971217
Packit 971217
  gst_pad_set_active (mysrcpad, TRUE);
Packit 971217
Packit 971217
  gst_segment_init (&segment, GST_FORMAT_BYTES);
Packit 971217
  gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test"));
Packit 971217
  gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
Packit 971217
  gst_pad_set_active (mysinkpad, TRUE);
Packit 971217
Packit 971217
  fail_unless_equals_int (gst_element_set_state (subparse, GST_STATE_PLAYING),
Packit 971217
      GST_STATE_CHANGE_SUCCESS);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
teardown_subparse (void)
Packit 971217
{
Packit 971217
  GST_DEBUG ("cleaning up");
Packit 971217
Packit 971217
  g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
Packit 971217
  g_list_free (buffers);
Packit 971217
  buffers = NULL;
Packit 971217
Packit 971217
  gst_pad_set_active (mysrcpad, FALSE);
Packit 971217
  gst_pad_set_active (mysinkpad, FALSE);
Packit 971217
  gst_check_teardown_sink_pad (subparse);
Packit 971217
  gst_check_teardown_src_pad (subparse);
Packit 971217
  gst_check_teardown_element (subparse);
Packit 971217
  subparse = NULL;
Packit 971217
  mysrcpad = NULL;
Packit 971217
  mysinkpad = NULL;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
test_srt_do_test (SubParseInputChunk * input, guint start_idx, guint num)
Packit 971217
{
Packit 971217
  guint n;
Packit 971217
  GstCaps *outcaps;
Packit 971217
Packit 971217
  GST_LOG ("srt test: start_idx = %u, num = %u", start_idx, num);
Packit 971217
Packit 971217
  setup_subparse ();
Packit 971217
Packit 971217
  for (n = start_idx; n < start_idx + num; ++n) {
Packit 971217
    GstBuffer *buf;
Packit 971217
Packit 971217
    buf = buffer_from_static_string (input[n].in);
Packit 971217
    fail_unless_equals_int (gst_pad_push (mysrcpad, buf), GST_FLOW_OK);
Packit 971217
  }
Packit 971217
Packit 971217
  gst_pad_push_event (mysrcpad, gst_event_new_eos ());
Packit 971217
Packit 971217
  fail_unless_equals_int (g_list_length (buffers), num);
Packit 971217
Packit 971217
  outcaps = gst_pad_get_current_caps (mysinkpad);
Packit 971217
Packit 971217
  for (n = start_idx; n < start_idx + num; ++n) {
Packit 971217
    const GstStructure *buffer_caps_struct;
Packit 971217
    GstBuffer *buf;
Packit 971217
    GstMapInfo map;
Packit 971217
Packit 971217
    buf = g_list_nth_data (buffers, n - start_idx);
Packit 971217
    fail_unless (buf != NULL);
Packit 971217
    fail_unless (GST_BUFFER_TIMESTAMP_IS_VALID (buf), NULL);
Packit 971217
    fail_unless (GST_BUFFER_DURATION_IS_VALID (buf), NULL);
Packit 971217
    fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buf), input[n].from_ts);
Packit 971217
    fail_unless_equals_uint64 (GST_BUFFER_DURATION (buf),
Packit 971217
        input[n].to_ts - input[n].from_ts);
Packit 971217
Packit 971217
    gst_buffer_map (buf, &map, GST_MAP_READ);
Packit 971217
    /* can be NULL */
Packit 971217
    if (map.data != NULL) {
Packit 971217
      /* shouldn't have trailing newline characters */
Packit 971217
      fail_if (map.size > 0 && map.data[map.size - 1] == '\n');
Packit 971217
      /* shouldn't include NUL-terminator in data size */
Packit 971217
      fail_if (map.size > 0 && map.data[map.size - 1] == '\0');
Packit 971217
      /* but should still have a  NUL-terminator behind the declared data */
Packit 971217
      fail_unless_equals_int (map.data[map.size], '\0');
Packit 971217
      /* make sure out string matches expected string */
Packit 971217
      fail_unless_equals_string ((gchar *) map.data, input[n].out);
Packit 971217
    }
Packit 971217
    gst_buffer_unmap (buf, &map);
Packit 971217
    /* check caps */
Packit 971217
    fail_unless (outcaps != NULL);
Packit 971217
    buffer_caps_struct = gst_caps_get_structure (outcaps, 0);
Packit 971217
    fail_unless (gst_structure_has_name (buffer_caps_struct, "text/x-raw"));
Packit 971217
    fail_unless_equals_string (gst_structure_get_string (buffer_caps_struct,
Packit 971217
            "format"), "pango-markup");
Packit 971217
  }
Packit 971217
  gst_caps_unref (outcaps);
Packit 971217
Packit 971217
  teardown_subparse ();
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
test_vtt_do_test (SubParseInputChunk * input, guint start_idx, guint num)
Packit 971217
{
Packit 971217
  guint n;
Packit 971217
Packit 971217
  GST_LOG ("vtt test: start_idx = %u, num = %u", start_idx, num);
Packit 971217
Packit 971217
  setup_subparse ();
Packit 971217
Packit 971217
  for (n = start_idx; n < start_idx + num; ++n) {
Packit 971217
    GstBuffer *buf;
Packit 971217
    gchar *data = g_strconcat ("WEBVTT FILE\n", input[n].in, NULL);
Packit 971217
    buf = buffer_from_static_string (data);
Packit 971217
    fail_unless_equals_int (gst_pad_push (mysrcpad, buf), GST_FLOW_OK);
Packit 971217
    g_free (data);
Packit 971217
  }
Packit 971217
Packit 971217
  gst_pad_push_event (mysrcpad, gst_event_new_eos ());
Packit 971217
Packit 971217
  fail_unless_equals_int (g_list_length (buffers), num);
Packit 971217
Packit 971217
  for (n = start_idx; n < start_idx + num; ++n) {
Packit 971217
    const GstStructure *buffer_caps_struct;
Packit 971217
    GstMapInfo map;
Packit 971217
    GstBuffer *buf;
Packit 971217
    GstCaps *outcaps;
Packit 971217
    gchar *out;
Packit 971217
    guint out_size;
Packit 971217
Packit 971217
    buf = g_list_nth_data (buffers, n - start_idx);
Packit 971217
    fail_unless (buf != NULL);
Packit 971217
    fail_unless (GST_BUFFER_TIMESTAMP_IS_VALID (buf), NULL);
Packit 971217
    fail_unless (GST_BUFFER_DURATION_IS_VALID (buf), NULL);
Packit 971217
    fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buf), input[n].from_ts);
Packit 971217
    fail_unless_equals_uint64 (GST_BUFFER_DURATION (buf),
Packit 971217
        input[n].to_ts - input[n].from_ts);
Packit 971217
    fail_unless (gst_buffer_map (buf, &map, GST_MAP_READ));
Packit 971217
    out = (gchar *) map.data;
Packit 971217
Packit 971217
    out_size = gst_buffer_get_size (buf);
Packit 971217
    /* shouldn't have trailing newline characters */
Packit 971217
    fail_if (out_size > 0 && out[out_size - 1] == '\n');
Packit 971217
    /* shouldn't include NUL-terminator in data size */
Packit 971217
    fail_if (out_size > 0 && out[out_size - 1] == '\0');
Packit 971217
    /* but should still have a  NUL-terminator behind the declared data */
Packit 971217
    fail_unless_equals_int (out[out_size], '\0');
Packit 971217
    /* make sure out string matches expected string */
Packit 971217
    fail_unless_equals_string (out, input[n].out);
Packit 971217
Packit 971217
    gst_buffer_unmap (buf, &map);
Packit 971217
Packit 971217
    /* check caps */
Packit 971217
    outcaps = gst_pad_get_current_caps (mysinkpad);
Packit 971217
    fail_unless (outcaps != NULL);
Packit 971217
    buffer_caps_struct = gst_caps_get_structure (outcaps, 0);
Packit 971217
    fail_unless_equals_string (gst_structure_get_name (buffer_caps_struct),
Packit 971217
        "text/x-raw");
Packit 971217
    fail_unless_equals_string (gst_structure_get_string (buffer_caps_struct,
Packit 971217
            "format"), "pango-markup");
Packit 971217
    gst_caps_unref (outcaps);
Packit 971217
  }
Packit 971217
Packit 971217
  teardown_subparse ();
Packit 971217
}
Packit 971217
Packit 971217
GST_START_TEST (test_srt)
Packit 971217
{
Packit 971217
  test_srt_do_test (srt_input, 0, G_N_ELEMENTS (srt_input));
Packit 971217
Packit 971217
  /* make sure everything works fine if we don't start with chunk 1 */
Packit 971217
  test_srt_do_test (srt_input, 1, G_N_ELEMENTS (srt_input) - 1);
Packit 971217
  test_srt_do_test (srt_input, 2, G_N_ELEMENTS (srt_input) - 2);
Packit 971217
  test_srt_do_test (srt_input, 3, G_N_ELEMENTS (srt_input) - 3);
Packit 971217
  test_srt_do_test (srt_input, 4, G_N_ELEMENTS (srt_input) - 4);
Packit 971217
Packit 971217
  /* try with empty input, immediate EOS */
Packit 971217
  test_srt_do_test (srt_input, 5, G_N_ELEMENTS (srt_input) - 5);
Packit 971217
Packit 971217
  /* try with chunk number 0 (which is not exactly according to spec) */
Packit 971217
  test_srt_do_test (srt_input0, 0, G_N_ELEMENTS (srt_input0));
Packit 971217
Packit 971217
  /* try with spaces instead of doubled zeroes (which is not exactly according to spec) */
Packit 971217
  test_srt_do_test (srt_input1, 0, G_N_ELEMENTS (srt_input1));
Packit 971217
Packit 971217
  /* try with UTF-8 BOM at the start */
Packit 971217
  test_srt_do_test (srt_input2, 0, G_N_ELEMENTS (srt_input2));
Packit 971217
Packit 971217
  /* try with fewer than three post-comma digits, and some extra spaces */
Packit 971217
  test_srt_do_test (srt_input3, 0, G_N_ELEMENTS (srt_input3));
Packit 971217
Packit 971217
  /* try with some WebVTT chunks */
Packit 971217
  test_srt_do_test (srt_input4, 0, G_N_ELEMENTS (srt_input4));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
Packit 971217
GST_START_TEST (test_webvtt)
Packit 971217
{
Packit 971217
  SubParseInputChunk webvtt_input[] = {
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 D:vertical T:50%\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 D:vertical   T:50%\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 D:vertical\tT:50%\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 D:vertical-lr\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 L:-123\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 L:123\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 L:12%\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 L:12% S:35% A:start\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 A:middle\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000 A:end\nOne\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\nOne & Two\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One & Two"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\nOne < Two\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "One < Two"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\n<v Spoke>Live long and prosper\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "<v Spoke>Live long and prosper</v>"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\n<v The Joker>HAHAHA\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "<v The Joker>HAHAHA</v>"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\n<c.someclass>some text\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "<c.someclass>some text</c>"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\n<b.loud>some text\n\n",
Packit 971217
        1 * GST_SECOND, 2 * GST_SECOND, "<b.loud>some text"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:02.000\n<ruby>base text<rt>annotation</rt></ruby>\n\n",
Packit 971217
          1 * GST_SECOND, 2 * GST_SECOND,
Packit 971217
        "<ruby>base text<rt>annotation</rt></ruby>"}
Packit 971217
    ,
Packit 971217
    {
Packit 971217
          "1\n00:00:01.000 --> 00:00:03.000\nOne... <00:00:00,200>Two... <00:00:00,500>Three...\n\n",
Packit 971217
          1 * GST_SECOND, 3 * GST_SECOND,
Packit 971217
        "One... <00:00:00,200>Two... <00:00:00,500>Three..."}
Packit 971217
    ,
Packit 971217
    {"1\n00:00:02.000 --> 00:00:03.000\nHello\nWorld\n\n",
Packit 971217
        2 * GST_SECOND, 3 * GST_SECOND, "Hello\nWorld"}
Packit 971217
    ,
Packit 971217
  };
Packit 971217
  test_vtt_do_test (webvtt_input, 0, G_N_ELEMENTS (webvtt_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
static void
Packit 971217
do_test (SubParseInputChunk * input, guint num, const gchar * format)
Packit 971217
{
Packit 971217
  guint n;
Packit 971217
  GstCaps *outcaps;
Packit 971217
Packit 971217
  setup_subparse ();
Packit 971217
Packit 971217
  for (n = 0; n < num; ++n) {
Packit 971217
    GstBuffer *buf;
Packit 971217
Packit 971217
    buf = buffer_from_static_string (input[n].in);
Packit 971217
    fail_unless_equals_int (gst_pad_push (mysrcpad, buf), GST_FLOW_OK);
Packit 971217
  }
Packit 971217
Packit 971217
  gst_pad_push_event (mysrcpad, gst_event_new_eos ());
Packit 971217
Packit 971217
  fail_unless_equals_int (g_list_length (buffers), num);
Packit 971217
Packit 971217
  outcaps = gst_pad_get_current_caps (mysinkpad);
Packit 971217
Packit 971217
  for (n = 0; n < num; ++n) {
Packit 971217
    const GstStructure *buffer_caps_struct;
Packit 971217
    GstBuffer *buf;
Packit 971217
    GstMapInfo map;
Packit 971217
Packit 971217
    buf = g_list_nth_data (buffers, n);
Packit 971217
    fail_unless (buf != NULL);
Packit 971217
Packit 971217
    /* check timestamp */
Packit 971217
    fail_unless (GST_BUFFER_TIMESTAMP_IS_VALID (buf), NULL);
Packit 971217
    fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buf), input[n].from_ts);
Packit 971217
Packit 971217
    /* might not be able to put a duration on the last buffer */
Packit 971217
    if (input[n].to_ts != GST_CLOCK_TIME_NONE) {
Packit 971217
      /* check duration */
Packit 971217
      fail_unless (GST_BUFFER_DURATION_IS_VALID (buf), NULL);
Packit 971217
      fail_unless_equals_uint64 (GST_BUFFER_DURATION (buf),
Packit 971217
          input[n].to_ts - input[n].from_ts);
Packit 971217
    }
Packit 971217
Packit 971217
    gst_buffer_map (buf, &map, GST_MAP_READ);
Packit 971217
    /* can be NULL */
Packit 971217
    if (map.data != NULL) {
Packit 971217
      /* shouldn't have trailing newline characters */
Packit 971217
      fail_if (map.size > 0 && map.data[map.size - 1] == '\n');
Packit 971217
      /* shouldn't include NUL-terminator in data size */
Packit 971217
      fail_if (map.size > 0 && map.data[map.size - 1] == '\0');
Packit 971217
      /* but should still have a  NUL-terminator behind the declared data */
Packit 971217
      fail_unless_equals_int (map.data[map.size], '\0');
Packit 971217
      /* make sure out string matches expected string */
Packit 971217
      fail_unless_equals_string ((gchar *) map.data, input[n].out);
Packit 971217
    }
Packit 971217
    gst_buffer_unmap (buf, &map);
Packit 971217
    /* check caps */
Packit 971217
    fail_unless (outcaps != NULL);
Packit 971217
    buffer_caps_struct = gst_caps_get_structure (outcaps, 0);
Packit 971217
    fail_unless (gst_structure_has_name (buffer_caps_struct, "text/x-raw"));
Packit 971217
    fail_unless_equals_string (gst_structure_get_string (buffer_caps_struct,
Packit 971217
            "format"), format);
Packit 971217
  }
Packit 971217
  gst_caps_unref (outcaps);
Packit 971217
Packit 971217
  teardown_subparse ();
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
test_tmplayer_do_test (SubParseInputChunk * input, guint num)
Packit 971217
{
Packit 971217
  do_test (input, num, "utf8");
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
test_microdvd_do_test (SubParseInputChunk * input, guint num)
Packit 971217
{
Packit 971217
  do_test (input, num, "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_multiline)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_multiline_input[] = {
Packit 971217
    {
Packit 971217
          "00:00:10,1=This is the Earth at a time\n"
Packit 971217
          "00:00:10,2=when the dinosaurs roamed...\n" "00:00:13,1=\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "00:00:14,1=a lush and fertile planet.\n" "00:00:16,1=\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_multiline_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_multiline_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_multiline_with_bogus_lines)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_multiline_b_input[] = {
Packit 971217
    {
Packit 971217
          "00:00:10,1=This is the Earth at a time\n"
Packit 971217
          "Yooboo wabahablablahuguug bogus line hello test 1-2-3-4\n"
Packit 971217
          "00:00:10,2=when the dinosaurs roamed...\n" "00:00:13,1=\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "00:00:14,1=a lush and fertile planet.\n" "00:00:16,1=\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_multiline_b_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_multiline_b_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_style1)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_style1_input[] = {
Packit 971217
    {
Packit 971217
          "00:00:10:This is the Earth at a time|when the dinosaurs roamed...\n"
Packit 971217
          "00:00:13:\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "00:00:14:a lush and fertile planet.\n" "00:00:16:\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_style1_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_style1_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_style2)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_style2_input[] = {
Packit 971217
    {
Packit 971217
          "00:00:10=This is the Earth at a time|when the dinosaurs roamed...\n"
Packit 971217
          "00:00:13=\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "00:00:14=a lush and fertile planet.\n" "00:00:16=\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_style2_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_style2_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_style3)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_style3_input[] = {
Packit 971217
    {
Packit 971217
          "0:00:10:This is the Earth at a time|when the dinosaurs roamed...\n"
Packit 971217
          "0:00:13:\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "0:00:14:a lush and fertile planet.\n" "0:00:16:\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_style3_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_style3_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
/* also tests the max_duration stuff (see second-last chunk which is supposed
Packit 971217
 * to be clipped to 5s duration) */
Packit 971217
GST_START_TEST (test_tmplayer_style3b)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_style3b_input[] = {
Packit 971217
    {
Packit 971217
          "0:00:10:This is the Earth at a time|when the dinosaurs roamed...\n",
Packit 971217
          10 * GST_SECOND, 14 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "0:00:14:a lush and fertile planet.\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}, {
Packit 971217
          "0:00:16:And they liked it a lot.\n",
Packit 971217
        16 * GST_SECOND, (16 + 5) * GST_SECOND, "And they liked it a lot."}, {
Packit 971217
          "0:00:30:Last line.",
Packit 971217
        30 * GST_SECOND, GST_CLOCK_TIME_NONE, "Last line."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_style3b_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_style3b_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_style4)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_style4_input[] = {
Packit 971217
    {
Packit 971217
          "0:00:10=This is the Earth at a time|when the dinosaurs roamed...\n"
Packit 971217
          "0:00:13=\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "0:00:14=a lush and fertile planet.\n" "0:00:16=\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_style4_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_style4_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_tmplayer_style4_with_bogus_lines)
Packit 971217
{
Packit 971217
  static SubParseInputChunk tmplayer_style4b_input[] = {
Packit 971217
    {
Packit 971217
          "0:00:10=This is the Earth at a time|when the dinosaurs roamed...\n"
Packit 971217
          "# This is a bogus line with a comment and should just be skipped\n"
Packit 971217
          "0:00:13=\n",
Packit 971217
          10 * GST_SECOND, 13 * GST_SECOND,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed..."}, {
Packit 971217
          "0:00:14=a lush and fertile planet.\n"
Packit 971217
          "                                                            \n"
Packit 971217
          "0:00:16=\n",
Packit 971217
          14 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "a lush and fertile planet."}
Packit 971217
  };
Packit 971217
Packit 971217
  test_tmplayer_do_test (tmplayer_style4b_input,
Packit 971217
      G_N_ELEMENTS (tmplayer_style4b_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_microdvd_with_italics)
Packit 971217
{
Packit 971217
  static SubParseInputChunk microdvd_italics[] = {
Packit 971217
    {
Packit 971217
          "{1}{1}25.000 movie info: XVID  608x256 25.0fps 699.0 MB|"
Packit 971217
          "/SubEdit b.4060(http://subedit.com.pl)/\n"
Packit 971217
          "{100}{200}/italics/|not italics\n",
Packit 971217
          4 * GST_SECOND, 8 * GST_SECOND,
Packit 971217
        "italics\n" "not italics"}
Packit 971217
  };
Packit 971217
Packit 971217
  test_microdvd_do_test (microdvd_italics, G_N_ELEMENTS (microdvd_italics));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_microdvd_with_fps)
Packit 971217
{
Packit 971217
  static SubParseInputChunk microdvd_input[] = {
Packit 971217
    {
Packit 971217
          "{1}{1}12.500\n{100}{200}- Hi, Eddie.|- Hiya, Scotty.\n",
Packit 971217
          8 * GST_SECOND, 16 * GST_SECOND,
Packit 971217
        "- Hi, Eddie.\n- Hiya, Scotty."}, {
Packit 971217
          "{1250}{1350}- Cold enough for you?|- Well, I'm only faintly alive. "
Packit 971217
          "It's 25 below\n",
Packit 971217
          100 * GST_SECOND, 108 * GST_SECOND,
Packit 971217
        "- Cold enough for you?\n"
Packit 971217
          "- Well, I'm only faintly alive. It's 25 below"}
Packit 971217
  };
Packit 971217
Packit 971217
  test_microdvd_do_test (microdvd_input, G_N_ELEMENTS (microdvd_input));
Packit 971217
Packit 971217
  /* and the same with ',' instead of '.' as floating point divider */
Packit 971217
  microdvd_input[0].in =
Packit 971217
      "{1}{1}12,500\n{100}{200}- Hi, Eddie.|- Hiya, Scotty.\n";
Packit 971217
  test_microdvd_do_test (microdvd_input, G_N_ELEMENTS (microdvd_input));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_mpl2)
Packit 971217
{
Packit 971217
  SubParseInputChunk mpl2_input[] = {
Packit 971217
    {
Packit 971217
          "[123][456] This is the Earth at a time|when the dinosaurs roamed\n",
Packit 971217
          (123 * GST_SECOND) / 10, (456 * GST_SECOND) / 10,
Packit 971217
        "This is the Earth at a time\nwhen the dinosaurs roamed"}, {
Packit 971217
          "[1234][5678]a lush and fertile planet.\n",
Packit 971217
          (1234 * GST_SECOND) / 10, (5678 * GST_SECOND) / 10,
Packit 971217
        "a lush and fertile planet."}, {
Packit 971217
          "[12345][27890] /Italic|Normal\n",
Packit 971217
          (12345 * GST_SECOND) / 10, (27890 * GST_SECOND) / 10,
Packit 971217
        "Italic\nNormal"}, {
Packit 971217
          "[32345][37890]/Italic|/Italic\n",
Packit 971217
          (32345 * GST_SECOND) / 10, (37890 * GST_SECOND) / 10,
Packit 971217
        "Italic\nItalic"}, {
Packit 971217
          "[42345][47890] Normal|/Italic",
Packit 971217
          (42345 * GST_SECOND) / 10, (47890 * GST_SECOND) / 10,
Packit 971217
        "Normal\nItalic"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (mpl2_input, G_N_ELEMENTS (mpl2_input), "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_subviewer)
Packit 971217
{
Packit 971217
  SubParseInputChunk subviewer_input[] = {
Packit 971217
    {
Packit 971217
          "[INFORMATION]\n"
Packit 971217
          "[TITLE]xxxxxxxxxx\n"
Packit 971217
          "[AUTHOR]xxxxxxxx\n"
Packit 971217
          "[SOURCE]xxxxxxxxxxxxxxxx\n"
Packit 971217
          "[FILEPATH]\n"
Packit 971217
          "[DELAY]0\n"
Packit 971217
          "[COMMENT]\n"
Packit 971217
          "[END INFORMATION]\n"
Packit 971217
          "[SUBTITLE]\n"
Packit 971217
          "[COLF]&HFFFFFF,[STYLE]bd,[SIZE]18,[FONT]Arial\n"
Packit 971217
          "00:00:41.00,00:00:44.40\n"
Packit 971217
          "The Age of Gods was closing.\n"
Packit 971217
          "Eternity had come to an end.\n"
Packit 971217
          "\n", 41 * GST_SECOND, 44 * GST_SECOND + 40 * GST_MSECOND,
Packit 971217
        "The Age of Gods was closing.\nEternity had come to an end."}, {
Packit 971217
          "00:00:55.00,00:00:58.40\n"
Packit 971217
          "The heavens shook as the armies\n"
Packit 971217
          "of Falis, God of Light...\n\n", 55 * GST_SECOND,
Packit 971217
          58 * GST_SECOND + 40 * GST_MSECOND,
Packit 971217
        "The heavens shook as the armies\nof Falis, God of Light..."}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (subviewer_input, G_N_ELEMENTS (subviewer_input), "utf8");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_subviewer2)
Packit 971217
{
Packit 971217
  SubParseInputChunk subviewer2_input[] = {
Packit 971217
    {
Packit 971217
          "[INFORMATION]\n"
Packit 971217
          "[TITLE]xxxxxxxxxx\n"
Packit 971217
          "[AUTHOR]xxxxxxxxxx\n"
Packit 971217
          "[SOURCE]xxxxxxxxxx\n"
Packit 971217
          "[PRG]\n"
Packit 971217
          "[FILEPATH]\n"
Packit 971217
          "[DELAY]0\n"
Packit 971217
          "[CD TRACK]0\n"
Packit 971217
          "[COMMENT]\n"
Packit 971217
          "[END INFORMATION]\n"
Packit 971217
          "[SUBTITLE]\n"
Packit 971217
          "[COLF]&H00FFFF,[STYLE]no,[SIZE]12,[FONT]Courier New\n"
Packit 971217
          "00:00:07.00,00:00:11.91\n"
Packit 971217
          "THERE IS A PLACE ON EARTH WHERE IT[br]IS STILL THE MORNING OF LIFE...\n\n",
Packit 971217
          7 * GST_SECOND, 11 * GST_SECOND + 91 * GST_MSECOND,
Packit 971217
        "THERE IS A PLACE ON EARTH WHERE IT\nIS STILL THE MORNING OF LIFE..."}, {
Packit 971217
          "00:00:12.48,00:00:15.17\n"
Packit 971217
          "AND THE GREAT HERDS RUN FREE.[br]SO WHAT?!\n\n",
Packit 971217
          12 * GST_SECOND + 48 * GST_MSECOND,
Packit 971217
          15 * GST_SECOND + 17 * GST_MSECOND,
Packit 971217
        "AND THE GREAT HERDS RUN FREE.\nSO WHAT?!"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (subviewer2_input, G_N_ELEMENTS (subviewer2_input), "utf8");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_dks)
Packit 971217
{
Packit 971217
  SubParseInputChunk dks_input[] = {
Packit 971217
    {
Packit 971217
          "[00:00:07]THERE IS A PLACE ON EARTH WHERE IT[br]IS STILL THE MORNING OF LIFE...\n[00:00:12]\n",
Packit 971217
          7 * GST_SECOND, 12 * GST_SECOND,
Packit 971217
        "THERE IS A PLACE ON EARTH WHERE IT\nIS STILL THE MORNING OF LIFE..."}, {
Packit 971217
          "[00:00:13]AND THE GREAT HERDS RUN FREE.[br]SO WHAT?!\n[00:00:15]\n",
Packit 971217
          13 * GST_SECOND, 15 * GST_SECOND,
Packit 971217
        "AND THE GREAT HERDS RUN FREE.\nSO WHAT?!"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (dks_input, G_N_ELEMENTS (dks_input), "utf8");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_sami)
Packit 971217
{
Packit 971217
  SubParseInputChunk sami_input[] = {
Packit 971217
    {"<SAMI>\n"
Packit 971217
          "<HEAD>\n"
Packit 971217
          "    <TITLE>Subtitle</TITLE>\n"
Packit 971217
          "    <STYLE TYPE=\"text/css\">\n"
Packit 971217
          "    
Packit 971217
          "        P {margin-left:8pt; margin-right:8pt; margin-bottom:2pt; margin-top:2pt; text-align:center; font-size:12pt; font-weight:normal; color:black;}\n"
Packit 971217
          "        .CC {Name:English; lang:en-AU; SAMIType:CC;}\n"
Packit 971217
          "        #STDPrn {Name:Standard Print;}\n"
Packit 971217
          "        #LargePrn {Name:Large Print; font-size:24pt;}\n"
Packit 971217
          "        #SmallPrn {Name:Small Print; font-size:16pt;}\n"
Packit 971217
          "    -->\n"
Packit 971217
          "    </Style>\n"
Packit 971217
          "</HEAD>\n"
Packit 971217
          "<BODY>\n"
Packit 971217
          "    <SYNC Start=1000>\n"
Packit 971217
          "        

\n"

Packit 971217
          "            This is a comment.
\n"
Packit 971217
          "            This is a second comment.\n",
Packit 971217
          1000 * GST_MSECOND, 2000 * GST_MSECOND,
Packit 971217
        "This is a comment.\nThis is a second comment."},
Packit 971217
    {"    <SYNC Start=2000>\n"
Packit 971217
          "        

\n"

Packit 971217
          "            This is a third comment.
\n"
Packit 971217
          "            This is a fourth comment.\n" "</BODY>\n" "</SAMI>\n",
Packit 971217
          2000 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "This is a third comment.\nThis is a fourth comment."}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (sami_input, G_N_ELEMENTS (sami_input), "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_sami_xml_entities)
Packit 971217
{
Packit 971217
  SubParseInputChunk sami_input[] = {
Packit 971217
    {"<SAMI>\n"
Packit 971217
          "<BODY>\n"
Packit 971217
          "    <SYNC Start=1000>\n"
Packit 971217
          "        

\n" " <Hello> &\n",

Packit 971217
          1000 * GST_MSECOND, 2000 * GST_MSECOND,
Packit 971217
        "<Hello> &"},
Packit 971217
    {"    <SYNC Start=2000>\n"
Packit 971217
          "        

\n"

Packit 971217
          "            "World'\n" "</BODY>\n" "</SAMI>\n",
Packit 971217
          2000 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        ""World'"}
Packit 971217
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (sami_input, G_N_ELEMENTS (sami_input), "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_sami_html_entities)
Packit 971217
{
Packit 971217
  SubParseInputChunk sami_input[] = {
Packit 971217
    {"<SAMI>\n"
Packit 971217
          "<BODY>\n"
Packit 971217
          "    <SYNC Start=1000>\n"
Packit 971217
          "        

\n" "   ± ´\n",

Packit 971217
          1000 * GST_MSECOND, 2000 * GST_MSECOND,
Packit 971217
        "\xc2\xa0 \xc2\xb1 \xc2\xb4"},
Packit 971217
    {"    <SYNC Start=2000>\n"
Packit 971217
          "        

\n" " Α ω\n",

Packit 971217
          2000 * GST_MSECOND, 3000 * GST_MSECOND,
Packit 971217
        "\xce\x91 \xcf\x89"},
Packit 971217
    {"    <SYNC Start=3000>\n"
Packit 971217
          "        

\n"

Packit 971217
          "              ± ´\n" "</BODY>\n" "</SAMI>\n",
Packit 971217
          3000 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "\xc2\xa0 \xc2\xb1 \xc2\xb4"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (sami_input, G_N_ELEMENTS (sami_input), "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_sami_bad_entities)
Packit 971217
{
Packit 971217
  SubParseInputChunk sami_input[] = {
Packit 971217
    {"<SAMI>\n"
Packit 971217
          "<BODY>\n"
Packit 971217
          "    <SYNC Start=1000>\n"
Packit 971217
          "        

\n" " &nbsp &\n",

Packit 971217
          1000 * GST_MSECOND, 2000 * GST_MSECOND,
Packit 971217
        "\xc2\xa0 &"},
Packit 971217
    {"    <SYNC Start=2000>\n"
Packit 971217
          "        

\n"

Packit 971217
          "            &#xa0 &#177 ´\n" "</BODY>\n" "</SAMI>\n",
Packit 971217
          2000 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "\xc2\xa0 \xc2\xb1 \xc2\xb4"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (sami_input, G_N_ELEMENTS (sami_input), "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_sami_comment)
Packit 971217
{
Packit 971217
  SubParseInputChunk sami_input[] = {
Packit 971217
    {"<SAMI>\n"
Packit 971217
          "
Packit 971217
          "=======\n"
Packit 971217
          "foo bar\n"
Packit 971217
          "=======\n"
Packit 971217
          "-->\n"
Packit 971217
          "<BODY>\n"
Packit 971217
          "    <SYNC Start=1000>\n"
Packit 971217
          "        

\n" " &nbsp &\n",

Packit 971217
          1000 * GST_MSECOND, 2000 * GST_MSECOND,
Packit 971217
        "\xc2\xa0 &"},
Packit 971217
    {"    <SYNC Start=2000>\n"
Packit 971217
          "        

\n"

Packit 971217
          "            &#xa0 &#177 ´\n" "</BODY>\n" "</SAMI>\n",
Packit 971217
          2000 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "\xc2\xa0 \xc2\xb1 \xc2\xb4"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (sami_input, G_N_ELEMENTS (sami_input), "pango-markup");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_lrc)
Packit 971217
{
Packit 971217
  SubParseInputChunk lrc_input[] = {
Packit 971217
    {"[ar:123]\n" "[ti:Title]\n" "[al:Album]\n" "[00:02.23]Line 1\n",
Packit 971217
          2230 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "Line 1"},
Packit 971217
    {"[00:05.10]Line 2\n",
Packit 971217
          5100 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "Line 2"},
Packit 971217
    {"[00:06.123]Line 3\n",
Packit 971217
          6123 * GST_MSECOND, GST_CLOCK_TIME_NONE,
Packit 971217
        "Line 3"}
Packit 971217
  };
Packit 971217
Packit 971217
  do_test (lrc_input, G_N_ELEMENTS (lrc_input), "utf8");
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
/* TODO:
Packit 971217
 *  - add/modify tests so that lines aren't dogfed to the parsers in complete
Packit 971217
 *    lines or sets of complete lines, but rather in random chunks
Packit 971217
 */
Packit 971217
Packit 971217
static Suite *
Packit 971217
subparse_suite (void)
Packit 971217
{
Packit 971217
  Suite *s = suite_create ("subparse");
Packit 971217
  TCase *tc_chain = tcase_create ("general");
Packit 971217
Packit 971217
  suite_add_tcase (s, tc_chain);
Packit 971217
Packit 971217
  tcase_add_test (tc_chain, test_srt);
Packit 971217
  tcase_add_test (tc_chain, test_webvtt);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_multiline);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_multiline_with_bogus_lines);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_style1);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_style2);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_style3);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_style3b);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_style4);
Packit 971217
  tcase_add_test (tc_chain, test_tmplayer_style4_with_bogus_lines);
Packit 971217
  tcase_add_test (tc_chain, test_microdvd_with_fps);
Packit 971217
  tcase_add_test (tc_chain, test_microdvd_with_italics);
Packit 971217
  tcase_add_test (tc_chain, test_mpl2);
Packit 971217
  tcase_add_test (tc_chain, test_subviewer);
Packit 971217
  tcase_add_test (tc_chain, test_subviewer2);
Packit 971217
  tcase_add_test (tc_chain, test_dks);
Packit 971217
  tcase_add_test (tc_chain, test_sami);
Packit 971217
  tcase_add_test (tc_chain, test_sami_xml_entities);
Packit 971217
  tcase_add_test (tc_chain, test_sami_html_entities);
Packit 971217
  tcase_add_test (tc_chain, test_sami_bad_entities);
Packit 971217
  tcase_add_test (tc_chain, test_sami_comment);
Packit 971217
  tcase_add_test (tc_chain, test_lrc);
Packit 971217
  return s;
Packit 971217
}
Packit 971217
Packit 971217
GST_CHECK_MAIN (subparse);