/* GStreamer * Copyright (C) 2015 Matthew Waters * * 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., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include static void setup (void) { } static void teardown (void) { } /* *INDENT-OFF* */ static const struct {GstGLSLVersion version; const gchar * name;} glsl_versions[] = { {GST_GLSL_VERSION_100, "100"}, {GST_GLSL_VERSION_110, "110"}, {GST_GLSL_VERSION_120, "120"}, {GST_GLSL_VERSION_130, "130"}, {GST_GLSL_VERSION_140, "140"}, {GST_GLSL_VERSION_150, "150"}, {GST_GLSL_VERSION_300, "300"}, {GST_GLSL_VERSION_310, "310"}, {GST_GLSL_VERSION_320, "320"}, {GST_GLSL_VERSION_330, "330"}, {GST_GLSL_VERSION_400, "400"}, {GST_GLSL_VERSION_410, "410"}, {GST_GLSL_VERSION_420, "420"}, {GST_GLSL_VERSION_430, "430"}, {GST_GLSL_VERSION_440, "440"}, {GST_GLSL_VERSION_450, "450"}, }; static const struct {GstGLSLProfile profile; const gchar * name;} glsl_profiles[] = { {GST_GLSL_PROFILE_ES, "es"}, {GST_GLSL_PROFILE_CORE, "core"}, {GST_GLSL_PROFILE_COMPATIBILITY, "compatibility"}, }; struct version_profile_s { GstGLSLVersion version; GstGLSLProfile profile; const gchar * name; }; static const struct version_profile_s glsl_version_profiles_valid[] = { {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES, "100"}, {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_COMPATIBILITY, "110"}, {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_COMPATIBILITY, "120"}, {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_COMPATIBILITY, "130"}, {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_COMPATIBILITY, "140"}, {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_CORE, "150 core"}, {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_COMPATIBILITY, "150 compatibility"}, {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_ES, "300 es"}, {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_ES, "310 es"}, {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_ES, "320 es"}, {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_CORE, "330 core"}, {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_COMPATIBILITY, "330 compatibility"}, {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_CORE, "400 core"}, {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_COMPATIBILITY, "400 compatibility"}, {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_CORE, "410 core"}, {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_COMPATIBILITY, "410 compatibility"}, {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_CORE, "420 core"}, {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_COMPATIBILITY, "420 compatibility"}, {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_CORE, "430 core"}, {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_COMPATIBILITY, "430 compatibility"}, {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_CORE, "440 core"}, {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_COMPATIBILITY, "440 compatibility"}, {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_CORE, "450 core"}, {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_COMPATIBILITY, "450 compatibility"}, }; /* combinations that produce different results between serializing/deserializing * due to default values being imposed */ static const struct version_profile_s glsl_version_profiles_valid_serialize[] = { {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_NONE, "100"}, {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_NONE, "110"}, {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_NONE, "120"}, {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_NONE, "130"}, {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_NONE, "140"}, {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_NONE, "150"}, {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_NONE, "330"}, {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_NONE, "400"}, {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_NONE, "410"}, {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_NONE, "420"}, {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_NONE, "430"}, {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_NONE, "440"}, {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_NONE, "450"}, }; static const struct version_profile_s glsl_version_profiles_valid_deserialize[] = { {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES, "100"}, {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_COMPATIBILITY, "110"}, {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_COMPATIBILITY, "120"}, {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_COMPATIBILITY, "130"}, {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_COMPATIBILITY, "140"}, {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_CORE, "150"}, {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_CORE, "330"}, {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_CORE, "400"}, {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_CORE, "410"}, {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_CORE, "420"}, {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_CORE, "430"}, {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_CORE, "440"}, {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_CORE, "450"}, }; static const gchar * invalid_deserialize_glsl[] = { "", " \t\r\n", "ael dja", "es", "core", "compatibility", "1000", "100 es", "100 core", "100 compatibility", "150 es", "300 core", "300 compatibility", "310 core", "310 compatibility", "320 core", "320 compatibility", "330 es", }; static const struct {GstGLSLVersion version; GstGLSLProfile profile;} invalid_serialize_glsl[] = { {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_COMPATIBILITY}, {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_NONE}, {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_COMPATIBILITY}, {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_NONE}, {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_COMPATIBILITY}, {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_NONE}, {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_CORE}, {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_COMPATIBILITY}, {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_ES}, {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_ES}, }; static const struct {const gchar *name; gboolean succeed; GstGLSLVersion version; GstGLSLProfile profile;} glsl_str_map[] = { {"//#version 100\n", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE}, {"/*\n#version 100*/\n", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE}, {"/*\r#version 100*/", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE}, {"#\rversion 100", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE}, {"#\nversion 100", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE}, {"\t#version 100", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE}, {"//\r#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES}, {"//\n#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES}, {"# \tversion 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES}, {"\n#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES}, {"\r#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES}, }; /* *INDENT-ON* */ GST_START_TEST (test_serialization) { gint i; /* versions */ for (i = 0; i < G_N_ELEMENTS (glsl_versions); i++) { GstGLSLVersion version; const gchar *version_s; version_s = gst_glsl_version_to_string (glsl_versions[i].version); fail_unless (g_strcmp0 (version_s, glsl_versions[i].name) == 0, "%s != %s", version_s, glsl_versions[i].name); version = gst_glsl_version_from_string (glsl_versions[i].name); fail_unless (version == glsl_versions[i].version, "%s != %s", gst_glsl_version_to_string (glsl_versions[i].version), gst_glsl_version_to_string (version)); } /* profiles */ for (i = 0; i < G_N_ELEMENTS (glsl_profiles); i++) { GstGLSLProfile profile; const gchar *profile_s; profile_s = gst_glsl_profile_to_string (glsl_profiles[i].profile); fail_unless (g_strcmp0 (profile_s, glsl_profiles[i].name) == 0, "%s != %s", profile_s, glsl_profiles[i].name); profile = gst_glsl_profile_from_string (glsl_profiles[i].name); fail_unless (profile == glsl_profiles[i].profile, "%s != %s", gst_glsl_profile_to_string (glsl_profiles[i].profile), gst_glsl_profile_to_string (profile)); } for (i = 0; i < G_N_ELEMENTS (glsl_version_profiles_valid); i++) { gchar *version_profile_s; GstGLSLVersion version; GstGLSLProfile profile; version_profile_s = gst_glsl_version_profile_to_string (glsl_version_profiles_valid [i].version, glsl_version_profiles_valid[i].profile); fail_unless (g_strcmp0 (version_profile_s, glsl_version_profiles_valid[i].name) == 0, "%s != %s", version_profile_s, glsl_version_profiles_valid[i].name); fail_unless (gst_glsl_version_profile_from_string (glsl_version_profiles_valid[i].name, &version, &profile), "Failed to parse %s", glsl_version_profiles_valid[i].name); fail_unless (profile == glsl_version_profiles_valid[i].profile && version == glsl_version_profiles_valid[i].version, "%s != %s %s", glsl_version_profiles_valid[i].name, gst_glsl_version_to_string (version), gst_glsl_profile_to_string (profile)); g_free (version_profile_s); } for (i = 0; i < G_N_ELEMENTS (glsl_version_profiles_valid_serialize); i++) { gchar *version_profile_s; version_profile_s = gst_glsl_version_profile_to_string (glsl_version_profiles_valid_serialize[i].version, glsl_version_profiles_valid_serialize[i].profile); fail_unless (g_strcmp0 (version_profile_s, glsl_version_profiles_valid_serialize[i].name) == 0, "%s != %s", version_profile_s, glsl_version_profiles_valid_serialize[i].name); g_free (version_profile_s); } for (i = 0; i < G_N_ELEMENTS (glsl_version_profiles_valid_deserialize); i++) { GstGLSLVersion version; GstGLSLProfile profile; fail_unless (gst_glsl_version_profile_from_string (glsl_version_profiles_valid_deserialize[i].name, &version, &profile), "Failed to parse %s", glsl_version_profiles_valid_deserialize[i].name); fail_unless (profile == glsl_version_profiles_valid_deserialize[i].profile && version == glsl_version_profiles_valid_deserialize[i].version, "%s != %s %s", glsl_version_profiles_valid_deserialize[i].name, gst_glsl_version_to_string (version), gst_glsl_profile_to_string (profile)); } /* failures */ for (i = 0; i < G_N_ELEMENTS (invalid_deserialize_glsl); i++) { GstGLSLVersion version; GstGLSLProfile profile; fail_if (gst_glsl_version_profile_from_string (invalid_deserialize_glsl[i], &version, &profile), "successfully deserialized %s into %s %s (should have failed)", invalid_deserialize_glsl[i], gst_glsl_version_to_string (version), gst_glsl_profile_to_string (profile)); } /* failures */ for (i = 0; i < G_N_ELEMENTS (invalid_serialize_glsl); i++) { gchar *version_profile_s; version_profile_s = gst_glsl_version_profile_to_string (invalid_serialize_glsl[i].version, invalid_serialize_glsl[i].profile); fail_if (version_profile_s != NULL, "successfully serialized %s from %s %s (should have failed)", version_profile_s, gst_glsl_version_to_string (invalid_serialize_glsl[i].version), gst_glsl_profile_to_string (invalid_serialize_glsl[i].profile)); g_free (version_profile_s); } /* map strings to version/profile */ for (i = 0; i < G_N_ELEMENTS (glsl_str_map); i++) { GstGLSLVersion version; GstGLSLProfile profile; fail_unless (glsl_str_map[i].succeed == gst_glsl_string_get_version_profile (glsl_str_map[i].name, &version, &profile), "Incorrect result for parsing \'%s\': %s", glsl_str_map[i].name, glsl_str_map[i].succeed ? "false" : "true"); if (glsl_str_map[i].succeed) { fail_unless (version == glsl_str_map[i].version, "With %s: %s != %s", glsl_str_map[i].name, gst_glsl_version_to_string (glsl_str_map[i].version), gst_glsl_version_to_string (version)); fail_unless (profile == glsl_str_map[i].profile, "With %s: %s != %s", glsl_str_map[i].name, gst_glsl_profile_to_string (glsl_str_map[i].profile), gst_glsl_profile_to_string (profile)); } } /* special ones */ { GstGLSLVersion version; GstGLSLProfile profile; gchar *version_profile_s; version_profile_s = gst_glsl_version_profile_to_string (GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES); fail_unless (g_strcmp0 (version_profile_s, "100") == 0, "%s != 100", version_profile_s); g_free (version_profile_s); version_profile_s = gst_glsl_version_profile_to_string (GST_GLSL_VERSION_100, GST_GLSL_PROFILE_NONE); fail_unless (g_strcmp0 (version_profile_s, "100") == 0, "%s != 100", version_profile_s); g_free (version_profile_s); fail_unless (gst_glsl_version_profile_from_string ("100", &version, &profile)); fail_unless (version == GST_GLSL_VERSION_100 && profile == GST_GLSL_PROFILE_ES, "100 != %s %s", gst_glsl_version_to_string (version), gst_glsl_profile_to_string (profile)); } } GST_END_TEST; static Suite * gst_gl_upload_suite (void) { Suite *s = suite_create ("GstGLSL"); TCase *tc_chain = tcase_create ("glsl"); suite_add_tcase (s, tc_chain); tcase_add_checked_fixture (tc_chain, setup, teardown); tcase_add_test (tc_chain, test_serialization); return s; } GST_CHECK_MAIN (gst_gl_upload);