Skip to content

Commit 1a7198a

Browse files
committed
Black image captured instead of view from camera, fixes #285
1 parent 2e10f95 commit 1a7198a

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

webcam-capture/src/main/java/com/github/sarxos/webcam/ds/buildin/WebcamDefaultDevice.java

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)