medialib: Split initialization in multiple steps
[vlc.git] / include / vlc_input.h
blob7d24f1183055ab05d5c3ccac929be1c3414220f5
1 /*****************************************************************************
2 * vlc_input.h: Core input structures
3 *****************************************************************************
4 * Copyright (C) 1999-2015 VLC authors and VideoLAN
6 * Authors: Christophe Massiot <massiot@via.ecp.fr>
7 * Laurent Aimar <fenrir@via.ecp.fr>
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 *****************************************************************************/
24 #ifndef VLC_INPUT_H
25 #define VLC_INPUT_H 1
27 /**
28 * \defgroup input Input
29 * \ingroup vlc
30 * Input thread
31 * @{
32 * \file
33 * Input thread interface
36 #include <vlc_es.h>
37 #include <vlc_meta.h>
38 #include <vlc_epg.h>
39 #include <vlc_events.h>
40 #include <vlc_input_item.h>
41 #include <vlc_vout.h>
42 #include <vlc_vout_osd.h>
44 #include <string.h>
46 typedef struct input_resource_t input_resource_t;
48 /*****************************************************************************
49 * Seek point: (generalisation of chapters)
50 *****************************************************************************/
51 struct seekpoint_t
53 vlc_tick_t i_time_offset;
54 char *psz_name;
57 static inline seekpoint_t *vlc_seekpoint_New( void )
59 seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) );
60 if( !point )
61 return NULL;
62 point->i_time_offset = -1;
63 point->psz_name = NULL;
64 return point;
67 static inline void vlc_seekpoint_Delete( seekpoint_t *point )
69 if( !point ) return;
70 free( point->psz_name );
71 free( point );
74 static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src )
76 seekpoint_t *point = vlc_seekpoint_New();
77 if( likely(point) )
79 if( src->psz_name ) point->psz_name = strdup( src->psz_name );
80 point->i_time_offset = src->i_time_offset;
82 return point;
85 /*****************************************************************************
86 * Title:
87 *****************************************************************************/
89 /* input_title_t.i_flags field */
90 #define INPUT_TITLE_MENU 0x01 /* Menu title */
91 #define INPUT_TITLE_INTERACTIVE 0x02 /* Interactive title. Playback position has no meaning. */
93 typedef struct input_title_t
95 char *psz_name;
97 vlc_tick_t i_length; /* Length(microsecond) if known, else 0 */
99 unsigned i_flags; /* Is it a menu or a normal entry */
101 /* Title seekpoint */
102 int i_seekpoint;
103 seekpoint_t **seekpoint;
104 } input_title_t;
106 static inline input_title_t *vlc_input_title_New(void)
108 input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) );
109 if( !t )
110 return NULL;
112 t->psz_name = NULL;
113 t->i_flags = 0;
114 t->i_length = 0;
115 t->i_seekpoint = 0;
116 t->seekpoint = NULL;
118 return t;
121 static inline void vlc_input_title_Delete( input_title_t *t )
123 int i;
124 if( t == NULL )
125 return;
127 free( t->psz_name );
128 for( i = 0; i < t->i_seekpoint; i++ )
129 vlc_seekpoint_Delete( t->seekpoint[i] );
130 free( t->seekpoint );
131 free( t );
134 static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t )
136 input_title_t *dup = vlc_input_title_New( );
137 if( dup == NULL) return NULL;
139 if( t->psz_name ) dup->psz_name = strdup( t->psz_name );
140 dup->i_flags = t->i_flags;
141 dup->i_length = t->i_length;
142 if( t->i_seekpoint > 0 )
144 dup->seekpoint = (seekpoint_t**)vlc_alloc( t->i_seekpoint, sizeof(seekpoint_t*) );
145 if( likely(dup->seekpoint) )
147 for( int i = 0; i < t->i_seekpoint; i++ )
148 dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] );
149 dup->i_seekpoint = t->i_seekpoint;
153 return dup;
156 /*****************************************************************************
157 * Attachments
158 *****************************************************************************/
159 struct input_attachment_t
161 char *psz_name;
162 char *psz_mime;
163 char *psz_description;
165 size_t i_data;
166 void *p_data;
169 static inline void vlc_input_attachment_Delete( input_attachment_t *a )
171 if( !a )
172 return;
174 free( a->p_data );
175 free( a->psz_description );
176 free( a->psz_mime );
177 free( a->psz_name );
178 free( a );
181 static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name,
182 const char *psz_mime,
183 const char *psz_description,
184 const void *p_data,
185 size_t i_data )
187 input_attachment_t *a = (input_attachment_t *)malloc( sizeof (*a) );
188 if( unlikely(a == NULL) )
189 return NULL;
191 a->psz_name = strdup( psz_name ? psz_name : "" );
192 a->psz_mime = strdup( psz_mime ? psz_mime : "" );
193 a->psz_description = strdup( psz_description ? psz_description : "" );
194 a->i_data = i_data;
195 a->p_data = malloc( i_data );
196 if( i_data > 0 && likely(a->p_data != NULL) )
197 memcpy( a->p_data, p_data, i_data );
199 if( unlikely(a->psz_name == NULL || a->psz_mime == NULL
200 || a->psz_description == NULL || (i_data > 0 && a->p_data == NULL)) )
202 vlc_input_attachment_Delete( a );
203 a = NULL;
205 return a;
208 static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a )
210 return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description,
211 a->p_data, a->i_data );
215 * Input rate.
217 * It is an float used by the variable "rate" in the
218 * range [INPUT_RATE_MIN, INPUT_RATE_MAX]
219 * the default value being 1.f. It represents the ratio of playback speed to
220 * nominal speed (bigger is faster).
224 * Minimal rate value
226 #define INPUT_RATE_MIN 0.03125f
228 * Maximal rate value
230 #define INPUT_RATE_MAX 31.25f
232 /** @} */
233 #endif