X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Fbeos%2Fvout_beos.cpp;h=8038ccbca3001c35c77511dfd97bfafd5fc5f787;hb=07a8286a1aa4e128d9e9fa590b61c12f830ab8a2;hp=dda84768934feb53892654f72c03847cef488d81;hpb=38d1a266e2c17c00420d173b3a8b86e66c07b023;p=vlc diff --git a/plugins/beos/vout_beos.cpp b/plugins/beos/vout_beos.cpp index dda8476893..8038ccbca3 100644 --- a/plugins/beos/vout_beos.cpp +++ b/plugins/beos/vout_beos.cpp @@ -2,7 +2,7 @@ * vout_beos.cpp: beos video output display method ***************************************************************************** * Copyright (C) 2000, 2001 VideoLAN - * $Id: vout_beos.cpp,v 1.28 2001/08/14 12:09:03 tcastley Exp $ + * $Id: vout_beos.cpp,v 1.43 2002/02/27 03:47:56 sam Exp $ * * Authors: Jean-Marc Dressler * Samuel Hocevar @@ -24,53 +24,31 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -#define MODULE_NAME beos -#include "modules_inner.h" - /***************************************************************************** * Preamble *****************************************************************************/ -#include "defs.h" - #include /* ENOMEM */ #include /* free() */ #include #include /* strerror() */ -#include -#include +#include +#include #include -#include -#include -#include -#include -#include +#include extern "C" { -#include "config.h" -#include "common.h" -#include "threads.h" -#include "mtime.h" -#include "tests.h" +#include #include "video.h" #include "video_output.h" #include "interface.h" -#include "intf_msg.h" - -#include "main.h" - -#include "modules.h" -#include "modules_export.h" } #include "VideoWindow.h" -#include -#define WIDTH 128 -#define HEIGHT 64 -#define BITS_PER_PLANE 16 +#define BITS_PER_PLANE 16 #define BYTES_PER_PIXEL 2 /***************************************************************************** @@ -79,21 +57,22 @@ extern "C" * This structure is part of the video output thread descriptor. * It describes the BeOS specific properties of an output thread. *****************************************************************************/ - typedef struct vout_sys_s { - VideoWindow * p_window; + VideoWindow * p_window; + + s32 i_width; + s32 i_height; + + u8 *pp_buffer[2]; + int i_index; - byte_t * pp_buffer[2]; - s32 i_width; - s32 i_height; } vout_sys_t; /***************************************************************************** * beos_GetAppWindow : retrieve a BWindow pointer from the window name *****************************************************************************/ - BWindow *beos_GetAppWindow(char *name) { int32 index; @@ -117,145 +96,258 @@ BWindow *beos_GetAppWindow(char *name) return window; } -/***************************************************************************** - * DrawingThread : thread that really does the drawing - *****************************************************************************/ - -int32 Draw(void *data) -{ - VideoWindow *w; - w = (VideoWindow*) data; - if (w->LockLooper()) - { - w->view->DrawBitmap( w->bitmap[w->i_buffer_index], - w->bitmap[w->i_buffer_index]->Bounds(), - w->Bounds()); -// w->view->Sync(); - w->UnlockLooper(); - } - return B_OK; +/**************************************************************************** + * DrawingThread : thread that really does the drawing + ****************************************************************************/ +int32 Draw(void *data) +{ + //rudolf: sync init: + BScreen *screen; + display_mode disp_mode; + static uint32 refresh, oldrefresh = 0; + + screen = new BScreen(); + screen-> GetMode(&disp_mode); + refresh = + (disp_mode.timing.pixel_clock * 1000)/((disp_mode.timing.h_total)* + (disp_mode.timing.v_total)); + if (!(refresh == oldrefresh)) + { + intf_WarnMsg( 1, "vout info: new refreshrate is %ld:Hz", refresh ); + oldrefresh = refresh; + if (refresh < 61 ) + { + intf_WarnMsg( 1, "vout info: enabling retrace sync" ); + } + else + { + intf_WarnMsg( 1, "vout info: disabling retrace sync" ); + } + } + + VideoWindow* p_win; + p_win = (VideoWindow *) data; + if ( p_win-> voutWindow-> LockLooper() ) + { + //rudolf: sync: + if (refresh < 61) + { + screen-> WaitForRetrace(22000);//set timeout for < 45 Hz... + } + + p_win-> view-> DrawBitmap( p_win-> bitmap[p_win-> i_buffer], + p_win-> bitmap[p_win-> i_buffer]-> Bounds(), + p_win-> voutWindow-> Bounds() ); + p_win-> voutWindow-> UnlockLooper(); + } + return B_OK; } /***************************************************************************** - * VideoWindow constructor and destructor + * bitmapWindow : This is the bitmap window output *****************************************************************************/ - -VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_output ) - : BWindow(frame, name, B_TITLED_WINDOW, NULL) +bitmapWindow::bitmapWindow(BRect frame, VideoWindow *theOwner) + : BWindow( frame, NULL, B_TITLED_WINDOW, + B_OUTLINE_RESIZE | B_NOT_CLOSABLE | B_NOT_MINIMIZABLE ) { - - /* set the VideoWindow variables */ - teardownwindow = false; is_zoomed = false; - fUsingOverlay = false; - p_video_output->b_YCbr = false; - i_screen_depth = 16; - - /* create the view to do the display */ - view = new VLCView(Bounds()); - AddChild(view); - - /* Bitmap mode overlay not available */ - bitmap[0] = new BBitmap(Bounds(), B_RGB32); - bitmap[1] = new BBitmap(Bounds(), B_RGB32); - i_screen_depth = 32; - SetTitle(VOUT_TITLE " (BBitmap output)"); - - memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength()); - memset(bitmap[1]->Bits(), 0, bitmap[1]->BitsLength()); - - i_width = bitmap[0]->Bounds().IntegerWidth(); - i_height = bitmap[0]->Bounds().IntegerHeight(); - i_bytes_per_pixel = bitmap[0]->BytesPerRow()/i_width; - fRowBytes = bitmap[0]->BytesPerRow(); - i_screen_depth = 8 * i_bytes_per_pixel; - - fDirty = false; - Show(); + origRect = frame; + owner = theOwner; + SetTitle(VOUT_TITLE " (BBitmap output)"); } -VideoWindow::~VideoWindow() +bitmapWindow::~bitmapWindow() { - int32 result; +} - Hide(); - Sync(); - teardownwindow = true; - wait_for_thread(fDrawThreadID, &result); - delete bitmap[0]; - delete bitmap[1]; - } +void bitmapWindow::FrameResized( float width, float height ) +{ + if (is_zoomed) + { + return; + } + float width_scale; + float height_scale; + width_scale = width / origRect.Width(); + height_scale = height / origRect.Height(); + + /* if the width is proportionally smaller */ + if (width_scale <= height_scale) + { + ResizeTo(width, origRect.Height() * width_scale); + } + else /* if the height is proportionally smaller */ + { + ResizeTo(origRect.Width() * height_scale, height); + } +} -/***************************************************************************** - * VideoWindow::FrameResized - *****************************************************************************/ -void VideoWindow::FrameResized( float width, float height ) +void bitmapWindow::Zoom(BPoint origin, float width, float height ) { + if(is_zoomed) + { + MoveTo(origRect.left, origRect.top); + ResizeTo(origRect.IntegerWidth(), origRect.IntegerHeight()); + be_app->ShowCursor(); + } + else + { + BScreen *screen; + screen = new BScreen(this); + BRect rect = screen->Frame(); + delete screen; + MoveTo(0,0); + ResizeTo(rect.IntegerWidth(), rect.IntegerHeight()); + be_app->HideCursor(); + } + is_zoomed = !is_zoomed; } /***************************************************************************** - * VideoWindow::Zoom + * directWindow : This is the bitmap window output *****************************************************************************/ +directWindow::directWindow(BRect frame, VideoWindow *theOwner) + : BDirectWindow( frame, NULL, B_TITLED_WINDOW, + B_OUTLINE_RESIZE | B_NOT_CLOSABLE | B_NOT_MINIMIZABLE ) +{ + is_zoomed = false; + origRect = frame; + owner = theOwner; + SetTitle(VOUT_TITLE " (DirectWindow output)"); +} -void VideoWindow::Zoom(BPoint origin, float width, float height ) +directWindow::~directWindow() { - if(is_zoomed) - { - MoveTo(rect.left, rect.top); - ResizeTo(rect.IntegerWidth(), rect.IntegerHeight()); - be_app->ShowCursor(); - } - else - { - rect = Frame(); - BScreen *screen; - screen = new BScreen(this); - BRect rect = screen->Frame(); - delete screen; - MoveTo(0,0); - ResizeTo(rect.IntegerWidth(), rect.IntegerHeight()); - be_app->HideCursor(); - } - is_zoomed = !is_zoomed; } -/***************************************************************************** - * VideoWindow::MessageReceived - *****************************************************************************/ +void directWindow::DirectConnected(direct_buffer_info *info) +{ +} -void VideoWindow::MessageReceived( BMessage * p_message ) +void directWindow::FrameResized( float width, float height ) { - BWindow * p_win; - - switch( p_message->what ) + if (is_zoomed) { - case B_KEY_DOWN: - case B_SIMPLE_DATA: - // post the message to the interface window which will handle it - p_win = beos_GetAppWindow( "interface" ); - if( p_win != NULL ) - { - p_win->PostMessage( p_message ); - } - break; + return; + } + float width_scale; + float height_scale; + + width_scale = width / origRect.Width(); + height_scale = height / origRect.Height(); - default: - BWindow::MessageReceived( p_message ); - break; + /* if the width is proportionally smaller */ + if (width_scale <= height_scale) + { + ResizeTo(width, origRect.Height() * width_scale); + } + else /* if the height is proportionally smaller */ + { + ResizeTo(origRect.Width() * height_scale, height); } } +void directWindow::Zoom(BPoint origin, float width, float height ) +{ + if(is_zoomed) + { + SetFullScreen(false); + MoveTo(origRect.left, origRect.top); + ResizeTo(origRect.IntegerWidth(), origRect.IntegerHeight()); + be_app->ShowCursor(); + } + else + { + SetFullScreen(true); + BScreen *screen; + screen = new BScreen(this); + BRect rect = screen->Frame(); + delete screen; + MoveTo(0,0); + ResizeTo(rect.IntegerWidth(), rect.IntegerHeight()); + be_app->HideCursor(); + } + is_zoomed = !is_zoomed; +} + /***************************************************************************** - * VideoWindow::QuitRequested + * VideoWindow constructor and destructor *****************************************************************************/ +VideoWindow::VideoWindow( int width, int height, + vout_thread_t *p_video_output ) +{ + if ( BDirectWindow::SupportsWindowMode() ) + { + voutWindow = new directWindow( BRect( 80, 50, + 80 + width, 50 + height ), this ); + } + else + { + voutWindow = new bitmapWindow( BRect( 80, 50, + 80 + width, 50 + height ), this ); + } + + /* set the VideoWindow variables */ + teardownwindow = false; + + /* create the view to do the display */ + view = new VLCView( voutWindow->Bounds() ); + voutWindow->AddChild(view); + + /* Bitmap mode overlay not available, set the system to 32bits + * and let BeOS do all the work */ + bitmap[0] = new BBitmap( voutWindow->Bounds(), B_RGB32); + bitmap[1] = new BBitmap( voutWindow->Bounds(), B_RGB32); + memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength()); + memset(bitmap[1]->Bits(), 0, bitmap[1]->BitsLength()); + + i_width = bitmap[0]->Bounds().IntegerWidth(); + i_height = bitmap[0]->Bounds().IntegerHeight(); + + voutWindow->Show(); +} -bool VideoWindow::QuitRequested() +VideoWindow::~VideoWindow() { - /* FIXME: send a message ! */ - p_main->p_intf->b_die = 1; + int32 result; + + voutWindow->Hide(); + voutWindow->Sync(); + voutWindow->Lock(); + voutWindow->Quit(); teardownwindow = true; - return( false ); + wait_for_thread(fDrawThreadID, &result); + delete bitmap[0]; + delete bitmap[1]; +} + +void VideoWindow::resizeIfRequired( int newWidth, int newHeight ) +{ + if (( newWidth != i_width + 1) && + ( newHeight != i_height + 1) && + ( newWidth != 0 )) + { + if ( voutWindow->Lock() ) + { + view->ClearViewBitmap(); + i_width = newWidth - 1; + i_height = newHeight -1; + voutWindow->ResizeTo((float) i_width, (float) i_height); + voutWindow->Unlock(); + } + } +} + +void VideoWindow::drawBuffer(int bufferIndex) +{ + status_t status; + + i_buffer = bufferIndex; + + fDrawThreadID = spawn_thread(Draw, "drawing_thread", + B_DISPLAY_PRIORITY, (void*) this); + wait_for_thread(fDrawThreadID, &status); } /***************************************************************************** @@ -263,7 +355,7 @@ bool VideoWindow::QuitRequested() *****************************************************************************/ VLCView::VLCView(BRect bounds) : BView(bounds, "", B_FOLLOW_ALL, B_WILL_DRAW) { - SetViewColor(B_TRANSPARENT_32_BIT); + SetViewColor(B_TRANSPARENT_32_BIT); } /***************************************************************************** @@ -271,7 +363,6 @@ VLCView::VLCView(BRect bounds) : BView(bounds, "", B_FOLLOW_ALL, B_WILL_DRAW) *****************************************************************************/ VLCView::~VLCView() { - } /***************************************************************************** @@ -279,12 +370,8 @@ VLCView::~VLCView() *****************************************************************************/ void VLCView::MouseDown(BPoint point) { - VideoWindow *w = (VideoWindow *) Window(); - if(w->is_zoomed) - { - BWindow *win = Window(); - win->Zoom(); - } + BWindow *win = Window(); + win->Zoom(); } extern "C" @@ -293,13 +380,13 @@ extern "C" /***************************************************************************** * Local prototypes *****************************************************************************/ -static int vout_Probe ( probedata_t *p_data ); -static int vout_Create ( struct vout_thread_s * ); -static int vout_Init ( struct vout_thread_s * ); -static void vout_End ( struct vout_thread_s * ); -static void vout_Destroy ( struct vout_thread_s * ); -static int vout_Manage ( struct vout_thread_s * ); -static void vout_Display ( struct vout_thread_s * ); +static int vout_Create ( vout_thread_t * ); +static int vout_Init ( vout_thread_t * ); +static void vout_End ( vout_thread_t * ); +static void vout_Destroy ( vout_thread_t * ); +static int vout_Manage ( vout_thread_t * ); +static void vout_Display ( vout_thread_t *, picture_t * ); +static void vout_Render ( vout_thread_t *, picture_t * ); static int BeosOpenDisplay ( vout_thread_t *p_vout ); static void BeosCloseDisplay( vout_thread_t *p_vout ); @@ -310,30 +397,13 @@ static void BeosCloseDisplay( vout_thread_t *p_vout ); *****************************************************************************/ void _M( vout_getfunctions )( function_list_t * p_function_list ) { - p_function_list->pf_probe = vout_Probe; p_function_list->functions.vout.pf_create = vout_Create; p_function_list->functions.vout.pf_init = vout_Init; p_function_list->functions.vout.pf_end = vout_End; p_function_list->functions.vout.pf_destroy = vout_Destroy; p_function_list->functions.vout.pf_manage = vout_Manage; p_function_list->functions.vout.pf_display = vout_Display; - p_function_list->functions.vout.pf_setpalette = NULL; -} - -/***************************************************************************** - * vout_Probe: probe the video driver and return a score - ***************************************************************************** - * This function tries to initialize SDL and returns a score to the - * plugin manager so that it can select the best plugin. - *****************************************************************************/ -static int vout_Probe( probedata_t *p_data ) -{ - if( TestMethod( VOUT_METHOD_VAR, "beos" ) ) - { - return( 999 ); - } - - return( 100 ); + p_function_list->functions.vout.pf_render = vout_Render; } /***************************************************************************** @@ -350,19 +420,19 @@ int vout_Create( vout_thread_t *p_vout ) intf_ErrMsg( "error: %s", strerror(ENOMEM) ); return( 1 ); } - - /* Set video window's size */ - p_vout->i_width = main_GetIntVariable( VOUT_WIDTH_VAR, - VOUT_WIDTH_DEFAULT ); - p_vout->i_height = main_GetIntVariable( VOUT_HEIGHT_VAR, - VOUT_HEIGHT_DEFAULT ); - /* Open and initialize device */ - if( BeosOpenDisplay( p_vout ) ) + if( p_vout->render.i_height * p_vout->render.i_aspect + >= p_vout->render.i_width * VOUT_ASPECT_FACTOR ) { - intf_ErrMsg("vout error: can't open display"); - free( p_vout->p_sys ); - return( 1 ); + p_vout->p_sys->i_width = p_vout->render.i_height + * p_vout->render.i_aspect / VOUT_ASPECT_FACTOR; + p_vout->p_sys->i_height = p_vout->render.i_height; + } + else + { + p_vout->p_sys->i_width = p_vout->render.i_width; + p_vout->p_sys->i_height = p_vout->render.i_width + * VOUT_ASPECT_FACTOR / p_vout->render.i_aspect; } return( 0 ); @@ -373,18 +443,61 @@ int vout_Create( vout_thread_t *p_vout ) *****************************************************************************/ int vout_Init( vout_thread_t *p_vout ) { - VideoWindow * p_win = p_vout->p_sys->p_window; - u32 i_page_size; + int i_index; + picture_t *p_pic; + I_OUTPUTPICTURES = 0; - i_page_size = p_vout->i_width * p_vout->i_height * p_vout->i_bytes_per_pixel; - - if((p_win->bitmap[0] != NULL) && (p_win->bitmap[1] != NULL)) - { - p_vout->pf_setbuffers( p_vout, - (byte_t *)p_win->bitmap[0]->Bits(), - (byte_t *)p_win->bitmap[1]->Bits()); + /* Open and initialize device */ + if( BeosOpenDisplay( p_vout ) ) + { + intf_ErrMsg("vout error: can't open display"); + return 0; } + + 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; + p_vout->output.i_chroma = FOURCC_RV32; + + 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; + } + } + + if( p_pic == NULL ) + { + return 0; + } + + p_vout->p_sys->i_index = 0; + p_pic->p->p_pixels = p_vout->p_sys->pp_buffer[0]; + p_pic->p->i_pixel_bytes = 4; + p_pic->p->i_lines = p_vout->p_sys->i_height; + p_pic->p->b_margin = 0; + p_pic->p->i_pitch = 4 * p_vout->p_sys->i_width; + + p_pic->p->i_red_mask = 0x00ff0000; + p_pic->p->i_green_mask = 0x0000ff00; + p_pic->p->i_blue_mask = 0x000000ff; + + 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( 0 ); } @@ -393,6 +506,7 @@ int vout_Init( vout_thread_t *p_vout ) *****************************************************************************/ void vout_End( vout_thread_t *p_vout ) { + BeosCloseDisplay( p_vout ); } /***************************************************************************** @@ -402,8 +516,6 @@ void vout_End( vout_thread_t *p_vout ) *****************************************************************************/ void vout_Destroy( vout_thread_t *p_vout ) { - BeosCloseDisplay( p_vout ); - free( p_vout->p_sys ); } @@ -415,7 +527,20 @@ void vout_Destroy( vout_thread_t *p_vout ) *****************************************************************************/ int vout_Manage( vout_thread_t *p_vout ) { - return( 0 ); +// VideoWindow * p_win = p_vout->p_sys->p_window; + +// p_win->resizeIfRequired(p_vout->p_sys->pp_buffer[p_vout->p_sys->i_index].i_pic_width, +// p_vout->p_sys->pp_buffer[p_vout->p_sys->i_index].i_pic_height); + + return( 0 ); +} + +/***************************************************************************** + * vout_Render: render previously calculated output + *****************************************************************************/ +void vout_Render( vout_thread_t *p_vout, picture_t *p_pic ) +{ + ; } /***************************************************************************** @@ -424,74 +549,43 @@ int vout_Manage( vout_thread_t *p_vout ) * 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 vout_Display( vout_thread_t *p_vout ) +void vout_Display( vout_thread_t *p_vout, picture_t *p_pic ) { - status_t status; - VideoWindow * p_win = p_vout->p_sys->p_window; - - p_win->i_buffer_index = p_vout->i_buffer_index; - p_vout->i_buffer_index = ++p_vout->i_buffer_index & 1; - p_win->fDrawThreadID = spawn_thread(Draw, "drawing_thread", - B_DISPLAY_PRIORITY, (void*) p_win); - wait_for_thread(p_win->fDrawThreadID, &status); - + /* 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 & 1; + p_pic->p->p_pixels = p_vout->p_sys->pp_buffer[p_vout->p_sys->i_index]; } /* following functions are local */ /***************************************************************************** * BeosOpenDisplay: open and initialize BeOS device - ***************************************************************************** - * XXX?? The framebuffer mode is only provided as a fast and efficient way to - * display video, providing the card is configured and the mode ok. It is - * not portable, and is not supposed to work with many cards. Use at your - * own risk ! *****************************************************************************/ - static int BeosOpenDisplay( vout_thread_t *p_vout ) { - - p_vout->p_sys->p_window = - new VideoWindow( BRect( 80, 50, 80+p_vout->i_width-1, 50+p_vout->i_height-1 ), NULL, p_vout ); - if( p_vout->p_sys->p_window == 0 ) + p_vout->p_sys->p_window = new VideoWindow( p_vout->p_sys->i_width - 1, + p_vout->p_sys->i_height - 1, + p_vout ); + + if( p_vout->p_sys->p_window == NULL ) { - free( p_vout->p_sys ); intf_ErrMsg( "error: cannot allocate memory for VideoWindow" ); return( 1 ); } - VideoWindow * p_win = p_vout->p_sys->p_window; - p_vout->i_screen_depth = p_win->i_screen_depth; - p_vout->i_bytes_per_pixel = p_win->i_bytes_per_pixel; - p_vout->i_width = p_win->i_width + 1; - p_vout->i_height = p_win->i_height + 1; - p_vout->i_bytes_per_line = p_vout->i_width*p_win->i_bytes_per_pixel; + p_vout->p_sys->i_width = p_vout->p_sys->p_window->i_width + 1; + p_vout->p_sys->i_height = p_vout->p_sys->p_window->i_height + 1; + + p_vout->p_sys->pp_buffer[0] = (u8*)p_vout->p_sys->p_window->bitmap[0]->Bits(); + p_vout->p_sys->pp_buffer[1] = (u8*)p_vout->p_sys->p_window->bitmap[1]->Bits(); - switch( p_vout->i_screen_depth ) - { - case 8: - intf_ErrMsg( "vout error: 8 bit mode not fully supported" ); - break; - case 15: - p_vout->i_red_mask = 0x7c00; - p_vout->i_green_mask = 0x03e0; - p_vout->i_blue_mask = 0x001f; - break; - case 16: - p_vout->i_red_mask = 0xf800; - p_vout->i_green_mask = 0x07e0; - p_vout->i_blue_mask = 0x001f; - break; - case 24: - case 32: - default: - p_vout->i_red_mask = 0xff0000; - p_vout->i_green_mask = 0x00ff00; - p_vout->i_blue_mask = 0x0000ff; - break; - } return( 0 ); } @@ -504,8 +598,7 @@ static int BeosOpenDisplay( vout_thread_t *p_vout ) static void BeosCloseDisplay( vout_thread_t *p_vout ) { /* Destroy the video window */ - p_vout->p_sys->p_window->Lock(); - p_vout->p_sys->p_window->Quit(); + delete p_vout->p_sys->p_window; } } /* extern "C" */