📄 sdl.c
字号:
* 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 + -