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() */
43 #include <sys/types.h>
45 libvlc_time_t
private_mediacontrol_unit_convert( libvlc_media_player_t
*p_media_player
,
46 mediacontrol_PositionKey from
,
47 mediacontrol_PositionKey to
,
58 case mediacontrol_MediaTime
:
59 if( to
== mediacontrol_ByteCount
)
61 /* FIXME Unsupported */
63 /* return value * 50 * p_input->stream.i_mux_rate / 1000; */
66 if( to
== mediacontrol_SampleCount
)
70 f_fps
= libvlc_media_player_get_rate( p_media_player
);
74 return( value
* f_fps
/ 1000.0 );
77 /* See http://catb.org/~esr/jargon/html/entry/can-t-happen.html */
80 case mediacontrol_SampleCount
:
84 f_fps
= libvlc_media_player_get_rate( p_media_player
);
88 if( to
== mediacontrol_ByteCount
)
92 /* return ( int64_t )( value * 50 * p_input->stream.i_mux_rate / f_fps ); */
96 if( to
== mediacontrol_MediaTime
)
97 return( int64_t )( value
* 1000.0 / ( double )f_fps
);
102 case mediacontrol_ByteCount
:
110 /* Converts a mediacontrol_Position into a time in microseconds in
113 private_mediacontrol_position2microsecond( libvlc_media_player_t
* p_media_player
,
114 const mediacontrol_Position
* pos
)
116 switch( pos
->origin
)
118 case mediacontrol_AbsolutePosition
:
119 return ( 1000 * private_mediacontrol_unit_convert( p_media_player
,
121 mediacontrol_MediaTime
, /* to */
124 case mediacontrol_RelativePosition
:
126 libvlc_time_t l_time
= 0;
127 libvlc_time_t l_pos
= 0;
129 l_time
= libvlc_media_player_get_time( p_media_player
);
130 /* Ignore exception, we will assume a 0 time value */
132 l_pos
= private_mediacontrol_unit_convert( p_media_player
,
134 mediacontrol_MediaTime
,
136 return 1000 * ( l_time
+ l_pos
);
139 case mediacontrol_ModuloPosition
:
141 libvlc_time_t l_time
= 0;
142 libvlc_time_t l_length
= 0;
143 libvlc_time_t l_pos
= 0;
145 l_length
= libvlc_media_player_get_length( p_media_player
);
149 l_time
= libvlc_media_player_get_time( p_media_player
);
150 /* Ignore exception, we will assume a 0 time value */
152 l_pos
= private_mediacontrol_unit_convert( p_media_player
,
154 mediacontrol_MediaTime
,
157 return 1000 * ( ( l_time
+ l_pos
) % l_length
);
165 mediacontrol_RGBPicture__free( mediacontrol_RGBPicture
* pic
)
175 mediacontrol_StreamInformation__free( mediacontrol_StreamInformation
* p_si
)
185 mediacontrol_Exception
*
186 mediacontrol_exception_create( void )
188 mediacontrol_Exception
* exception
;
190 exception
= ( mediacontrol_Exception
* )malloc( sizeof( mediacontrol_Exception
) );
191 mediacontrol_exception_init( exception
);
196 mediacontrol_exception_init( mediacontrol_Exception
*exception
)
201 exception
->message
= NULL
;
206 mediacontrol_exception_cleanup( mediacontrol_Exception
*exception
)
209 free( exception
->message
);
213 mediacontrol_exception_free( mediacontrol_Exception
*exception
)
215 mediacontrol_exception_cleanup( exception
);
220 * Allocates and initializes a mediacontrol_RGBPicture object.
222 * @param i_width: picture width
223 * @param i_height: picture width
224 * @param i_chroma: picture chroma
225 * @param l_date: picture timestamp
226 * @param p_data: pointer to the data. The data will be directly used, not copied.
227 * @param i_datasize: data size in bytes
229 * @return the new object, or NULL on error.
231 mediacontrol_RGBPicture
*
232 private_mediacontrol_createRGBPicture( int i_width
, int i_height
, long i_chroma
, int64_t l_date
,
233 char* p_data
, int i_datasize
)
235 mediacontrol_RGBPicture
*retval
;
237 retval
= ( mediacontrol_RGBPicture
* )malloc( sizeof( mediacontrol_RGBPicture
) );
240 retval
->width
= i_width
;
241 retval
->height
= i_height
;
242 retval
->type
= i_chroma
;
243 retval
->date
= l_date
;
244 retval
->size
= i_datasize
;
245 retval
->data
= p_data
;