code: @Override
  	public void open() {
  		if (isOpen()) {
  			return;
  		}
  		beforeOpen();
  
  		service = newExecutorService();
  		validateParameters();
  		try {
  			process = launch();
  		} catch (IOException e) {
  			LOGGER.error(e.toString(), e);
  			return;
  		}
  
  		out = process.getOutputStream();
  		in = process.getInputStream();
  		err = process.getErrorStream();
  
  		// error must be consumed, if not, too much data blocking will crash process or
  		// blocking IO
  		service.submit(newErrorConsumeWorker());
  
  		isOpen = true;
  		afterOpen();
  	}
docs: start raspi??? process to open devices
  <ul>
  <li>step 1: check given arguments will introduce native windows. keep
  raspistill run in quietly</li>
  
  <li>step 2: create thread fixed size pool(size=2), one for read, one for
  write</li>
  
  <li>step 3: override some illegal parameters</li>
  
  <li>step 4: start process and begin communication and consume IO</li>
  </ul>
  
  @see com.github.sarxos.webcam.WebcamDevice#open()