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

📄 sdl.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 );    /* Choose the chroma we will try first. */    switch( 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;    }    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 ... */    /* 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 )    {        msg_Warn( p_vout, "no SDL overlay for 0x%.8x (%4.4s)",                  p_vout->render.i_chroma, (char*)&p_vout->render.i_chroma );        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 + -