X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmediacontrol_audio_video.c;h=17660340fef7b9155324b335b08d4aa45c259314;hb=1fb01424d70e6b99f63d56d5243ef0d6dc458f0d;hp=e0a6f7c55dd7061b83c561b9720d2fa6b12a48eb;hpb=37485818653989b5f4b8fbabfdc75198dfc84a05;p=vlc diff --git a/src/control/mediacontrol_audio_video.c b/src/control/mediacontrol_audio_video.c index e0a6f7c55d..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,48 +152,14 @@ 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 ) { - 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->p_region->i_align = i_flags & SUBPICTURE_ALIGN_MASK; - p_spu->p_region->p_style = p_style; - p_spu->i_start = i_start; - p_spu->i_stop = i_stop; - p_spu->b_ephemer = false; - p_spu->b_absolute = false; - - p_spu->i_x = i_hmargin; - p_spu->i_y = i_vmargin; - p_spu->i_flags = i_flags & ~SUBPICTURE_ALIGN_MASK; - 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 ); } @@ -176,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 ) { @@ -194,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 ) @@ -213,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 ); } @@ -233,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 ); }