* vout_beos.cpp: beos video output display method
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
+ * $Id: vout_beos.cpp,v 1.26 2001/05/30 17:03:11 sam Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
int32 DrawingThread(void *data)
{
- VideoWindow *w;
- w = (VideoWindow*) data;
+ VideoWindow *w;
+ w = (VideoWindow*) data;
- while(!w->teardownwindow)
+ while(!w->teardownwindow)
+ {
+ if (w->Lock())
{
- w->Lock();
- if( w->fDirty )
- {
- w->view->DrawBitmap(w->bitmap[w->i_buffer_index], w->bitmap[w->i_buffer_index]->Bounds(), w->Bounds());
- w->fDirty = false;
- }
- w->Unlock();
- snooze(20000);
- }
- return B_OK;
+ if( w->fDirty )
+ {
+ if(w->fUsingOverlay)
+ {
+ rgb_color key;
+ w->view->SetViewOverlay( w->bitmap[w->i_buffer_index],
+ w->bitmap[w->i_buffer_index]->Bounds(),
+ w->Bounds(),
+ &key,
+ B_FOLLOW_ALL,
+ B_OVERLAY_FILTER_HORIZONTAL | B_OVERLAY_FILTER_VERTICAL
+ | B_OVERLAY_TRANSFER_CHANNEL );
+ w->view->SetViewColor(key);
+ }
+ else
+ {
+ w->view->DrawBitmap( w->bitmap[w->i_buffer_index],
+ w->bitmap[w->i_buffer_index]->Bounds(),
+ w->Bounds());
+ }
+
+ w->fDirty = false;
+ }
+ w->Unlock();
+ }
+ else // we couldn't lock the window, it probably closed.
+ return B_ERROR;
+
+ snooze (20000);
+ } // while
+
+ return B_OK;
}
/*****************************************************************************
*****************************************************************************/
VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_output )
- : BWindow(frame, name, B_DOCUMENT_WINDOW, NULL)
+ : BWindow(frame, name, B_TITLED_WINDOW, NULL)
{
float minWidth, minHeight, maxWidth, maxHeight;
teardownwindow = false;
is_zoomed = false;
p_vout = p_video_output;
- fDrawThreadID = NULL;
-
+ fDrawThreadID = NULL;
+ bitmap[0] = NULL;
+ bitmap[1] = NULL;
+
rect = Frame();
view = new VLCView(Bounds());
AddChild(view);
bitmap[0] = new BBitmap(Bounds(), B_BITMAP_WILL_OVERLAY|B_BITMAP_RESERVE_OVERLAY_CHANNEL, B_YCbCr422);
+ bitmap[1] = new BBitmap(Bounds(), B_BITMAP_WILL_OVERLAY, B_YCbCr422);
fUsingOverlay = true;
- i_screen_depth = 32;
+ i_screen_depth = 16;
p_vout->b_YCbr = true;
- if (bitmap[0]->InitCheck() != B_OK)
+ if ((bitmap[0]->InitCheck() != B_OK) || (bitmap[1]->InitCheck() != B_OK))
{
delete bitmap[0];
+ delete bitmap[1];
p_vout->b_YCbr = false;
fUsingOverlay = false;
BScreen *screen;
bitmap[1] = new BBitmap(Bounds(), B_RGB32);
i_screen_depth = 32;
}
- memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
- memset(bitmap[1]->Bits(), 0, bitmap[1]->BitsLength());
SetTitle(VOUT_TITLE " (BBitmap output)");
}
- i_bytes_per_pixel = bitmap[0]->BytesPerRow()/bitmap[0]->Bounds().IntegerWidth();
- fRowBytes = bitmap[0]->BytesPerRow();
- fDirty = false;
-
if(fUsingOverlay)
{
- memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
rgb_color key;
view->SetViewOverlay(bitmap[0], bitmap[0]->Bounds(), Bounds(), &key, B_FOLLOW_ALL,
B_OVERLAY_FILTER_HORIZONTAL|B_OVERLAY_FILTER_VERTICAL);
GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight);
SetSizeLimits((float) Bounds().IntegerWidth(), maxWidth, (float) Bounds().IntegerHeight(), maxHeight);
}
- else
- {
- fDrawThreadID = spawn_thread(DrawingThread, "drawing_thread",
+// else
+ {
+ fDrawThreadID = spawn_thread(DrawingThread, "drawing_thread",
B_DISPLAY_PRIORITY, (void*) this);
- resume_thread(fDrawThreadID);
- }
+ resume_thread(fDrawThreadID);
+ }
+
+ memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
+ memset(bitmap[1]->Bits(), 0, bitmap[1]->BitsLength());
+ i_bytes_per_pixel = bitmap[0]->BytesPerRow()/bitmap[0]->Bounds().IntegerWidth();
+ fRowBytes = bitmap[0]->BytesPerRow();
+ fDirty = false;
Show();
}
Hide();
Sync();
- if(!fUsingOverlay)
- {
+// if(!fUsingOverlay)
+// {
+ teardownwindow = true;
wait_for_thread(fDrawThreadID, &result);
delete bitmap[0];
delete bitmap[1];
- }
+// }
}
{
MoveTo(rect.left, rect.top);
ResizeTo(rect.IntegerWidth(), rect.IntegerHeight());
- SetLook(B_DOCUMENT_WINDOW_LOOK);
be_app->ShowCursor();
}
else
delete screen;
MoveTo(0,0);
ResizeTo(rect.IntegerWidth(), rect.IntegerHeight());
- SetLook(B_NO_BORDER_WINDOW_LOOK);
be_app->HideCursor();
}
is_zoomed = !is_zoomed;
p_vout->p_sys->i_width = p_vout->i_width;
p_vout->p_sys->i_height = p_vout->i_height;
- if(p_win->fUsingOverlay)
+/* if(p_win->fUsingOverlay)
{
- vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+ if(p_win->bitmap[0] != NULL)
+ {
+ p_vout->pf_setbuffers( p_vout,
+ (byte_t *)p_win->bitmap[0]->Bits(),
(byte_t *)p_win->bitmap[0]->Bits());
- delete p_win->bitmap[0];
+ delete p_win->bitmap[0];
+ p_win->bitmap[0] = NULL;
+ }
}
else
{
- vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+ 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());
- }
+ }
+ }*/
+ 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());
+ }
+
return( 0 );
}
*****************************************************************************/
int vout_Manage( vout_thread_t *p_vout )
{
- return( 0 );
+VideoWindow * p_win = p_vout->p_sys->p_window;
+rgb_color key;
+float minWidth, minHeight, maxWidth, maxHeight;
+
+if( (p_vout->i_width != p_vout->p_sys->i_width) ||
+ (p_vout->i_height != p_vout->p_sys->i_height) )
+ {
+ /* If video output size has changed, change interface window size */
+ intf_DbgMsg( "resizing output window" );
+ if(p_win->fUsingOverlay)
+ {
+ p_win->Lock();
+ p_win->view->ClearViewOverlay();
+ delete p_win->bitmap[0];
+ delete p_win->bitmap[1];
+ p_vout->p_sys->i_width = p_vout->i_width;
+ p_vout->p_sys->i_height = p_vout->i_height;;
+ p_win->GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight);
+ p_win->SetSizeLimits((float) p_vout->p_sys->i_width, maxWidth, (float) p_vout->p_sys->i_height, maxHeight);
+ p_win->ResizeTo(p_vout->p_sys->i_width, p_vout->p_sys->i_height);
+ p_win->bitmap[0] = new BBitmap(p_win->Bounds(),
+ B_BITMAP_WILL_OVERLAY|B_BITMAP_RESERVE_OVERLAY_CHANNEL,
+ B_YCbCr422);
+ p_win->bitmap[0] = new BBitmap(p_win->Bounds(),
+ B_BITMAP_WILL_OVERLAY, B_YCbCr422);
+ memset(p_win->bitmap[0]->Bits(), 0, p_win->bitmap[0]->BitsLength());
+ memset(p_win->bitmap[1]->Bits(), 0, p_win->bitmap[1]->BitsLength());
+ p_win->view->SetViewOverlay(p_win->bitmap[0], p_win->bitmap[0]->Bounds(), p_win->Bounds(), &key, B_FOLLOW_ALL,
+ B_OVERLAY_FILTER_HORIZONTAL|B_OVERLAY_FILTER_VERTICAL|B_OVERLAY_TRANSFER_CHANNEL);
+ p_win->view->SetViewColor(key);
+ p_win->Unlock();
+ p_vout->pf_setbuffers( p_vout,
+ (byte_t *)p_win->bitmap[0]->Bits(),
+ (byte_t *)p_win->bitmap[0]->Bits());
+ delete p_win->bitmap[0];
+ }
+ }
+return( 0 );
}
/*****************************************************************************
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;
+ if(p_win->fUsingOverlay)
+ p_vout->i_buffer_index = p_vout->i_buffer_index & 1;
+ else
+ p_vout->i_buffer_index = ++p_vout->i_buffer_index & 1;
p_win->fDirty = true;
}
static int BeosOpenDisplay( vout_thread_t *p_vout )
{
p_vout->p_sys->p_window =
- new VideoWindow( BRect( 50, 150, 50+p_vout->i_width-1, 150+p_vout->i_height-1 ), NULL, p_vout );
+ 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 )
{
free( p_vout->p_sys );