Blame tests/check/elements/avisubtitle.c

Packit 1f69a5
/* GStreamer
Packit 1f69a5
 *
Packit 1f69a5
 * unit test for avisubtitle
Packit 1f69a5
 *
Packit 1f69a5
 * Copyright (C) <2007> Thijs Vermeir <thijsvermeir@gmail.com>
Packit 1f69a5
 *
Packit 1f69a5
 * This library is free software; you can redistribute it and/or
Packit 1f69a5
 * modify it under the terms of the GNU Library General Public
Packit 1f69a5
 * License as published by the Free Software Foundation; either
Packit 1f69a5
 * version 2 of the License, or (at your option) any later version.
Packit 1f69a5
 *
Packit 1f69a5
 * This library is distributed in the hope that it will be useful,
Packit 1f69a5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1f69a5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1f69a5
 * Library General Public License for more details.
Packit 1f69a5
 *
Packit 1f69a5
 * You should have received a copy of the GNU Library General Public
Packit 1f69a5
 * License along with this library; if not, write to the
Packit 1f69a5
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 1f69a5
 * Boston, MA 02110-1301, USA.
Packit 1f69a5
 */
Packit 1f69a5
/* Element-Checklist-Version: 5 */
Packit 1f69a5
Packit 1f69a5
#include <unistd.h>
Packit 1f69a5
Packit 1f69a5
#include <gst/gst.h>
Packit 1f69a5
#include <gst/check/gstcheck.h>
Packit 1f69a5
Packit 1f69a5
GstPad *mysinkpad;
Packit 1f69a5
GstPad *mysrcpad;
Packit 1f69a5
Packit 1f69a5
guint8 avisub_utf_8_with_bom[] = {
Packit 1f69a5
  0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10,
Packit 1f69a5
  0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67,
Packit 1f69a5
  0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68,
Packit 1f69a5
  0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00,
Packit 1f69a5
  0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30,
Packit 1f69a5
  0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c,
Packit 1f69a5
  0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20,
Packit 1f69a5
  0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32,
Packit 1f69a5
  0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62,
Packit 1f69a5
  0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38,
Packit 1f69a5
  0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c,
Packit 1f69a5
  0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42,
Packit 1f69a5
  0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a,
Packit 1f69a5
  0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a,
Packit 1f69a5
  0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30,
Packit 1f69a5
  0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30,
Packit 1f69a5
  0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30,
Packit 1f69a5
  0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65,
Packit 1f69a5
  0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f,
Packit 1f69a5
  0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d,
Packit 1f69a5
  0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3,
Packit 1f69a5
  0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a
Packit 1f69a5
};
Packit 1f69a5
Packit 1f69a5
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
Packit 1f69a5
    GST_PAD_SINK,
Packit 1f69a5
    GST_PAD_ALWAYS,
Packit 1f69a5
    GST_STATIC_CAPS ("application/x-subtitle")
Packit 1f69a5
    );
Packit 1f69a5
Packit 1f69a5
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
Packit 1f69a5
    GST_PAD_SRC,
Packit 1f69a5
    GST_PAD_ALWAYS,
Packit 1f69a5
    GST_STATIC_CAPS ("application/x-subtitle-avi")
Packit 1f69a5
    );
Packit 1f69a5
Packit 1f69a5
static GstElement *
Packit 1f69a5
setup_avisubtitle (void)
Packit 1f69a5
{
Packit 1f69a5
  GstElement *avisubtitle;
Packit 1f69a5
  GstCaps *srccaps;
Packit 1f69a5
Packit 1f69a5
  GST_DEBUG ("setup_avisubtitle");
Packit 1f69a5
  avisubtitle = gst_check_setup_element ("avisubtitle");
Packit 1f69a5
  mysinkpad = gst_check_setup_sink_pad (avisubtitle, &sink_template);
Packit 1f69a5
  mysrcpad = gst_check_setup_src_pad (avisubtitle, &src_template);
Packit 1f69a5
  gst_pad_set_active (mysinkpad, TRUE);
Packit 1f69a5
  gst_pad_set_active (mysrcpad, TRUE);
Packit 1f69a5
  srccaps = gst_caps_new_empty_simple ("application/x-subtitle-avi");
Packit 1f69a5
  gst_check_setup_events (mysrcpad, avisubtitle, srccaps, GST_FORMAT_TIME);
Packit 1f69a5
  gst_caps_unref (srccaps);
Packit 1f69a5
  return avisubtitle;
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
static void
Packit 1f69a5
cleanup_avisubtitle (GstElement * avisubtitle)
Packit 1f69a5
{
Packit 1f69a5
  gst_pad_set_active (mysinkpad, FALSE);
Packit 1f69a5
  gst_pad_set_active (mysrcpad, FALSE);
Packit 1f69a5
  gst_check_teardown_sink_pad (avisubtitle);
Packit 1f69a5
  gst_check_teardown_src_pad (avisubtitle);
Packit 1f69a5
  gst_check_teardown_element (avisubtitle);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
static void
Packit 1f69a5
check_wrong_buffer (guint8 * data, guint length)
Packit 1f69a5
{
Packit 1f69a5
  GstBuffer *buffer = gst_buffer_new_allocate (NULL, length, 0);
Packit 1f69a5
  GstElement *avisubtitle = setup_avisubtitle ();
Packit 1f69a5
Packit 1f69a5
  gst_buffer_fill (buffer, 0, data, length);
Packit 1f69a5
  fail_unless (gst_element_set_state (avisubtitle,
Packit 1f69a5
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
Packit 1f69a5
      "could not set to playing");
Packit 1f69a5
  gst_buffer_ref (buffer);
Packit 1f69a5
  ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 2);
Packit 1f69a5
  /* push the broken buffer */
Packit 1f69a5
  fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_ERROR,
Packit 1f69a5
      "accepted a broken buffer");
Packit 1f69a5
  /* check if we have unreffed this buffer on failure */
Packit 1f69a5
  ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1);
Packit 1f69a5
  gst_buffer_unref (buffer);
Packit 1f69a5
  fail_unless (gst_element_set_state (avisubtitle,
Packit 1f69a5
          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
Packit 1f69a5
  cleanup_avisubtitle (avisubtitle);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
static void
Packit 1f69a5
check_correct_buffer (guint8 * src_data, guint src_size, guint8 * dst_data,
Packit 1f69a5
    guint dst_size)
Packit 1f69a5
{
Packit 1f69a5
  GstBuffer *buffer = gst_buffer_new_allocate (NULL, src_size, 0);
Packit 1f69a5
  GstBuffer *newBuffer;
Packit 1f69a5
  GstElement *avisubtitle = setup_avisubtitle ();
Packit 1f69a5
  GstEvent *event;
Packit 1f69a5
Packit 1f69a5
  fail_unless (g_list_length (buffers) == 0, "Buffers list needs to be empty");
Packit 1f69a5
  gst_buffer_fill (buffer, 0, src_data, src_size);
Packit 1f69a5
  fail_unless (gst_element_set_state (avisubtitle,
Packit 1f69a5
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
Packit 1f69a5
      "could not set to playing");
Packit 1f69a5
  ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1);
Packit 1f69a5
  event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
Packit 1f69a5
      GST_SEEK_TYPE_SET, 2 * GST_SECOND, GST_SEEK_TYPE_SET, 5 * GST_SECOND);
Packit 1f69a5
  fail_unless (gst_element_send_event (avisubtitle, event) == FALSE,
Packit 1f69a5
      "Seeking is not possible when there is no buffer yet");
Packit 1f69a5
  fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK,
Packit 1f69a5
      "not accepted a correct buffer");
Packit 1f69a5
  /* we gave away our reference to the buffer, don't assume anything */
Packit 1f69a5
  buffer = NULL;
Packit 1f69a5
  /* a new buffer is created in the list */
Packit 1f69a5
  fail_unless (g_list_length (buffers) == 1,
Packit 1f69a5
      "No new buffer in the buffers list");
Packit 1f69a5
  event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
Packit 1f69a5
      GST_SEEK_TYPE_SET, 2 * GST_SECOND, GST_SEEK_TYPE_SET, 5 * GST_SECOND);
Packit 1f69a5
  fail_unless (gst_element_send_event (avisubtitle, event) == TRUE,
Packit 1f69a5
      "seeking should be working now");
Packit 1f69a5
  fail_unless (g_list_length (buffers) == 2,
Packit 1f69a5
      "After seeking we need another buffer in the buffers");
Packit 1f69a5
  newBuffer = GST_BUFFER (buffers->data);
Packit 1f69a5
  buffers = g_list_remove (buffers, newBuffer);
Packit 1f69a5
  fail_unless (g_list_length (buffers) == 1, "Buffers list needs to be empty");
Packit 1f69a5
  fail_unless (gst_buffer_get_size (newBuffer) == dst_size,
Packit 1f69a5
      "size of the new buffer is wrong ( %d != %d)",
Packit 1f69a5
      gst_buffer_get_size (newBuffer), dst_size);
Packit 1f69a5
  fail_unless (gst_buffer_memcmp (newBuffer, 0, dst_data, dst_size) == 0,
Packit 1f69a5
      "data of the buffer is not correct");
Packit 1f69a5
  gst_buffer_unref (newBuffer);
Packit 1f69a5
  /* free the buffer from seeking */
Packit 1f69a5
  gst_buffer_unref (GST_BUFFER (buffers->data));
Packit 1f69a5
  buffers = g_list_remove (buffers, buffers->data);
Packit 1f69a5
  fail_unless (gst_element_set_state (avisubtitle,
Packit 1f69a5
          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
Packit 1f69a5
  cleanup_avisubtitle (avisubtitle);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
GST_START_TEST (test_avisubtitle_negative)
Packit 1f69a5
{
Packit 1f69a5
  guint8 wrong_magic[] =
Packit 1f69a5
      { 0x47, 0x41, 0x41, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1f69a5
    0x00, 0x00
Packit 1f69a5
  };
Packit 1f69a5
  guint8 wrong_fixed_word_2[] = {
Packit 1f69a5
    0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x01, 0x10,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67,
Packit 1f69a5
    0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68
Packit 1f69a5
  };
Packit 1f69a5
  guint8 wrong_length_after_name[] = {
Packit 1f69a5
    0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67,
Packit 1f69a5
    0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68
Packit 1f69a5
  };
Packit 1f69a5
  guint8 wrong_fixed_word_4[] = {
Packit 1f69a5
    0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67,
Packit 1f69a5
    0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x04, 0x01, 0x8e, 0x00, 0x00,
Packit 1f69a5
    0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30
Packit 1f69a5
  };
Packit 1f69a5
  guint8 wrong_total_length[] = {
Packit 1f69a5
    0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67,
Packit 1f69a5
    0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00,
Packit 1f69a5
    0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30
Packit 1f69a5
  };
Packit 1f69a5
  /* size of the buffer must be larger than 11 */
Packit 1f69a5
  check_wrong_buffer (avisub_utf_8_with_bom, 11);
Packit 1f69a5
  /* buffer must start with 'GAB2\0' */
Packit 1f69a5
  check_wrong_buffer (wrong_magic, 14);
Packit 1f69a5
  /* next word must be 2 */
Packit 1f69a5
  check_wrong_buffer (wrong_fixed_word_2, 24);
Packit 1f69a5
  /* length must be larger than the length of the name + 17 */
Packit 1f69a5
  check_wrong_buffer (wrong_length_after_name, 24);
Packit 1f69a5
  /* next word must be 4 */
Packit 1f69a5
  check_wrong_buffer (wrong_fixed_word_4, 36);
Packit 1f69a5
  /* check wrong total length */
Packit 1f69a5
  check_wrong_buffer (wrong_total_length, 36);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
GST_END_TEST;
Packit 1f69a5
Packit 1f69a5
GST_START_TEST (test_avisubtitle_positive)
Packit 1f69a5
{
Packit 1f69a5
  guint8 avisub_utf_8_without_bom[] = {
Packit 1f69a5
    0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67,
Packit 1f69a5
    0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68,
Packit 1f69a5
    0x00, 0x00, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x00,
Packit 1f69a5
    0x00, 0x31, 0x0d, 0x0a, 0x30,
Packit 1f69a5
    0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c,
Packit 1f69a5
    0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20,
Packit 1f69a5
    0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32,
Packit 1f69a5
    0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62,
Packit 1f69a5
    0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38,
Packit 1f69a5
    0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c,
Packit 1f69a5
    0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42,
Packit 1f69a5
    0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a,
Packit 1f69a5
    0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a,
Packit 1f69a5
    0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30,
Packit 1f69a5
    0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30,
Packit 1f69a5
    0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30,
Packit 1f69a5
    0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65,
Packit 1f69a5
    0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f,
Packit 1f69a5
    0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d,
Packit 1f69a5
    0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3,
Packit 1f69a5
    0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a
Packit 1f69a5
  };
Packit 1f69a5
  check_correct_buffer (avisub_utf_8_with_bom, 175, avisub_utf_8_with_bom + 36,
Packit 1f69a5
      139);
Packit 1f69a5
  check_correct_buffer (avisub_utf_8_without_bom, 172,
Packit 1f69a5
      avisub_utf_8_without_bom + 33, 139);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
GST_END_TEST;
Packit 1f69a5
Packit 1f69a5
static Suite *
Packit 1f69a5
avisubtitle_suite (void)
Packit 1f69a5
{
Packit 1f69a5
  Suite *s = suite_create ("avisubtitle");
Packit 1f69a5
  TCase *tc_chain = tcase_create ("general");
Packit 1f69a5
Packit 1f69a5
  suite_add_tcase (s, tc_chain);
Packit 1f69a5
  tcase_add_test (tc_chain, test_avisubtitle_negative);
Packit 1f69a5
  tcase_add_test (tc_chain, test_avisubtitle_positive);
Packit 1f69a5
Packit 1f69a5
  return s;
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
GST_CHECK_MAIN (avisubtitle);