⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vout_intf.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -