From f1febe470ac30f8992066cb263c10f58493c4c34 Mon Sep 17 00:00:00 2001 From: James Dong Date: Wed, 3 Nov 2010 17:27:58 -0700 Subject: [PATCH] Support rotation in media recorder o needs to be tested with camera hal and camcorder application Change-Id: Ie343185c8ad3ec55da8850efbdcf19cf98993232 --- media/java/android/media/MediaRecorder.java | 12 +++++++++ .../StagefrightRecorder.cpp | 25 +++++++++++++++++++ .../StagefrightRecorder.h | 2 ++ 3 files changed, 39 insertions(+) diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index b38124ecc4012..1c691427416a3 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -284,6 +284,18 @@ public class MediaRecorder setAudioEncoder(profile.audioCodec); } + /** + * Set the rotation degrees for the video recording. This method should be called + * before start(). + * + * @param degrees the angle to be rotated clockwise. + * + * {@hide} + */ + public void setClockwiseRotation(int degrees) { + setParameter(String.format("video-param-clockwise-rotation-degrees=%d", degrees)); + } + /** * Sets the format of the output file produced during recording. Call this * after setAudioSource()/setVideoSource() but before prepare(). diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index d37d83d3472e2..50d7f6d3d4a26 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -462,6 +462,17 @@ status_t StagefrightRecorder::setParamVideoTimeScale(int32_t timeScale) { return OK; } +status_t StagefrightRecorder::setParamVideoRotation(int32_t degreesClockwise) { + LOGV("setParamVideoRotation: %d", degreesClockwise); + + if (degreesClockwise < 0 || degreesClockwise % 90 != 0) { + LOGE("Unsupported video rotation angle: %d", degreesClockwise); + return BAD_VALUE; + } + mClockwiseRotationDegrees = degreesClockwise; + return OK; +} + status_t StagefrightRecorder::setParamAudioTimeScale(int32_t timeScale) { LOGV("setParamAudioTimeScale: %d", timeScale); @@ -557,6 +568,11 @@ status_t StagefrightRecorder::setParameter( if (safe_strtoi32(value.string(), &timeScale)) { return setParamVideoTimeScale(timeScale); } + } else if (key == "video-param-clockwise-rotation-degrees") { + int32_t degrees; + if (safe_strtoi32(value.string(), °rees)) { + return setParamVideoRotation(degrees); + } } else { LOGE("setParameter: failed to find key %s", key.string()); } @@ -921,6 +937,12 @@ status_t StagefrightRecorder::setupCameraSource() { CameraParameters params(mCamera->getParameters()); params.setPreviewSize(mVideoWidth, mVideoHeight); params.setPreviewFrameRate(mFrameRate); + { + // Optional feature: setting the rotation degrees. + char degrees[4]; + snprintf(degrees, 4, "%d", mClockwiseRotationDegrees); + params.set(CameraParameters::KEY_ROTATION, degrees); + } String8 s = params.flatten(); if (OK != mCamera->setParameters(s)) { LOGE("Could not change settings." @@ -1188,6 +1210,7 @@ status_t StagefrightRecorder::reset() { mMaxFileSizeBytes = 0; mTrackEveryTimeDurationUs = 0; mEncoderProfiles = MediaProfiles::getInstance(); + mClockwiseRotationDegrees = 0; mOutputFd = -1; mFlags = 0; @@ -1261,6 +1284,8 @@ status_t StagefrightRecorder::dump( result.append(buffer); snprintf(buffer, SIZE, " Camera flags: %d\n", mFlags); result.append(buffer); + snprintf(buffer, SIZE, " Rotation (clockwise) degrees: %d\n", mClockwiseRotationDegrees); + result.append(buffer); snprintf(buffer, SIZE, " Encoder: %d\n", mVideoEncoder); result.append(buffer); snprintf(buffer, SIZE, " Encoder profile: %d\n", mVideoEncoderProfile); diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h index ad0dfa05fda84..383fec5029023 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.h +++ b/media/libmediaplayerservice/StagefrightRecorder.h @@ -91,6 +91,7 @@ private: int64_t mMaxFileSizeBytes; int64_t mMaxFileDurationUs; int64_t mTrackEveryTimeDurationUs; + int32_t mClockwiseRotationDegrees; String8 mParams; int mOutputFd; @@ -120,6 +121,7 @@ private: status_t setParamVideoEncoderLevel(int32_t level); status_t setParamVideoCameraId(int32_t cameraId); status_t setParamVideoTimeScale(int32_t timeScale); + status_t setParamVideoRotation(int32_t degreesClockwise); status_t setParamTrackTimeStatus(int64_t timeDurationUs); status_t setParamInterleaveDuration(int32_t durationUs); status_t setParam64BitFileOffset(bool use64BitFileOffset);