X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmediacontrol_audio_video.c;h=17660340fef7b9155324b335b08d4aa45c259314;hb=1fb01424d70e6b99f63d56d5243ef0d6dc458f0d;hp=cf6f0268c96e3708e587f21aa5c98da3960556aa;hpb=9cff8cf11225ccfb6f74624741d83844c76422fd;p=vlc diff --git a/src/control/mediacontrol_audio_video.c b/src/control/mediacontrol_audio_video.c index cf6f0268c9..17660340fe 100644 --- a/src/control/mediacontrol_audio_video.c +++ b/src/control/mediacontrol_audio_video.c @@ -56,7 +56,6 @@ mediacontrol_snapshot( mediacontrol_Instance *self, 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; @@ -67,38 +66,68 @@ mediacontrol_snapshot( mediacontrol_Instance *self, libvlc_exception_init( &ex ); mediacontrol_exception_init( exception ); + + p_snapshot = malloc( sizeof( snapshot_t ) ); + if( ! p_snapshot ) + { + RAISE_NULL( mediacontrol_InternalException, "Cannot allocate snapshot" ); + } + 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 ); + vlc_object_release( p_input ); if( ! p_vout ) { RAISE_NULL( mediacontrol_InternalException, "No video output" ); } - p_cache = vlc_object_create( p_input, sizeof( vlc_object_t ) ); - if( p_cache == NULL ) - { - vlc_object_release( p_vout ); - vlc_object_release( p_input ); - RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); - } - snprintf( path, 255, "object:%ju", (uintmax_t)(uintptr_t)p_cache ); + + /* TODO: + vlc_mutex_lock (&lock); + mutex_cleanup_push (&lock); // release the mutex in case of cancellation + + while (!foobar) + vlc_cond_wait (&wait, &lock); + + --- foobar is now true, do something about it here -- + + vlc_cleanup_run (); // release the mutex + */ + + snprintf( path, 255, "object:%p", p_snapshot ); var_SetString( p_vout, "snapshot-path", path ); var_SetString( p_vout, "snapshot-format", "png" ); - vlc_object_lock( p_cache ); + vlc_mutex_init( &p_snapshot->p_mutex ); + vlc_cond_init( &p_snapshot->p_condvar ); + + vlc_mutex_lock( &p_snapshot->p_mutex ); + mutex_cleanup_push( &p_snapshot->p_mutex ); + + /* Use p_snapshot address as sentinel against spurious vlc_object_wait wakeups. + + If a legitimate wakeup occurs, then p_snapshot->p_data will hold either + NULL (in case of error) or a pointer to valid data. */ + p_snapshot->p_data = ( char* )p_snapshot; + vout_Control( p_vout, VOUT_SNAPSHOT ); - vlc_object_wait( p_cache ); + while ( p_snapshot->p_data == ( char* )p_snapshot ) + { + vlc_cond_wait( &p_snapshot->p_condvar, &p_snapshot->p_mutex ); + } + vlc_cleanup_pop(); + vlc_object_release( p_vout ); - p_snapshot = ( snapshot_t* ) p_cache->p_private; - vlc_object_unlock( p_cache ); - vlc_object_release( p_cache ); - vlc_object_release( p_input ); + vlc_mutex_unlock( &p_snapshot->p_mutex ); + vlc_cond_destroy( &p_snapshot->p_condvar ); + vlc_mutex_destroy( &p_snapshot->p_mutex ); - if( p_snapshot ) + if( p_snapshot->p_data ) { /* Note: p_snapshot->p_data is directly used, not copied. Thus do not free it here. */ @@ -123,7 +152,7 @@ mediacontrol_snapshot( mediacontrol_Instance *self, static int mediacontrol_showtext( vout_thread_t *p_vout, int i_channel, - char *psz_string, text_style_t *p_style, + const 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 ) { @@ -142,13 +171,17 @@ mediacontrol_display_text( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { vout_thread_t *p_vout = NULL; - char* psz_message; input_thread_t *p_input; libvlc_exception_t ex; libvlc_exception_init( &ex ); mediacontrol_exception_init( exception ); + if( !message ) + { + RAISE_VOID( mediacontrol_InternalException, "Empty text" ); + } + p_input = libvlc_get_input_thread( self->p_media_player, &ex ); if( ! p_input ) { @@ -160,12 +193,6 @@ mediacontrol_display_text( mediacontrol_Instance *self, 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 && begin->value == 0 && end->origin == mediacontrol_RelativePosition ) @@ -179,7 +206,7 @@ mediacontrol_display_text( mediacontrol_Instance *self, mediacontrol_MediaTime, end->value ); - mediacontrol_showtext( p_vout, DEFAULT_CHAN, psz_message, NULL, + mediacontrol_showtext( p_vout, DEFAULT_CHAN, message, NULL, OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 0, 0, i_now, i_now + i_duration ); } @@ -199,7 +226,7 @@ mediacontrol_display_text( mediacontrol_Instance *self, ( mediacontrol_Position * ) end ); i_fin += i_now; - vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, psz_message, NULL, + vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, message, NULL, OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 0, 0, i_debut, i_fin ); }