test/media: remove libjpeg dependency
[vlc.git] / test / libvlc / media.c
1 /*
2  * media_player.c - libvlc smoke test
3  *
4  * $Id$
5  */
6
7 /**********************************************************************
8  *  Copyright (C) 2010 Pierre d'Herbemont.                            *
9  *  This program is free software; you can redistribute and/or modify *
10  *  it under the terms of the GNU General Public License as published *
11  *  by the Free Software Foundation; version 2 of the license, or (at *
12  *  your option) any later version.                                   *
13  *                                                                    *
14  *  This program is distributed in the hope that it will be useful,   *
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of    *
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.              *
17  *  See the GNU General Public License for more details.              *
18  *                                                                    *
19  *  You should have received a copy of the GNU General Public License *
20  *  along with this program; if not, you can get it from:             *
21  *  http://www.gnu.org/copyleft/gpl.html                              *
22  **********************************************************************/
23
24 #include "test.h"
25 #include "../lib/libvlc_internal.h"
26
27 #include <sys/types.h>
28 #include <sys/stat.h>
29 #include <fcntl.h>
30
31 #include <vlc_threads.h>
32
33 static void media_parse_ended(const libvlc_event_t *event, void *user_data)
34 {
35     (void)event;
36     vlc_sem_t *sem = user_data;
37     vlc_sem_post (sem);
38 }
39
40 static void test_media_preparsed(const char** argv, int argc)
41 {
42     // We use this image file because "empty.voc" has no track.
43     const char * file = SRCDIR"/samples/image.jpg";
44
45     log ("Testing set_media\n");
46
47     libvlc_instance_t *vlc = libvlc_new (argc, argv);
48     assert (vlc != NULL);
49
50     libvlc_media_t *media = libvlc_media_new_path (vlc, file);
51     assert (media != NULL);
52
53     vlc_sem_t sem;
54     vlc_sem_init (&sem, 0);
55
56     // Check to see if we are properly receiving the event.
57     libvlc_event_manager_t *em = libvlc_media_event_manager (media);
58     libvlc_event_attach (em, libvlc_MediaParsedStatus, media_parse_ended, &sem);
59
60     // Parse the media. This is synchronous.
61     int i_ret = libvlc_media_parse_with_options(media, libvlc_media_parse_local);
62     assert(i_ret == 0);
63
64     // Wait for preparsed event
65     vlc_sem_wait (&sem);
66     vlc_sem_destroy (&sem);
67
68     // We are good, now check Elementary Stream info.
69     assert (libvlc_media_get_parsed_status(media) == libvlc_media_parse_done);
70
71     libvlc_media_release (media);
72     libvlc_release (vlc);
73 }
74
75 #define TEST_SUBITEMS_COUNT 6
76 struct
77 {
78     const char *file;
79     libvlc_media_type_t type;
80 } test_media_subitems_list[TEST_SUBITEMS_COUNT] =
81 {
82     { "directory", libvlc_media_type_directory, },
83     { "file.jpg", libvlc_media_type_file },
84     { "file.mkv", libvlc_media_type_file },
85     { "file.mp3", libvlc_media_type_file },
86     { "file.png", libvlc_media_type_file },
87     { "file.ts", libvlc_media_type_file },
88 };
89
90 static void subitem_parse_ended(const libvlc_event_t *event, void *user_data)
91 {
92     (void)event;
93     vlc_sem_t *sem = user_data;
94     vlc_sem_post (sem);
95 }
96
97 static void subitem_added(const libvlc_event_t *event, void *user_data)
98 {
99 #ifdef _WIN32
100 #define FILE_SEPARATOR   '\\'
101 #else
102 #define FILE_SEPARATOR   '/'
103 #endif
104     bool *subitems_found = user_data;
105     libvlc_media_t *m = event->u.media_subitem_added.new_child;
106     assert (m);
107
108     char *mrl = libvlc_media_get_mrl (m);
109     assert (mrl);
110
111     const char *file = strrchr (mrl, FILE_SEPARATOR);
112     assert (file);
113     file++;
114     log ("subitem_added, file: %s\n", file);
115
116     for (unsigned i = 0; i < TEST_SUBITEMS_COUNT; ++i)
117     {
118         if (strcmp (test_media_subitems_list[i].file, file) == 0)
119         {
120             assert (!subitems_found[i]);
121             assert (libvlc_media_get_type(m) == test_media_subitems_list[i].type);
122             subitems_found[i] = true;
123         }
124     }
125     free (mrl);
126 #undef FILE_SEPARATOR
127 }
128
129 static void test_media_subitems_media(libvlc_media_t *media, bool play)
130 {
131     libvlc_media_add_option(media, ":ignore-filetypes= ");
132
133     bool subitems_found[TEST_SUBITEMS_COUNT] = { 0 };
134     vlc_sem_t sem;
135     vlc_sem_init (&sem, 0);
136
137     libvlc_event_manager_t *em = libvlc_media_event_manager (media);
138     libvlc_event_attach (em, libvlc_MediaSubItemAdded, subitem_added, subitems_found);
139
140     if (play)
141     {
142         /* XXX: libvlc_media_parse_with_options won't work with fd, since it
143          * won't be preparsed because fd:// is an unknown type, so play the
144          * file to force parsing. */
145         libvlc_event_attach (em, libvlc_MediaSubItemTreeAdded, subitem_parse_ended, &sem);
146
147         libvlc_media_player_t *mp = libvlc_media_player_new_from_media (media);
148         assert (mp);
149         assert (libvlc_media_player_play (mp) != -1);
150         vlc_sem_wait (&sem);
151         libvlc_media_player_release (mp);
152     }
153     else
154     {
155         libvlc_event_attach (em, libvlc_MediaParsedStatus, subitem_parse_ended, &sem);
156
157         int i_ret = libvlc_media_parse_with_options(media, libvlc_media_parse_local);
158         assert(i_ret == 0);
159         vlc_sem_wait (&sem);
160     }
161
162     vlc_sem_destroy (&sem);
163
164     for (unsigned i = 0; i < TEST_SUBITEMS_COUNT; ++i)
165     {
166         log ("test if %s was added\n", test_media_subitems_list[i].file);
167         assert (subitems_found[i]);
168     }
169 }
170
171 static void test_media_subitems(const char** argv, int argc)
172 {
173     const char *subitems_path = SRCDIR"/samples/subitems";
174
175     libvlc_instance_t *vlc = libvlc_new (argc, argv);
176     assert (vlc != NULL);
177     libvlc_media_t *media;
178
179     log ("Testing media_subitems: path: '%s'\n", subitems_path);
180     media = libvlc_media_new_path (vlc, subitems_path);
181     assert (media != NULL);
182     test_media_subitems_media (media, false);
183     libvlc_media_release (media);
184
185     #define NB_LOCATIONS 2
186     char *subitems_realpath = realpath (subitems_path, NULL);
187     assert (subitems_realpath != NULL);
188     const char *schemes[NB_LOCATIONS] = { "file://", "dir://" };
189     for (unsigned i = 0; i < NB_LOCATIONS; ++i)
190     {
191         char *location;
192         assert (asprintf (&location, "%s%s", schemes[i], subitems_realpath) != -1);
193         log ("Testing media_subitems: location: '%s'\n", location);
194         media = libvlc_media_new_location (vlc, location);
195         assert (media != NULL);
196         test_media_subitems_media (media, false);
197         free (location);
198         libvlc_media_release (media);
199     }
200     free (subitems_realpath);
201
202 #ifdef HAVE_OPENAT
203     /* listing directory via a fd works only if HAVE_OPENAT is defined */
204     int fd = open (subitems_path, O_RDONLY);
205     log ("Testing media_subitems: fd: '%d'\n", fd);
206     assert (fd >= 0);
207     media = libvlc_media_new_fd (vlc, fd);
208     assert (media != NULL);
209     test_media_subitems_media (media, true);
210     libvlc_media_release (media);
211     close (fd);
212 #else
213 #warning not testing subitems list via a fd location
214 #endif
215
216     libvlc_release (vlc);
217 }
218
219 int main (void)
220 {
221     test_init();
222
223     test_media_preparsed (test_defaults_args, test_defaults_nargs);
224     test_media_subitems (test_defaults_args, test_defaults_nargs);
225
226     return 0;
227 }