Reland patch for Switch default color format to YV12 on Android.
The new since the previous patch is that we ignore all resolutions with width % 16 != 0
since they are not tightly packed.
http://developer.android.com/reference/android/graphics/ImageFormat.html#YV12
R=glaznev@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/36269004
Cr-Commit-Position: refs/heads/master@{#8459}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8459 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/app/webrtc/androidvideocapturer.cc b/talk/app/webrtc/androidvideocapturer.cc
index 02f77db..d1238b3 100644
--- a/talk/app/webrtc/androidvideocapturer.cc
+++ b/talk/app/webrtc/androidvideocapturer.cc
@@ -62,7 +62,7 @@
int length,
int rotation,
int64 time_stamp_in_ms) {
- captured_frame_.fourcc = static_cast<uint32>(cricket::FOURCC_NV21);
+ captured_frame_.fourcc = static_cast<uint32>(cricket::FOURCC_YV12);
captured_frame_.data = frame_data;
captured_frame_.elapsed_time = rtc::TimeNanos() - start_time_;
captured_frame_.time_stamp =
@@ -119,7 +119,7 @@
json_value["width"].asInt(),
json_value["height"].asInt(),
cricket::VideoFormat::FpsToInterval(json_value["framerate"].asInt()),
- cricket::FOURCC_NV21);
+ cricket::FOURCC_YV12);
formats.push_back(format);
}
SetSupportedFormats(formats);
@@ -168,7 +168,7 @@
}
bool AndroidVideoCapturer::GetPreferredFourccs(std::vector<uint32>* fourccs) {
- fourccs->push_back(cricket::FOURCC_NV21);
+ fourccs->push_back(cricket::FOURCC_YV12);
return true;
}
diff --git a/talk/app/webrtc/java/src/org/webrtc/VideoCapturerAndroid.java b/talk/app/webrtc/java/src/org/webrtc/VideoCapturerAndroid.java
index c68e270..4465354 100644
--- a/talk/app/webrtc/java/src/org/webrtc/VideoCapturerAndroid.java
+++ b/talk/app/webrtc/java/src/org/webrtc/VideoCapturerAndroid.java
@@ -287,6 +287,13 @@
List<Camera.Size> supportedSizes =
parameters.getSupportedPreviewSizes();
for (Camera.Size size : supportedSizes) {
+ if (size.width % 16 != 0) {
+ // If the width is not a multiple of 16, The frames received from the
+ // camera will have a stride != width when YV12 is used. Since we
+ // currently only support tightly packed images, we simply ignore those
+ // resolutions.
+ continue;
+ }
formatList.add(new CaptureFormat(size.width, size.height,
range[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
range[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]));
@@ -324,6 +331,9 @@
if (frameObserver == null) {
throw new RuntimeException("frameObserver not set.");
}
+ if (width % 16 != 0) {
+ throw new RuntimeException("widht must be a multiple of 16." );
+ }
this.width = width;
this.height = height;
this.framerate = framerate;
@@ -398,7 +408,7 @@
}
parameters.setPictureSize(width, height);
parameters.setPreviewSize(width, height);
- int format = ImageFormat.NV21;
+ int format = ImageFormat.YV12;
parameters.setPreviewFormat(format);
camera.setParameters(parameters);
// Note: setRecordingHint(true) actually decrease frame rate on N5.