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

📄 sdl.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
 * thread fields. *****************************************************************************/static int OpenDisplay( vout_thread_t *p_vout ){    uint32_t i_flags;    int i_bpp;    /* SDL fucked up fourcc definitions on bigendian machines */    uint32_t i_sdl_chroma;    char *psz_chroma = NULL;    uint32_t i_chroma = 0;    bool b_overlay = config_GetInt( p_vout, "overlay" );    /* Set main window's size */#if SDL_VERSION_ATLEAST(1,2,10)    p_vout->p_sys->i_width = p_vout->b_fullscreen ? p_vout->p_sys->i_desktop_width :                                                    p_vout->i_window_width;    p_vout->p_sys->i_height = p_vout->b_fullscreen ? p_vout->p_sys->i_desktop_height :                                                     p_vout->i_window_height;#else    p_vout->p_sys->i_width = p_vout->b_fullscreen ? p_vout->output.i_width :                                                    p_vout->i_window_width;    p_vout->p_sys->i_height = p_vout->b_fullscreen ? p_vout->output.i_height :                                                     p_vout->i_window_height;#endif    /* Initialize flags and cursor */    i_flags = SDL_ANYFORMAT | SDL_HWPALETTE | SDL_HWSURFACE | SDL_DOUBLEBUF;    i_flags |= p_vout->b_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE;    i_bpp = SDL_VideoModeOK( p_vout->p_sys->i_width, p_vout->p_sys->i_height,                             SDL_DEFAULT_BPP, i_flags );    if( i_bpp == 0 )    {        msg_Err( p_vout, "no video mode available" );        return VLC_EGENERIC;    }    p_vout->p_sys->p_display = SDL_SetVideoMode( p_vout->p_sys->i_width,                                                 p_vout->p_sys->i_height,                                                 i_bpp, i_flags );    if( p_vout->p_sys->p_display == NULL )    {        msg_Err( p_vout, "cannot set video mode" );        return VLC_EGENERIC;    }    SDL_LockSurface( p_vout->p_sys->p_display );    if( ( psz_chroma = config_GetPsz( p_vout, "sdl-chroma" ) ) )    {        if( strlen( psz_chroma ) >= 4 )        {            memcpy(&i_chroma, psz_chroma, 4);            msg_Dbg( p_vout, "Forcing chroma to 0x%.8x (%4.4s)", i_chroma, (char*)&i_chroma );        }        else        {            free( psz_chroma );            psz_chroma = NULL;        }    }    if( b_overlay )    {        /* Choose the chroma we will try first. */        do        {            if( !psz_chroma ) i_chroma = 0;            switch( i_chroma ? i_chroma : p_vout->render.i_chroma )            {                case VLC_FOURCC('Y','U','Y','2'):                case VLC_FOURCC('Y','U','N','V'):                    p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');                    i_sdl_chroma = SDL_YUY2_OVERLAY;                    break;                case VLC_FOURCC('U','Y','V','Y'):                case VLC_FOURCC('U','Y','N','V'):                case VLC_FOURCC('Y','4','2','2'):                    p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y');                    i_sdl_chroma = SDL_UYVY_OVERLAY;                    break;                case VLC_FOURCC('Y','V','Y','U'):                    p_vout->output.i_chroma = VLC_FOURCC('Y','V','Y','U');                    i_sdl_chroma = SDL_YVYU_OVERLAY;                    break;                case VLC_FOURCC('Y','V','1','2'):                case VLC_FOURCC('I','4','2','0'):                case VLC_FOURCC('I','Y','U','V'):                default:                    p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');                    i_sdl_chroma = SDL_YV12_OVERLAY;                    break;            }            free( psz_chroma ); psz_chroma = NULL;            p_vout->p_sys->p_overlay =                SDL_CreateYUVOverlay( 32, 32, i_sdl_chroma,                                      p_vout->p_sys->p_display );            /* FIXME: if the first overlay we find is software, don't stop,             * because we may find a hardware one later ... */        }        while( i_chroma && !p_vout->p_sys->p_overlay );        /* If this best choice failed, fall back to other chromas */        if( p_vout->p_sys->p_overlay == NULL )        {            p_vout->output.i_chroma = VLC_FOURCC('I','Y','U','V');            p_vout->p_sys->p_overlay =                SDL_CreateYUVOverlay( 32, 32, SDL_IYUV_OVERLAY,                                      p_vout->p_sys->p_display );        }        if( p_vout->p_sys->p_overlay == NULL )        {            p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');            p_vout->p_sys->p_overlay =                SDL_CreateYUVOverlay( 32, 32, SDL_YV12_OVERLAY,                                      p_vout->p_sys->p_display );        }        if( p_vout->p_sys->p_overlay == NULL )        {            p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');            p_vout->p_sys->p_overlay =                SDL_CreateYUVOverlay( 32, 32, SDL_YUY2_OVERLAY,                                      p_vout->p_sys->p_display );        }    }    if( p_vout->p_sys->p_overlay == NULL )    {        if( b_overlay )            msg_Warn( p_vout, "no SDL overlay for 0x%.8x (%4.4s)",                      p_vout->render.i_chroma,                      (char*)&p_vout->render.i_chroma );        else            msg_Warn( p_vout, "SDL overlay disabled by the user" );        switch( p_vout->p_sys->p_display->format->BitsPerPixel )        {            case 8:                p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2');                p_vout->output.pf_setpalette = SetPalette;                break;            case 15:                p_vout->output.i_chroma = VLC_FOURCC('R','V','1','5');                break;            case 16:                p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6');                break;            case 24:                p_vout->output.i_chroma = VLC_FOURCC('R','V','2','4');                break;            case 32:                p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2');                break;            default:                msg_Err( p_vout, "unknown screen depth %i",                         p_vout->p_sys->p_display->format->BitsPerPixel );                SDL_UnlockSurface( p_vout->p_sys->p_display );                SDL_FreeSurface( p_vout->p_sys->p_display );                return VLC_EGENERIC;        }        p_vout->output.i_rmask = p_vout->p_sys->p_display->format->Rmask;        p_vout->output.i_gmask = p_vout->p_sys->p_display->format->Gmask;        p_vout->output.i_bmask = p_vout->p_sys->p_display->format->Bmask;        SDL_WM_SetCaption( VOUT_TITLE " (software RGB SDL output)",                           VOUT_TITLE " (software RGB SDL output)" );    }    else    {        if( p_vout->p_sys->p_overlay->hw_overlay )        {            SDL_WM_SetCaption( VOUT_TITLE " (hardware YUV SDL output)",                               VOUT_TITLE " (hardware YUV SDL output)" );        }        else        {            SDL_WM_SetCaption( VOUT_TITLE " (software YUV SDL output)",                               VOUT_TITLE " (software YUV SDL output)" );        }    }    SDL_EventState( SDL_KEYUP, SDL_IGNORE );               /* ignore keys up */    return VLC_SUCCESS;}/***************************************************************************** * CloseDisplay: close and reset SDL device ***************************************************************************** * This function returns all resources allocated by OpenDisplay and restore * the original state of the device. *****************************************************************************/static void CloseDisplay( vout_thread_t *p_vout ){    SDL_FreeYUVOverlay( p_vout->p_sys->p_overlay );    SDL_UnlockSurface ( p_vout->p_sys->p_display );    SDL_FreeSurface( p_vout->p_sys->p_display );}/***************************************************************************** * NewPicture: allocate a picture ***************************************************************************** * Returns 0 on success, -1 otherwise *****************************************************************************/static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ){    int i_width  = p_vout->output.i_width;    int i_height = p_vout->output.i_height;    if( p_vout->p_sys->p_overlay == NULL )    {        /* RGB picture */        if( p_vout->p_sys->i_surfaces )        {            /* We already allocated this surface, return */            return VLC_EGENERIC;        }        p_pic->p_sys = malloc( sizeof( picture_sys_t ) );        if( p_pic->p_sys == NULL )        {            return VLC_ENOMEM;        }        switch( p_vout->p_sys->p_display->format->BitsPerPixel )        {            case 8:                p_pic->p->i_pixel_pitch = 1;                break;            case 15:            case 16:                p_pic->p->i_pixel_pitch = 2;                break;            case 24:            case 32:                p_pic->p->i_pixel_pitch = 4;                break;            default:                return VLC_EGENERIC;        }        p_pic->p->p_pixels = p_vout->p_sys->p_display->pixels;        p_pic->p->i_lines = p_vout->p_sys->p_display->h;        p_pic->p->i_visible_lines = p_vout->p_sys->p_display->h;        p_pic->p->i_pitch = p_vout->p_sys->p_display->pitch;        p_pic->p->i_visible_pitch =            p_pic->p->i_pixel_pitch * p_vout->p_sys->p_display->w;        p_vout->p_sys->i_surfaces++;        p_pic->i_planes = 1;    }    else    {        p_pic->p_sys = malloc( sizeof( picture_sys_t ) );        if( p_pic->p_sys == NULL )        {            return VLC_ENOMEM;        }        p_pic->p_sys->p_overlay =            SDL_CreateYUVOverlay( i_width, i_height,                                  p_vout->output.i_chroma,                                  p_vout->p_sys->p_display );        if( p_pic->p_sys->p_overlay == NULL )        {            free( p_pic->p_sys );            return VLC_EGENERIC;        }        SDL_LockYUVOverlay( p_pic->p_sys->p_overlay );        p_pic->Y_PIXELS = p_pic->p_sys->p_overlay->pixels[0];        p_pic->p[Y_PLANE].i_lines = p_pic->p_sys->p_overlay->h;        p_pic->p[Y_PLANE].i_visible_lines = p_pic->p_sys->p_overlay->h;        p_pic->p[Y_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[0];        switch( p_vout->output.i_chroma )        {        case SDL_YV12_OVERLAY:            p_pic->p[Y_PLANE].i_pixel_pitch = 1;            p_pic->p[Y_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w;            p_pic->U_PIXELS = p_pic->p_sys->p_overlay->pixels[2];            p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[U_PLANE].i_visible_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[2];            p_pic->p[U_PLANE].i_pixel_pitch = 1;            p_pic->p[U_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w / 2;            p_pic->V_PIXELS = p_pic->p_sys->p_overlay->pixels[1];            p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[V_PLANE].i_visible_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[1];            p_pic->p[V_PLANE].i_pixel_pitch = 1;            p_pic->p[V_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w / 2;            p_pic->i_planes = 3;            break;        case SDL_IYUV_OVERLAY:            p_pic->p[Y_PLANE].i_pixel_pitch = 1;            p_pic->p[Y_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w;            p_pic->U_PIXELS = p_pic->p_sys->p_overlay->pixels[1];            p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[U_PLANE].i_visible_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[1];            p_pic->p[U_PLANE].i_pixel_pitch = 1;            p_pic->p[U_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w / 2;            p_pic->V_PIXELS = p_pic->p_sys->p_overlay->pixels[2];            p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[V_PLANE].i_visible_lines = p_pic->p_sys->p_overlay->h / 2;            p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[2];            p_pic->p[V_PLANE].i_pixel_pitch = 1;            p_pic->p[V_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w / 2;            p_pic->i_planes = 3;            break;        default:            p_pic->p[Y_PLANE].i_pixel_pitch = 2;            p_pic->p[U_PLANE].i_visible_pitch = p_pic->p_sys->p_overlay->w * 2;            p_pic->i_planes = 1;            break;        }    }    return VLC_SUCCESS;}/***************************************************************************** * SetPalette: sets an 8 bpp palette *****************************************************************************/static void SetPalette( vout_thread_t *p_vout,                        uint16_t *red, uint16_t *green, uint16_t *blue ){    SDL_Color colors[256];    int i;    /* Fill colors with color information */    for( i = 0; i < 256; i++ )    {        colors[ i ].r = red[ i ] >> 8;        colors[ i ].g = green[ i ] >> 8;        colors[ i ].b = blue[ i ] >> 8;    }    /* Set palette */    if( SDL_SetColors( p_vout->p_sys->p_display, colors, 0, 256 ) == 0 )    {        msg_Err( p_vout, "failed to set palette" );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -