0ae1e507c3b37012deebda82eecd01d62c0a7124
[platform/upstream/gstreamer.git] / tests / check / elements / dataurisrc.c
1 /* GStreamer unit test for dataurisrc
2  *
3  * Copyright (C) 2010, 2016 Tim-Philipp Müller <tim centricular net>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include <gst/check/check.h>
25
26 /* sine wave encoded in ogg/vorbis, created with:
27  *   gst-launch-1.0 audiotestsrc num-buffers=110 ! audioconvert ! \
28  *                   audio/x-raw,channels=1 ! vorbisenc ! oggmux ! \
29  *                   filesink location=sine.ogg
30  * and then encoded to base64 */
31 const gchar data_uri[] = "data:audio/ogg;base64,"
32     "T2dnUwACAAAAAAAAAACVWbd7AAAAAHgH02kBHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4"
33     "AU9nZ1MAAAAAAAAAAAAAlVm3ewEAAADrU8FRDkv///////////////+BA3ZvcmJpcx0AAABYaXBo"
34     "Lk9yZyBsaWJWb3JiaXMgSSAyMDA5MDcwOQEAAAAaAAAAREVTQ1JJUFRJT049YXVkaW90ZXN0IHdh"
35     "dmUBBXZvcmJpcyJCQ1YBAEAAACRzGCpGpXMWhBAaQlAZ4xxCzmvsGUJMEYIcMkxbyyVzkCGkoEKI"
36     "WyiB0JBVAABAAACHQXgUhIpBCCGEJT1YkoMnPQghhIg5eBSEaUEIIYQQQgghhBBCCCGERTlokoMn"
37     "QQgdhOMwOAyD5Tj4HIRFOVgQgydB6CCED0K4moOsOQghhCQ1SFCDBjnoHITCLCiKgsQwuBaEBDUo"
38     "jILkMMjUgwtCiJqDSTX4GoRnQXgWhGlBCCGEJEFIkIMGQcgYhEZBWJKDBjm4FITLQagahCo5CB+E"
39     "IDRkFQCQAACgoiiKoigKEBqyCgDIAAAQQFEUx3EcyZEcybEcCwgNWQUAAAEACAAAoEiKpEiO5EiS"
40     "JFmSJVmSJVmS5omqLMuyLMuyLMsyEBqyCgBIAABQUQxFcRQHCA1ZBQBkAAAIoDiKpViKpWiK54iO"
41     "CISGrAIAgAAABAAAEDRDUzxHlETPVFXXtm3btm3btm3btm3btm1blmUZCA1ZBQBAAAAQ0mlmqQaI"
42     "MAMZBkJDVgEACAAAgBGKMMSA0JBVAABAAACAGEoOogmtOd+c46BZDppKsTkdnEi1eZKbirk555xz"
43     "zsnmnDHOOeecopxZDJoJrTnnnMSgWQqaCa0555wnsXnQmiqtOeeccc7pYJwRxjnnnCateZCajbU5"
44     "55wFrWmOmkuxOeecSLl5UptLtTnnnHPOOeecc84555zqxekcnBPOOeecqL25lpvQxTnnnE/G6d6c"
45     "EM4555xzzjnnnHPOOeecIDRkFQAABABAEIaNYdwpCNLnaCBGEWIaMulB9+gwCRqDnELq0ehopJQ6"
46     "CCWVcVJKJwgNWQUAAAIAQAghhRRSSCGFFFJIIYUUYoghhhhyyimnoIJKKqmooowyyyyzzDLLLLPM"
47     "Ouyssw47DDHEEEMrrcRSU2011lhr7jnnmoO0VlprrbVSSimllFIKQkNWAQAgAAAEQgYZZJBRSCGF"
48     "FGKIKaeccgoqqIDQkFUAACAAgAAAAABP8hzRER3RER3RER3RER3R8RzPESVREiVREi3TMjXTU0VV"
49     "dWXXlnVZt31b2IVd933d933d+HVhWJZlWZZlWZZlWZZlWZZlWZYgNGQVAAACAAAghBBCSCGFFFJI"
50     "KcYYc8w56CSUEAgNWQUAAAIACAAAAHAUR3EcyZEcSbIkS9IkzdIsT/M0TxM9URRF0zRV0RVdUTdt"
51     "UTZl0zVdUzZdVVZtV5ZtW7Z125dl2/d93/d93/d93/d93/d9XQdCQ1YBABIAADqSIymSIimS4ziO"
52     "JElAaMgqAEAGAEAAAIriKI7jOJIkSZIlaZJneZaomZrpmZ4qqkBoyCoAABAAQAAAAAAAAIqmeIqp"
53     "eIqoeI7oiJJomZaoqZoryqbsuq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq4LhIas"
54     "AgAkAAB0JEdyJEdSJEVSJEdygNCQVQCADACAAAAcwzEkRXIsy9I0T/M0TxM90RM901NFV3SB0JBV"
55     "AAAgAIAAAAAAAAAMybAUy9EcTRIl1VItVVMt1VJF1VNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
56     "VVVVVVVVVVVN0zRNEwgNWQkAAAEA0FpzzK2XjkHorJfIKKSg10455qTXzCiCnOcQMWOYx1IxQwzG"
57     "lkGElAVCQ1YEAFEAAIAxyDHEHHLOSeokRc45Kh2lxjlHqaPUUUqxplo7SqW2VGvjnKPUUcoopVpL"
58     "qx2lVGuqsQAAgAAHAIAAC6HQkBUBQBQAAIEMUgophZRizinnkFLKOeYcYoo5p5xjzjkonZTKOSed"
59     "kxIppZxjzinnnJTOSeack9JJKAAAIMABACDAQig0ZEUAECcA4HAcTZM0TRQlTRNFTxRd1xNF1ZU0"
60     "zTQ1UVRVTRRN1VRVWRZNVZYlTTNNTRRVUxNFVRVVU5ZNVbVlzzRt2VRV3RZV1bZlW/Z9V5Z13TNN"
61     "2RZV1bZNVbV1V5Z1XbZt3Zc0zTQ1UVRVTRRV11RV2zZV1bY1UXRdUVVlWVRVWXZdWddVV9Z9TRRV"
62     "1VNN2RVVVZZV2dVlVZZ1X3RV3VZd2ddVWdZ929aFX9Z9wqiqum7Krq6rsqz7si77uu3rlEnTTFMT"
63     "RVXVRFFVTVe1bVN1bVsTRdcVVdWWRVN1ZVWWfV91ZdnXRNF1RVWVZVFVZVmVZV13ZVe3RVXVbVV2"
64     "fd90XV2XdV1YZlv3hdN1dV2VZd9XZVn3ZV3H1nXf90zTtk3X1XXTVXXf1nXlmW3b+EVV1XVVloVf"
65     "lWXf14XheW7dF55RVXXdlF1fV2VZF25fN9q+bjyvbWPbPrKvIwxHvrAsXds2ur5NmHXd6BtD4TeG"
66     "NNO0bdNVdd10XV+Xdd1o67pQVFVdV2XZ91VX9n1b94Xh9n3fGFXX91VZFobVlp1h932l7guVVbaF"
67     "39Z155htXVh+4+j8vjJ0dVto67qxzL6uPLtxdIY+AgAABhwAAAJMKAOFhqwIAOIEABiEnENMQYgU"
68     "gxBCSCmEkFLEGITMOSkZc1JCKamFUlKLGIOQOSYlc05KKKGlUEpLoYTWQimxhVJabK3VmlqLNYTS"
69     "WiiltVBKi6mlGltrNUaMQcick5I5J6WU0loopbXMOSqdg5Q6CCmllFosKcVYOSclg45KByGlkkpM"
70     "JaUYQyqxlZRiLCnF2FpsucWYcyilxZJKbCWlWFtMObYYc44Yg5A5JyVzTkoopbVSUmuVc1I6CCll"
71     "DkoqKcVYSkoxc05KByGlDkJKJaUYU0qxhVJiKynVWEpqscWYc0sx1lBSiyWlGEtKMbYYc26x5dZB"
72     "aC2kEmMoJcYWY66ttRpDKbGVlGIsKdUWY629xZhzKCXGkkqNJaVYW425xhhzTrHlmlqsucXYa225"
73     "9Zpz0Km1WlNMubYYc465BVlz7r2D0FoopcVQSoyttVpbjDmHUmIrKdVYSoq1xZhza7H2UEqMJaVY"
74     "S0o1thhrjjX2mlqrtcWYa2qx5ppz7zHm2FNrNbcYa06x5Vpz7r3m1mMBAAADDgAAASaUgUJDVgIA"
75     "UQAABCFKMQahQYgx56Q0CDHmnJSKMecgpFIx5hyEUjLnIJSSUuYchFJSCqWkklJroZRSUmqtAACA"
76     "AgcAgAAbNCUWByg0ZCUAkAoAYHAcy/I8UTRV2XYsyfNE0TRV1bYdy/I8UTRNVbVty/NE0TRV1XV1"
77     "3fI8UTRVVXVdXfdEUTVV1XVlWfc9UTRVVXVdWfZ901RV1XVlWbaFXzRVV3VdWZZl31hd1XVlWbZ1"
78     "WxhW1XVdWZZtWzeGW9d13feFYTk6t27ruu/7wvE7xwAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiD"
79     "kEFIIYMQUkghpRBSSgkAABhwAAAIMKEMFBqyEgCIAgAACJFSSimNlFJKKaWRUkoppZQSQgghhBBC"
80     "CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggFAPhPOAD4P9igKbE4QKEhKwGAcAAAwBilmHIMOgkp"
81     "NYw5BqGUlFJqrWGMMQilpNRaS5VzEEpJqbXYYqycg1BSSq3FGmMHIaXWWqyx1po7CCmlFmusOdgc"
82     "Smktxlhzzr33kFJrMdZac++9l9ZirDXn3IMQwrQUY6659uB77ym2WmvNPfgghFCx1Vpz8EEIIYSL"
83     "Mffcg/A9CCFcjDnnHoTwwQdhAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBiijHnnIMQQgiRUow5"
84     "5xyEEEIoJVKKMeecgw5CCCVkjDnnHIQQQiillIwx55yDEEIJpZSSOecchBBCKKWUUjLnoIMQQgml"
85     "lFJK5xyEEEIIpZRSSumggxBCCaWUUkopIYQQQgmllFJKKSWEEEIJpZRSSimlhBBKKKWUUkoppZQQ"
86     "QimllFJKKaWUEkIopZRSSimllJJCKaWUUkoppZRSUiillFJKKaWUUkoJpZRSSimllJRSSQUAABw4"
87     "AAAEGEEnGVUWYaMJFx6AQkNWAgBAAAAUxFZTiZ1BzDFnqSEIMaipQkophjFDyiCmKVMKIYUhc4oh"
88     "AqHFVkvFAAAAEAQACAgJADBAUDADAAwOED4HQSdAcLQBAAhCZIZINCwEhweVABExFQAkJijkAkCF"
89     "xUXaxQV0GeCCLu46EEIQghDE4gAKSMDBCTc88YYn3OAEnaJSBwEAAAAAcAAADwAAxwUQEdEcRobG"
90     "BkeHxwdISAAAAAAAyADABwDAIQJERDSHkaGxwdHh8QESEgAAAAAAAAAAAAQEBAAAAAAAAgAAAAQE"
91     "T2dnUwAAwFIAAAAAAACVWbd7AgAAAPtNZ2oXKxQ4JiYlJSUmJSYmJSUlJiUmJiYmJSWM64s3q+wD"
92     "MAQAnICN1ydV8tWC8lN5Kk/lqTyVp/JUuqu7uqu7KgjDMEwAnO2rVb0qWHw+DQAAAAAAIC5HDwU6"
93     "yj7C62/u4teEkwiA2gAAAAAAAAAAAAAAbL8fuP/EQFh6odjwP2uvvNHgH/d6FLjkcubZXtUAAJ7K"
94     "3qo3ye0WocGOPxVMBwAAAAAAAAAAAAAA8H7XAwAAcm8vpwcAnsreqjfJ7RahwY4/FUwHAAAAAAAA"
95     "AAAAAADw/l0AAIB2r4kzAgCeyt4qNyntFqHBzv0KpgNQAAAAAAAAAAAAAODQowQAgPjtOQoAnsre"
96     "KjfJ/RYF7NyvYDoAAAAAAAAAAAAAAIBf3wMAgL2/NDECAJ7K3qo3Ke0WpcHOrQKmAxAAAAAAAAAA"
97     "AAAAIJoFAACIm3ZUAQCeyt4qN8ntFqnBjj8VTAcAAAAAAAAAAAAAAPDj9wAAgEnDb5MBAJ7K3io3"
98     "ye0WGuz4U8F0AAoAAAAAAAAAAAAAXG8xAQAgv8G5vgCeyt6qN8ntFqHBjj8VTAcAAAAAAAAAAAAA"
99     "APB1FwkAAIPev/QBAJ7K3qo3ye0WGuz4W8B0AAAAAAAAAAAAAAAAX29hAADAwMuzPgIAnsreKjcp"
100     "7RYa7PhTwHQAAgAAAAAAAAAAAACcv6UAAIDcBE+qAJ7K3io3yf0WAez4W8F0AAAAAAAAAAAAAAAA"
101     "P34XAABMFj2SAgCeyt6qNyntFqnBzv0KpgNQAAAAAAAAAAAAACCrSwAAkGUXUwAAnsreKjfJ/RYF"
102     "7PhTwXQAAAAAAAAAAAAAAAC/fhYAYGHvr03cAACeyt4qNyntFhrs+FPAdAACAAAAAAAAAAAAANz3"
103     "OAAAIHrqAhUAnsreqjfJ7RahwY4/FUwHAAAAAAAAAAAAAADw/l0BAEC7xG4ZAACeyt6qN8ntFhrs"
104     "+FvAdAAAAAAAAAAAAAAAAO9vQQIAQP7YG9MBAJ7K3qo3ye0WocGOPxVMBwAAAAAAAAAAAAAA8Ny1"
105     "BACAmsF9ngAAnsreKjfJ7RahwY4/FUwHAAAAAAAAAAAAAADw6+0AAMCi1mdeAACeyt7yNyntFgHs"
106     "3K9gOgABAAAAAAAAAAAAAFpnCgAAMI98WgAAnsre8jfJ7RYN7NyaYDoAAAAAAAAAAAAAAIA/fgMA"
107     "wLKxf1wEAE9nZ1MAAMCqAAAAAAAAlVm3ewMAAAD+9Ox8FiQlJSYmJSUlJSUmJSYlJSUmJiYmJSSe"
108     "yt4qNyntFqHBzv0KpgNQAAAAAAAAAAAAAKB9ZgkAAE6GCACeyt6qN8ntFqnBjj8VTAcAAAAAAAAA"
109     "AAAAAPD1lgEAwODweu8AnsreqjfJ7RYa7PhbwHQAAAAAAAAAAAAAAADPXQoAAKje6sUrAJ7K3qo3"
110     "ye0WocGOPxVMBwAAAAAAAAAAAAAAcN31AACA3K760gIAnsreqjfJ7RahwY4/FUwHAAAAAAAAAAAA"
111     "AADw/l0AAID2OV7SAgCeyt7yNyl1i1Bg5/4E0wEoAAAAAAAAAAAAAHDoQQIAQJxOjwQAnsreKjfJ"
112     "7Ratwc6tAqYDAAAAAAAAAAAAAAD46wcAgMDlal8mAJ7K3io3Ke0WqcHO/QKmAxAAAAAAAAAAAAAA"
113     "oN/DAACAaKfrAACeyt4qN8ntFqnBzv0KpgMAAAAAAAAAAAAAAPjxHQAAMJn8dhoAnsreqjfJ7RYa"
114     "7PhbwHQAAAAAAAAAAAAAAADXW0oAAMj7OMMnAJ7K3qo3ye0WocGOPxVMBwAAAAAAAAAAAAAA8HVX"
115     "CQAAtYu2eQMAnsreqjfJ7RYa7PhbwHQAAAAAAAAAAAAAAABfnwAAAAZN1vcBAJ7K3io3Ke0WocHO"
116     "/QqmAxAAAAAAAAAAAAAA4PzMAwAAzP8cqQIAnsreKjfJ/RYJ7PhTwHQAAAAAAAAAAAAAAAA/fhcA"
117     "AEx+XGYSAJ7K3qo3Ke0WpcHOrQqmA1AAAAAAAAAAAAAAIKtLAACQ841WAACeyt4qN8n9Fgns+FPB"
118     "dAAAAAAAAAAAAAAAAL9+FgAALDa84wEAnsreKjfJ7RaxwY6/FUwHIAAAAAAAAAAAAADA/V0LAACo"
119     "7vGKCgCeyt6qN8ntFqHBjj8VTAcAAAAAAAAAAAAAAPD+XQMAANplf5IRAJ7K3qo3ye0WGuz4W8B0"
120     "AAAAAAAAAAAAAAAA799lAgBAu9mnGQAAnsreKjcp7RYa7PhTwXQACgAAAAAAAAAAAAC83OUEAIDa"
121     "7i8rAACeyt4qN8n9FgHs+FvBdAAAAAAAAAAAAAAAAL9+BgAALNa/7Q4Ansreqjcp7Rapwc79CqYD"
122     "EAAAAAAAAAAAAAAgmgUAAIj5x6gAT2dnUwAAwAIBAAAAAACVWbd7BAAAAFDbxx4WJSUmJiYlJSUl"
123     "JiUmJSUlJSUlJiUmJZ7K3io3yf0WBezcr2A6AAAAAAAAAAAAAACAH78DAAA2flSWLwCeyt4qNynt"
124     "Fhrs+FPAdAAKAAAAAAAAAAAAALTPLAEAwPnmCAUAnsreqjfJ7RapwY4/FUwHAAAAAAAAAAAAAADw"
125     "9ZYBAMCg6Xo+AgCeyt6qN8ntFhrs+FvAdAAAAAAAAAAAAAAAAF93KQAAoHrhht4BAJ7K3qo3ye0W"
126     "ocGOPxVMBwAAAAAAAAAAAAAAcL3FAACAnA8zUwEAnsreKjfJ7RYa7PhTwHQAAAAAAAAAAAAAAAA/"
127     "PhkAAEymvJMWAJ7K3vI3Ke0WAezcr2A6AAUAAAAAAAAAAAAADj1IAACI5x0vAQCeyt4qN8n9Fg3s"
128     "3CpgOgAAAAAAAAAAAAAAgL9+AAAI7K317QAAnsreKjcp7Rahwc79CqYDEAAAAAAAAAAAAACg3+MA"
129     "AIAobSQBAJ7K3qo3ye0WqcGOPxVMBwAAAAAAAAAAAAAA8P5JAQBA+2yvaQAAnsreqjfJ7RYa7Phb"
130     "wHQAAAAAAAAAAAAAAADXW5AAAJDfzWAaAJ7K3qo3ye0WocGOPxVMBwAAAAAAAAAAAAAA8NxVAgBA"
131     "7TavXgAAnsreqjfJ7RahwY4/FUwHAAAAAAAAAAAAAADw9QkAAGBwWIM3AJ7K3vI3KXWLUGDn/gTT"
132     "AQgAAAAAAAAAAAAA0DpTAACAWUZ6AQCeyt4qN8ntFq3Bzq0CpgMAAAAAAAAAAAAAAPjjtwAALCfy"
133     "Y8UAnsre8jcp7RYB7NyvYDoABQAAAAAAAAAAAADaPU0AAHCOeIYEAJ7K3io3ye0WqcHO/QqmAwAA"
134     "AAAAAAAAAAAA+PX2AABgUftTrwCeyt6qN8ntFhrs+FvAdAAAAAAAAAAAAAAAAM9dDgAAqBrY7xkA"
135     "nsreqjfJ7RahwY4/FUwHAAAAAAAAAAAAAADwftcDAAByx9yUHgCeyt6qN8ntFhrs+FvAdAAAAAAA"
136     "AAAAAAAAAO/fJQAAaJfcNSMAnsreKjcp7Rahwc79CqYDUAAAAAAAAAAAAADgpUcJAADxk+crAACe"
137     "yt4qN8n9Fgns+FPAdAAAAAAAAAAAAAAAAL9+BgAALP7S1BAAT2dnUwAAwFoBAAAAAACVWbd7BQAA"
138     "ABLEbSgWJSUmJiYlJSUlJSYmJiYlJSUlJSYlJZ7K3lo3Kf0WbcDOrQqmAxAAAAAAAAAAAAAAIKof"
139     "AAAgmhXTAACeyt4qN8n9Fgns+FPAdAAAAAAAAAAAAAAAAD9+BwAATJ7eWzIAnsreKjfJ7RaxwY6/"
140     "BUwHoAAAAAAAAAAAAADAzVtMAADIj/+UAgCeyt6qN8ntFqHBjj8VTAcAAAAAAAAAAAAAAPD1iRIA"
141     "AAZeX/ABAJ7K3qo3ye0WGuz4W8B0AAAAAAAAAAAAAAAAX2cZAAAw6O0LHwEAnsreKjfJ7RYa7PhT"
142     "wXQAAgAAAAAAAAAAAABcbykAACC3/nlJAJ7K3io3yf0WAez4U8F0AAAAAAAAAAAAAAAAP34vAACY"
143     "dPsqBQCeyt6qNyntFqXBzq0CpgNQAAAAAAAAAAAAACCrSwAAkDfupAAAnsreKjfJ/RYF7NyvYDoA"
144     "AAAAAAAAAAAAAIBfPwEAgL2/NnUBAJ7K3io3Ke0WGuz4U8B0AAIAAAAAAAAAAAAA9HscAAAQvTNb"
145     "BQCeyt6qN8ntFqnBjj8VTAcAAAAAAAAAAAAAAPD+SQEAQLvnvAwAAJ7K3qo3ye0WGuz4W8B0AAAA"
146     "AAAAAAAAAAAA729BAgBA/p0l6QAAnsreqjfJ7RahwY4/FUwHAAAAAAAAAAAAAADw3LUEAIBai6M9"
147     "AQCeyt6qN8ntFqHBjj8FTAcAAAAAAAAAAAAAAPDr7QAAwOLZvXkBAJ7K3vI3Ke0WAezcr2A6AAEA"
148     "AAAAAAAAAAAAWmcKAAAwmy4gAACeyt4qN8ntFq3Bzq0KpgMAAAAAAAAAAAAAAPjjFwAAy8Yf7gEA"
149     "nsreKjcp7Rahwc79CqYDUAAAAAAAAAAAAACgfWYJAABOmg4BAJ7K3qo3ye0WqcGOPxVMBwAAAAAA"
150     "AAAAAAAA8PX2AABgcENGrwCeyt6qN8ntFhrs+FvAdAAAAAAAAAAAAAAAAM9dDgAAqK6f0SsAnsre"
151     "qjfJ7RahwY4/FUwHAAAAAAAAAAAAAABw3fUAAIDck43SAgCeyt6qN8ntFqHBjj8VTAcAAAAAAAAA"
152     "AAAAAPD+XQAAgPZO7fQAnsreKjcp7Rapwc79CqYDUAAAAAAAAAAAAADg0KMEAIB4XVMAAE9nZ1MA"
153     "AMCyAQAAAAAAlVm3ewYAAADDE4GEFiUkJSUmJSYlJSYlJiYmJiQlJSUlJiaeyt4qN8ntFqXBzv0K"
154     "pgMAAAAAAAAAAAAAAPj1PQAA2PtTwgQAnsre8jcp7RYB7NyfYDoAAQAAAAAAAAAAAAD6TQEAAOLr"
155     "jwUAnsreKjfJ7Rapwc79CqYDAAAAAAAAAAAAAAD48R0AADCp/OETAJ7K3qo3ye0WGuz4W8B0AAAA"
156     "AAAAAAAAAAAA11tKAADIZzylAwCeyt6qN8ntFqHBjj8VTAcAAAAAAAAAAAAAAPB1VwkAAEPzP+kN"
157     "AJ7K3qo3ye0WGuz4W8B0AAAAAAAAAAAAAAAAX28hAAAY+LzBBwCeyt4qNyntFqHBzv0KpgMQAAAA"
158     "AAAAAAAAAOD8zAMAAMzb/qMCAJ7K3io3yf0WCez4U8B0AAAAAAAAAAAAAAAAP34XAABMPpBLAgCe"
159     "yt7aN6nzFmXCzv0CpgNQAAAAAAAAAAAAACCrlwAAIL2kaAEAnsreKjfJ/RYF7PhTwXQAAAAAAAAA"
160     "AAAAAAC/fhYAYGHvK6M8AACeyt4qN8ntFhrs+FPAdAACAAAAAAAAAAAAANzftQAAgOqC/6sAnsre"
161     "qjfJ7RahwY4/FUwHAAAAAAAAAAAAAADw/l0DAADaeh7ICACeyt6qN8ntFhrs+FvAdAAAAAAAAAAA"
162     "AAAAAO9vngAA0B7vmekAAJ7K3qo3ye0WocGOPxVMBwAAAAAAAAAAAAAA8Ny1BACAWt+vaAEAnsre"
163     "KjfJ7RahwY4/FUwHAAAAAAAAAAAAAADw67sDAIBF3989AQCeyt7yNyntFgHs3K9gOgABAAAAAAAA"
164     "AAAAAKIRAAAgvnymAACeyt7yN8ntFgXs3C9gOgAAAAAAAAAAAAAAgD9+AwAANpqv+gEAnsreKjcp"
165     "7RYa7PhTwHQACgAAAAAAAAAAAAC0zywBAMC5cJgAAJ7K3qo3ye0WqcGOPxVMBwAAAAAAAAAAAAAA"
166     "8PWWAQDAYK0R7wCeyt6qN8ntFhrs+FvAdAAAAAAAAAAAAAAAAF93KQAAoPpNq1cAnsreqjfJ7Rah"
167     "wY4/FUwHAAAAAAAAAAAAAABwvcUAAIBcX6VTAQCeyt6qN8ntFqHBjj8FTAcAAAAAAAAAAAAAAPDj"
168     "uwAAAJM3TJgWAE9nZ1MAAMC2AQAAAAAAlVm3ewcAAAChMbyhATK+ur7krvf7iNcT84QFpAwAAAAA"
169     "AAAAAAAAAEAnELfPda81yNy2bdpbCkUt8amvXMHuAE9nZ1MABAC4AQAAAAAAlVm3ewgAAAA8WkRh"
170     "AWZeiL1v7LSgX1wHDrB3NhI3k3sSnaKJAAAAAAAAQOJJS94nzV+3/3r/2Ho5ub5tHN70XSuPfdZZ"
171     "C/9eZOtqZc5Zfl8wP5ZenOT3hbWPpZeE6jzjkdY3f+GXCblaF41qKouT/N7UyQA=";
172
173 static GstPad *mysinkpad;
174
175 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
176     GST_PAD_SINK,
177     GST_PAD_ALWAYS,
178     GST_STATIC_CAPS_ANY);
179
180 static gboolean have_eos;
181 static GCond eos_cond;
182 static GMutex event_mutex;
183
184 static guchar *data;
185 static gsize data_size;
186
187 static gboolean
188 event_func (GstPad * pad, GstObject * parent, GstEvent * event)
189 {
190   gboolean res = TRUE;
191
192   g_mutex_lock (&event_mutex);
193   if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
194     have_eos = TRUE;
195     GST_DEBUG ("signal EOS");
196     g_cond_broadcast (&eos_cond);
197   }
198   g_mutex_unlock (&event_mutex);
199
200   gst_event_unref (event);
201
202   return res;
203 }
204
205 static GstElement *
206 setup_dataurisrc (void)
207 {
208   GstElement *dataurisrc;
209
210   g_cond_init (&eos_cond);
211   g_mutex_init (&event_mutex);
212   have_eos = FALSE;
213
214   dataurisrc = gst_check_setup_element ("dataurisrc");
215   mysinkpad = gst_check_setup_sink_pad (dataurisrc, &sinktemplate);
216   gst_pad_set_event_function (mysinkpad, event_func);
217   gst_pad_set_active (mysinkpad, TRUE);
218
219   return dataurisrc;
220 }
221
222 static void
223 cleanup_dataurisrc (GstElement * dataurisrc)
224 {
225   gst_check_drop_buffers ();
226   gst_pad_set_active (mysinkpad, FALSE);
227   gst_check_teardown_sink_pad (dataurisrc);
228   gst_check_teardown_element (dataurisrc);
229
230   g_cond_clear (&eos_cond);
231   g_mutex_clear (&event_mutex);
232 }
233
234 GST_START_TEST (test_dataurisrc_pull)
235 {
236   GstFlowReturn flow;
237   GstBuffer *buf1, *buf2;
238   GstElement *src;
239   GstQuery *seeking_query;
240   GstPad *src_pad;
241   gboolean seekable = FALSE;
242   gint64 start = -1, stop = -1;
243
244   data = g_base64_decode (data_uri + 22, &data_size);
245   fail_unless (data != NULL);
246
247   src = setup_dataurisrc ();
248
249   g_object_set (src, "uri", data_uri, NULL);
250
251   fail_unless_equals_int (gst_element_set_state (src, GST_STATE_READY),
252       GST_STATE_CHANGE_SUCCESS);
253
254   /* get the source pad */
255   src_pad = gst_element_get_static_pad (src, "src");
256   fail_unless (src_pad != NULL);
257
258   /* activate the pad in pull mode */
259   fail_unless (gst_pad_activate_mode (src_pad, GST_PAD_MODE_PULL, TRUE));
260
261   /* now start playing */
262   fail_unless_equals_int (gst_element_set_state (src, GST_STATE_PLAYING),
263       GST_STATE_CHANGE_SUCCESS);
264
265   /* Check that dataurisrc is seekable */
266   seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES);
267   fail_unless (gst_element_query (src, seeking_query) == TRUE);
268   gst_query_parse_seeking (seeking_query, NULL, &seekable, &start, &stop);
269   fail_unless (seekable == TRUE);
270   fail_unless_equals_int64 (start, 0);
271   fail_unless_equals_int64 (stop, data_size);
272   gst_query_unref (seeking_query);
273
274   seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES);
275   fail_unless (gst_pad_query (src_pad, seeking_query) == TRUE);
276   gst_query_parse_seeking (seeking_query, NULL, &seekable, &start, &stop);
277   fail_unless (seekable == TRUE);
278   fail_unless_equals_int64 (start, 0);
279   fail_unless_equals_int64 (stop, data_size);
280   gst_query_unref (seeking_query);
281
282   seeking_query = gst_query_new_seeking (GST_FORMAT_TIME);
283   fail_unless (gst_pad_query (src_pad, seeking_query) == FALSE);
284   gst_query_unref (seeking_query);
285
286   /* do some pulls */
287   buf1 = NULL;
288   flow = gst_pad_get_range (src_pad, 0, 100, &buf1);
289   fail_unless_equals_int (flow, GST_FLOW_OK);
290   fail_unless (buf1 != NULL);
291   fail_unless_equals_int (gst_buffer_get_size (buf1), 100);
292   fail_unless (gst_buffer_memcmp (buf1, 0, data, 100) == 0);
293
294   buf2 = NULL;
295   flow = gst_pad_get_range (src_pad, 0, 50, &buf2);
296   fail_unless_equals_int (flow, GST_FLOW_OK);
297   fail_unless (buf2 != NULL);
298   fail_unless_equals_int (gst_buffer_get_size (buf2), 50);
299   fail_unless (gst_buffer_memcmp (buf2, 0, data, 50) == 0);
300   gst_buffer_unref (buf2);
301   gst_buffer_unref (buf1);
302
303   /* read next 50 bytes */
304   buf2 = NULL;
305   flow = gst_pad_get_range (src_pad, 50, 50, &buf2);
306   fail_unless_equals_int (flow, GST_FLOW_OK);
307   fail_unless (buf2 != NULL);
308   fail_unless_equals_int (gst_buffer_get_size (buf2), 50);
309   fail_unless (gst_buffer_memcmp (buf2, 0, data + 50, 50) == 0);
310   gst_buffer_unref (buf2);
311
312   buf1 = NULL;
313   flow = gst_pad_get_range (src_pad, 1, 100, &buf1);
314   fail_unless_equals_int (flow, GST_FLOW_OK);
315   fail_unless (buf1 != NULL);
316   fail_unless_equals_int (gst_buffer_get_size (buf1), 100);
317   fail_unless (gst_buffer_memcmp (buf1, 0, data + 1, 100) == 0);
318   gst_buffer_unref (buf1);
319
320   buf1 = NULL;
321   flow = gst_pad_get_range (src_pad, 0, 999999, &buf1);
322   fail_unless_equals_int (flow, GST_FLOW_OK);
323   fail_unless (buf1 != NULL);
324   fail_unless_equals_int (gst_buffer_get_size (buf1), data_size);
325   fail_unless (gst_buffer_memcmp (buf1, 0, data, data_size) == 0);
326   gst_buffer_unref (buf1);
327
328   buf1 = NULL;
329   flow = gst_pad_get_range (src_pad, 50, 999999, &buf1);
330   fail_unless_equals_int (flow, GST_FLOW_OK);
331   fail_unless (buf1 != NULL);
332   fail_unless_equals_int (gst_buffer_get_size (buf1), data_size - 50);
333   fail_unless (gst_buffer_memcmp (buf1, 0, data + 50, data_size - 50) == 0);
334   gst_buffer_unref (buf1);
335
336   /* read 10 bytes at end-10 should give exactly 10 bytes */
337   buf1 = NULL;
338   flow = gst_pad_get_range (src_pad, data_size - 10, 10, &buf1);
339   fail_unless_equals_int (flow, GST_FLOW_OK);
340   fail_unless (buf1 != NULL);
341   fail_unless_equals_int (gst_buffer_get_size (buf1), 10);
342   gst_buffer_unref (buf1);
343
344   /* read 20 bytes at end-10 should give exactly 10 bytes */
345   buf1 = NULL;
346   flow = gst_pad_get_range (src_pad, data_size - 10, 20, &buf1);
347   fail_unless_equals_int (flow, GST_FLOW_OK);
348   fail_unless (buf1 != NULL);
349   fail_unless_equals_int (gst_buffer_get_size (buf1), 10);
350   gst_buffer_unref (buf1);
351
352   /* read 0 bytes at end-1 should return 0 bytes */
353   buf1 = NULL;
354   flow = gst_pad_get_range (src_pad, data_size - 1, 0, &buf1);
355   fail_unless_equals_int (flow, GST_FLOW_OK);
356   fail_unless (buf1 != NULL);
357   fail_unless_equals_int (gst_buffer_get_size (buf1), 0);
358   gst_buffer_unref (buf1);
359
360   /* read 10 bytes at end-1 should return 1 byte */
361   buf1 = NULL;
362   flow = gst_pad_get_range (src_pad, stop - 1, 10, &buf1);
363   fail_unless_equals_int (flow, GST_FLOW_OK);
364   fail_unless (buf1 != NULL);
365   fail_unless (gst_buffer_get_size (buf1) == 1);
366   gst_buffer_unref (buf1);
367
368   /* read 0 bytes at end should EOS */
369   buf1 = NULL;
370   flow = gst_pad_get_range (src_pad, data_size, 0, &buf1);
371   fail_unless_equals_int (flow, GST_FLOW_EOS);
372
373   /* read 10 bytes after end should EOS */
374   buf1 = NULL;
375   flow = gst_pad_get_range (src_pad, data_size, 10, &buf1);
376   fail_unless_equals_int (flow, GST_FLOW_EOS);
377
378   /* read 0 bytes after end should EOS */
379   buf1 = NULL;
380   flow = gst_pad_get_range (src_pad, data_size + 10, 0, &buf1);
381   fail_unless_equals_int (flow, GST_FLOW_EOS);
382
383   /* read 10 bytes after end should EOS too */
384   buf1 = NULL;
385   flow = gst_pad_get_range (src_pad, data_size + 10, 10, &buf1);
386   fail_unless_equals_int (flow, GST_FLOW_EOS);
387
388   fail_unless_equals_int (gst_element_set_state (src, GST_STATE_NULL),
389       GST_STATE_CHANGE_SUCCESS);
390
391   gst_object_unref (src_pad);
392   cleanup_dataurisrc (src);
393   g_free (data);
394 }
395
396 GST_END_TEST;
397
398 static GstBuffer *
399 dataurisrc_wait_for_eos_and_get_data_buffer (void)
400 {
401   GstBuffer *buf;
402
403   g_mutex_lock (&event_mutex);
404   while (!have_eos)
405     g_cond_wait (&eos_cond, &event_mutex);
406   g_mutex_unlock (&event_mutex);
407
408   buf = gst_buffer_new ();
409   while (buffers != NULL) {
410     buf = gst_buffer_append (buf, buffers->data);
411     buffers = g_list_delete_link (buffers, buffers);
412   }
413
414   return buf;
415 }
416
417 GST_START_TEST (test_dataurisrc_push)
418 {
419   GstElement *src;
420   GstBuffer *buf;
421
422   data = g_base64_decode (data_uri + 22, &data_size);
423   fail_unless (data != NULL);
424
425   src = setup_dataurisrc ();
426
427   g_object_set (src, "uri", data_uri, NULL);
428
429   fail_unless_equals_int (gst_element_set_state (src, GST_STATE_PLAYING),
430       GST_STATE_CHANGE_SUCCESS);
431
432   /* Everything */
433   buf = dataurisrc_wait_for_eos_and_get_data_buffer ();
434   fail_unless_equals_int (gst_buffer_get_size (buf), data_size);
435   fail_unless (gst_buffer_memcmp (buf, 0, data, data_size) == 0);
436   gst_buffer_unref (buf);
437
438   /* 500 - 1000 */
439   have_eos = FALSE;
440   gst_pad_push_event (mysinkpad,
441       gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH,
442           GST_SEEK_TYPE_SET, 500, GST_SEEK_TYPE_SET, 1000));
443
444   buf = dataurisrc_wait_for_eos_and_get_data_buffer ();
445   fail_unless_equals_int (gst_buffer_get_size (buf), 500);
446   fail_unless (gst_buffer_memcmp (buf, 0, data + 500, 500) == 0);
447   gst_buffer_unref (buf);
448
449   /* only start changed, stop kept the same (ie. 1000), so 1000-1000 now */
450   have_eos = FALSE;
451   gst_pad_push_event (mysinkpad,
452       gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH,
453           GST_SEEK_TYPE_SET, 1000, GST_SEEK_TYPE_NONE, -1));
454
455   buf = dataurisrc_wait_for_eos_and_get_data_buffer ();
456   fail_unless_equals_int (gst_buffer_get_size (buf), 0);
457   gst_buffer_unref (buf);
458
459   /* 1000-end */
460   have_eos = FALSE;
461   gst_pad_push_event (mysinkpad,
462       gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH,
463           GST_SEEK_TYPE_SET, 1000, GST_SEEK_TYPE_SET, -1));
464
465   buf = dataurisrc_wait_for_eos_and_get_data_buffer ();
466   fail_unless_equals_int (gst_buffer_get_size (buf), data_size - 1000);
467   fail_unless (gst_buffer_memcmp (buf, 0, data + 1000, data_size - 1000) == 0);
468   gst_buffer_unref (buf);
469
470   fail_unless_equals_int (gst_element_set_state (src, GST_STATE_NULL),
471       GST_STATE_CHANGE_SUCCESS);
472
473   cleanup_dataurisrc (src);
474   g_free (data);
475 }
476
477 GST_END_TEST;
478
479 GST_START_TEST (test_dataurisrc_uri_iface)
480 {
481   const gchar *const *protocols;
482   GstElement *src;
483   gchar *uri = NULL;
484
485   src = gst_element_factory_make ("dataurisrc", NULL);
486   fail_unless (gst_uri_handler_get_uri (GST_URI_HANDLER (src)) == NULL);
487   fail_unless_equals_int (gst_uri_handler_get_uri_type (GST_URI_HANDLER (src)),
488       GST_URI_SRC);
489   protocols = gst_uri_handler_get_protocols (GST_URI_HANDLER (src));
490   fail_unless (protocols != NULL && *protocols != NULL);
491 #if GLIB_CHECK_VERSION (2, 44, 0)
492   fail_unless (g_strv_contains (protocols, "data"));
493 #endif
494   fail_if (gst_uri_handler_set_uri (GST_URI_HANDLER (src), "file:///foo",
495           NULL));
496   fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (src), data_uri, NULL));
497   g_object_get (src, "uri", &uri, NULL);
498   fail_unless_equals_string (uri, data_uri);
499   g_free (uri);
500   uri = gst_uri_handler_get_uri (GST_URI_HANDLER (src));
501   fail_unless (uri, data_uri);
502   g_free (uri);
503   gst_object_unref (src);
504 }
505
506 GST_END_TEST;
507
508 GST_START_TEST (test_dataurisrc_from_uri)
509 {
510   GstElement *src, *sink;
511
512   sink = gst_element_make_from_uri (GST_URI_SINK, data_uri, NULL, NULL);
513   fail_unless (sink == NULL);
514
515   src = gst_element_make_from_uri (GST_URI_SRC, data_uri, NULL, NULL);
516   fail_unless (src != NULL);
517   gst_object_unref (src);
518 }
519
520 GST_END_TEST;
521
522 GST_START_TEST (test_dataurisrc_uris)
523 {
524 #define STRING_CONTENT(s) s, sizeof(s) - 1
525   static const struct
526   {
527     const char *name;
528     const char *uri;
529     const char *mimetype;
530     const char *contents;
531     gsize contents_len;
532   } tests[] = {
533     /* *INDENT-OFF* */
534     {"simple", "data:,HelloWorld", NULL, STRING_CONTENT ("HelloWorld")},
535     {"nodata", "data:,", NULL, STRING_CONTENT ("")},
536     {"case_sensitive", "dATa:,HelloWorld", NULL, STRING_CONTENT ("HelloWorld")},
537     {"semicolon_after_comma", "data:,;base64", NULL,
538         STRING_CONTENT (";base64")},
539     {"mimetype", "data:image/png,nopng", "image/png", STRING_CONTENT ("nopng")},
540     {"charset_base64",
541           "data:text/plain;charset=ISO-8859-5;base64,wOPh29DdILjW0ePb0OLe0g==",
542         "text/plain", STRING_CONTENT ("Руслан Ижбулатов")},
543     /* *INDENT-ON* */
544   };
545   gint i;
546 #undef STRING_CONTENT
547
548   for (i = 0; i < G_N_ELEMENTS (tests); i++) {
549     GstHarness *h;
550     GstElement *src;
551     GstBuffer *buf;
552
553     src = gst_element_factory_make ("dataurisrc", NULL);
554     g_object_set (src, "uri", tests[i].uri, NULL);
555     h = gst_harness_new_with_element (src, NULL, "src");
556     gst_harness_play (h);
557
558     buf = gst_harness_pull (h);
559     fail_unless (buf);
560
561     gst_check_buffer_data (buf, tests[i].contents, tests[i].contents_len);
562     gst_buffer_unref (buf);
563
564     gst_harness_teardown (h);
565     gst_object_unref (src);
566   }
567 }
568
569 GST_END_TEST;
570
571 static Suite *
572 dataurisrc_suite (void)
573 {
574   Suite *s = suite_create ("dataurisrc");
575   TCase *tc_chain = tcase_create ("general");
576
577   suite_add_tcase (s, tc_chain);
578
579   tcase_add_test (tc_chain, test_dataurisrc_pull);
580   tcase_add_test (tc_chain, test_dataurisrc_push);
581   tcase_add_test (tc_chain, test_dataurisrc_uri_iface);
582   tcase_add_test (tc_chain, test_dataurisrc_from_uri);
583   tcase_add_test (tc_chain, test_dataurisrc_uris);
584
585   return s;
586 }
587
588 GST_CHECK_MAIN (dataurisrc);