diff options
author | Thijs Vermeir <thijsvermeir@gmail.com> | 2007-12-18 09:13:12 +0000 |
---|---|---|
committer | Thijs Vermeir <thijsvermeir@gmail.com> | 2007-12-18 09:13:12 +0000 |
commit | d0c62e910823d5c3bba2696f734769f8ac47b149 (patch) | |
tree | 170139fd73b34fe6b3f1a99469662f6946a5102d /tests | |
parent | de9a28056e618bfeee94e8fb89d0de7be4e36f9f (diff) |
Add avi subtitle element for bug #442034. Need seeking support and more support for character conversion.
Original commit message from CVS:
* gst/avi/Makefile.am:
* gst/avi/gstavi.c:
* gst/avi/gstavisubtitle.c:
* gst/avi/gstavisubtitle.h:
* tests/check/Makefile.am:
* tests/check/elements/avisubtitle.c:
* win32/common/config.h:
Add avi subtitle element for bug #442034. Need seeking support
and more support for character conversion.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/check/Makefile.am | 1 | ||||
-rw-r--r-- | tests/check/elements/avisubtitle.c | 248 |
2 files changed, 249 insertions, 0 deletions
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index a3c9c892..8ee7b995 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -60,6 +60,7 @@ check_PROGRAMS = \ elements/audioamplify \ elements/audiodynamic \ elements/avimux \ + elements/avisubtitle \ elements/id3demux \ elements/level \ elements/matroskamux \ diff --git a/tests/check/elements/avisubtitle.c b/tests/check/elements/avisubtitle.c new file mode 100644 index 00000000..c4c80d25 --- /dev/null +++ b/tests/check/elements/avisubtitle.c @@ -0,0 +1,248 @@ +/* GStreamer + * + * unit test for avisubtitle + * + * Copyright (C) <2007> Thijs Vermeir <thijsvermeir@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/* Element-Checklist-Version: 5 */ + +#include <unistd.h> + +#include <gst/gst.h> +#include <gst/check/gstcheck.h> + +GstPad *mysinkpad; +GstPad *mysrcpad; + +guint8 avisub_utf_8_with_bom[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, + 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30, + 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c, + 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, + 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, + 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62, + 0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38, + 0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, + 0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a, + 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30, + 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, + 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30, + 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, + 0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d, + 0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, + 0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a +}; + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-subtitle") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-subtitle-avi") + ); + +GstElement * +setup_avisubtitle () +{ + GstElement *avisubtitle; + GstCaps *caps; + + GST_DEBUG ("setup_avisubtitle"); + avisubtitle = gst_check_setup_element ("avisubtitle"); + caps = gst_caps_new_simple ("application/x-subtitle", NULL); + mysinkpad = gst_check_setup_sink_pad (avisubtitle, &sink_template, caps); + gst_caps_unref (caps); + caps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); + mysrcpad = gst_check_setup_src_pad (avisubtitle, &src_template, caps); + gst_caps_unref (caps); + gst_pad_set_active (mysinkpad, TRUE); + gst_pad_set_active (mysrcpad, TRUE); + return avisubtitle; +} + +void +cleanup_avisubtitle (GstElement * avisubtitle) +{ + gst_pad_set_active (mysinkpad, FALSE); + gst_pad_set_active (mysrcpad, FALSE); + gst_check_teardown_sink_pad (avisubtitle); + gst_check_teardown_src_pad (avisubtitle); + gst_check_teardown_element (avisubtitle); +} + +void +check_wrong_buffer (guint8 * data, guint length) +{ + GstBuffer *buffer = gst_buffer_new (); + GstElement *avisubtitle = setup_avisubtitle (); + + gst_buffer_set_data (buffer, data, length); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + gst_buffer_ref (buffer); + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 2); + /* push the broken buffer */ + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_ERROR, + "accepted a broken buffer"); + /* check if we have unreffed this buffer on failure */ + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); + gst_buffer_unref (buffer); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + cleanup_avisubtitle (avisubtitle); +} + +void +check_correct_buffer (guint8 * src_data, guint src_size, guint8 * dst_data, + guint dst_size) +{ + GstBuffer *buffer = gst_buffer_new (); + GstBuffer *newBuffer; + GstElement *avisubtitle = setup_avisubtitle (); + + fail_unless (g_list_length (buffers) == 0, "Buffers list needs to be empty"); + gst_buffer_set_data (buffer, src_data, src_size); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK, + "not accepted a correct buffer"); + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); + /* a new buffer is created in the list */ + fail_unless (g_list_length (buffers) == 1, + "No new buffer in the buffers list"); + newBuffer = GST_BUFFER (buffers->data); + buffers = g_list_remove (buffers, newBuffer); + fail_unless (g_list_length (buffers) == 0, "Buffers list needs to be empty"); + fail_unless (GST_BUFFER_SIZE (newBuffer) == dst_size, + "size of the new buffer is wrong ( %d != %d)", + GST_BUFFER_SIZE (newBuffer), dst_size); + fail_unless (memcmp (GST_BUFFER_DATA (newBuffer), dst_data, dst_size) == 0, + "data of the buffer is not correct"); + gst_buffer_unref (newBuffer); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + cleanup_avisubtitle (avisubtitle); +} + + +GST_START_TEST (test_avisubtitle_negative) +{ + guint8 wrong_magic[] = + { 0x47, 0x41, 0x41, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 }; + guint8 wrong_fixed_word_2[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x01, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68 + }; + guint8 wrong_length_after_name[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68 + }; + guint8 wrong_fixed_word_4[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x01, 0x8e, 0x00, 0x00, + 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30 + }; + guint8 wrong_total_length[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, + 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30 + }; + /* size of the buffer must be larger than 11 */ + check_wrong_buffer (avisub_utf_8_with_bom, 11); + /* buffer must start with 'GAB2\0' */ + check_wrong_buffer (wrong_magic, 14); + /* next word must be 2 */ + check_wrong_buffer (wrong_fixed_word_2, 24); + /* length must be larger than the length of the name + 17 */ + check_wrong_buffer (wrong_length_after_name, 24); + /* next word must be 4 */ + check_wrong_buffer (wrong_fixed_word_4, 36); + /* check wrong total length */ + check_wrong_buffer (wrong_total_length, 36); +} + +GST_END_TEST; + +GST_START_TEST (test_avisubtitle_positive) +{ + guint8 avisub_utf_8_without_bom[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x00, + 0x00, 0x31, 0x0d, 0x0a, 0x30, + 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c, + 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, + 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, + 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62, + 0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38, + 0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, + 0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a, + 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30, + 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, + 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30, + 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, + 0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d, + 0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, + 0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a + }; + check_correct_buffer (avisub_utf_8_with_bom, 175, avisub_utf_8_with_bom + 36, + 139); + check_correct_buffer (avisub_utf_8_without_bom, 172, + avisub_utf_8_without_bom + 33, 139); +} + +GST_END_TEST; + +Suite * +avisubtitle_suite (void) +{ + Suite *s = suite_create ("avisubtitle"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_avisubtitle_negative); + tcase_add_test (tc_chain, test_avisubtitle_positive); + + return s; +} + +GST_CHECK_MAIN (avisubtitle); |