mediacontrol_Instance* mediacontrol_new( int argc, char** argv, mediacontrol_Exception *exception ) { mediacontrol_Instance* retval; libvlc_exception_t ex; libvlc_exception_init( &ex ); mediacontrol_exception_init( exception ); retval = ( mediacontrol_Instance* )malloc( sizeof( mediacontrol_Instance ) ); if( !retval ) RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); retval->p_instance = libvlc_new( argc, (const char**)argv, &ex ); HANDLE_LIBVLC_EXCEPTION_NULL( &ex ); retval->p_media_player = libvlc_media_player_new( retval->p_instance, &ex ); HANDLE_LIBVLC_EXCEPTION_NULL( &ex ); return retval; }
mediacontrol_Instance * mediacontrol_new_from_instance( libvlc_instance_t* p_instance, mediacontrol_Exception *exception ) { mediacontrol_Instance* retval; libvlc_exception_t ex; libvlc_exception_init( &ex ); retval = ( mediacontrol_Instance* )malloc( sizeof( mediacontrol_Instance ) ); if( ! retval ) { RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); } retval->p_instance = p_instance; retval->p_media_player = libvlc_media_player_new( retval->p_instance, &ex ); HANDLE_LIBVLC_EXCEPTION_NULL( &ex ); return retval; }
/************************************************************************** * Playback management **************************************************************************/ mediacontrol_Position* mediacontrol_get_media_position( mediacontrol_Instance *self, const mediacontrol_PositionOrigin an_origin, const mediacontrol_PositionKey a_key, mediacontrol_Exception *exception ) { mediacontrol_Position* retval = NULL; libvlc_exception_t ex; int64_t pos; mediacontrol_exception_init( exception ); libvlc_exception_init( &ex ); retval = ( mediacontrol_Position* )malloc( sizeof( mediacontrol_Position ) ); retval->origin = an_origin; retval->key = a_key; if( an_origin != mediacontrol_AbsolutePosition ) { free( retval ); /* Relative or ModuloPosition make no sense */ RAISE_NULL( mediacontrol_PositionOriginNotSupported, "Only absolute position is valid." ); } /* We are asked for an AbsolutePosition. */ pos = libvlc_media_player_get_time( self->p_media_player, &ex ); if( a_key == mediacontrol_MediaTime ) { retval->value = pos; } else { retval->value = private_mediacontrol_unit_convert( self->p_media_player, mediacontrol_MediaTime, a_key, pos ); } return retval; }
mediacontrol_RGBPicture * mediacontrol_snapshot( mediacontrol_Instance *self, const mediacontrol_Position * a_position, mediacontrol_Exception *exception ) { (void)a_position; vout_thread_t* p_vout; input_thread_t *p_input; mediacontrol_RGBPicture *p_pic; libvlc_exception_t ex; libvlc_exception_init( &ex ); mediacontrol_exception_init( exception ); p_input = libvlc_get_input_thread( self->p_media_player ); if( ! p_input ) { RAISE_NULL( mediacontrol_InternalException, "No input" ); } p_vout = input_GetVout( p_input ); vlc_object_release( p_input ); if( ! p_vout ) { RAISE_NULL( mediacontrol_InternalException, "No video output" ); } block_t *p_image; video_format_t fmt; if( vout_GetSnapshot( p_vout, &p_image, NULL, &fmt, "png", 500*1000 ) ) { vlc_object_release( p_vout ); RAISE_NULL( mediacontrol_InternalException, "Snapshot exception" ); return NULL; } /* */ char *p_data = malloc( p_image->i_buffer ); if( p_data ) { memcpy( p_data, p_image->p_buffer, p_image->i_buffer ); p_pic = private_mediacontrol_createRGBPicture( fmt.i_width, fmt.i_height, fmt.i_chroma, p_image->i_pts, p_data, p_image->i_buffer ); } else { p_pic = NULL; } block_Release( p_image ); if( !p_pic ) RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); vlc_object_release( p_vout ); return p_pic; }