📄 vout_intf.c
字号:
{ image_handler_t *p_image = image_HandlerCreate( p_vout ); video_format_t fmt_in = {0}, fmt_out = {0}; char *psz_filename; subpicture_t *p_subpic; picture_t *p_pif; vlc_value_t val, format; int i_ret; var_Get( p_vout, "snapshot-path", &val ); if( val.psz_string && !*val.psz_string ) { free( val.psz_string ); val.psz_string = 0; }#if defined(SYS_DARWIN) || defined(SYS_BEOS) if( !val.psz_string && p_vout->p_vlc->psz_homedir ) { asprintf( &val.psz_string, "%s/Desktop", p_vout->p_vlc->psz_homedir ); }#elif defined(WIN32) && !defined(UNDER_CE) if( !val.psz_string && p_vout->p_vlc->psz_homedir ) { /* Get the My Pictures folder path */ char *p_mypicturesdir = NULL; typedef HRESULT (WINAPI *SHGETFOLDERPATH)( HWND, int, HANDLE, DWORD, LPSTR ); #ifndef CSIDL_FLAG_CREATE # define CSIDL_FLAG_CREATE 0x8000 #endif #ifndef CSIDL_MYPICTURES # define CSIDL_MYPICTURES 0x27 #endif #ifndef SHGFP_TYPE_CURRENT # define SHGFP_TYPE_CURRENT 0 #endif HINSTANCE shfolder_dll; SHGETFOLDERPATH SHGetFolderPath ; /* load the shfolder dll to retrieve SHGetFolderPath */ if( ( shfolder_dll = LoadLibrary( _T("SHFolder.dll") ) ) != NULL ) { SHGetFolderPath = (void *)GetProcAddress( shfolder_dll, _T("SHGetFolderPathA") ); if( SHGetFolderPath != NULL ) { p_mypicturesdir = (char *)malloc( MAX_PATH ); if( p_mypicturesdir ) { if( S_OK != SHGetFolderPath( NULL, CSIDL_MYPICTURES | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, p_mypicturesdir ) ) { free( p_mypicturesdir ); p_mypicturesdir = NULL; } } } FreeLibrary( shfolder_dll ); } if( p_mypicturesdir == NULL ) { asprintf( &val.psz_string, "%s/" CONFIG_DIR, p_vout->p_vlc->psz_homedir ); } else { asprintf( &val.psz_string, p_mypicturesdir ); free( p_mypicturesdir ); } }#else if( !val.psz_string && p_vout->p_vlc->psz_homedir ) { asprintf( &val.psz_string, "%s/" CONFIG_DIR, p_vout->p_vlc->psz_homedir ); }#endif if( !val.psz_string ) { msg_Err( p_vout, "no directory specified for snapshots" ); return VLC_EGENERIC; } var_Get( p_vout, "snapshot-format", &format ); if( !format.psz_string || !*format.psz_string ) { if( format.psz_string ) free( format.psz_string ); format.psz_string = strdup( "png" ); } asprintf( &psz_filename, "%s/vlcsnap-%u.%s", val.psz_string, (unsigned int)(p_pic->date / 100000) & 0xFFFFFF, format.psz_string ); free( val.psz_string ); free( format.psz_string ); /* Save the snapshot */ fmt_in = p_vout->fmt_in; fmt_out.i_sar_num = fmt_out.i_sar_den = 1; i_ret = image_WriteUrl( p_image, p_pic, &fmt_in, &fmt_out, psz_filename ); if( i_ret != VLC_SUCCESS ) { msg_Err( p_vout, "could not create snapshot %s", psz_filename ); free( psz_filename ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } msg_Dbg( p_vout, "snapshot taken (%s)", psz_filename ); free( psz_filename ); /* Inject a subpicture with the snapshot */ memset( &fmt_out, 0, sizeof(fmt_out) ); fmt_out.i_chroma = VLC_FOURCC('Y','U','V','A'); p_pif = image_Convert( p_image, p_pic, &fmt_in, &fmt_out ); image_HandlerDelete( p_image ); if( !p_pif ) return VLC_EGENERIC; p_subpic = spu_CreateSubpicture( p_vout->p_spu ); if( p_subpic == NULL ) { p_pif->pf_release( p_pif ); return VLC_EGENERIC; } p_subpic->i_channel = 0; p_subpic->i_start = mdate(); p_subpic->i_stop = mdate() + 4000000; p_subpic->b_ephemer = VLC_TRUE; p_subpic->b_fade = VLC_TRUE; p_subpic->i_original_picture_width = p_vout->render.i_width * 4; p_subpic->i_original_picture_height = p_vout->render.i_height * 4; p_subpic->p_region = spu_CreateRegion( p_vout->p_spu, &fmt_out ); vout_CopyPicture( p_image->p_parent, &p_subpic->p_region->picture, p_pif ); p_pif->pf_release( p_pif ); spu_DisplaySubpicture( p_vout->p_spu, p_subpic ); return VLC_SUCCESS;}/***************************************************************************** * vout_ControlDefault: default methods for video output control. *****************************************************************************/int vout_vaControlDefault( vout_thread_t *p_vout, int i_query, va_list args ){ switch( i_query ) { case VOUT_REPARENT: case VOUT_CLOSE: if( p_vout->p_parent_intf ) { vlc_object_release( p_vout->p_parent_intf ); p_vout->p_parent_intf = NULL; } return VLC_SUCCESS; break; case VOUT_SNAPSHOT: p_vout->b_snapshot = VLC_TRUE; return VLC_SUCCESS; break; default: msg_Dbg( p_vout, "control query not supported" ); return VLC_EGENERIC; }}/***************************************************************************** * Object variables callbacks *****************************************************************************/static int ZoomCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; vout_Control( p_vout, VOUT_SET_ZOOM, newval.f_float ); return VLC_SUCCESS;}static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; playlist_t *p_playlist; vout_Control( p_vout, VOUT_SET_STAY_ON_TOP, newval.b_bool ); p_playlist = (playlist_t *)vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_PARENT ); if( p_playlist ) { /* Modify playlist as well because the vout might have to be restarted */ var_Create( p_playlist, "video-on-top", VLC_VAR_BOOL ); var_Set( p_playlist, "video-on-top", newval ); vlc_object_release( p_playlist ); } return VLC_SUCCESS;}static int FullscreenCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; playlist_t *p_playlist; vlc_value_t val; p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; p_playlist = (playlist_t *)vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_PARENT ); if( p_playlist ) { /* Modify playlist as well because the vout might have to be restarted */ var_Create( p_playlist, "fullscreen", VLC_VAR_BOOL ); var_Set( p_playlist, "fullscreen", newval ); vlc_object_release( p_playlist ); } /* Disable "always on top" in fullscreen mode */ var_Get( p_vout, "video-on-top", &val ); if( newval.b_bool && val.b_bool ) { val.b_bool = VLC_FALSE; vout_Control( p_vout, VOUT_SET_STAY_ON_TOP, val.b_bool ); } else if( !newval.b_bool && val.b_bool ) { vout_Control( p_vout, VOUT_SET_STAY_ON_TOP, val.b_bool ); } val.b_bool = VLC_TRUE; var_Set( p_vout, "intf-change", val ); return VLC_SUCCESS;}static int SnapshotCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; vout_Control( p_vout, VOUT_SNAPSHOT ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -