am 270bcaa9: Merge "Fix for 5156702 Rotate video output for thumbnails and export"

* commit '270bcaa9d1b7e6cef723532692d82bb231ac7137':
  Fix for 5156702 Rotate video output for thumbnails and export
diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
index b7d129d..2b4e85f 100644
--- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
+++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
@@ -29,6 +29,7 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Rect;
+import android.graphics.Matrix;
 import android.media.videoeditor.VideoEditor.ExportProgressListener;
 import android.media.videoeditor.VideoEditor.PreviewProgressListener;
 import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener;
@@ -1050,6 +1051,10 @@
          */
          public int rgbWidth;
          public int rgbHeight;
+         /**
+         * Video rotation degree.
+         */
+         public int rotationDegree;
     }
 
     /**
@@ -1700,6 +1705,11 @@
          */
         public int audioVolumeValue;
 
+        /**
+         * Video rotation degree.
+         */
+        public int videoRotation;
+
         public String Id;
     }
 
@@ -2254,6 +2264,7 @@
         lclipSettings.panZoomTopLeftXEnd = 0;
         lclipSettings.panZoomTopLeftYEnd = 0;
         lclipSettings.mediaRendering = 0;
+        lclipSettings.rotationDegree = 0;
     }
 
 
@@ -3784,7 +3795,8 @@
      **/
     void getPixelsList(String filename, final int width, final int height,
             long startMs, long endMs, int thumbnailCount, int[] indices,
-            final MediaItem.GetThumbnailListCallback callback) {
+            final MediaItem.GetThumbnailListCallback callback,
+            final int videoRotation) {
         /* Make width and height as even */
         final int newWidth = (width + 1) & 0xFFFFFFFE;
         final int newHeight = (height + 1) & 0xFFFFFFFE;
@@ -3799,7 +3811,7 @@
         final int[] rgb888 = new int[thumbnailSize];
         final IntBuffer tmpBuffer = IntBuffer.allocate(thumbnailSize);
         nativeGetPixelsList(filename, rgb888, newWidth, newHeight,
-                thumbnailCount, startMs, endMs, indices,
+                thumbnailCount, videoRotation, startMs, endMs, indices,
                 new NativeGetPixelsListCallback() {
             public void onThumbnail(int index) {
                 Bitmap bitmap = Bitmap.createBitmap(
@@ -3821,7 +3833,21 @@
 
                     canvas.setBitmap(null);
                 }
-                callback.onThumbnail(bitmap, index);
+
+                if (videoRotation == 0) {
+                    callback.onThumbnail(bitmap, index);
+                } else {
+                    Matrix mtx = new Matrix();
+                    mtx.postRotate(videoRotation);
+                    Bitmap rotatedBmp =
+                        Bitmap.createBitmap(bitmap, 0, 0, width, height, mtx, false);
+                    callback.onThumbnail(rotatedBmp, index);
+
+                    if (bitmap != null) {
+                        bitmap.recycle();
+                    }
+                }
+
             }
         });
 
@@ -3943,8 +3969,8 @@
             long timeMS);
 
     private native int nativeGetPixelsList(String fileName, int[] pixelArray,
-            int width, int height, int nosofTN, long startTimeMs, long endTimeMs,
-            int[] indices, NativeGetPixelsListCallback callback);
+            int width, int height, int nosofTN, int videoRotation, long startTimeMs,
+            long endTimeMs, int[] indices, NativeGetPixelsListCallback callback);
 
     /**
      * Releases the JNI and cleans up the core native module.. Should be called
diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java
index b2a279a..65a9e19 100755
--- a/media/java/android/media/videoeditor/MediaImageItem.java
+++ b/media/java/android/media/videoeditor/MediaImageItem.java
@@ -638,7 +638,7 @@
             }
 
             mMANativeHelper.getPixelsList(getGeneratedImageClip(), width,
-                height, startMs, endMs, thumbnailCount, indices, callback);
+                height, startMs, endMs, thumbnailCount, indices, callback, 0);
         }
     }
 
diff --git a/media/java/android/media/videoeditor/MediaVideoItem.java b/media/java/android/media/videoeditor/MediaVideoItem.java
index fea751b..2ce857c 100755
--- a/media/java/android/media/videoeditor/MediaVideoItem.java
+++ b/media/java/android/media/videoeditor/MediaVideoItem.java
@@ -57,6 +57,7 @@
     private String mAudioWaveformFilename;
     private MediaArtistNativeHelper mMANativeHelper;
     private VideoEditorImpl mVideoEditor;
+    private final int mVideoRotationDegree;
     /**
      *  The audio waveform data
      */
@@ -190,6 +191,7 @@
         } else {
             mWaveformData = null;
         }
+        mVideoRotationDegree = properties.videoRotation;
     }
 
     /**
@@ -317,7 +319,8 @@
         }
 
         mMANativeHelper.getPixelsList(super.getFilename(), width,
-                height, startMs, endMs, thumbnailCount, indices, callback);
+                height, startMs, endMs, thumbnailCount, indices, callback,
+                mVideoRotationDegree);
     }
 
     /*
@@ -425,7 +428,12 @@
      */
     @Override
     public int getWidth() {
-        return mWidth;
+        if (mVideoRotationDegree == 90 ||
+             mVideoRotationDegree == 270) {
+            return mHeight;
+        } else {
+            return mWidth;
+        }
     }
 
     /*
@@ -433,7 +441,12 @@
      */
     @Override
     public int getHeight() {
-        return mHeight;
+        if (mVideoRotationDegree == 90 ||
+             mVideoRotationDegree == 270) {
+            return mWidth;
+        } else {
+            return mHeight;
+        }
     }
 
     /*
@@ -725,6 +738,7 @@
         clipSettings.beginCutTime = (int)getBoundaryBeginTime();
         clipSettings.endCutTime = (int)getBoundaryEndTime();
         clipSettings.mediaRendering = mMANativeHelper.getMediaItemRenderingMode(getRenderingMode());
+        clipSettings.rotationDegree = mVideoRotationDegree;
 
         return clipSettings;
     }
diff --git a/media/jni/mediaeditor/VideoEditorClasses.cpp b/media/jni/mediaeditor/VideoEditorClasses.cpp
index 69735ca..4e0e0f2 100755
--- a/media/jni/mediaeditor/VideoEditorClasses.cpp
+++ b/media/jni/mediaeditor/VideoEditorClasses.cpp
@@ -490,7 +490,8 @@
     VIDEOEDIT_JAVA_FIELD_INIT("audioDuration",          "I"),
     VIDEOEDIT_JAVA_FIELD_INIT("audioBitrate",           "I"),
     VIDEOEDIT_JAVA_FIELD_INIT("audioChannels",          "I"),
-    VIDEOEDIT_JAVA_FIELD_INIT("audioSamplingFrequency", "I")
+    VIDEOEDIT_JAVA_FIELD_INIT("audioSamplingFrequency", "I"),
+    VIDEOEDIT_JAVA_FIELD_INIT("videoRotation",          "I")
 };
 
 VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(Properties, PROPERTIES_CLASS_NAME)
@@ -540,7 +541,8 @@
     VIDEOEDIT_JAVA_FIELD_INIT("panZoomTopLeftYEnd",   "I"                 ),
     VIDEOEDIT_JAVA_FIELD_INIT("mediaRendering",       "I"                 ),
     VIDEOEDIT_JAVA_FIELD_INIT("rgbWidth",           "I"                 ),
-    VIDEOEDIT_JAVA_FIELD_INIT("rgbHeight",          "I"                 )
+    VIDEOEDIT_JAVA_FIELD_INIT("rgbHeight",          "I"                 ),
+    VIDEOEDIT_JAVA_FIELD_INIT("rotationDegree",     "I"                 )
 };
 
 VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(ClipSettings, CLIP_SETTINGS_CLASS_NAME)
@@ -1402,6 +1404,10 @@
             VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", \
                 "getClipSettings-- rgbFileHeight %d ",
                 pSettings->ClipProperties.uiStillPicHeight);
+
+            // Set the video rotation degree
+            pSettings->ClipProperties.videoRotationDegrees =
+                (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.rotationDegree);
         }
 
         // Check if settings could be set.
@@ -1513,6 +1519,10 @@
                 pSettings->ClipProperties.uiStillPicWidth ,
                 pSettings->ClipProperties.uiStillPicHeight);
 
+            // Set the video rotation
+            pEnv->SetIntField(object, fieldIds.rotationDegree,
+                pSettings->ClipProperties.videoRotationDegrees);
+
             // Return the object.
             (*pObject) = object;
         }
@@ -1609,6 +1619,9 @@
             pEnv->SetIntField(object, fieldIds.audioSamplingFrequency,
                 pProperties->uiSamplingFrequency);
 
+            // Set the video rotation field.
+            pEnv->SetIntField(object, fieldIds.videoRotation, pProperties->uiRotation);
+
             // Return the object.
             (*pObject) = object;
         }
diff --git a/media/jni/mediaeditor/VideoEditorClasses.h b/media/jni/mediaeditor/VideoEditorClasses.h
index 3c10b1d..a4c82a8 100755
--- a/media/jni/mediaeditor/VideoEditorClasses.h
+++ b/media/jni/mediaeditor/VideoEditorClasses.h
@@ -145,6 +145,7 @@
     M4OSA_UInt32 uiAudioBitrate;
     M4OSA_UInt32 uiNbChannels;
     M4OSA_UInt32 uiSamplingFrequency;
+    M4OSA_UInt32 uiRotation;
 } VideoEditPropClass_Properties;
 
 typedef struct
@@ -166,6 +167,7 @@
     jfieldID audioBitrate;
     jfieldID audioChannels;
     jfieldID audioSamplingFrequency;
+    jfieldID videoRotation;
 } VideoEditJava_PropertiesFieldIds;
 
 
@@ -187,6 +189,7 @@
     jfieldID mediaRendering;
     jfieldID rgbFileWidth;
     jfieldID rgbFileHeight;
+    jfieldID rotationDegree;
 } VideoEditJava_ClipSettingsFieldIds;
 
 typedef struct
diff --git a/media/jni/mediaeditor/VideoEditorMain.cpp b/media/jni/mediaeditor/VideoEditorMain.cpp
index b737e5d..4e73581 100755
--- a/media/jni/mediaeditor/VideoEditorMain.cpp
+++ b/media/jni/mediaeditor/VideoEditorMain.cpp
@@ -185,6 +185,7 @@
                                      M4OSA_UInt32             width,
                                      M4OSA_UInt32             height,
                                      M4OSA_UInt32             noOfThumbnails,
+                                     M4OSA_UInt32             videoRotation,
                                      jlong                    startTime,
                                      jlong                    endTime,
                                      jintArray                indexArray,
@@ -291,7 +292,7 @@
                                 (void *)videoEditor_release            },
     {"nativeGetPixels",         "(Ljava/lang/String;[IIIJ)I",
                                 (void*)videoEditor_getPixels               },
-    {"nativeGetPixelsList",     "(Ljava/lang/String;[IIIIJJ[ILandroid/media/videoeditor/MediaArtistNativeHelper$NativeGetPixelsListCallback;)I",
+    {"nativeGetPixelsList",     "(Ljava/lang/String;[IIIIIJJ[ILandroid/media/videoeditor/MediaArtistNativeHelper$NativeGetPixelsListCallback;)I",
                                 (void*)videoEditor_getPixelsList           },
     {"getMediaProperties",
     "(Ljava/lang/String;)Landroid/media/videoeditor/MediaArtistNativeHelper$Properties;",
@@ -375,6 +376,12 @@
                     pEnv->GetIntField(object,fid);
    M4OSA_TRACE1_1("audioVolumeValue = %d",
                     pSettings->ClipProperties.uiClipAudioVolumePercentage);
+
+   fid = pEnv->GetFieldID(clazz,"videoRotation","I");
+   pSettings->ClipProperties.videoRotationDegrees =
+                    pEnv->GetIntField(object,fid);
+   M4OSA_TRACE1_1("videoRotation = %d",
+                    pSettings->ClipProperties.videoRotationDegrees);
 }
 
 static void jniPreviewProgressCallback (void* cookie, M4OSA_UInt32 msgType,
@@ -789,6 +796,8 @@
             pContext->pEditSettings->pClipList[iCurrentClipIndex]->ClipProperties.uiVideoWidth,
             (M4OSA_Void **)&frameStr.pBuffer);
             tnTimeMs = (M4OSA_UInt32)timeMs;
+
+          frameStr.videoRotationDegree = 0;
     } else {
         /* Handle 3gp/mp4 Clips here */
         /* get thumbnail*/
@@ -913,6 +922,9 @@
 
         /* Fill up the render structure*/
         frameStr.pBuffer = (M4OSA_Void*)yuvPlane[0].pac_data;
+
+        frameStr.videoRotationDegree = pContext->pEditSettings->\
+            pClipList[iCurrentClipIndex]->ClipProperties.videoRotationDegrees;
     }
 
     frameStr.timeMs = timeMs;    /* timestamp on storyboard*/
@@ -976,13 +988,12 @@
     videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
             (M4NO_ERROR != result), result);
 
-    if (pContext->pEditSettings->pClipList[iCurrentClipIndex]->FileType ==\
-         /*M4VIDEOEDITING_kFileType_JPG */ M4VIDEOEDITING_kFileType_ARGB8888) {
-            free(frameStr.pBuffer);
-    } else {
-        free(yuvPlane[0].pac_data);
+    free(frameStr.pBuffer);
+    if (pContext->pEditSettings->pClipList[iCurrentClipIndex]->FileType !=
+            M4VIDEOEDITING_kFileType_ARGB8888) {
         free(yuvPlane);
     }
+
     return tnTimeMs;
 }
 
@@ -2275,6 +2286,7 @@
                 M4OSA_UInt32            width,
                 M4OSA_UInt32            height,
                 M4OSA_UInt32            noOfThumbnails,
+                M4OSA_UInt32            videoRotation,
                 jlong                   startTime,
                 jlong                   endTime,
                 jintArray               indexArray,
diff --git a/media/jni/mediaeditor/VideoEditorMain.h b/media/jni/mediaeditor/VideoEditorMain.h
index ca4a945..4c3b517 100755
--- a/media/jni/mediaeditor/VideoEditorMain.h
+++ b/media/jni/mediaeditor/VideoEditorMain.h
@@ -71,6 +71,7 @@
     M4OSA_Bool      bApplyEffect;        /* Apply video effects before render*/
     M4OSA_UInt32    clipBeginCutTime;  /* Clip begin cut time relative to storyboard */
     M4OSA_UInt32    clipEndCutTime;    /* Clip end cut time relative to storyboard */
+    M4OSA_UInt32    videoRotationDegree; /* Video rotation degree */
 
 } VideoEditor_renderPreviewFrameStr;
 #endif /*__VIDEO_EDITOR_API_H__*/
diff --git a/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp b/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp
index 2ca3a08..c8fb263 100755
--- a/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp
+++ b/media/jni/mediaeditor/VideoEditorPropertiesMain.cpp
@@ -258,6 +258,8 @@
                 pProperties->uiAudioBitrate      = pClipProperties->uiAudioBitrate;
                 pProperties->uiNbChannels        = pClipProperties->uiNbChannels;
                 pProperties->uiSamplingFrequency = pClipProperties->uiSamplingFrequency;
+                pProperties->uiRotation          = pClipProperties->videoRotationDegrees;
+
             }
 
             // Free the clip properties.