📄 vout.c
字号:
if( ( p_ev->key_flags & Pk_KF_Key_Down ) && ( p_ev->key_flags & Pk_KF_Sym_Valid ) ) { switch( i_key ) { case Pk_q: case Pk_Q: p_vout->p_vlc->b_die = 1; break; case Pk_f: case Pk_F: p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; break; case Pk_c: case Pk_C: p_vout->b_grayscale = ! p_vout->b_grayscale; p_vout->i_changes |= VOUT_GRAYSCALE_CHANGE; break; default: break; } } } } } while( i_ev != -1 && i_ev != 0 ); free( p_event ); /* * fullscreen */ if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ) { PhDim_t dim; p_vout->b_fullscreen = !p_vout->b_fullscreen; p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; if( p_vout->b_fullscreen ) { p_vout->p_sys->old_pos.x = p_vout->p_sys->pos.x; p_vout->p_sys->old_pos.y = p_vout->p_sys->pos.y; p_vout->p_sys->pos.x = p_vout->p_sys->pos.y = 0; dim.w = p_vout->p_sys->screen_dim.w + 1; dim.h = p_vout->p_sys->screen_dim.h + 1; } else { p_vout->p_sys->pos.x = p_vout->p_sys->old_pos.x; p_vout->p_sys->pos.y = p_vout->p_sys->old_pos.y; dim.w = p_vout->p_sys->old_dim.w + 1; dim.h = p_vout->p_sys->old_dim.h + 1; } /* modify render flags, border */ PtSetResource( p_vout->p_sys->p_window, Pt_ARG_WINDOW_RENDER_FLAGS, p_vout->b_fullscreen ? Pt_FALSE : Pt_TRUE, Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE ); /* set position and dimension */ PtSetResource( p_vout->p_sys->p_window, Pt_ARG_POS, &p_vout->p_sys->pos, 0 ); PtSetResource( p_vout->p_sys->p_window, Pt_ARG_DIM, &dim, 0 ); /* mark as damaged to force redraw */ PtDamageWidget( p_vout->p_sys->p_window ); } /* * size change */ if( p_vout->i_changes & VOUT_SIZE_CHANGE ) { p_vout->i_changes &= ~VOUT_SIZE_CHANGE; if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { ResizeOverlayOutput(p_vout); }#if 0 else { p_vout->output.i_width = p_vout->p_sys->dim.w; p_vout->output.i_height = p_vout->p_sys->dim.h; p_vout->i_changes |= VOUT_YUV_CHANGE; QNXEnd( p_vout ); if( QNXInit( p_vout ) ) { msg_Err( p_vout, "cannot resize display" ); return( 1 ); } }#endif msg_Dbg( p_vout, "video display resized (%dx%d)", p_vout->p_sys->dim.w, p_vout->p_sys->dim.h ); } /* * position change, move video channel */ if( b_repos && p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { ResizeOverlayOutput(p_vout); } return( i_ev == -1 );}/***************************************************************************** * QNXDisplay: displays previously rendered output ***************************************************************************** * This function send the currently rendered image to QNX server, wait until * it is displayed and switch the two rendering buffer, preparing next frame. *****************************************************************************/static void QNXDisplay( vout_thread_t *p_vout, picture_t *p_pic ){ if( p_vout->p_sys->i_mode == MODE_NORMAL_MEM || p_vout->p_sys->i_mode == MODE_SHARED_MEM ) { PhPoint_t pos = { 0, 0 }; PgSetRegion( PtWidgetRid( p_vout->p_sys->p_window ) ); if (p_vout->p_sys->i_screen_depth == 8) { PgSetPalette( p_vout->p_sys->p_colors, 0, 0, 255, Pg_PALSET_SOFT, 0); } PgDrawPhImagemx( &pos, p_pic->p_sys->p_image, 0 ); PgFlush(); } else if( p_vout->p_sys->i_mode == MODE_VIDEO_MEM ) { PhRect_t rc = { { 0, 0 }, { p_vout->output.i_width, p_vout->output.i_height } };// PgSetRegion( PtWidgetRid ( p_vout->p_sys->p_window ) ); PgContextBlit( p_pic->p_sys->p_ctx[0], &rc, NULL, &rc ); PgFlush(); }}/***************************************************************************** * QNXInitDisplay: check screen resolution, depth, amount of video ram, etc *****************************************************************************/static int QNXInitDisplay( vout_thread_t * p_vout ){ PgHWCaps_t hwcaps; PgDisplaySettings_t cfg; PgVideoModeInfo_t minfo; /* get graphics card hw capabilities */ if( PgGetGraphicsHWCaps( &hwcaps ) != 0 ) { msg_Err( p_vout, "unable to get gfx card capabilities" ); return( 1 ); } /* get current video mode */ if( PgGetVideoMode( &cfg ) != 0 ) { msg_Err( p_vout, "unable to get current video mode" ); return( 1 ); } /* get video mode info */ if( PgGetVideoModeInfo( cfg.mode, &minfo ) != 0 ) { msg_Err( p_vout, "unable to get info for video mode" ); return( 1 ); } if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { int i = 0; PgScalerCaps_t vcaps; if( ( p_vout->p_sys->p_channel = PgCreateVideoChannel( Pg_VIDEO_CHANNEL_SCALER, 0 ) ) == NULL ) { msg_Err( p_vout, "unable to create video channel" ); printf("errno = %d\n", errno); p_vout->p_sys->i_mode = MODE_NORMAL_MEM; } else { vcaps.size = sizeof( vcaps ); while( PgGetScalerCapabilities( p_vout->p_sys->p_channel, i++, &vcaps ) == 0 ) { printf("vcaps.format = 0x%x\n", vcaps.format); if( vcaps.format == Pg_VIDEO_FORMAT_YV12 || vcaps.format == Pg_VIDEO_FORMAT_YUV420 || vcaps.format == Pg_VIDEO_FORMAT_YUY2 || vcaps.format == Pg_VIDEO_FORMAT_UYVY || vcaps.format == Pg_VIDEO_FORMAT_RGB555 || vcaps.format == Pg_VIDEO_FORMAT_RGB565 || vcaps.format == Pg_VIDEO_FORMAT_RGB8888 ) { p_vout->p_sys->i_vc_flags = vcaps.flags; p_vout->p_sys->i_vc_format = vcaps.format; } vcaps.size = sizeof( vcaps ); } if( p_vout->p_sys->i_vc_format == 0 ) { msg_Warn( p_vout, "need YV12, YUY2 or RGB8888 overlay" ); p_vout->p_sys->i_mode = MODE_NORMAL_MEM; } } } /* use video ram if we have enough available */ if( p_vout->p_sys->i_mode == MODE_NORMAL_MEM && (minfo.bits_per_pixel != 8) && hwcaps.currently_available_video_ram >= ( ( minfo.width * minfo.height * minfo.bits_per_pixel * MAX_DIRECTBUFFERS) / 8 ) ) { p_vout->p_sys->i_mode = MODE_VIDEO_MEM; printf("Using video memory...\n"); } p_vout->p_sys->i_img_type = minfo.type; p_vout->p_sys->screen_dim.w = minfo.width; p_vout->p_sys->screen_dim.h = minfo.height; p_vout->p_sys->i_screen_depth = minfo.bits_per_pixel; switch( p_vout->p_sys->i_screen_depth ) { case 8: p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2'); p_vout->p_sys->i_bytes_per_pixel = 1; p_vout->output.pf_setpalette = SetPalette; break; case 15: p_vout->output.i_chroma = VLC_FOURCC('R','V','1','5'); p_vout->p_sys->i_bytes_per_pixel = 2; p_vout->output.i_rmask = 0x7c00; p_vout->output.i_gmask = 0x03e0; p_vout->output.i_bmask = 0x001f; break; case 16: p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6'); p_vout->p_sys->i_bytes_per_pixel = 2; p_vout->output.i_rmask = 0xf800; p_vout->output.i_gmask = 0x07e0; p_vout->output.i_bmask = 0x001f; break; case 24: p_vout->output.i_chroma = VLC_FOURCC('R','V','2','4'); p_vout->p_sys->i_bytes_per_pixel = 3; p_vout->output.i_rmask = 0xff0000; p_vout->output.i_gmask = 0x00ff00; p_vout->output.i_bmask = 0x0000ff; break; case 32: default: p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2'); p_vout->p_sys->i_bytes_per_pixel = 4; p_vout->output.i_rmask = 0xff0000; p_vout->output.i_gmask = 0x00ff00; p_vout->output.i_bmask = 0x0000ff; break; } return( 0 );}/***************************************************************************** * QNXCreateWnd: create and realize the main window *****************************************************************************/static int QNXCreateWnd( vout_thread_t * p_vout ){ PtArg_t args[8]; PhPoint_t pos = { 0, 0 }; PgColor_t color = Pg_BLACK; if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { if( p_vout->p_sys->i_vc_flags & Pg_SCALER_CAP_DST_CHROMA_KEY ) { color = PgGetOverlayChromaColor(); } } /* fullscreen, set dimension */ if( p_vout->b_fullscreen ) { p_vout->p_sys->old_dim.w = p_vout->p_sys->dim.w; p_vout->p_sys->old_dim.h = p_vout->p_sys->dim.h; p_vout->output.i_width = p_vout->p_sys->dim.w = p_vout->p_sys->screen_dim.w; p_vout->output.i_height = p_vout->p_sys->dim.h = p_vout->p_sys->screen_dim.h; } /* set window parameters */ PtSetArg( &args[0], Pt_ARG_POS, &pos, 0 ); PtSetArg( &args[1], Pt_ARG_DIM, &p_vout->p_sys->dim, 0 ); PtSetArg( &args[2], Pt_ARG_FILL_COLOR, color, 0 ); PtSetArg( &args[3], Pt_ARG_WINDOW_TITLE, "VideoLan Client", 0 ); PtSetArg( &args[4], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_CLOSE ); PtSetArg( &args[5], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_MOVE | Ph_WM_RESIZE | Ph_WM_CLOSE ); PtSetArg( &args[6], Pt_ARG_WINDOW_RENDER_FLAGS, p_vout->b_fullscreen ? Pt_FALSE : Pt_TRUE, Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE ); /* create window */ p_vout->p_sys->p_window = PtCreateWidget( PtWindow, Pt_NO_PARENT, 7, args); if( p_vout->p_sys->p_window == NULL ) { msg_Err( p_vout, "unable to create window" ); return( 1 ); } /* realize the window widget */ if( PtRealizeWidget( p_vout->p_sys->p_window ) != 0 ) { msg_Err( p_vout, "unable to realize window widget" ); PtDestroyWidget( p_vout->p_sys->p_window ); return( 1 ); } /* get window frame size */ if( PtWindowFrameSize( NULL, p_vout->p_sys->p_window, &p_vout->p_sys->frame ) != 0 ) { msg_Err( p_vout, "unable to get window frame size" ); PtDestroyWidget( p_vout->p_sys->p_window ); return( 1 ); } return( 0 );}/***************************************************************************** * QNXDestroyWnd: unrealize and destroy the main window *****************************************************************************/static int QNXDestroyWnd( vout_thread_t * p_vout ){ /* destroy the window widget */ PtUnrealizeWidget( p_vout->p_sys->p_window );// PtDestroyWidget( p_vout->p_sys->p_window ); /* destroy video channel */ if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { PgDestroyVideoChannel( p_vout->p_sys->p_channel ); } return( 0 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -