* @param data A preview frame.
* @param width The width of the image.
* @param height The height of the image.
- * @return A BaseLuminanceSource subclass.
+ * @return A PlanarYUVLuminanceSource instance.
*/
- public BaseLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
+ public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
Rect rect = getFramingRect();
switch (previewFormat) {
+ // This is the standard Android format which all devices are REQUIRED to support.
+ // In theory, it's the only one we should ever care about.
case PixelFormat.YCbCr_420_SP:
+ return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
+ rect.width(), rect.height());
+ // This format has never been seen in the wild, but is compatible as we only care
+ // about the Y channel, so allow it.
case PixelFormat.YCbCr_422_SP:
return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
rect.width(), rect.height());
default:
- // There's no PixelFormat constant for this buffer format yet.
- if (previewFormatString.equals("yuv422i-yuyv")) {
- return new InterleavedYUV422LuminanceSource(data, width, height, rect.left, rect.top,
- rect.width(), rect.height());
+ // The Samsung Moment incorrectly uses this variant instead of the 'sp' version.
+ // Fortunately, it too has all the Y data up front, so we can read it.
+ if (previewFormatString.equals("yuv420p")) {
+ return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
+ rect.width(), rect.height());
}
- break;
}
- return null;
+ throw new IllegalArgumentException("Unsupported picture format: " +
+ previewFormat + '/' + previewFormatString);
}
/**
Log.v(TAG, "Default preview size: " + size.width + ", " + size.height);
previewFormat = parameters.getPreviewFormat();
previewFormatString = parameters.get("preview-format");
- Log.v(TAG, "Default preview format: " + previewFormat);
+ Log.v(TAG, "Default preview format: " + previewFormat + '/' + previewFormatString);
// Ensure that the camera resolution is a multiple of 8, as the screen may not be.
// TODO: A better solution would be to request the supported preview resolutions