📄 vout_intf.c
字号:
while( psz_cur && *psz_cur ) { psz_next = strchr( psz_cur, ',' ); if( psz_next ) { *psz_next = '\0'; psz_next++; } val.psz_string = strdup( psz_cur ); text.psz_string = strdup( psz_cur ); var_Change( p_vout, "aspect-ratio", VLC_VAR_ADDCHOICE, &val, &text); free( val.psz_string ); free( text.psz_string ); psz_cur = psz_next; } } if( psz_buf ) free( psz_buf ); var_AddCallback( p_vout, "aspect-ratio", AspectCallback, NULL ); var_Get( p_vout, "aspect-ratio", &old_val ); if( (old_val.psz_string && *old_val.psz_string) || b_force_par ) var_Change( p_vout, "aspect-ratio", VLC_VAR_TRIGGER_CALLBACKS, 0, 0 ); if( old_val.psz_string ) free( old_val.psz_string ); /* Initialize the dimensions of the video window */ InitWindowSize( p_vout, &p_vout->i_window_width, &p_vout->i_window_height ); /* Add a variable to indicate if the window should be on top of others */ var_Create( p_vout, "video-on-top", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); text.psz_string = _("Always on top"); var_Change( p_vout, "video-on-top", VLC_VAR_SETTEXT, &text, NULL ); var_AddCallback( p_vout, "video-on-top", OnTopCallback, NULL ); /* Add a variable to indicate whether we want window decoration or not */ var_Create( p_vout, "video-deco", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); /* Add a fullscreen variable */ var_Create( p_vout, "fullscreen", VLC_VAR_BOOL ); text.psz_string = _("Fullscreen"); var_Change( p_vout, "fullscreen", VLC_VAR_SETTEXT, &text, NULL ); var_Change( p_vout, "fullscreen", VLC_VAR_INHERITVALUE, &val, NULL ); if( val.b_bool ) { /* user requested fullscreen */ p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; } var_AddCallback( p_vout, "fullscreen", FullscreenCallback, NULL ); /* Add a snapshot variable */ var_Create( p_vout, "video-snapshot", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); text.psz_string = _("Snapshot"); var_Change( p_vout, "video-snapshot", VLC_VAR_SETTEXT, &text, NULL ); var_AddCallback( p_vout, "video-snapshot", SnapshotCallback, NULL ); /* Mouse coordinates */ var_Create( p_vout, "mouse-x", VLC_VAR_INTEGER ); var_Create( p_vout, "mouse-y", VLC_VAR_INTEGER ); var_Create( p_vout, "mouse-button-down", VLC_VAR_INTEGER ); var_Create( p_vout, "mouse-moved", VLC_VAR_BOOL ); var_Create( p_vout, "mouse-clicked", VLC_VAR_INTEGER ); var_Create( p_vout, "intf-change", VLC_VAR_BOOL ); val.b_bool = VLC_TRUE; var_Set( p_vout, "intf-change", val );}/***************************************************************************** * vout_Snapshot: generates a snapshot. *****************************************************************************/int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic ){ image_handler_t *p_image = image_HandlerCreate( p_vout ); video_format_t fmt_in = {0}, fmt_out = {0}; char *psz_filename = NULL; subpicture_t *p_subpic; picture_t *p_pif; vlc_value_t val, format; DIR *path; 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; } /* Embedded snapshot : if snapshot-path == object:object-id, then create a snapshot_t* and store it in object(object-id)->p_private, then unlock and signal the waiting object. */ if( val.psz_string && !strncmp( val.psz_string, "object:", 7 ) ) { int i_id; vlc_object_t* p_dest; block_t *p_block; snapshot_t *p_snapshot; int i_size; /* Destination object-id is following object: */ i_id = atoi( &val.psz_string[7] ); p_dest = ( vlc_object_t* )vlc_current_object( i_id ); if( !p_dest ) { msg_Err( p_vout, "Cannot find calling object" ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } /* Object must be locked. We will unlock it once we get the snapshot and written it to p_private */ p_dest->p_private = NULL; /* Save the snapshot to a memory zone */ fmt_in = p_vout->fmt_in; fmt_out.i_sar_num = fmt_out.i_sar_den = 1; /* FIXME: should not be hardcoded. We should be able to specify the snapshot size (snapshot-width and snapshot-height). */ fmt_out.i_width = 320; fmt_out.i_height = 200; fmt_out.i_chroma = VLC_FOURCC( 'p','n','g',' ' ); p_block = ( block_t* ) image_Write( p_image, p_pic, &fmt_in, &fmt_out ); if( !p_block ) { msg_Err( p_vout, "Could not get snapshot" ); image_HandlerDelete( p_image ); vlc_cond_signal( &p_dest->object_wait ); vlc_mutex_unlock( &p_dest->object_lock ); vlc_object_release( p_dest ); return VLC_EGENERIC; } /* Copy the p_block data to a snapshot structure */ /* FIXME: get the timestamp */ p_snapshot = ( snapshot_t* ) malloc( sizeof( snapshot_t ) ); if( !p_snapshot ) { block_Release( p_block ); image_HandlerDelete( p_image ); vlc_cond_signal( &p_dest->object_wait ); vlc_mutex_unlock( &p_dest->object_lock ); vlc_object_release( p_dest ); return VLC_ENOMEM; } i_size = p_block->i_buffer; p_snapshot->i_width = fmt_out.i_width; p_snapshot->i_height = fmt_out.i_height; p_snapshot->i_datasize = i_size; p_snapshot->date = p_block->i_pts; /* FIXME ?? */ p_snapshot->p_data = ( char* ) malloc( i_size ); if( !p_snapshot->p_data ) { block_Release( p_block ); free( p_snapshot ); image_HandlerDelete( p_image ); vlc_cond_signal( &p_dest->object_wait ); vlc_mutex_unlock( &p_dest->object_lock ); vlc_object_release( p_dest ); return VLC_ENOMEM; } memcpy( p_snapshot->p_data, p_block->p_buffer, p_block->i_buffer ); p_dest->p_private = p_snapshot; block_Release( p_block ); /* Unlock the object */ vlc_cond_signal( &p_dest->object_wait ); vlc_mutex_unlock( &p_dest->object_lock ); vlc_object_release( p_dest ); image_HandlerDelete( p_image ); return VLC_SUCCESS; }#if defined(__APPLE__) || 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 path 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" ); } /* * Did the user specify a directory? If not, path = NULL. */ path = utf8_opendir ( (const char *)val.psz_string ); if ( path != NULL ) { char *psz_prefix = var_GetString( p_vout, "snapshot-prefix" ); if( !psz_prefix ) psz_prefix = strdup( "vlcsnap-" ); vlc_closedir_wrapper( path ); if( var_GetBool( p_vout, "snapshot-sequential" ) == VLC_TRUE ) { int i_num = var_GetInteger( p_vout, "snapshot-num" ); FILE *p_file; do { asprintf( &psz_filename, "%s" DIR_SEP "%s%05d.%s", val.psz_string, psz_prefix, i_num++, format.psz_string ); } while( ( p_file = utf8_fopen( psz_filename, "r" ) ) && !fclose( p_file ) ); var_SetInteger( p_vout, "snapshot-num", i_num ); } else { asprintf( &psz_filename, "%s" DIR_SEP "%s%u.%s", val.psz_string, psz_prefix, (unsigned int)(p_pic->date / 100000) & 0xFFFFFF, format.psz_string ); } free( psz_prefix ); } else // The user specified a full path name (including file name) { asprintf ( &psz_filename, "%s", val.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 ); vout_OSDMessage( VLC_OBJECT( p_vout ), DEFAULT_CHAN, "%s", psz_filename ); free( psz_filename ); if( var_GetBool( p_vout, "snapshot-preview" ) ) { /* 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 ); } else { image_HandlerDelete( p_image ); } 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 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -