diff --git a/README.md b/README.md
index c40c4e65..c4c84321 100644
--- a/README.md
+++ b/README.md
@@ -297,7 +297,7 @@ Most camera parameters can be controlled through XML attributes or linked method
|[`cameraGrid`](#cameragrid)|`setGrid()`|`off` `draw3x3` `draw4x4` `drawPhi`|`off`|
|[`cameraCropOutput`](#cameracropoutput)|`setCropOutput()`|`true` `false`|`false`|
|[`cameraJpegQuality`](#camerajpegquality)|`setJpegQuality()`|`0 <= n <= 100`|`100`|
-|[`cameraVideoQuality`](#cameravideoquality)|`setVideoQuality()`|`max480p` `max720p` `max1080p` `max2160p` `highest` `lowest`|`max480p`|
+|[`cameraVideoQuality`](#cameravideoquality)|`setVideoQuality()`|`lowest` `highest` `maxQvga` `max480p` `max720p` `max1080p` `max2160p`|`max480p`|
|[`cameraWhiteBalance`](#camerawhitebalance)|`setWhiteBalance()`|`auto` `incandescent` `fluorescent` `daylight` `cloudy`|`auto`|
#### cameraSessionType
@@ -364,13 +364,13 @@ cameraView.setJpegQuality(50);
Sets the desired video quality.
```java
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_480P);
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_720P);
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_1080P);
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_2160P);
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_LOWEST);
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_HIGHEST);
-cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_QVGA);
+cameraView.setVideoQuality(VideoQuality.LOWEST);
+cameraView.setVideoQuality(VideoQuality.HIGHEST);
+cameraView.setVideoQuality(VideoQuality.MAX_QVGA);
+cameraView.setVideoQuality(VideoQuality.MAX_480P);
+cameraView.setVideoQuality(VideoQuality.MAX_720P);
+cameraView.setVideoQuality(VideoQuality.MAX_1080P);
+cameraView.setVideoQuality(VideoQuality.MAX_2160P);
```
#### cameraWhiteBalance
@@ -378,11 +378,11 @@ cameraView.setVideoQuality(CameraConstants.VIDEO_QUALITY_QVGA);
Sets the desired white balance for the current session.
```java
-cameraView.setWhiteBalance(CameraConstants.WHITE_BALANCE_AUTO);
-cameraView.setWhiteBalance(CameraConstants.WHITE_BALANCE_INCANDESCENT);
-cameraView.setWhiteBalance(CameraConstants.WHITE_BALANCE_FLUORESCENT);
-cameraView.setWhiteBalance(CameraConstants.WHITE_BALANCE_DAYLIGHT);
-cameraView.setWhiteBalance(CameraConstants.WHITE_BALANCE_CLOUDY);
+cameraView.setWhiteBalance(WhiteBalance.AUTO);
+cameraView.setWhiteBalance(WhiteBalance.INCANDESCENT);
+cameraView.setWhiteBalance(WhiteBalance.FLUORESCENT);
+cameraView.setWhiteBalance(WhiteBalance.DAYLIGHT);
+cameraView.setWhiteBalance(WhiteBalance.CLOUDY);
```
## Other APIs
diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
index eede8a2e..ac88564b 100644
--- a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
+++ b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
@@ -321,7 +321,7 @@ class Camera1 extends CameraController {
@Override
- void setVideoQuality(int videoQuality) {
+ void setVideoQuality(VideoQuality videoQuality) {
if (mIsCapturingVideo) {
throw new IllegalStateException("Can't change video quality while recording a video.");
}
@@ -588,43 +588,43 @@ class Camera1 extends CameraController {
@NonNull
- private CamcorderProfile getCamcorderProfile(@VideoQuality int videoQuality) {
+ private CamcorderProfile getCamcorderProfile(VideoQuality videoQuality) {
switch (videoQuality) {
- case CameraConstants.VIDEO_QUALITY_HIGHEST:
+ case HIGHEST:
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_HIGH);
- case CameraConstants.VIDEO_QUALITY_2160P:
+ case MAX_2160P:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) {
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_2160P);
}
// Don't break.
- case CameraConstants.VIDEO_QUALITY_1080P:
+ case MAX_1080P:
if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_1080P)) {
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_1080P);
}
// Don't break.
- case CameraConstants.VIDEO_QUALITY_720P:
+ case MAX_720P:
if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_720P)) {
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_720P);
}
// Don't break.
- case CameraConstants.VIDEO_QUALITY_480P:
+ case MAX_480P:
if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_480P)) {
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_480P);
}
// Don't break.
- case CameraConstants.VIDEO_QUALITY_QVGA:
+ case MAX_QVGA:
if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_QVGA)) {
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_QVGA);
}
// Don't break.
- case CameraConstants.VIDEO_QUALITY_LOWEST:
+ case LOWEST:
default:
// Fallback to lowest.
return CamcorderProfile.get(mCameraId, CamcorderProfile.QUALITY_LOW);
diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraConstants.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraConstants.java
index 25415375..2c8c677c 100644
--- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraConstants.java
+++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraConstants.java
@@ -10,17 +10,9 @@ public class CameraConstants {
public static final int SESSION_TYPE_PICTURE = 0;
public static final int SESSION_TYPE_VIDEO = 1;
- public static final int VIDEO_QUALITY_480P = 0;
- public static final int VIDEO_QUALITY_720P = 1;
- public static final int VIDEO_QUALITY_1080P = 2;
- public static final int VIDEO_QUALITY_2160P = 3;
- public static final int VIDEO_QUALITY_HIGHEST = 4;
- public static final int VIDEO_QUALITY_LOWEST = 5;
- public static final int VIDEO_QUALITY_QVGA = 6;
static class Defaults {
- static final int DEFAULT_VIDEO_QUALITY = VIDEO_QUALITY_480P;
static final int DEFAULT_SESSION_TYPE = SESSION_TYPE_PICTURE;
static final int DEFAULT_JPEG_QUALITY = 100;
static final boolean DEFAULT_CROP_OUTPUT = false;
diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java
index 4ed633df..527ee11b 100644
--- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java
+++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java
@@ -14,7 +14,7 @@ abstract class CameraController implements Preview.SurfaceCallback {
protected Facing mFacing;
protected Flash mFlash;
protected WhiteBalance mWhiteBalance;
- @VideoQuality protected int mVideoQuality;
+ protected VideoQuality mVideoQuality;
@SessionType protected int mSessionType;
CameraController(CameraView.CameraCallbacks callback, Preview preview) {
@@ -34,7 +34,7 @@ abstract class CameraController implements Preview.SurfaceCallback {
abstract void setFacing(Facing facing);
abstract void setFlash(Flash flash);
abstract void setWhiteBalance(WhiteBalance whiteBalance);
- abstract void setVideoQuality(@VideoQuality int videoQuality);
+ abstract void setVideoQuality(VideoQuality videoQuality);
abstract void setSessionType(@SessionType int sessionType);
abstract void setLocation(double latitude, double longitude);
@@ -56,11 +56,7 @@ abstract class CameraController implements Preview.SurfaceCallback {
final Facing getFacing() { return mFacing; }
final Flash getFlash() { return mFlash; }
final WhiteBalance getWhiteBalance() { return mWhiteBalance; }
-
- @VideoQuality
- final int getVideoQuality() {
- return mVideoQuality;
- }
+ final VideoQuality getVideoQuality() { return mVideoQuality; }
@SessionType
final int getSessionType() {
diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
index fe291c6a..2748c825 100644
--- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
+++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
@@ -96,8 +96,8 @@ public class CameraView extends FrameLayout {
Flash flash = Flash.fromValue(a.getInteger(R.styleable.CameraView_cameraFlash, Flash.DEFAULT.value()));
Grid grid = Grid.fromValue(a.getInteger(R.styleable.CameraView_cameraGrid, Grid.DEFAULT.value()));
WhiteBalance whiteBalance = WhiteBalance.fromValue(a.getInteger(R.styleable.CameraView_cameraWhiteBalance, WhiteBalance.DEFAULT.value()));
+ VideoQuality videoQuality = VideoQuality.fromValue(a.getInteger(R.styleable.CameraView_cameraVideoQuality, VideoQuality.DEFAULT.value()));
int sessionType = a.getInteger(R.styleable.CameraView_cameraSessionType, Defaults.DEFAULT_SESSION_TYPE);
- int videoQuality = a.getInteger(R.styleable.CameraView_cameraVideoQuality, Defaults.DEFAULT_VIDEO_QUALITY);
mJpegQuality = a.getInteger(R.styleable.CameraView_cameraJpegQuality, Defaults.DEFAULT_JPEG_QUALITY);
mCropOutput = a.getBoolean(R.styleable.CameraView_cameraCropOutput, Defaults.DEFAULT_CROP_OUTPUT);
GestureAction tapGesture = GestureAction.fromValue(a.getInteger(R.styleable.CameraView_cameraGestureTap, GestureAction.DEFAULT_TAP.value()));
@@ -838,17 +838,17 @@ public class CameraView extends FrameLayout {
* If it's not, a lower quality will be chosen, until a supported one is found.
* If sessionType is video, this might trigger a camera restart and a change in preview size.
*
- * @see CameraConstants#VIDEO_QUALITY_LOWEST
- * @see CameraConstants#VIDEO_QUALITY_QVGA
- * @see CameraConstants#VIDEO_QUALITY_480P
- * @see CameraConstants#VIDEO_QUALITY_720P
- * @see CameraConstants#VIDEO_QUALITY_1080P
- * @see CameraConstants#VIDEO_QUALITY_2160P
- * @see CameraConstants#VIDEO_QUALITY_HIGHEST
+ * @see VideoQuality#LOWEST
+ * @see VideoQuality#HIGHEST
+ * @see VideoQuality#MAX_QVGA
+ * @see VideoQuality#MAX_480P
+ * @see VideoQuality#MAX_720P
+ * @see VideoQuality#MAX_1080P
+ * @see VideoQuality#MAX_2160P
*
* @param videoQuality requested video quality
*/
- public void setVideoQuality(@VideoQuality int videoQuality) {
+ public void setVideoQuality(VideoQuality videoQuality) {
mCameraController.setVideoQuality(videoQuality);
}
@@ -857,8 +857,7 @@ public class CameraView extends FrameLayout {
* Gets the current video quality.
* @return the current video quality
*/
- @VideoQuality
- public int getVideoQuality() {
+ public VideoQuality getVideoQuality() {
return mCameraController.getVideoQuality();
}
diff --git a/cameraview/src/main/options/com/otaliastudios/cameraview/VideoQuality.java b/cameraview/src/main/options/com/otaliastudios/cameraview/VideoQuality.java
index ad99464e..0b6dec5d 100644
--- a/cameraview/src/main/options/com/otaliastudios/cameraview/VideoQuality.java
+++ b/cameraview/src/main/options/com/otaliastudios/cameraview/VideoQuality.java
@@ -1,19 +1,73 @@
package com.otaliastudios.cameraview;
-import android.support.annotation.IntDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_1080P;
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_2160P;
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_480P;
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_720P;
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_HIGHEST;
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_LOWEST;
-import static com.otaliastudios.cameraview.CameraConstants.VIDEO_QUALITY_QVGA;
-
-@Retention(RetentionPolicy.SOURCE)
-@IntDef({VIDEO_QUALITY_QVGA, VIDEO_QUALITY_480P, VIDEO_QUALITY_720P, VIDEO_QUALITY_1080P, VIDEO_QUALITY_2160P, VIDEO_QUALITY_HIGHEST, VIDEO_QUALITY_LOWEST})
-public @interface VideoQuality {
+
+/**
+ * Constants for selecting the quality of video recordings.
+ *
+ * @see CameraView#setVideoQuality(VideoQuality)
+ */
+public enum VideoQuality {
+
+
+ /**
+ * Quality level corresponding to the lowest available resolution.
+ */
+ LOWEST(0),
+
+ /**
+ * Quality level corresponding to the highest available resolution.
+ */
+ HIGHEST(1),
+
+ /**
+ * Quality level corresponding to the QVGA (320x240) resolution.
+ */
+ MAX_QVGA(2),
+
+ /**
+ * Quality level corresponding to the 480p (720 x 480) resolution.
+ * Note that the horizontal resolution for 480p can also be other
+ * values, such as 640 or 704, instead of 720.
+ */
+ MAX_480P(3),
+
+ /**
+ * Quality level corresponding to the 720p (1280 x 720) resolution.
+ */
+ MAX_720P(4),
+
+ /**
+ * Quality level corresponding to the 1080p (1920 x 1080) resolution.
+ * Note that the vertical resolution for 1080p can also be 1088,
+ * instead of 1080 (used by some vendors to avoid cropping during
+ * video playback).
+ */
+ MAX_1080P(5),
+
+ /**
+ * Quality level corresponding to the 2160p (3840x2160) resolution.
+ */
+ MAX_2160P(6);
+
+ static final VideoQuality DEFAULT = MAX_480P;
+
+ private int value;
+
+ VideoQuality(int value) {
+ this.value = value;
+ }
+
+ int value() {
+ return value;
+ }
+
+ static VideoQuality fromValue(int value) {
+ VideoQuality[] list = VideoQuality.values();
+ for (VideoQuality action : list) {
+ if (action.value() == value) {
+ return action;
+ }
+ }
+ return null;
+ }
}
diff --git a/cameraview/src/main/res/values/attrs.xml b/cameraview/src/main/res/values/attrs.xml
index 6578e5bd..cb5f5c7c 100644
--- a/cameraview/src/main/res/values/attrs.xml
+++ b/cameraview/src/main/res/values/attrs.xml
@@ -62,13 +62,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/MainActivity.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/MainActivity.java
index 135352fc..ad3f1b65 100644
--- a/demo/src/main/java/com/otaliastudios/cameraview/demo/MainActivity.java
+++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/MainActivity.java
@@ -19,6 +19,7 @@ import com.otaliastudios.cameraview.CameraView;
import com.otaliastudios.cameraview.Facing;
import com.otaliastudios.cameraview.Grid;
import com.otaliastudios.cameraview.Size;
+import com.otaliastudios.cameraview.VideoQuality;
import java.io.File;
@@ -238,15 +239,15 @@ public class MainActivity extends AppCompatActivity implements View.OnLayoutChan
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (mCapturingVideo) return;
- int videoQuality = CameraConstants.VIDEO_QUALITY_HIGHEST;
+ VideoQuality videoQuality = VideoQuality.HIGHEST;
switch (checkedId) {
- case R.id.videoQualityLowest: videoQuality = CameraConstants.VIDEO_QUALITY_LOWEST; break;
- case R.id.videoQualityQvga: videoQuality = CameraConstants.VIDEO_QUALITY_QVGA; break;
- case R.id.videoQuality480p: videoQuality = CameraConstants.VIDEO_QUALITY_480P; break;
- case R.id.videoQuality720p: videoQuality = CameraConstants.VIDEO_QUALITY_720P; break;
- case R.id.videoQuality1080p: videoQuality = CameraConstants.VIDEO_QUALITY_1080P; break;
- case R.id.videoQuality2160p: videoQuality = CameraConstants.VIDEO_QUALITY_2160P; break;
- case R.id.videoQualityHighest: videoQuality = CameraConstants.VIDEO_QUALITY_HIGHEST; break;
+ case R.id.videoQualityLowest: videoQuality = VideoQuality.LOWEST; break;
+ case R.id.videoQualityQvga: videoQuality = VideoQuality.MAX_QVGA; break;
+ case R.id.videoQuality480p: videoQuality = VideoQuality.MAX_480P; break;
+ case R.id.videoQuality720p: videoQuality = VideoQuality.MAX_720P; break;
+ case R.id.videoQuality1080p: videoQuality = VideoQuality.MAX_1080P; break;
+ case R.id.videoQuality2160p: videoQuality = VideoQuality.MAX_2160P; break;
+ case R.id.videoQualityHighest: videoQuality = VideoQuality.HIGHEST; break;
}
camera.setVideoQuality(videoQuality);
message("Video quality changed!", false);