]> git.sesse.net Git - vlc/blobdiff - plugins/beos/vout_beos.cpp
* Fixed the BeOS compile typo.
[vlc] / plugins / beos / vout_beos.cpp
index 61023167b577da16e8d0a57e11fa848e4b2905ce..44fe4b304f9972ea7c2d6395baf6d87a2da577c7 100644 (file)
@@ -2,7 +2,7 @@
  * vout_beos.cpp: beos video output display method
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
- * $Id: vout_beos.cpp,v 1.22 2001/03/21 13:42:33 sam Exp $
+ * $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>
@@ -121,21 +121,45 @@ BWindow *beos_GetAppWindow(char *name)
 
 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;
 }
 
 /*****************************************************************************
@@ -158,13 +182,15 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
     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 = 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;
@@ -190,14 +216,11 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
                        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)");
         }
 
        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);
@@ -206,13 +229,15 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
                GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); 
                SetSizeLimits((float) Bounds().IntegerWidth(), maxWidth, (float) Bounds().IntegerHeight(), maxHeight);
                }
-       else
+//     else
                {
        fDrawThreadID = spawn_thread(DrawingThread, "drawing_thread",
                     B_DISPLAY_PRIORITY, (void*) this);
        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;
@@ -225,13 +250,13 @@ VideoWindow::~VideoWindow()
 
     Hide();
     Sync();
-    if(!fUsingOverlay)
-       {
+//    if(!fUsingOverlay)
+//     {
            teardownwindow = true;
            wait_for_thread(fDrawThreadID, &result);
        delete bitmap[0];
        delete bitmap[1];
-       }
+//     }
  }
 
 
@@ -430,11 +455,12 @@ int vout_Init( vout_thread_t *p_vout )
     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)
        {
            if(p_win->bitmap[0] != NULL)
                {
-                   vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+                   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];
                p_win->bitmap[0] = NULL;
@@ -444,10 +470,18 @@ int vout_Init( vout_thread_t *p_vout )
                {
            if((p_win->bitmap[0] != NULL) && (p_win->bitmap[1] != NULL))
                {
-               vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+               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 );
 }
 
@@ -491,6 +525,8 @@ if( (p_vout->i_width  != p_vout->p_sys->i_width) ||
                {
                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); 
@@ -499,12 +535,16 @@ if( (p_vout->i_width  != p_vout->p_sys->i_width) ||
                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_FILTER_HORIZONTAL|B_OVERLAY_FILTER_VERTICAL|B_OVERLAY_TRANSFER_CHANNEL);
                        p_win->view->SetViewColor(key);
                        p_win->Unlock();
-                   vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+                   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];
                    }
@@ -523,7 +563,10 @@ void vout_Display( vout_thread_t *p_vout )
     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;
 }