demux: mp4: set bitmap mask when possible
[vlc.git] / src / input / services_discovery.c
blob7d43e4ee7abd6aa0f793ebc75adb493139fe8802
1 /*****************************************************************************
2 * services_discovery.c : Manage playlist services_discovery modules
3 *****************************************************************************
4 * Copyright (C) 1999-2004 VLC authors and VideoLAN
5 * $Id$
7 * Authors: Clément Stenac <zorglub@videolan.org>
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation; either version 2.1 of the License, or
12 * (at your option) any later version.
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. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this program; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
23 #ifdef HAVE_CONFIG_H
24 # include "config.h"
25 #endif
26 #include <assert.h>
28 #include <vlc_common.h>
29 #include <vlc_services_discovery.h>
30 #include <vlc_probe.h>
31 #include <vlc_modules.h>
32 #include "../libvlc.h"
34 typedef struct
36 char *name;
37 char *longname;
38 int category;
39 } vlc_sd_probe_t;
41 int vlc_sd_probe_Add (vlc_probe_t *probe, const char *name,
42 const char *longname, int category)
44 vlc_sd_probe_t names = { strdup(name), strdup(longname), category };
46 if (unlikely (names.name == NULL || names.longname == NULL
47 || vlc_probe_add (probe, &names, sizeof (names))))
49 free (names.name);
50 free (names.longname);
51 return VLC_ENOMEM;
53 return VLC_PROBE_CONTINUE;
56 #undef vlc_sd_GetNames
58 /**
59 * Gets the list of available services discovery plugins.
61 char **vlc_sd_GetNames (vlc_object_t *obj, char ***pppsz_longnames, int **pp_categories)
63 size_t count;
64 vlc_sd_probe_t *tab = vlc_probe (obj, "services probe", &count);
66 if (count == 0)
68 free (tab);
69 return NULL;
72 char **names = vlc_alloc (count + 1, sizeof(char *));
73 char **longnames = vlc_alloc (count + 1, sizeof(char *));
74 int *categories = vlc_alloc (count + 1, sizeof(int));
76 if (unlikely (names == NULL || longnames == NULL || categories == NULL))
78 free(names);
79 free(longnames);
80 free(categories);
81 free(tab);
82 return NULL;
84 for( size_t i = 0; i < count; i++ )
86 names[i] = tab[i].name;
87 longnames[i] = tab[i].longname;
88 categories[i] = tab[i].category;
90 free (tab);
91 names[count] = longnames[count] = NULL;
92 categories[count] = 0;
93 *pppsz_longnames = longnames;
94 if( pp_categories ) *pp_categories = categories;
95 else free( categories );
96 return names;
100 * Services discovery
101 * Basically you just listen to Service discovery event through the
102 * sd's event manager.
103 * That's how the playlist get's Service Discovery information
106 #undef vlc_sd_Create
107 services_discovery_t *vlc_sd_Create(vlc_object_t *parent, const char *cfg,
108 const struct services_discovery_owner_t *restrict owner)
110 services_discovery_t *sd = vlc_custom_create(parent, sizeof (*sd),
111 "services discovery");
112 if (unlikely(sd == NULL))
113 return NULL;
115 free(config_ChainCreate(&sd->psz_name, &sd->p_cfg, cfg));
116 sd->description = NULL;
117 sd->owner = *owner;
119 sd->p_module = module_need(sd, "services_discovery",
120 sd->psz_name, true);
121 if (sd->p_module == NULL)
123 msg_Err(sd, "no suitable services discovery module");
124 vlc_sd_Destroy(sd);
125 sd = NULL;
128 return sd;
131 void vlc_sd_Destroy(services_discovery_t *sd)
133 if (sd->p_module != NULL)
134 module_unneed(sd, sd->p_module);
135 config_ChainDestroy(sd->p_cfg);
136 free(sd->psz_name);
137 vlc_object_release(sd);