Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1341)

Unified Diff: media/base/android/java/src/org/chromium/media/VideoCaptureCamera2.java

Issue 1416253005: Android VideoCaptureCamera2: Use closest supported resolution instead of requested resolution (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing mcasas@ comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/android/java/src/org/chromium/media/VideoCaptureCamera2.java
diff --git a/media/base/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/base/android/java/src/org/chromium/media/VideoCaptureCamera2.java
index 81db67a071873dcba5548edb3115886e0b11f637..0c66ede2ce363518717c80cbd6c153d7287113ed 100644
--- a/media/base/android/java/src/org/chromium/media/VideoCaptureCamera2.java
+++ b/media/base/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -107,6 +107,12 @@ public class VideoCaptureCamera2 extends VideoCapture {
return;
}
+ if (reader.getWidth() != image.getWidth()
+ || reader.getHeight() != image.getHeight()) {
+ throw new IllegalStateException("ImageReader size " + reader.getWidth() + "x"
+ + reader.getHeight() + " did not match Image size " + image.getWidth()
+ + "x" + image.getHeight());
+ }
readImageIntoBuffer(image, mCapturedData);
nativeOnFrameAvailable(mNativeVideoCaptureDeviceAndroid,
mCapturedData,
@@ -352,8 +358,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
}
}
- ArrayList<VideoCaptureFormat> formatList =
- new ArrayList<VideoCaptureFormat>();
+ ArrayList<VideoCaptureFormat> formatList = new ArrayList<VideoCaptureFormat>();
final StreamConfigurationMap streamMap =
cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
final int[] formats = streamMap.getOutputFormats();
@@ -363,19 +368,17 @@ public class VideoCaptureCamera2 extends VideoCapture {
for (Size size : sizes) {
double minFrameRate = 0.0f;
if (minFrameDurationAvailable) {
- final long minFrameDuration =
- streamMap.getOutputMinFrameDuration(format, size);
- minFrameRate = (minFrameDuration == 0) ? 0.0f :
- (1.0 / kNanoSecondsToFps * minFrameDuration);
+ final long minFrameDuration = streamMap.getOutputMinFrameDuration(format, size);
+ minFrameRate = (minFrameDuration == 0)
+ ? 0.0f
+ : (1.0 / kNanoSecondsToFps * minFrameDuration);
} else {
// TODO(mcasas): find out where to get the info from in this case.
// Hint: perhaps using SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS.
minFrameRate = 0.0;
}
- formatList.add(new VideoCaptureFormat(size.getWidth(),
- size.getHeight(),
- (int) minFrameRate,
- 0));
+ formatList.add(new VideoCaptureFormat(
+ size.getWidth(), size.getHeight(), (int) minFrameRate, 0));
}
}
return formatList.toArray(new VideoCaptureFormat[formatList.size()]);
@@ -396,13 +399,36 @@ public class VideoCaptureCamera2 extends VideoCapture {
return false;
}
}
+ final CameraCharacteristics cameraCharacteristics = getCameraCharacteristics(mContext, mId);
+ final StreamConfigurationMap streamMap =
+ cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+
+ // Find closest supported size.
+ final Size[] supportedSizes = streamMap.getOutputSizes(ImageFormat.YUV_420_888);
+ if (supportedSizes == null) return false;
+ Size closestSupportedSize = null;
+ int minDiff = Integer.MAX_VALUE;
+ for (Size size : supportedSizes) {
+ final int diff =
+ Math.abs(size.getWidth() - width) + Math.abs(size.getHeight() - height);
+ if (diff < minDiff) {
+ minDiff = diff;
+ closestSupportedSize = size;
+ }
+ }
+ if (minDiff == Integer.MAX_VALUE) {
+ Log.e(TAG, "No supported resolutions.");
+ return false;
+ }
+ Log.d(TAG, "allocate: matched (%d x %d)", closestSupportedSize.getWidth(),
+ closestSupportedSize.getHeight());
+
// |mCaptureFormat| is also used to configure the ImageReader.
- mCaptureFormat = new VideoCaptureFormat(width, height, frameRate, ImageFormat.YUV_420_888);
+ mCaptureFormat = new VideoCaptureFormat(closestSupportedSize.getWidth(),
+ closestSupportedSize.getHeight(), frameRate, ImageFormat.YUV_420_888);
int expectedFrameSize = mCaptureFormat.mWidth * mCaptureFormat.mHeight
* ImageFormat.getBitsPerPixel(mCaptureFormat.mPixelFormat) / 8;
mCapturedData = new byte[expectedFrameSize];
- final CameraCharacteristics cameraCharacteristics =
- getCameraCharacteristics(mContext, mId);
mCameraNativeOrientation =
cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
// TODO(mcasas): The following line is correct for N5 with prerelease Build,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698