/***************************************************************************** * Close: *****************************************************************************/ static void Close( vlc_object_t * p_this ) { sout_stream_t *p_stream = (sout_stream_t*)p_this; sout_stream_sys_t *p_sys = p_stream->p_sys; free( p_sys->psz_af ); config_ChainDestroy( p_sys->p_audio_cfg ); free( p_sys->psz_aenc ); free( p_sys->psz_alang ); free( p_sys->psz_vf2 ); config_ChainDestroy( p_sys->p_video_cfg ); free( p_sys->psz_venc ); config_ChainDestroy( p_sys->p_deinterlace_cfg ); free( p_sys->psz_deinterlace ); config_ChainDestroy( p_sys->p_spu_cfg ); free( p_sys->psz_senc ); if( p_sys->p_spu ) spu_Destroy( p_sys->p_spu ); if( p_sys->p_spu_blend ) filter_DeleteBlend( p_sys->p_spu_blend ); config_ChainDestroy( p_sys->p_osd_cfg ); free( p_sys->psz_osdenc ); free( p_sys ); }
static void Close(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; /* Check if SPU regions have been properly cleared, and clear them if they * were not. */ if (sys->b_has_subpictures) { SubpicturePrepare(vd, NULL); AndroidWindow_UnlockPicture(sys, sys->p_sub_window, sys->p_sub_pic); } if (sys->pool) picture_pool_Release(sys->pool); if (sys->p_window) { if (sys->b_displayed) ClearSurface(vd); AndroidWindow_Destroy(vd, sys->p_window); } if (sys->p_sub_pic) picture_Release(sys->p_sub_pic); if (sys->p_spu_blend) filter_DeleteBlend(sys->p_spu_blend); free(sys->p_sub_buffer_bounds); if (sys->p_sub_window) AndroidWindow_Destroy(vd, sys->p_sub_window); if (sys->embed) AWindowHandler_setVideoLayout(sys->p_awh, 0, 0, 0, 0, 0, 0); free(sys); }
static void Close(vlc_object_t *p_this) { vout_display_t *vd = (vout_display_t *)p_this; vout_display_sys_t *sys = vd->sys; if (!sys) return; if (sys->pool) picture_pool_Release(sys->pool); if (sys->p_window) AndroidWindow_Destroy(sys, sys->p_window); if (sys->p_sub_pic) picture_Release(sys->p_sub_pic); if (sys->p_spu_blend) filter_DeleteBlend(sys->p_spu_blend); free(sys->p_sub_buffer_bounds); if (sys->p_sub_window) AndroidWindow_Destroy(sys, sys->p_sub_window); if (sys->p_library) dlclose(sys->p_library); free(sys); }
static void Close(vlc_object_t *p_this) { vout_display_t *vd = (vout_display_t *)p_this; vout_display_sys_t *sys = vd->sys; if (!sys) return; /* Check if SPU regions have been properly cleared, and clear them if they * were not. */ if (sys->b_has_subpictures) { SubpicturePrepare(vd, NULL); if (sys->b_sub_pic_locked) AndroidWindow_UnlockPicture(sys, sys->p_sub_window, sys->p_sub_pic, true); } if (sys->pool) picture_pool_Release(sys->pool); if (sys->p_window) AndroidWindow_Destroy(vd, sys->p_window); if (sys->p_sub_pic) picture_Release(sys->p_sub_pic); if (sys->p_spu_blend) filter_DeleteBlend(sys->p_spu_blend); free(sys->p_sub_buffer_bounds); if (sys->p_sub_window) AndroidWindow_Destroy(vd, sys->p_sub_window); if (sys->p_awh) AWindowHandler_destroy(sys->p_awh); free(sys); }
static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture, vlc_tick_t date) { vout_display_sys_t *sys = vd->sys; VLC_UNUSED(picture); if (subpicture && sys->p_sub_window) { if (sys->b_sub_invalid) { sys->b_sub_invalid = false; if (sys->p_sub_pic) { picture_Release(sys->p_sub_pic); sys->p_sub_pic = NULL; } if (sys->p_spu_blend) { filter_DeleteBlend(sys->p_spu_blend); sys->p_spu_blend = NULL; } free(sys->p_sub_buffer_bounds); sys->p_sub_buffer_bounds = NULL; } if (!sys->p_sub_pic && AndroidWindow_Setup(sys, sys->p_sub_window, 1) == 0) sys->p_sub_pic = PictureAlloc(sys, &sys->p_sub_window->fmt, false); if (!sys->p_spu_blend && sys->p_sub_pic) sys->p_spu_blend = filter_NewBlend(VLC_OBJECT(vd), &sys->p_sub_pic->format); if (sys->p_sub_pic && sys->p_spu_blend) sys->b_has_subpictures = true; } /* As long as no subpicture was received, do not call SubpictureDisplay since JNI calls and clearing the subtitles surface are expensive operations. */ if (sys->b_has_subpictures) { SubpicturePrepare(vd, subpicture); if (!subpicture) { /* The surface has been cleared and there is no new subpicture to upload, do not clear again until a new subpicture is received. */ sys->b_has_subpictures = false; } } if (sys->p_window->b_opaque && AndroidOpaquePicture_CanReleaseAtTime(picture->p_sys)) { vlc_tick_t now = vlc_tick_now(); if (date > now) { if (date - now <= VLC_TICK_FROM_SEC(1)) AndroidOpaquePicture_ReleaseAtTime(picture->p_sys, date); else /* The picture will be displayed from the Display callback */ msg_Warn(vd, "picture way too early to release at time"); } } }
static void Close(vlc_object_t *p_this) { vout_display_t *vd = (vout_display_t *)p_this; vout_display_sys_t *sys = vd->sys; picture_pool_Delete(sys->pool); if (sys->window) sys->native_window.winRelease(sys->window); dlclose(sys->p_library); picture_Release(sys->subtitles_picture); if (sys->p_spu_blend) filter_DeleteBlend(sys->p_spu_blend); free(sys); }
static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture) { vout_display_sys_t *sys = vd->sys; VLC_UNUSED(picture); SendEventDisplaySize(vd); if (subpicture && sys->p_sub_window) { if (sys->b_sub_invalid) { sys->b_sub_invalid = false; if (sys->p_sub_pic) { picture_Release(sys->p_sub_pic); sys->p_sub_pic = NULL; } if (sys->p_spu_blend) { filter_DeleteBlend(sys->p_spu_blend); sys->p_spu_blend = NULL; } free(sys->p_sub_buffer_bounds); sys->p_sub_buffer_bounds = NULL; } if (!sys->p_sub_pic && AndroidWindow_Setup(sys, sys->p_sub_window, 1) == 0) sys->p_sub_pic = PictureAlloc(sys, &sys->p_sub_window->fmt, false); if (!sys->p_spu_blend && sys->p_sub_pic) sys->p_spu_blend = filter_NewBlend(VLC_OBJECT(vd), &sys->p_sub_pic->format); if (sys->p_sub_pic && sys->p_spu_blend) sys->b_has_subpictures = true; } /* As long as no subpicture was received, do not call SubpictureDisplay since JNI calls and clearing the subtitles surface are expensive operations. */ if (sys->b_has_subpictures) { SubpicturePrepare(vd, subpicture); if (!subpicture) { /* The surface has been cleared and there is no new subpicture to upload, do not clear again until a new subpicture is received. */ sys->b_has_subpictures = false; } } }
/** * Common close function */ static void Close( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys = p_filter->p_sys; for( int i = 0; ppsz_filter_callbacks[i]; i++ ) var_DelCallback( p_filter, ppsz_filter_callbacks[i], LogoCallback, p_sys ); if( p_sys->p_blend ) filter_DeleteBlend( p_sys->p_blend ); vlc_mutex_destroy( &p_sys->lock ); LogoListUnload( &p_sys->list ); free( p_sys ); }
/** * Common close function */ static void Close( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys = p_filter->p_sys; BarGraph_t *p_BarGraph = &(p_sys->p_BarGraph); for( int i = 0; ppsz_filter_callbacks[i]; i++ ) var_DelCallback( p_filter, ppsz_filter_callbacks[i], BarGraphCallback, p_sys ); if( p_sys->p_blend ) filter_DeleteBlend( p_sys->p_blend ); vlc_mutex_destroy( &p_sys->lock ); if( p_BarGraph->p_pic ) { picture_Release( p_BarGraph->p_pic ); p_BarGraph->p_pic = NULL; } free( p_BarGraph->i_values ); free( p_sys ); }
/** * Common open function */ static int OpenCommon( vlc_object_t *p_this, bool b_sub ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; char *psz_filename; /* */ if( !b_sub && !es_format_IsSimilar( &p_filter->fmt_in, &p_filter->fmt_out ) ) { msg_Err( p_filter, "Input and output format does not match" ); return VLC_EGENERIC; } /* */ p_filter->p_sys = p_sys = malloc( sizeof( *p_sys ) ); if( !p_sys ) return VLC_ENOMEM; /* */ p_sys->p_blend = NULL; if( !b_sub ) { p_sys->p_blend = filter_NewBlend( VLC_OBJECT(p_filter), &p_filter->fmt_in.video ); if( !p_sys->p_blend ) { free( p_sys ); return VLC_EGENERIC; } } /* */ config_ChainParse( p_filter, CFG_PREFIX, ppsz_filter_options, p_filter->p_cfg ); /* */ logo_list_t *p_list = &p_sys->list; psz_filename = var_CreateGetStringCommand( p_filter, "logo-file" ); if( !psz_filename ) { if( p_sys->p_blend ) filter_DeleteBlend( p_sys->p_blend ); free( p_sys ); return VLC_ENOMEM; } if( *psz_filename == '\0' ) msg_Warn( p_this, "no logo file specified" ); p_list->i_alpha = var_CreateGetIntegerCommand( p_filter, "logo-opacity"); p_list->i_alpha = __MAX( __MIN( p_list->i_alpha, 255 ), 0 ); p_list->i_delay = var_CreateGetIntegerCommand( p_filter, "logo-delay" ); p_list->i_repeat = var_CreateGetIntegerCommand( p_filter, "logo-repeat" ); p_sys->i_pos = var_CreateGetIntegerCommand( p_filter, "logo-position" ); p_sys->i_pos_x = var_CreateGetIntegerCommand( p_filter, "logo-x" ); p_sys->i_pos_y = var_CreateGetIntegerCommand( p_filter, "logo-y" ); /* Ignore aligment if a position is given for video filter */ if( !b_sub && p_sys->i_pos_x >= 0 && p_sys->i_pos_y >= 0 ) p_sys->i_pos = 0; vlc_mutex_init( &p_sys->lock ); LogoListLoad( p_this, p_list, psz_filename ); p_sys->b_spu_update = true; p_sys->b_mouse_grab = false; for( int i = 0; ppsz_filter_callbacks[i]; i++ ) var_AddCallback( p_filter, ppsz_filter_callbacks[i], LogoCallback, p_sys ); /* Misc init */ if( b_sub ) { p_filter->pf_sub_source = FilterSub; } else { p_filter->pf_video_filter = FilterVideo; p_filter->pf_video_mouse = Mouse; } free( psz_filename ); return VLC_SUCCESS; }