/***************************************************************************** * Init: initialize video thread output method ***************************************************************************** * This function create the buffers needed by the output thread. It is called * at the beginning of the thread, but also each time the window is resized. *****************************************************************************/ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t* p_pic; int dd = QPixmap::defaultDepth(); I_OUTPUTPICTURES = 0; p_vout->output.i_chroma = (dd == 16) ? VLC_CODEC_RGB16 : VLC_CODEC_RGB32; p_vout->output.i_rmask = 0xf800; p_vout->output.i_gmask = 0x07e0; p_vout->output.i_bmask = 0x001f; /* All we have is an RGB image with square pixels */ p_vout->output.i_width = p_vout->p_sys->i_width; p_vout->output.i_height = p_vout->p_sys->i_height; if( !p_vout->b_fullscreen ) { p_vout->output.i_aspect = p_vout->output.i_width * VOUT_ASPECT_FACTOR / p_vout->output.i_height; } else { p_vout->output.i_aspect = p_vout->render.i_aspect; } #if 0 msg_Dbg( p_vout, "Init (h=%d,w=%d,aspect=%d)",p_vout->output.i_height,p_vout->output.i_width,p_vout->output.i_aspect ); #endif /* Try to initialize MAX_DIRECTBUFFERS direct buffers */ while( I_OUTPUTPICTURES < QTE_MAX_DIRECTBUFFERS ) { p_pic = NULL; /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } /* Allocate the picture */ if( p_pic == NULL || NewPicture( p_vout, p_pic ) ) { break; } p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; } return( 0 ); }
/***************************************************************************** * Init: initialize SDL video thread output method ***************************************************************************** * This function initialize the SDL display device. *****************************************************************************/ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; p_vout->p_sys->i_surfaces = 0; I_OUTPUTPICTURES = 0; /* Initialize the output structure */ if( p_vout->p_sys->p_overlay == NULL ) { /* All we have is an RGB image with square pixels */ p_vout->output.i_width = p_vout->p_sys->i_width; p_vout->output.i_height = p_vout->p_sys->i_height; p_vout->output.i_aspect = p_vout->output.i_width * VOUT_ASPECT_FACTOR / p_vout->output.i_height; } else { /* We may need to convert the chroma, but at least we keep the * aspect ratio */ p_vout->output.i_width = p_vout->render.i_width; p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; } /* Try to initialize SDL_MAX_DIRECTBUFFERS direct buffers */ while( I_OUTPUTPICTURES < SDL_MAX_DIRECTBUFFERS ) { p_pic = NULL; /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } /* Allocate the picture if we found one */ if( p_pic == NULL || NewPicture( p_vout, p_pic ) ) { break; } p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; } return VLC_SUCCESS; }
/***************************************************************************** * Init: initialize video thread output method *****************************************************************************/ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic = NULL; I_OUTPUTPICTURES = 0; p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2'); p_vout->output.i_width = p_vout->p_sys->i_width; p_vout->output.i_height = p_vout->p_sys->i_height; p_vout->output.i_aspect = p_vout->p_sys->i_width * VOUT_ASPECT_FACTOR / p_vout->p_sys->i_height; /* Only RGBA 32bpp is supported by output device. */ switch( p_vout->p_sys->i_screen_depth ) { case 8: /* FIXME: set the palette */ p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2'); 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->i_screen_depth ); return VLC_SUCCESS; } /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } if( p_pic == NULL || NewPicture( p_vout, p_pic ) ) { return -1; } /* Allocate the picture */ p_pic->p->i_lines = p_vout->p_sys->i_height; p_pic->p->i_visible_lines = p_vout->p_sys->i_height; p_pic->p->i_pitch = p_vout->p_sys->i_width; p_pic->p->i_pixel_pitch = 1; p_pic->p->i_visible_pitch = p_vout->p_sys->i_width; p_pic->i_planes = 1; p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; return VLC_SUCCESS; }
/***************************************************************************** * QNXInit: initialize QNX video thread output method ***************************************************************************** * This function create the buffers needed by the output thread. It is called * at the beginning of the thread, but also each time the window is resized. *****************************************************************************/ static int QNXInit( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; I_OUTPUTPICTURES = 0; switch( p_vout->p_sys->i_mode ) { case MODE_NORMAL_MEM: case MODE_SHARED_MEM: p_vout->output.i_width = p_vout->p_sys->dim.w; p_vout->output.i_height = p_vout->p_sys->dim.h; /* Assume we have square pixels */ p_vout->output.i_aspect = p_vout->p_sys->dim.w * VOUT_ASPECT_FACTOR / p_vout->p_sys->dim.h; break; case MODE_VIDEO_MEM: p_vout->output.i_width = p_vout->p_sys->dim.w; p_vout->output.i_height = p_vout->p_sys->dim.h; /* Assume we have square pixels */ p_vout->output.i_aspect = p_vout->p_sys->dim.w * VOUT_ASPECT_FACTOR / p_vout->p_sys->dim.h; break; case MODE_VIDEO_OVERLAY: p_vout->output.i_width = p_vout->render.i_width; p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; if (ResizeOverlayOutput(p_vout)) { return (1); } break; default: /* This shouldn't happen ! */ break; } /* Try to initialize up to MAX_DIRECTBUFFERS direct buffers */ while( I_OUTPUTPICTURES < MAX_DIRECTBUFFERS ) { p_pic = NULL; /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } /* Allocate the picture */ if( p_pic == NULL || NewPicture( p_vout, p_pic, I_OUTPUTPICTURES ) ) { break; } p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; } return( 0 ); }