]> git.sesse.net Git - vlc/blob - include/vlc_vlm.h
Document more VLM API's and expand define.
[vlc] / include / vlc_vlm.h
1 /*****************************************************************************
2  * vlc_vlm.h: VLM core structures
3  *****************************************************************************
4  * Copyright (C) 2000, 2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Simon Latapie <garf@videolan.org>
8  *          Laurent Aimar <fenrir@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #ifndef VLC_VLM_H
26 #define VLC_VLM_H 1
27
28 /**
29  * \file
30  * This file defines VLM core functions and structures in vlc
31  */
32
33 #include <vlc_input.h>
34
35 /**
36  * \defgroup server VLM
37  * VLM is the server core in vlc that allows streaming of multiple media streams
38  * at the same time. It provides broadcast, schedule and video on demand features
39  * for streaming using several streaming and network protocols.
40  * @{
41  */
42
43 /** VLM media */
44 typedef struct
45 {
46     int64_t     id;     /*< numeric id for vlm_media_t item */
47     bool  b_enabled;    /*< vlm_media_t is enabled */
48
49     char *psz_name;     /*< descriptive name of vlm_media_t item */
50
51     int  i_input;       /*< number of input options */
52     char **ppsz_input;  /*< array of input options */
53
54     int  i_option;      /*< number of output options */
55     char **ppsz_option; /*< array of output options */
56
57     char *psz_output;   /*< */
58
59     bool b_vod;         /*< vlm_media_t is of type VOD */
60     struct
61     {
62         bool b_loop;    /*< this vlc_media_t broadcast item should loop */
63     } broadcast;        /*< Broadcast specific information */
64     struct
65     {
66         char *psz_mux;  /*< name of muxer to use */
67     } vod;              /*< VOD specific information */
68
69 } vlm_media_t;
70
71 /** VLM media instance */
72 typedef struct
73 {
74     char *psz_name;         /*< vlm media instance descriptive name */
75
76     int64_t     i_time;     /*< vlm media instance vlm media current time */
77     int64_t     i_length;   /*< vlm media instance vlm media item length */
78     double      d_position; /*< vlm media instance position in stream */
79     bool        b_paused;   /*< vlm media instance is paused */
80     int         i_rate;     // normal is INPUT_RATE_DEFAULT
81 } vlm_media_instance_t;
82
83 #if 0
84 typedef struct
85 {
86
87 } vlm_schedule_t
88 #endif
89
90 /** VLM control query */
91 enum vlm_query_e
92 {
93     /* --- Media control */
94     /* Get all medias */
95     VLM_GET_MEDIAS,                     /* arg1=vlm_media_t ***, int *pi_media      */
96     /* Delete all medias */
97     VLM_CLEAR_MEDIAS,                   /* no arg */
98
99     /* Add a new media */
100     VLM_ADD_MEDIA,                      /* arg1=vlm_media_t* arg2=int64_t *p_id         res=can fail */
101     /* Delete an existing media */
102     VLM_DEL_MEDIA,                      /* arg1=int64_t id */
103     /* Change properties of an existing media (all fields but id and b_vod) */
104     VLM_CHANGE_MEDIA,                   /* arg1=vlm_media_t*                            res=can fail */
105     /* Get 1 media by it's ID */
106     VLM_GET_MEDIA,                      /* arg1=int64_t id arg2=vlm_media_t **  */
107     /* Get media ID from its name */
108     VLM_GET_MEDIA_ID,                   /* arg1=const char *psz_name arg2=int64_t*  */
109
110     /* Media instance control XXX VOD control are for internal use only */
111     /* Get all media instances */
112     VLM_GET_MEDIA_INSTANCES,            /* arg1=int64_t id arg2=vlm_media_instance_t *** arg3=int *pi_instance */
113     /* Delete all media instances */
114     VLM_CLEAR_MEDIA_INSTANCES,          /* arg1=int64_t id */
115     /* Control broadcast instance */
116     VLM_START_MEDIA_BROADCAST_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index  res=can fail */
117     /* Control VOD instance */
118     VLM_START_MEDIA_VOD_INSTANCE,       /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index char *psz_vod_output res=can fail */
119     /* Stop an instance */
120     VLM_STOP_MEDIA_INSTANCE,            /* arg1=int64_t id, arg2=const char *psz_instance_name      res=can fail */
121     /* Pause an instance */
122     VLM_PAUSE_MEDIA_INSTANCE,           /* arg1=int64_t id, arg2=const char *psz_instance_name      res=can fail */
123     /* Get instance position time (in microsecond) */
124     VLM_GET_MEDIA_INSTANCE_TIME,        /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t *   */
125     /* Set instance position time (in microsecond) */
126     VLM_SET_MEDIA_INSTANCE_TIME,        /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t     */
127     /* Get instance position ([0.0 .. 1.0]) */
128     VLM_GET_MEDIA_INSTANCE_POSITION,    /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double *   */
129     /* Set instance position ([0.0 .. 1.0]) */
130     VLM_SET_MEDIA_INSTANCE_POSITION,    /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double     */
131
132     /* Schedule control */
133     VLM_CLEAR_SCHEDULES,                /* no arg */
134     /* TODO: missing schedule control */
135
136     /* */
137 };
138
139
140 /* VLM specific - structures and functions */
141
142 /* ok, here is the structure of a vlm_message:
143    The parent node is ( name_of_the_command , NULL ), or
144    ( name_of_the_command , message_error ) on error.
145    If a node has children, it should not have a value (=NULL).*/
146 struct vlm_message_t
147 {
148     char *psz_name;         /*< message name */
149     char *psz_value;        /*< message value */
150
151     int           i_child;  /*< number of child messages */
152     vlm_message_t **child;  /*< array of vlm_message_t */
153 };
154
155
156 #ifdef __cpluplus
157 extern "C" {
158 #endif
159
160 #define vlm_New( a ) __vlm_New( VLC_OBJECT(a) )
161 VLC_EXPORT( vlm_t *, __vlm_New, ( vlc_object_t * ) );
162 VLC_EXPORT( void,      vlm_Delete, ( vlm_t * ) );
163 VLC_EXPORT( int,       vlm_ExecuteCommand, ( vlm_t *, const char *, vlm_message_t ** ) );
164 VLC_EXPORT( int,       vlm_Control, ( vlm_t *p_vlm, int i_query, ... ) );
165
166 VLC_EXPORT( vlm_message_t *, vlm_MessageNew, ( const char *, const char *, ... ) LIBVLC_FORMAT( 2, 3 ) );
167 VLC_EXPORT( vlm_message_t *, vlm_MessageAdd, ( vlm_message_t *, vlm_message_t * ) );
168 VLC_EXPORT( void,            vlm_MessageDelete, ( vlm_message_t * ) );
169
170 /* media helpers */
171
172 /**
173  * Initialize a vlm_media_t instance
174  * \param p_media vlm_media_t instance to initialize
175  */
176 static inline void vlm_media_Init( vlm_media_t *p_media )
177 {
178     memset( p_media, 0, sizeof(vlm_media_t) );
179     p_media->id = 0;    // invalid id
180     p_media->psz_name = NULL;
181     TAB_INIT( p_media->i_input, p_media->ppsz_input );
182     TAB_INIT( p_media->i_option, p_media->ppsz_option );
183     p_media->psz_output = NULL;
184     p_media->b_vod = false;
185
186     p_media->vod.psz_mux = NULL;
187     p_media->broadcast.b_loop = false;
188 }
189
190 /**
191  * Copy a vlm_media_t instance into another vlm_media_t instance
192  * \param p_dst vlm_media_t instance to copy to
193  * \param p_src vlm_media_t instance to copy from
194  */
195 static inline void vlm_media_Copy( vlm_media_t *p_dst, vlm_media_t *p_src )
196 {
197     int i;
198
199     memset( p_dst, 0, sizeof(vlm_media_t) );
200     p_dst->id = p_src->id;
201     p_dst->b_enabled = p_src->b_enabled;
202     if( p_src->psz_name )
203         p_dst->psz_name = strdup( p_src->psz_name );
204
205     for( i = 0; i < p_src->i_input; i++ )
206         TAB_APPEND_CPP( char, p_dst->i_input, p_dst->ppsz_input, strdup(p_src->ppsz_input[i]) );
207     for( i = 0; i < p_src->i_option; i++ )
208         TAB_APPEND_CPP( char, p_dst->i_option, p_dst->ppsz_option, strdup(p_src->ppsz_option[i]) );
209
210     if( p_src->psz_output )
211         p_dst->psz_output = strdup( p_src->psz_output );
212
213     p_dst->b_vod = p_src->b_vod;
214     if( p_src->b_vod )
215     {
216         if( p_src->vod.psz_mux )
217             p_dst->vod.psz_mux = strdup( p_src->vod.psz_mux );
218     }
219     else
220     {
221         p_dst->broadcast.b_loop = p_src->broadcast.b_loop;
222     }
223 }
224
225 /**
226  * Cleanup and release memory associated with this vlm_media_t instance.
227  * You still need to release p_media itself with vlm_media_Delete().
228  * \param p_media vlm_media_t to cleanup
229  */
230 static inline void vlm_media_Clean( vlm_media_t *p_media )
231 {
232     int i;
233     free( p_media->psz_name );
234
235     for( i = 0; i < p_media->i_input; i++ )
236         free( p_media->ppsz_input[i]) ;
237     TAB_CLEAN(p_media->i_input, p_media->ppsz_input );
238
239     for( i = 0; i < p_media->i_option; i++ )
240         free( p_media->ppsz_option[i]) ;
241     TAB_CLEAN(p_media->i_option, p_media->ppsz_option );
242
243     free( p_media->psz_output );
244     if( p_media->b_vod )
245         free( p_media->vod.psz_mux );
246 }
247
248 /**
249  * Allocate a new vlm_media_t instance
250  * \return vlm_media_t instance
251  */
252 static inline vlm_media_t *vlm_media_New(void)
253 {
254     vlm_media_t *p_media = (vlm_media_t *)malloc( sizeof(vlm_media_t) );
255     if( p_media )
256         vlm_media_Init( p_media );
257     return p_media;
258 }
259
260 /**
261  * Delete a vlm_media_t instance
262  * \param p_media vlm_media_t instance to delete
263  */
264 static inline void vlm_media_Delete( vlm_media_t *p_media )
265 {
266     vlm_media_Clean( p_media );
267     free( p_media );
268 }
269
270 /**
271  * Copy a vlm_media_t instance
272  * \param p_src vlm_media_t instance to copy
273  * \return vlm_media_t duplicate of p_src
274  */
275 static inline vlm_media_t *vlm_media_Duplicate( vlm_media_t *p_src )
276 {
277     vlm_media_t *p_dst = vlm_media_New();
278     if( p_dst )
279         vlm_media_Copy( p_dst, p_src );
280     return p_dst;
281 }
282
283 /* media instance helpers */
284 /**
285  * Initialize vlm_media_instance_t
286  * \param p_instance vlm_media_instance_t to initialize
287  */
288 static inline void vlm_media_instance_Init( vlm_media_instance_t *p_instance )
289 {
290     memset( p_instance, 0, sizeof(vlm_media_instance_t) );
291     p_instance->psz_name = NULL;
292     p_instance->i_time = 0;
293     p_instance->i_length = 0;
294     p_instance->d_position = 0.0;
295     p_instance->b_paused = false;
296     p_instance->i_rate = INPUT_RATE_DEFAULT;
297 }
298
299 /**
300  * Cleanup vlm_media_instance_t
301  * \param p_instance vlm_media_instance_t to cleanup
302  */
303 static inline void vlm_media_instance_Clean( vlm_media_instance_t *p_instance )
304 {
305     free( p_instance->psz_name );
306 }
307
308 /**
309  * Allocate a new vlm_media_instance_t
310  * \return a new vlm_media_instance_t
311  */
312 static inline vlm_media_instance_t *vlm_media_instance_New(void)
313 {
314     vlm_media_instance_t *p_instance = (vlm_media_instance_t *) malloc( sizeof(vlm_media_instance_t) );
315     if( p_instance )
316         vlm_media_instance_Init( p_instance );
317     return p_instance;
318 }
319
320 /**
321  * Delete a vlm_media_instance_t
322  * \param p_instance vlm_media_instance_t to delete
323  */
324 static inline void vlm_media_instance_Delete( vlm_media_instance_t *p_instance )
325 {
326     vlm_media_instance_Clean( p_instance );
327     free( p_instance );
328 }
329
330 #ifdef __cpluplus
331 }
332 #endif
333
334 /**@}*/
335
336 #endif