📄 videooutput.cpp
字号:
menu->AddSeparatorItem(); // Window Feel Items/* BMessage *winNormFeel = new BMessage(WINDOW_FEEL); winNormFeel->AddInt32("WinFeel", (int32_t)B_NORMAL_WINDOW_FEEL); BMenuItem *normWindItem = new BMenuItem("Normal Window", winNormFeel); normWindItem->SetMarked(videoWindow->Feel() == B_NORMAL_WINDOW_FEEL); menu->AddItem(normWindItem); BMessage *winFloatFeel = new BMessage(WINDOW_FEEL); winFloatFeel->AddInt32("WinFeel", (int32_t)B_FLOATING_APP_WINDOW_FEEL); BMenuItem *onTopWindItem = new BMenuItem("App Top", winFloatFeel); onTopWindItem->SetMarked(videoWindow->Feel() == B_FLOATING_APP_WINDOW_FEEL); menu->AddItem(onTopWindItem); BMessage *winAllFeel = new BMessage(WINDOW_FEEL); winAllFeel->AddInt32("WinFeel", (int32_t)B_FLOATING_ALL_WINDOW_FEEL); BMenuItem *allSpacesWindItem = new BMenuItem("On Top All Workspaces", winAllFeel); allSpacesWindItem->SetMarked(videoWindow->Feel() == B_FLOATING_ALL_WINDOW_FEEL); menu->AddItem(allSpacesWindItem);*/ BMessage *windowFeelMsg = new BMessage( WINDOW_FEEL ); bool onTop = videoWindow->Feel() == B_FLOATING_ALL_WINDOW_FEEL; window_feel feel = onTop ? B_NORMAL_WINDOW_FEEL : B_FLOATING_ALL_WINDOW_FEEL; windowFeelMsg->AddInt32( "WinFeel", (int32_t)feel ); BMenuItem *windowFeelItem = new BMenuItem( _("Stay On Top"), windowFeelMsg ); windowFeelItem->SetMarked( onTop ); menu->AddItem( windowFeelItem ); menu->AddSeparatorItem(); BMenuItem* screenShotItem = new BMenuItem( _("Take Screen Shot"), new BMessage( SCREEN_SHOT ) ); menu->AddItem( screenShotItem ); menu->SetTargetForItems( this ); ConvertToScreen( &where ); BRect mouseRect( where.x - 5, where.y - 5, where.x + 5, where.y + 5 ); menu->Go( where, true, false, mouseRect, true ); } } } fLastMouseMovedTime = mdate(); fCursorHidden = false;}/***************************************************************************** * VLCVIew::MouseUp *****************************************************************************/voidVLCView::MouseUp( BPoint where ){ vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_vout, "mouse-clicked", val );}/***************************************************************************** * VLCVIew::MouseMoved *****************************************************************************/voidVLCView::MouseMoved(BPoint point, uint32 transit, const BMessage* dragMessage){ fLastMouseMovedTime = mdate(); fCursorHidden = false; fCursorInside = ( transit == B_INSIDE_VIEW || transit == B_ENTERED_VIEW ); if( !fCursorInside ) { return; } vlc_value_t val; unsigned int i_width, i_height, i_x, i_y; vout_PlacePicture( p_vout, (unsigned int)Bounds().Width(), (unsigned int)Bounds().Height(), &i_x, &i_y, &i_width, &i_height ); val.i_int = ( (int)point.x - i_x ) * p_vout->render.i_width / i_width; var_Set( p_vout, "mouse-x", val ); val.i_int = ( (int)point.y - i_y ) * p_vout->render.i_height / i_height; var_Set( p_vout, "mouse-y", val ); val.b_bool = VLC_TRUE; var_Set( p_vout, "mouse-moved", val );}/***************************************************************************** * VLCVIew::Pulse *****************************************************************************/voidVLCView::Pulse(){ // We are getting the pulse messages no matter if the mouse is over // this view. If we are in full screen mode, we want to hide the cursor // even if it is not. VideoWindow *videoWindow = dynamic_cast<VideoWindow*>(Window()); if (!fCursorHidden) { if (fCursorInside && mdate() - fLastMouseMovedTime > MOUSE_IDLE_TIMEOUT) { be_app->ObscureCursor(); fCursorHidden = true; // hide the interface window as well if full screen if (videoWindow && videoWindow->IsFullScreen()) videoWindow->SetInterfaceShowing(false); } } // Workaround to disable the screensaver in full screen: // we simulate an activity every 29 seconds if( videoWindow && videoWindow->IsFullScreen() && mdate() - fLastMouseMovedTime > 29000000 ) { BPoint where; uint32 buttons; GetMouse(&where, &buttons, false); ConvertToScreen(&where); set_mouse_position((int32_t) where.x, (int32_t) where.y); }}/***************************************************************************** * VLCVIew::Draw *****************************************************************************/voidVLCView::Draw(BRect updateRect){ VideoWindow* window = dynamic_cast<VideoWindow*>( Window() ); if ( window && window->mode == BITMAP ) FillRect( updateRect );}/***************************************************************************** * Local prototypes *****************************************************************************/static int Init ( vout_thread_t * );static void End ( vout_thread_t * );static int Manage ( vout_thread_t * );static void Display ( vout_thread_t *, picture_t * );static int Control ( vout_thread_t *, int, va_list );static int BeosOpenDisplay ( vout_thread_t *p_vout );static void BeosCloseDisplay( vout_thread_t *p_vout );/***************************************************************************** * OpenVideo: allocates BeOS video thread output method ***************************************************************************** * This function allocates and initializes a BeOS vout method. *****************************************************************************/int E_(OpenVideo) ( vlc_object_t *p_this ){ vout_thread_t * p_vout = (vout_thread_t *)p_this; /* Allocate structure */ p_vout->p_sys = (vout_sys_t*) malloc( sizeof( vout_sys_t ) ); if( p_vout->p_sys == NULL ) { msg_Err( p_vout, "out of memory" ); return( 1 ); } p_vout->p_sys->i_width = p_vout->render.i_width; p_vout->p_sys->i_height = p_vout->render.i_height; p_vout->p_sys->source_chroma = p_vout->render.i_chroma; p_vout->pf_init = Init; p_vout->pf_end = End; p_vout->pf_manage = Manage; p_vout->pf_render = NULL; p_vout->pf_display = Display; p_vout->pf_control = Control; return( 0 );}/***************************************************************************** * Init: initialize BeOS video thread output method *****************************************************************************/int Init( vout_thread_t *p_vout ){ int i_index; picture_t *p_pic; I_OUTPUTPICTURES = 0; /* Open and initialize device */ if( BeosOpenDisplay( p_vout ) ) { msg_Err(p_vout, "vout error: can't open display"); return 0; } p_vout->output.i_width = p_vout->render.i_width; p_vout->output.i_height = p_vout->render.i_height; /* Assume we have square pixels */ p_vout->output.i_aspect = p_vout->p_sys->i_width * VOUT_ASPECT_FACTOR / p_vout->p_sys->i_height; p_vout->output.i_chroma = colspace[p_vout->p_sys->p_window->colspace_index].chroma; p_vout->p_sys->i_index = 0; p_vout->b_direct = 1; p_vout->output.i_rmask = 0x00ff0000; p_vout->output.i_gmask = 0x0000ff00; p_vout->output.i_bmask = 0x000000ff; for( int buffer_index = 0 ; buffer_index < p_vout->p_sys->p_window->bitmap_count; buffer_index++ ) { p_pic = NULL; /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { p_pic = NULL; if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } if( p_pic == NULL ) { return 0; } p_pic->p->p_pixels = (uint8_t*)p_vout->p_sys->p_window->bitmap[buffer_index]->Bits(); 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_pixel_pitch = colspace[p_vout->p_sys->p_window->colspace_index].pixel_bytes; p_pic->i_planes = colspace[p_vout->p_sys->p_window->colspace_index].planes; p_pic->p->i_pitch = p_vout->p_sys->p_window->bitmap[buffer_index]->BytesPerRow(); p_pic->p->i_visible_pitch = p_pic->p->i_pixel_pitch * ( p_vout->p_sys->p_window->bitmap[buffer_index]->Bounds().IntegerWidth() + 1 ); p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; } return( 0 );}/***************************************************************************** * End: terminate BeOS video thread output method *****************************************************************************/void End( vout_thread_t *p_vout ){ BeosCloseDisplay( p_vout );}/***************************************************************************** * Manage *****************************************************************************/static int Manage( vout_thread_t * p_vout ){ if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ) { p_vout->p_sys->p_window->PostMessage( TOGGLE_FULL_SCREEN ); p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; } return 0;}/***************************************************************************** * CloseVideo: destroy BeOS video thread output method ***************************************************************************** * Terminate an output method created by DummyCreateOutputMethod *****************************************************************************/void E_(CloseVideo) ( vlc_object_t *p_this ){ vout_thread_t * p_vout = (vout_thread_t *)p_this; free( p_vout->p_sys );}/***************************************************************************** * Display: displays previously rendered output ***************************************************************************** * This function send the currently rendered image to BeOS image, waits until * it is displayed and switch the two rendering buffers, preparing next frame. *****************************************************************************/void Display( vout_thread_t *p_vout, picture_t *p_pic ){ VideoWindow * p_win = p_vout->p_sys->p_window; /* draw buffer if required */ if (!p_win->teardownwindow) { p_win->drawBuffer(p_vout->p_sys->i_index); } /* change buffer */ p_vout->p_sys->i_index = ++p_vout->p_sys->i_index % p_vout->p_sys->p_window->bitmap_count; p_pic->p->p_pixels = (uint8_t*)p_vout->p_sys->p_window->bitmap[p_vout->p_sys->i_index]->Bits();}static int Control( vout_thread_t * p_vout, int i_query, va_list args ){ return vout_vaControlDefault( p_vout, i_query, args );}/* following functions are local *//***************************************************************************** * BeosOpenDisplay: open and initialize BeOS device *****************************************************************************/static int BeosOpenDisplay( vout_thread_t *p_vout ){ p_vout->p_sys->p_window = new VideoWindow( p_vout->p_sys->i_width - 1, p_vout->p_sys->i_height - 1, BRect( 20, 50, 20 + p_vout->i_window_width - 1, 50 + p_vout->i_window_height - 1 ), p_vout ); if( p_vout->p_sys->p_window == NULL ) { msg_Err( p_vout, "cannot allocate VideoWindow" ); return( 1 ); } else { p_vout->p_sys->p_window->Show(); } return( 0 );}/***************************************************************************** * BeosDisplay: close and reset BeOS device ***************************************************************************** * Returns all resources allocated by BeosOpenDisplay and restore the original * state of the device. *****************************************************************************/static void BeosCloseDisplay( vout_thread_t *p_vout ){ VideoWindow * p_win = p_vout->p_sys->p_window; /* Destroy the video window */ if( p_win != NULL && !p_win->teardownwindow) { p_win->Lock(); p_win->teardownwindow = true; p_win->Hide(); p_win->Quit(); } p_win = NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -