X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmediacontrol_audio_video.c;h=cf6f0268c96e3708e587f21aa5c98da3960556aa;hb=14dd917d87e75ac1c7284373020ec3982082011b;hp=171561289ac5b3d0bb958ac07bdd0d7a1beee009;hpb=673593dc6f54f482830f52cf264dfca1cecee971;p=vlc diff --git a/src/control/mediacontrol_audio_video.c b/src/control/mediacontrol_audio_video.c index 171561289a..cf6f0268c9 100644 --- a/src/control/mediacontrol_audio_video.c +++ b/src/control/mediacontrol_audio_video.c @@ -21,20 +21,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include "mediacontrol_internal.h" +#include "libvlc_internal.h" #include #include -#include -#include -#include -#include - +#include #include -#include - #include /* malloc(), free() */ #include @@ -52,119 +50,87 @@ # include #endif -#define RAISE( c, m ) exception->code = c; \ - exception->message = strdup(m); - mediacontrol_RGBPicture * mediacontrol_snapshot( mediacontrol_Instance *self, const mediacontrol_Position * a_position, mediacontrol_Exception *exception ) { + (void)a_position; vlc_object_t* p_cache; vout_thread_t* p_vout; + input_thread_t *p_input; mediacontrol_RGBPicture *p_pic = NULL; char path[256]; snapshot_t *p_snapshot; + libvlc_exception_t ex; - exception=mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); - p_vout = vlc_object_find( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ); + p_input = libvlc_get_input_thread( self->p_media_player, &ex ); + if( ! p_input ) + { + RAISE_NULL( mediacontrol_InternalException, "No input" ); + } + p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); if( ! p_vout ) { - RAISE( mediacontrol_InternalException, "No video output" ); - return NULL; + RAISE_NULL( mediacontrol_InternalException, "No video output" ); } - p_cache = vlc_object_create( self->p_playlist, VLC_OBJECT_GENERIC ); + p_cache = vlc_object_create( p_input, sizeof( vlc_object_t ) ); if( p_cache == NULL ) { vlc_object_release( p_vout ); - msg_Err( self->p_playlist, "out of memory" ); - RAISE( mediacontrol_InternalException, "Out of memory" ); - return NULL; + vlc_object_release( p_input ); + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); } - snprintf( path, 255, "object:%d", p_cache->i_object_id ); + snprintf( path, 255, "object:%ju", (uintmax_t)(uintptr_t)p_cache ); var_SetString( p_vout, "snapshot-path", path ); var_SetString( p_vout, "snapshot-format", "png" ); - vlc_mutex_lock( &p_cache->object_lock ); + vlc_object_lock( p_cache ); vout_Control( p_vout, VOUT_SNAPSHOT ); - vlc_cond_wait( &p_cache->object_wait, &p_cache->object_lock ); + vlc_object_wait( p_cache ); vlc_object_release( p_vout ); p_snapshot = ( snapshot_t* ) p_cache->p_private; - vlc_object_destroy( p_cache ); + vlc_object_unlock( p_cache ); + vlc_object_release( p_cache ); + vlc_object_release( p_input ); if( p_snapshot ) { - p_pic = _mediacontrol_createRGBPicture( p_snapshot->i_width, - p_snapshot->i_height, - VLC_FOURCC( 'p','n','g',' ' ), - p_snapshot->date, - p_snapshot->p_data, - p_snapshot->i_datasize ); + /* Note: p_snapshot->p_data is directly used, not copied. Thus + do not free it here. */ + p_pic = private_mediacontrol_createRGBPicture( p_snapshot->i_width, + p_snapshot->i_height, + VLC_FOURCC( 'p','n','g',' ' ), + p_snapshot->date, + p_snapshot->p_data, + p_snapshot->i_datasize ); if( !p_pic ) - RAISE( mediacontrol_InternalException, "out of memory" ); - free( p_snapshot->p_data ); - free( p_snapshot ); + { + free( p_snapshot ); + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); + } } else { - RAISE( mediacontrol_InternalException, "Snapshot exception" ); + RAISE_NULL( mediacontrol_InternalException, "Snapshot exception" ); } return p_pic; } -mediacontrol_RGBPicture ** -mediacontrol_all_snapshots( mediacontrol_Instance *self, - mediacontrol_Exception *exception ) -{ - exception=mediacontrol_exception_init( exception ); - - RAISE( mediacontrol_InternalException, "unsupported method" ); - return NULL; -} - +static int mediacontrol_showtext( vout_thread_t *p_vout, int i_channel, char *psz_string, text_style_t *p_style, int i_flags, int i_hmargin, int i_vmargin, mtime_t i_start, mtime_t i_stop ) { - subpicture_t *p_spu; - video_format_t fmt; - - if( !psz_string ) return VLC_EGENERIC; - - p_spu = spu_CreateSubpicture( p_vout->p_spu ); - if( !p_spu ) return VLC_EGENERIC; - - /* Create a new subpicture region */ - memset( &fmt, 0, sizeof(video_format_t) ); - fmt.i_chroma = VLC_FOURCC('T','E','X','T'); - fmt.i_aspect = 0; - fmt.i_width = fmt.i_height = 0; - fmt.i_x_offset = fmt.i_y_offset = 0; - p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_vout), &fmt ); - if( !p_spu->p_region ) - { - msg_Err( p_vout, "cannot allocate SPU region" ); - spu_DestroySubpicture( p_vout->p_spu, p_spu ); - return VLC_EGENERIC; - } - - p_spu->p_region->psz_text = strdup( psz_string ); - p_spu->i_start = i_start; - p_spu->i_stop = i_stop; - p_spu->b_ephemer = VLC_FALSE; - p_spu->b_absolute = VLC_FALSE; - - p_spu->i_x = i_hmargin; - p_spu->i_y = i_vmargin; - p_spu->i_flags = i_flags; - p_spu->i_channel = i_channel; - - spu_DisplaySubpicture( p_vout->p_spu, p_spu ); - - return VLC_SUCCESS; + return osd_ShowTextAbsolute( p_vout->p_spu, i_channel, + psz_string, p_style, + i_flags, i_hmargin, i_vmargin, + i_start, i_stop ); } @@ -175,22 +141,29 @@ mediacontrol_display_text( mediacontrol_Instance *self, const mediacontrol_Position * end, mediacontrol_Exception *exception ) { - input_thread_t *p_input = NULL; vout_thread_t *p_vout = NULL; char* psz_message; + input_thread_t *p_input; + libvlc_exception_t ex; - psz_message = strdup( message ); - if( !psz_message ) + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); + + p_input = libvlc_get_input_thread( self->p_media_player, &ex ); + if( ! p_input ) { - RAISE( mediacontrol_InternalException, "no more memory" ); - return; + RAISE_VOID( mediacontrol_InternalException, "No input" ); } - - p_vout = vlc_object_find( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ); + p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); if( ! p_vout ) { - RAISE( mediacontrol_InternalException, "no video output" ); - return; + RAISE_VOID( mediacontrol_InternalException, "No video output" ); + } + + psz_message = strdup( message ); + if( !psz_message ) + { + RAISE_VOID( mediacontrol_InternalException, "no more memory" ); } if( begin->origin == mediacontrol_RelativePosition && @@ -200,11 +173,11 @@ mediacontrol_display_text( mediacontrol_Instance *self, mtime_t i_duration = 0; mtime_t i_now = mdate(); - i_duration = 1000 * mediacontrol_unit_convert( - self->p_playlist->p_input, - end->key, - mediacontrol_MediaTime, - end->value ); + i_duration = 1000 * private_mediacontrol_unit_convert( + self->p_media_player, + end->key, + mediacontrol_MediaTime, + end->value ); mediacontrol_showtext( p_vout, DEFAULT_CHAN, psz_message, NULL, OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 0, 0, @@ -214,23 +187,15 @@ mediacontrol_display_text( mediacontrol_Instance *self, { mtime_t i_debut, i_fin, i_now; - p_input = self->p_playlist->p_input; - if( ! p_input ) - { - RAISE( mediacontrol_InternalException, "No input" ); - vlc_object_release( p_vout ); - return; - } - /* FIXME */ /* i_now = input_ClockGetTS( p_input, NULL, 0 ); */ i_now = mdate(); - i_debut = mediacontrol_position2microsecond( p_input, + i_debut = private_mediacontrol_position2microsecond( self->p_media_player, ( mediacontrol_Position* ) begin ); i_debut += i_now; - i_fin = mediacontrol_position2microsecond( p_input, + i_fin = private_mediacontrol_position2microsecond( self->p_media_player, ( mediacontrol_Position * ) end ); i_fin += i_now; @@ -273,7 +238,7 @@ mediacontrol_sound_set_volume( mediacontrol_Instance *self, HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } -vlc_bool_t mediacontrol_set_visual( mediacontrol_Instance *self, +int mediacontrol_set_visual( mediacontrol_Instance *self, WINDOWHANDLE visual_id, mediacontrol_Exception *exception ) { @@ -282,27 +247,22 @@ vlc_bool_t mediacontrol_set_visual( mediacontrol_Instance *self, mediacontrol_exception_init( exception ); libvlc_exception_init( &ex ); - libvlc_video_set_parent( self->p_instance, visual_id, &ex ); + libvlc_media_player_set_drawable( self->p_media_player, (libvlc_drawable_t)visual_id, &ex ); HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); - return VLC_TRUE; + return true; } int mediacontrol_get_rate( mediacontrol_Instance *self, - mediacontrol_Exception *exception ) + mediacontrol_Exception *exception ) { libvlc_exception_t ex; - libvlc_input_t* p_input; int i_ret; mediacontrol_exception_init( exception ); libvlc_exception_init( &ex ); - p_input = libvlc_playlist_get_input( self->p_instance, &ex ); - HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); - - i_ret = libvlc_input_get_rate( p_input, &ex ); - libvlc_input_free( p_input ); + i_ret = libvlc_media_player_get_rate( self->p_media_player, &ex ); HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); return i_ret / 10; @@ -310,39 +270,29 @@ mediacontrol_get_rate( mediacontrol_Instance *self, void mediacontrol_set_rate( mediacontrol_Instance *self, - const int rate, - mediacontrol_Exception *exception ) + const int rate, + mediacontrol_Exception *exception ) { libvlc_exception_t ex; - libvlc_input_t* p_input; mediacontrol_exception_init( exception ); libvlc_exception_init( &ex ); - p_input = libvlc_playlist_get_input( self->p_instance, &ex ); - HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); - - libvlc_input_set_rate( p_input, rate * 10, &ex ); - libvlc_input_free( p_input ); + libvlc_media_player_set_rate( self->p_media_player, rate * 10, &ex ); HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } int mediacontrol_get_fullscreen( mediacontrol_Instance *self, - mediacontrol_Exception *exception ) + mediacontrol_Exception *exception ) { libvlc_exception_t ex; - libvlc_input_t* p_input; int i_ret; mediacontrol_exception_init( exception ); libvlc_exception_init( &ex ); - p_input = libvlc_playlist_get_input( self->p_instance, &ex ); - HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); - - i_ret = libvlc_get_fullscreen( p_input, &ex ); - libvlc_input_free( p_input ); + i_ret = libvlc_get_fullscreen( self->p_media_player, &ex ); HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); return i_ret; @@ -350,19 +300,14 @@ mediacontrol_get_fullscreen( mediacontrol_Instance *self, void mediacontrol_set_fullscreen( mediacontrol_Instance *self, - const int b_fullscreen, - mediacontrol_Exception *exception ) + const int b_fullscreen, + mediacontrol_Exception *exception ) { libvlc_exception_t ex; - libvlc_input_t* p_input; mediacontrol_exception_init( exception ); libvlc_exception_init( &ex ); - p_input = libvlc_playlist_get_input( self->p_instance, &ex ); - HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); - - libvlc_set_fullscreen( p_input, b_fullscreen, &ex ); - libvlc_input_free( p_input ); + libvlc_set_fullscreen( self->p_media_player, b_fullscreen, &ex ); HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); }