---
layout: page
title: "Controls"
subtitle: "Output parameters and capture options"
description: "Output parameters and capture options"
category: docs
order: 2
date: 2018-12-20 21:08:53
disqus: 1
---

CameraView supports a wide range of controls that will control the behavior of the sensor or the
quality of the output.

Everything can be controlled through XML parameters or programmatically. For convenience, most options
are represented by `enum` classes extending the `Control` class. This makes it possible to use 
`CameraView.set(Control)` to set the given control, `CameraView.get(Class<Control>)` to get it,
or `CameraOptions.supports(Control)` to see if it is supported.

### XML Attributes

```xml
<com.otaliastudios.cameraview.CameraView
    app:cameraFacing="front|back"
    app:cameraFlash="off|on|auto|torch"
    app:cameraWhiteBalance="auto|incandescent|fluorescent|daylight|cloudy"
    app:cameraHdr="off|on"
    app:cameraAudio="on|off|mono|stereo"
    app:cameraAudioBitRate="0"
    app:cameraVideoCodec="deviceDefault|h263|h264"
    app:cameraVideoMaxSize="0"
    app:cameraVideoMaxDuration="0"
    app:cameraVideoBitRate="0"/>
```

### APIs

##### cameraFacing

Which camera to use, either back facing or front facing.
Defaults to the first available value (tries `BACK` first).

```java
cameraView.setFacing(Facing.BACK);
cameraView.setFacing(Facing.FRONT);
```

##### cameraFlash

Flash mode, either off, on, auto or torch. Defaults to `OFF`.

```java
cameraView.setFlash(Flash.OFF);
cameraView.setFlash(Flash.ON);
cameraView.setFlash(Flash.AUTO);
cameraView.setFlash(Flash.TORCH);
```

##### cameraVideoCodec

Sets the encoder for video recordings. Defaults to `DEVICE_DEFAULT`,
which should typically be H_264.

```java
cameraView.setVideoCodec(VideoCodec.DEVICE_DEFAULT);
cameraView.setVideoCodec(VideoCodec.H_263);
cameraView.setVideoCodec(VideoCodec.H_264);
```

##### cameraWhiteBalance

Sets the desired white balance for the current session.
Defaults to `AUTO`.

```java
cameraView.setWhiteBalance(WhiteBalance.AUTO);
cameraView.setWhiteBalance(WhiteBalance.INCANDESCENT);
cameraView.setWhiteBalance(WhiteBalance.FLUORESCENT);
cameraView.setWhiteBalance(WhiteBalance.DAYLIGHT);
cameraView.setWhiteBalance(WhiteBalance.CLOUDY);
```

##### cameraHdr

Turns on or off HDR captures. Defaults to `OFF`.

```java
cameraView.setHdr(Hdr.OFF);
cameraView.setHdr(Hdr.ON);
```

##### cameraAudio

Turns on or off audio stream while recording videos.
Defaults to `ON`.

```java
cameraView.setAudio(Audio.OFF);
cameraView.setAudio(Audio.ON); // on but depends on video config
cameraView.setAudio(Audio.MONO); // force mono
cameraView.setAudio(Audio.STEREO); // force stereo
```

##### cameraAudioBitRate

Controls the audio bit rate in bits per second.
Use 0 or a negative value to fallback to the encoder default. Defaults to 0.

```java
cameraView.setAudioBitRate(0);
cameraView.setAudioBitRate(64000);
```

##### cameraVideoMaxSize

Defines the maximum size in bytes for recorded video files.
Once this size is reached, the recording will automatically stop.
Defaults to unlimited size. Use 0 or negatives to disable.

```java
cameraView.setVideoMaxSize(100000);
cameraView.setVideoMaxSize(0); // Disable
```

##### cameraVideoMaxDuration

Defines the maximum duration in milliseconds for video recordings.
Once this duration is reached, the recording will automatically stop.
Defaults to unlimited duration. Use 0 or negatives to disable.

```java
cameraView.setVideoMaxDuration(100000);
cameraView.setVideoMaxDuration(0); // Disable
```

##### cameraVideoBitRate

Controls the video bit rate in bits per second.
Use 0 or a negative value to fallback to the encoder default. Defaults to 0.

```java
cameraView.setVideoBitRate(0);
cameraView.setVideoBitRate(4000000);
```

### Auto Focus

There are many ways to focus a CameraView engine:

- Continuous autofocus is activated by default, where present
- User can start focus with a [Gesture](gestures.html)
- The developer can start focus with the `startAutoFocus(float, float)` API. This action needs
  the coordinates of a point to focus, with respect to the view width and height.

The last two actions will trigger the focus callbacks:

```java
cameraView.addCameraListener(new CameraListener() {
    
    @Override
    public void onAutoFocusStart(@NonNull PointF point) {
        // Auto focus was started by a gesture or by startAutoFocus(float, float).
        // The camera is currently trying to focus around that area.
        // This can be used to draw things on screen.
    }

    @Override
    public void onAutoFocusEnd(boolean successful, @NonNull PointF point) {
        // Auto focus operation just ended. If successful, the camera will have converged
        // to a new focus point, and possibly changed exposure and white balance as well.
        // The point is the same that was passed to onAutoFocusStart.
    }
});
```

Auto focus is not guaranteed to be supported: check the `CameraOptions` to be sure.

```xml
<com.otaliastudios.cameraview.CameraView
    app:cameraAutoFocusMarker="@string/cameraview_default_autofocus_marker"
    app:cameraAutoFocusResetDelay="3000"/>
```

##### cameraAutoFocusMarker

Lets you set a marker for drawing on screen in response to auto focus events.
In XML, you should pass the qualified class name of your marker.

```java
cameraView.setAutoFocusMarker(null);
cameraView.setAutoFocusMarker(marker);
```

We offer a default marker (similar to the old `focusWithMarker` attribute in v1),
which you can set in XML using the `@string/cameraview_default_autofocus_marker` resource,
or programmatically:

```java
cameraView.setAutoFocusMarker(new DefaultAutoFocusMarker());
```

##### cameraAutoFocusResetDelay

Lets you control how an auto-focus operation is reset after completed.
Setting a value <= 0 or == Long.MAX_VALUE will not reset the auto-focus.
This is useful for low end devices that have slow auto-focus capabilities.
Defaults to 3 seconds.

```java
cameraView.setCameraAutoFocusResetDelay(1000);  // 1 second
cameraView.setCameraAutoFocusResetDelay(0);  // NO reset
cameraView.setCameraAutoFocusResetDelay(-1);  // NO reset
cameraView.setCameraAutoFocusResetDelay(Long.MAX_VALUE);  // NO reset
```

### Zoom

There are two ways to control the zoom value:

- User can zoom in or out with a [Gesture](gestures.html)
- The developer can start manual zoom with the `setZoom(float)` API, passing in a value between 0 and 1.

Both actions will trigger the zoom callback, which can be used, for example, to draw a seek bar:

```java
cameraView.addCameraListener(new CameraListener() {
    
    @Override
    public void onZoomChanged(float newValue, @NonNull float[] bounds, @Nullable PointF[] fingers) {
        // newValue: the new zoom value
        // bounds: this is always [0, 1]
        // fingers: if caused by touch gestures, these is the fingers position
    }
});
```

Zoom is not guaranteed to be supported: check the `CameraOptions` to be sure.

### Exposure correction

There are two ways to control the exposure correction value:

- User can change the exposure correction with a [Gesture](gestures.html)
- The developer can change this value with the `setExposureCorrection(float)` API, passing in the EV
  value, in camera stops. This value should be contained in the minimum and maximum supported values,
  as returned by `CameraOptions`.

Both actions will trigger the exposure correction callback, which can be used, for example, to draw a seek bar:

```java
cameraView.addCameraListener(new CameraListener() {
    
    @UiThread
    public void onExposureCorrectionChanged(float newValue, @NonNull float[] bounds, @Nullable PointF[] fingers) {
        // newValue: the new correction value
        // bounds: min and max bounds for newValue, as returned by {@link CameraOptions}
        // fingers: finger positions that caused the event, null if not caused by touch
    }
});
```

EV correction is not guaranteed to be supported: check the `CameraOptions` to be sure.