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
= private_mediacontrol_unit_convert( p_media_player
,
147 mediacontrol_MediaTime
,
149 return 1000 * ( 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
= private_mediacontrol_unit_convert( p_media_player
,
169 mediacontrol_MediaTime
,
172 return 1000 * ( ( l_time
+ l_pos
) % l_length
);
180 mediacontrol_RGBPicture__free( mediacontrol_RGBPicture
* pic
)
190 mediacontrol_StreamInformation__free( mediacontrol_StreamInformation
* p_si
)
200 mediacontrol_Exception
*
201 mediacontrol_exception_create( void )
203 mediacontrol_Exception
* exception
;
205 exception
= ( mediacontrol_Exception
* )malloc( sizeof( mediacontrol_Exception
) );
206 mediacontrol_exception_init( exception
);
211 mediacontrol_exception_init( mediacontrol_Exception
*exception
)
216 exception
->message
= NULL
;
221 mediacontrol_exception_cleanup( mediacontrol_Exception
*exception
)
224 free( exception
->message
);
228 mediacontrol_exception_free( mediacontrol_Exception
*exception
)
230 mediacontrol_exception_cleanup( exception
);
235 * Allocates and initializes a mediacontrol_RGBPicture object.
237 * @param i_width: picture width
238 * @param i_height: picture width
239 * @param i_chroma: picture chroma
240 * @param l_date: picture timestamp
241 * @param p_data: pointer to the data. The data will be directly used, not copied.
242 * @param i_datasize: data size in bytes
244 * @return the new object, or NULL on error.
246 mediacontrol_RGBPicture
*
247 private_mediacontrol_createRGBPicture( int i_width
, int i_height
, long i_chroma
, int64_t l_date
,
248 char* p_data
, int i_datasize
)
250 mediacontrol_RGBPicture
*retval
;
252 retval
= ( mediacontrol_RGBPicture
* )malloc( sizeof( mediacontrol_RGBPicture
) );
255 retval
->width
= i_width
;
256 retval
->height
= i_height
;
257 retval
->type
= i_chroma
;
258 retval
->date
= l_date
;
259 retval
->size
= i_datasize
;
260 retval
->data
= p_data
;