1 /*****************************************************************************
2 * util.c: Utility functions and exceptions management
3 *****************************************************************************
4 * Copyright (C) 2005 the VideoLAN team
7 * Authors: Olivier Aubert <olivier.aubert@liris.univ-lyon1.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 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 General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
28 #include "mediacontrol_internal.h"
29 #include <vlc/mediacontrol.h>
31 #include <vlc_common.h>
35 #include <stdlib.h> /* malloc(), free() */
38 #include <errno.h> /* ENOMEM */
45 #ifdef HAVE_SYS_TIME_H
46 # include <sys/time.h>
48 #ifdef HAVE_SYS_TYPES_H
49 # include <sys/types.h>
52 libvlc_time_t
private_mediacontrol_unit_convert( libvlc_media_player_t
*p_media_player
,
53 mediacontrol_PositionKey from
,
54 mediacontrol_PositionKey to
,
65 case mediacontrol_MediaTime
:
66 if( to
== mediacontrol_ByteCount
)
68 /* FIXME Unsupported */
70 /* return value * 50 * p_input->stream.i_mux_rate / 1000; */
73 if( to
== mediacontrol_SampleCount
)
76 libvlc_exception_t ex
;
77 libvlc_exception_init( &ex
);
79 f_fps
= libvlc_media_player_get_rate( p_media_player
, &ex
);
83 return( value
* f_fps
/ 1000.0 );
86 /* See http://catb.org/~esr/jargon/html/entry/can-t-happen.html */
89 case mediacontrol_SampleCount
:
92 libvlc_exception_t ex
;
93 libvlc_exception_init( &ex
);
95 f_fps
= libvlc_media_player_get_rate( p_media_player
, &ex
);
99 if( to
== mediacontrol_ByteCount
)
103 /* return ( int64_t )( value * 50 * p_input->stream.i_mux_rate / f_fps ); */
107 if( to
== mediacontrol_MediaTime
)
108 return( int64_t )( value
* 1000.0 / ( double )f_fps
);
113 case mediacontrol_ByteCount
:
121 /* Converts a mediacontrol_Position into a time in microseconds in
124 private_mediacontrol_position2microsecond( libvlc_media_player_t
* p_media_player
,
125 const mediacontrol_Position
* pos
)
127 switch( pos
->origin
)
129 case mediacontrol_AbsolutePosition
:
130 return ( 1000 * private_mediacontrol_unit_convert( p_media_player
,
132 mediacontrol_MediaTime
, /* to */
135 case mediacontrol_RelativePosition
:
137 libvlc_time_t l_time
= 0;
138 libvlc_time_t l_pos
= 0;
139 libvlc_exception_t ex
;
140 libvlc_exception_init( &ex
);
142 l_time
= libvlc_media_player_get_time( p_media_player
, &ex
);
143 /* Ignore exception, we will assume a 0 time value */
145 l_pos
= 1000 * private_mediacontrol_unit_convert( p_media_player
,
147 mediacontrol_MediaTime
,
149 return l_time
+ l_pos
;
152 case mediacontrol_ModuloPosition
:
154 libvlc_time_t l_time
= 0;
155 libvlc_time_t l_length
= 0;
156 libvlc_time_t l_pos
= 0;
157 libvlc_exception_t ex
;
158 libvlc_exception_init( &ex
);
160 l_length
= libvlc_media_player_get_length( p_media_player
, &ex
);
164 l_time
= libvlc_media_player_get_time( p_media_player
, &ex
);
165 /* Ignore exception, we will assume a 0 time value */
167 l_pos
= ( 1000 * private_mediacontrol_unit_convert( p_media_player
,
169 mediacontrol_MediaTime
,
172 return ( l_time
+ l_pos
) % l_length
;
179 mediacontrol_RGBPicture
*
180 private_mediacontrol_RGBPicture__alloc( int datasize
)
182 mediacontrol_RGBPicture
* pic
;
184 pic
= ( mediacontrol_RGBPicture
* )malloc( sizeof( mediacontrol_RGBPicture
) );
188 pic
->size
= datasize
;
189 pic
->data
= ( char* )malloc( datasize
* sizeof( char ) );
194 mediacontrol_RGBPicture__free( mediacontrol_RGBPicture
* pic
)
204 mediacontrol_StreamInformation__free( mediacontrol_StreamInformation
* p_si
)
214 mediacontrol_Exception
*
215 mediacontrol_exception_create( void )
217 mediacontrol_Exception
* exception
;
219 exception
= ( mediacontrol_Exception
* )malloc( sizeof( mediacontrol_Exception
) );
220 mediacontrol_exception_init( exception
);
225 mediacontrol_exception_init( mediacontrol_Exception
*exception
)
230 exception
->message
= NULL
;
235 mediacontrol_exception_cleanup( mediacontrol_Exception
*exception
)
238 free( exception
->message
);
242 mediacontrol_exception_free( mediacontrol_Exception
*exception
)
244 mediacontrol_exception_cleanup( exception
);
248 mediacontrol_RGBPicture
*
249 private_mediacontrol_createRGBPicture( int i_width
, int i_height
, long i_chroma
, int64_t l_date
,
250 char* p_data
, int i_datasize
)
252 mediacontrol_RGBPicture
*retval
;
254 retval
= private_mediacontrol_RGBPicture__alloc( i_datasize
);
257 retval
->width
= i_width
;
258 retval
->height
= i_height
;
259 retval
->type
= i_chroma
;
260 retval
->date
= l_date
;
261 retval
->size
= i_datasize
;
262 memcpy( retval
->data
, p_data
, i_datasize
);