diff options
author | Rajneesh Chowdury <rajneeshc@google.com> | 2011-08-31 17:14:52 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-31 17:14:52 -0700 |
commit | 270bcaa9d1b7e6cef723532692d82bb231ac7137 (patch) | |
tree | 74de29fb2048522fe2320a6b80e0a948e8107890 | |
parent | 93d77b633e7888b425443f544b2732485adee45e (diff) | |
parent | c847b1a89df94dbff4c2f557f8c042ead5398c3f (diff) | |
download | frameworks_base-270bcaa9d1b7e6cef723532692d82bb231ac7137.zip frameworks_base-270bcaa9d1b7e6cef723532692d82bb231ac7137.tar.gz frameworks_base-270bcaa9d1b7e6cef723532692d82bb231ac7137.tar.bz2 |
Merge "Fix for 5156702 Rotate video output for thumbnails and export"
-rw-r--r-- | media/java/android/media/videoeditor/MediaArtistNativeHelper.java | 36 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/MediaImageItem.java | 2 | ||||
-rwxr-xr-x | media/java/android/media/videoeditor/MediaVideoItem.java | 20 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorClasses.cpp | 17 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorClasses.h | 3 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorMain.cpp | 24 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorMain.h | 1 | ||||
-rwxr-xr-x | media/jni/mediaeditor/VideoEditorPropertiesMain.cpp | 2 |
8 files changed, 88 insertions, 17 deletions
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.BitmapFactory; 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 @@ class MediaArtistNativeHelper { */ public int rgbWidth; public int rgbHeight; + /** + * Video rotation degree. + */ + public int rotationDegree; } /** @@ -1700,6 +1705,11 @@ class MediaArtistNativeHelper { */ public int audioVolumeValue; + /** + * Video rotation degree. + */ + public int videoRotation; + public String Id; } @@ -2254,6 +2264,7 @@ class MediaArtistNativeHelper { lclipSettings.panZoomTopLeftXEnd = 0; lclipSettings.panZoomTopLeftYEnd = 0; lclipSettings.mediaRendering = 0; + lclipSettings.rotationDegree = 0; } @@ -3784,7 +3795,8 @@ class MediaArtistNativeHelper { **/ 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 @@ class MediaArtistNativeHelper { 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 @@ class MediaArtistNativeHelper { 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 @@ class MediaArtistNativeHelper { 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 @@ public class MediaImageItem extends MediaItem { } 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 @@ public class MediaVideoItem extends MediaItem { private String mAudioWaveformFilename; private MediaArtistNativeHelper mMANativeHelper; private VideoEditorImpl mVideoEditor; + private final int mVideoRotationDegree; /** * The audio waveform data */ @@ -190,6 +191,7 @@ public class MediaVideoItem extends MediaItem { } else { mWaveformData = null; } + mVideoRotationDegree = properties.videoRotation; } /** @@ -317,7 +319,8 @@ public class MediaVideoItem extends MediaItem { } mMANativeHelper.getPixelsList(super.getFilename(), width, - height, startMs, endMs, thumbnailCount, indices, callback); + height, startMs, endMs, thumbnailCount, indices, callback, + mVideoRotationDegree); } /* @@ -425,7 +428,12 @@ public class MediaVideoItem extends MediaItem { */ @Override public int getWidth() { - return mWidth; + if (mVideoRotationDegree == 90 || + mVideoRotationDegree == 270) { + return mHeight; + } else { + return mWidth; + } } /* @@ -433,7 +441,12 @@ public class MediaVideoItem extends MediaItem { */ @Override public int getHeight() { - return mHeight; + if (mVideoRotationDegree == 90 || + mVideoRotationDegree == 270) { + return mWidth; + } else { + return mHeight; + } } /* @@ -725,6 +738,7 @@ public class MediaVideoItem extends MediaItem { 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_DEFINE_FIELDS(Properties) 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_DEFINE_FIELDS(ClipSettings) 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 @@ videoEditClasses_getClipSettings( 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 @@ videoEditClasses_createClipSettings( 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 @@ videoEditPropClass_createProperties( 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 @@ typedef struct { M4OSA_UInt32 uiAudioBitrate; M4OSA_UInt32 uiNbChannels; M4OSA_UInt32 uiSamplingFrequency; + M4OSA_UInt32 uiRotation; } VideoEditPropClass_Properties; typedef struct @@ -166,6 +167,7 @@ typedef struct jfieldID audioBitrate; jfieldID audioChannels; jfieldID audioSamplingFrequency; + jfieldID videoRotation; } VideoEditJava_PropertiesFieldIds; @@ -187,6 +189,7 @@ typedef struct 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 @@ static int videoEditor_getPixelsList( M4OSA_UInt32 width, M4OSA_UInt32 height, M4OSA_UInt32 noOfThumbnails, + M4OSA_UInt32 videoRotation, jlong startTime, jlong endTime, jintArray indexArray, @@ -291,7 +292,7 @@ static JNINativeMethod gManualEditMethods[] = { (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 @@ getClipSetting( 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 @@ static int videoEditor_renderPreviewFrame(JNIEnv* pEnv, 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 @@ static int videoEditor_renderPreviewFrame(JNIEnv* pEnv, /* 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 @@ static int videoEditor_renderPreviewFrame(JNIEnv* pEnv, 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 @@ static int videoEditor_getPixelsList( 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 @@ typedef struct 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 @@ jobject videoEditProp_getProperties( pProperties->uiAudioBitrate = pClipProperties->uiAudioBitrate; pProperties->uiNbChannels = pClipProperties->uiNbChannels; pProperties->uiSamplingFrequency = pClipProperties->uiSamplingFrequency; + pProperties->uiRotation = pClipProperties->videoRotationDegrees; + } // Free the clip properties. |