@@ -37,6 +37,11 @@ public class WebcamDefaultDevice implements WebcamDevice, BufferAccess, Runnable
3737 */
3838 private static final Logger LOG = LoggerFactory .getLogger (WebcamDefaultDevice .class );
3939
40+ /**
41+ * The device memory buffer size.
42+ */
43+ private static final int DEVICE_BUFFER_SIZE = 5 ;
44+
4045 /**
4146 * Artificial view sizes. I'm really not sure if will fit into other webcams
4247 * but hope that OpenIMAJ can handle this.
@@ -354,29 +359,44 @@ public void open() {
354359 smodel = new ComponentSampleModel (DATA_TYPE , size .width , size .height , 3 , size .width * 3 , BAND_OFFSETS );
355360 cmodel = new ComponentColorModel (COLOR_SPACE , BITS , false , false , Transparency .OPAQUE , DATA_TYPE );
356361
357- LOG . debug ( "Initialize buffer" );
362+ // clear device memory buffer
358363
359- int i = 0 ;
360- do {
364+ LOG .debug ("Clear memory buffer" );
361365
362- grabber . nextFrame ();
366+ clearMemoryBuffer ();
363367
364- try {
365- Thread .sleep (1000 );
366- } catch (InterruptedException e ) {
367- LOG .error ("Nasty interrupted exception" , e );
368- }
369-
370- } while (++i < 3 );
368+ // set device to open
371369
372370 LOG .debug ("Webcam device {} is now open" , this );
373371
374372 open .set (true );
375373
376- refresher = new Thread (this , String .format ("frames-refresher-[%s]" , id ));
374+ // start underlying frames refresher
375+
376+ refresher = startFramesRefresher ();
377+ }
378+
379+ /**
380+ * this is to clean up all frames from device memory buffer which causes
381+ * initial frames to be completely blank (black images)
382+ */
383+ private void clearMemoryBuffer () {
384+ for (int i = 0 ; i < DEVICE_BUFFER_SIZE ; i ++) {
385+ grabber .nextFrame ();
386+ }
387+ }
388+
389+ /**
390+ * Start underlying frames refresher.
391+ *
392+ * @return Refresher thread
393+ */
394+ private Thread startFramesRefresher () {
395+ Thread refresher = new Thread (this , String .format ("frames-refresher-[%s]" , id ));
377396 refresher .setUncaughtExceptionHandler (WebcamExceptionHandler .getInstance ());
378397 refresher .setDaemon (true );
379398 refresher .start ();
399+ return refresher ;
380400 }
381401
382402 @ Override
0 commit comments