diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2011-10-04 15:11:03 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2011-10-05 14:55:45 -0700 |
commit | 2c2550bd42c614330a3c968bda005ac23d12f8d1 (patch) | |
tree | 94461377481e19735f37cbae02cd78f6f9dfa74b /src/com/android/camera/EffectsRecorder.java | |
parent | 7f1b0d66edd09a4cb218ecc1255a8d48f5c18a60 (diff) | |
download | packages_apps_LegacyCamera-2c2550bd42c614330a3c968bda005ac23d12f8d1.zip packages_apps_LegacyCamera-2c2550bd42c614330a3c968bda005ac23d12f8d1.tar.gz packages_apps_LegacyCamera-2c2550bd42c614330a3c968bda005ac23d12f8d1.tar.bz2 |
Properly mirror video for front camera effects recording.
- Incoming transform from camera SurfaceTexture is mirrored
for front camera
- Recording preview needs to be mirrored, but the recorded
video needs to be unmirrored.
Bug: 5408479
Change-Id: I0cdb29151ae20b02f690fb976e5a29e594c094a1
Diffstat (limited to 'src/com/android/camera/EffectsRecorder.java')
-rw-r--r-- | src/com/android/camera/EffectsRecorder.java | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/com/android/camera/EffectsRecorder.java b/src/com/android/camera/EffectsRecorder.java index f177387..94a3740 100644 --- a/src/com/android/camera/EffectsRecorder.java +++ b/src/com/android/camera/EffectsRecorder.java @@ -22,6 +22,8 @@ import android.filterfw.core.Filter; import android.filterfw.core.GLEnvironment; import android.filterfw.core.GraphRunner; import android.filterfw.core.GraphRunner.OnRunnerDoneListener; +import android.filterfw.geometry.Point; +import android.filterfw.geometry.Quad; import android.filterpacks.videosrc.SurfaceTextureSource.SurfaceTextureSourceListener; import android.filterpacks.videoproc.BackDropperFilter; import android.filterpacks.videoproc.BackDropperFilter.LearningDoneListener; @@ -78,6 +80,7 @@ public class EffectsRecorder { private String mOutputFile; private int mOrientationHint = 0; + private int mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; private int mEffect = EFFECT_NONE; private int mCurrentEffect = EFFECT_NONE; @@ -229,6 +232,31 @@ public class EffectsRecorder { } } + private void setRecordingOrientation() { + if ( mState <= STATE_PREVIEW && mRunner != null ) { + Point bl = new Point(0, 0); + Point br = new Point(1, 0); + Point tl = new Point(0, 1); + Point tr = new Point(1, 1); + Quad recordingRegion; + if (mCameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK) { + // The back camera is not mirrored, so use a identity transform + recordingRegion = new Quad(bl, br, tl, tr); + } else { + // Recording region needs to be tweaked for front cameras, since they + // mirror their preview + if (mOrientationHint == 0 || mOrientationHint == 180) { + // Horizontal flip in landscape + recordingRegion = new Quad(br, bl, tr, tl); + } else { + // Horizontal flip in portrait + recordingRegion = new Quad(tl, tr, bl, br); + } + } + Filter recorder = mRunner.getGraph().getFilter("recorder"); + recorder.setInputValue("inputRegion", recordingRegion); + } + } public void setOrientationHint(int degrees) { switch (mState) { case STATE_RELEASED: @@ -241,6 +269,19 @@ public class EffectsRecorder { mOrientationHint = degrees; setFaceDetectOrientation(degrees); + setRecordingOrientation(); + } + + public void setCameraFacing(int facing) { + switch (mState) { + case STATE_RELEASED: + throw new RuntimeException( + "setCameraFacing called on alrady released recorder!"); + default: + break; + } + mCameraFacing = facing; + setRecordingOrientation(); } public void setOnInfoListener(MediaRecorder.OnInfoListener infoListener) { @@ -297,6 +338,7 @@ public class EffectsRecorder { Log.v(TAG, "Effect initializing. Preview size " + mPreviewWidth + ", " + mPreviewHeight); } + mGraphEnv.addReferences( "previewSurface", mPreviewSurfaceHolder.getSurface(), "previewWidth", mPreviewWidth, @@ -355,6 +397,7 @@ public class EffectsRecorder { break; } setFaceDetectOrientation(mOrientationHint); + setRecordingOrientation(); } public synchronized void startPreview() { |