remove v4l/lml/buz, add symbolic folders, more xlat update, yuyv fixes, v4l2 upgrades
[goodguy/history.git] / cinelerra-5.1 / guicast / xfer.C
index 87ad6bdd5b619971865f53a14f8a7b2b552722fc..417a15dcda9ee5c7c0d797c3d1205ace35d55364 100644 (file)
@@ -106,7 +106,8 @@ void BC_Xfer::init(
        switch( in_colormodel ) {
        case BC_UVY422:
        case BC_YUV422:   in_w &= ~1;               break;  // 2x1
-       case BC_YUV420P:  in_w &= ~1;  in_h &= ~1;  break;  // 2x2
+       case BC_YUV420P:
+       case BC_YUV420PI: in_w &= ~1;  in_h &= ~1;  break;  // 2x2
        case BC_YUV422P:  in_w &= ~1;               break;  // 2x1
        case BC_YUV410P:  in_w &= ~3;  in_h &= ~3;  break;  // 4x4
        case BC_YUV411P:  in_w &= ~3;               break;  // 4x1
@@ -114,7 +115,8 @@ void BC_Xfer::init(
        switch( out_colormodel ) {
        case BC_UVY422:
        case BC_YUV422:  out_w &= ~1;               break;
-       case BC_YUV420P: out_w &= ~1; out_h &= ~1;  break;
+       case BC_YUV420P:
+       case BC_YUV420PI: out_w &= ~1; out_h &= ~1; break;
        case BC_YUV422P: out_w &= ~1;               break;
        case BC_YUV410P: out_w &= ~3; out_h &= ~3;  break;
        case BC_YUV411P: out_w &= ~3;               break;
@@ -265,14 +267,12 @@ BC_Xfer::SlicerList BC_Xfer::slicers;
 
 BC_Xfer::SlicerList::SlicerList()
 {
-  waiting = new Condition(0, "BC_Xfer::SlicerList", 1);
   count = 0;
 }
 
 BC_Xfer::SlicerList::~SlicerList()
 {
   reset();
-  delete waiting;
 }
 
 void BC_Xfer::SlicerList::reset()
@@ -285,24 +285,24 @@ void BC_Xfer::SlicerList::reset()
 
 BC_Xfer::Slicer *BC_Xfer::SlicerList::get_slicer(BC_Xfer *xp)
 {
-  while( !first ) {
+  Slicer *slicer = first;
+  if( !slicer ) {
     if( count < BC_Resources::machine_cpus ) {
-      append(new Slicer(xp));
+      slicer = new Slicer(xp);
       ++count;
     }
-    else
-      waiting->lock("BC_Xfer::SlicerList::get_slicer");
   }
-  Slicer *slicer = first;
-  remove_pointer(slicer);
+  else
+    remove_pointer(slicer);
   return slicer;
 }
 
 void BC_Xfer::xfer_slices(int slices)
 {
   if( !xfn ) return;
-  int max_slices = BC_Resources::machine_cpus/2+1;
+  int max_slices = BC_Resources::machine_cpus/2;
   if( slices > max_slices ) slices = max_slices;
+  if( slices < 1 ) slices = 1;
   Slicer *active[slices];
   unsigned y0 = 0, y1 = out_h;
   int slices1 = slices-1;
@@ -310,6 +310,7 @@ void BC_Xfer::xfer_slices(int slices)
     slicers.lock("BC_Xfer::xfer_slices");
     for( int i=0; i<slices1; y0=y1 ) {
       Slicer *slicer = slicers.get_slicer(this);
+      if( !slicer ) { slices1 = i;  break; }
       active[i] = slicer;
       y1 = out_h * ++i / slices;
       slicer->slice(this, y0, y1);
@@ -324,7 +325,6 @@ void BC_Xfer::xfer_slices(int slices)
     for( int i=0; i<slices1; ++i )
       slicers.append(active[i]);
     slicers.unlock();
-    slicers.waiting->unlock();
   }
 }