From 3063ddba91d2636254a2cb0da9ea4c030950f1a8 Mon Sep 17 00:00:00 2001 From: Mike Habicher Date: Mon, 20 Aug 2012 09:11:20 -0700 Subject: [PATCH] Bug 783682 - Camera - always assume the camera gives us yuv420sp [r=gal] --- dom/camera/GonkCameraHwMgr.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/dom/camera/GonkCameraHwMgr.cpp b/dom/camera/GonkCameraHwMgr.cpp index 58b2ad8237c9..d601f459e99d 100644 --- a/dom/camera/GonkCameraHwMgr.cpp +++ b/dom/camera/GonkCameraHwMgr.cpp @@ -26,6 +26,16 @@ using namespace mozilla; using namespace mozilla::layers; using namespace android; +/** + * See bug 783682. Most camera implementations, despite claiming they + * support 'yuv420p' as a preview format, actually ignore this setting + * and return 'yuv420sp' data anyway. We have come across a new implementation + * that, while reporting that 'yuv420p' is supported *and* has been accepted, + * still returns the frame data in 'yuv420sp' anyway. So for now, since + * everyone seems to return this format, we just force it. + */ +#define FORCE_PREVIEW_FORMAT_YUV420SP 1 + #if GIHM_TIMING_RECEIVEFRAME #define INCLUDE_TIME_H 1 #endif @@ -51,14 +61,18 @@ static __inline void timespecSubtract(struct timespec* a, struct timespec* b) GonkCameraHardware::GonkCameraHardware(GonkCamera* aTarget, PRUint32 aCamera) : mCamera(aCamera) , mFps(30) +#if !FORCE_PREVIEW_FORMAT_YUV420SP , mPreviewFormat(PREVIEW_FORMAT_UNKNOWN) +#else + , mPreviewFormat(PREVIEW_FORMAT_YUV420SP) +#endif , mClosing(false) , mMonitor("GonkCameraHardware.Monitor") , mNumFrames(0) , mTarget(aTarget) , mInitialized(false) { - DOM_CAMERA_LOGI( "%s: this = %p (aTarget = %p)\n", __func__, (void* )this, (void* )aTarget ); + DOM_CAMERA_LOGI( "%s: this = %p (aTarget = %p)\n", __func__, (void*)this, (void*)aTarget ); init(); } @@ -384,6 +398,7 @@ GonkCameraHardware::StartPreview() { const char* format; +#if !FORCE_PREVIEW_FORMAT_YUV420SP DOM_CAMERA_LOGI("Preview formats: %s\n", mParams.get(mParams.KEY_SUPPORTED_PREVIEW_FORMATS)); // try to set preferred image format and frame rate @@ -405,6 +420,11 @@ GonkCameraHardware::StartPreview() mPreviewFormat = PREVIEW_FORMAT_UNKNOWN; DOM_CAMERA_LOGE("Camera ignored our request for '%s' preview, returned UNSUPPORTED format '%s'\n", PREVIEW_FORMAT, format); } +#else + mParams.setPreviewFormat("yuv420sp"); + mParams.setPreviewFrameRate(mFps); + mHardware->setParameters(mParams); +#endif // Check the frame rate and log if the camera ignored our setting PRUint32 fps = mParams.getPreviewFrameRate();