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.