diff options
-rw-r--r-- | media/java/android/media/MediaRecorder.java | 12 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.cpp | 25 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.h | 2 |
3 files changed, 39 insertions, 0 deletions
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index b38124e..1c69142 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -285,6 +285,18 @@ public class MediaRecorder } /** + * 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 d37d83d..50d7f6d 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 ad0dfa0..383fec5 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); |