Support rotation in media recorder

o needs to be tested with camera hal and camcorder application

Change-Id: Ie343185c8ad3ec55da8850efbdcf19cf98993232
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 @@
     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 @@
         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(), &degrees)) {
+            return setParamVideoRotation(degrees);
+        }
     } else {
         LOGE("setParameter: failed to find key %s", key.string());
     }
@@ -921,6 +937,12 @@
     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 @@
     mMaxFileSizeBytes = 0;
     mTrackEveryTimeDurationUs = 0;
     mEncoderProfiles = MediaProfiles::getInstance();
+    mClockwiseRotationDegrees = 0;
 
     mOutputFd = -1;
     mFlags = 0;
@@ -1261,6 +1284,8 @@
     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 @@
     int64_t mMaxFileSizeBytes;
     int64_t mMaxFileDurationUs;
     int64_t mTrackEveryTimeDurationUs;
+    int32_t mClockwiseRotationDegrees;
 
     String8 mParams;
     int mOutputFd;
@@ -120,6 +121,7 @@
     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);