Do not set camera preview display if the surface is null.

MediaRecorder.setPreviewDisplay() is not required if applications
use MediaRecorder.setCamera(). Besides, this causes a problem when
apps use Camera.setPreviewTexture. Camera service thinks the
surface texture from Camera.setPreviewTexture and the surface from
MediaRecorder.setPreviewDisplay are different.

bug:5988937

Change-Id: Ia345705b6679ef349db6e354feaa3cc0fe8bcd8c
This commit is contained in:
Wu-cheng Li
2012-03-14 17:25:57 +08:00
parent d85d590ed3
commit c59d1a8f0c
2 changed files with 14 additions and 4 deletions

View File

@@ -124,9 +124,15 @@ public class MediaRecorder
/**
* Sets a Surface to show a preview of recorded media (video). Calls this
* before prepare() to make sure that the desirable preview display is
* set.
* set. If {@link #setCamera(Camera)} is used and the surface has been
* already set to the camera, application do not need to call this. If
* this is called with non-null surface, the preview surface of the camera
* will be replaced by the new surface. If this method is called with null
* surface or not called at all, media recorder will not change the preview
* surface of the camera.
*
* @param sv the Surface to use for the preview
* @see android.hardware.Camera#setPreviewDisplay(android.view.SurfaceHolder)
*/
public void setPreviewDisplay(Surface sv) {
mSurface = sv;

View File

@@ -515,9 +515,13 @@ status_t CameraSource::initWithCameraAccess(
return err;
}
// This CHECK is good, since we just passed the lock/unlock
// check earlier by calling mCamera->setParameters().
CHECK_EQ((status_t)OK, mCamera->setPreviewDisplay(mSurface));
// Set the preview display. Skip this if mSurface is null because
// applications may already set a surface to the camera.
if (mSurface != NULL) {
// This CHECK is good, since we just passed the lock/unlock
// check earlier by calling mCamera->setParameters().
CHECK_EQ((status_t)OK, mCamera->setPreviewDisplay(mSurface));
}
// By default, do not store metadata in video buffers
mIsMetaDataStoredInVideoBuffers = false;