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 *****************************************************************************/
28 * \defgroup input Input
33 * Input thread interface
39 #include <vlc_input_item.h>
41 #include <vlc_vout_osd.h>
45 typedef struct input_resource_t input_resource_t
;
47 /*****************************************************************************
48 * Seek point: (generalisation of chapters)
49 *****************************************************************************/
52 vlc_tick_t i_time_offset
;
56 static inline seekpoint_t
*vlc_seekpoint_New( void )
58 seekpoint_t
*point
= (seekpoint_t
*)malloc( sizeof( seekpoint_t
) );
61 point
->i_time_offset
= -1;
62 point
->psz_name
= NULL
;
66 static inline void vlc_seekpoint_Delete( seekpoint_t
*point
)
69 free( point
->psz_name
);
73 static inline seekpoint_t
*vlc_seekpoint_Duplicate( const seekpoint_t
*src
)
75 seekpoint_t
*point
= vlc_seekpoint_New();
78 if( src
->psz_name
) point
->psz_name
= strdup( src
->psz_name
);
79 point
->i_time_offset
= src
->i_time_offset
;
84 /*****************************************************************************
86 *****************************************************************************/
88 /* input_title_t.i_flags field */
89 #define INPUT_TITLE_MENU 0x01 /* Menu title */
90 #define INPUT_TITLE_INTERACTIVE 0x02 /* Interactive title. Playback position has no meaning. */
92 typedef struct input_title_t
96 vlc_tick_t i_length
; /* Length(microsecond) if known, else 0 */
98 unsigned i_flags
; /* Is it a menu or a normal entry */
100 /* Title seekpoint */
102 seekpoint_t
**seekpoint
;
105 static inline input_title_t
*vlc_input_title_New(void)
107 input_title_t
*t
= (input_title_t
*)malloc( sizeof( input_title_t
) );
120 static inline void vlc_input_title_Delete( input_title_t
*t
)
127 for( i
= 0; i
< t
->i_seekpoint
; i
++ )
128 vlc_seekpoint_Delete( t
->seekpoint
[i
] );
129 free( t
->seekpoint
);
133 static inline input_title_t
*vlc_input_title_Duplicate( const input_title_t
*t
)
135 input_title_t
*dup
= vlc_input_title_New( );
136 if( dup
== NULL
) return NULL
;
138 if( t
->psz_name
) dup
->psz_name
= strdup( t
->psz_name
);
139 dup
->i_flags
= t
->i_flags
;
140 dup
->i_length
= t
->i_length
;
141 if( t
->i_seekpoint
> 0 )
143 dup
->seekpoint
= (seekpoint_t
**)vlc_alloc( t
->i_seekpoint
, sizeof(seekpoint_t
*) );
144 if( likely(dup
->seekpoint
) )
146 for( int i
= 0; i
< t
->i_seekpoint
; i
++ )
147 dup
->seekpoint
[i
] = vlc_seekpoint_Duplicate( t
->seekpoint
[i
] );
148 dup
->i_seekpoint
= t
->i_seekpoint
;
155 /*****************************************************************************
157 *****************************************************************************/
158 struct input_attachment_t
162 char *psz_description
;
168 static inline void vlc_input_attachment_Delete( input_attachment_t
*a
)
174 free( a
->psz_description
);
180 static inline input_attachment_t
*vlc_input_attachment_New( const char *psz_name
,
181 const char *psz_mime
,
182 const char *psz_description
,
186 input_attachment_t
*a
= (input_attachment_t
*)malloc( sizeof (*a
) );
187 if( unlikely(a
== NULL
) )
190 a
->psz_name
= strdup( psz_name
? psz_name
: "" );
191 a
->psz_mime
= strdup( psz_mime
? psz_mime
: "" );
192 a
->psz_description
= strdup( psz_description
? psz_description
: "" );
194 a
->p_data
= malloc( i_data
);
195 if( i_data
> 0 && likely(a
->p_data
!= NULL
) )
196 memcpy( a
->p_data
, p_data
, i_data
);
198 if( unlikely(a
->psz_name
== NULL
|| a
->psz_mime
== NULL
199 || a
->psz_description
== NULL
|| (i_data
> 0 && a
->p_data
== NULL
)) )
201 vlc_input_attachment_Delete( a
);
207 static inline input_attachment_t
*vlc_input_attachment_Duplicate( const input_attachment_t
*a
)
209 return vlc_input_attachment_New( a
->psz_name
, a
->psz_mime
, a
->psz_description
,
210 a
->p_data
, a
->i_data
);
216 * It is an float used by the variable "rate" in the
217 * range [INPUT_RATE_MIN, INPUT_RATE_MAX]
218 * the default value being 1.f. It represents the ratio of playback speed to
219 * nominal speed (bigger is faster).
225 #define INPUT_RATE_MIN 0.03125f
229 #define INPUT_RATE_MAX 31.25f