diff options
author | Carl Shapiro <cshapiro@google.com> | 2011-01-20 23:13:09 -0800 |
---|---|---|
committer | Carl Shapiro <cshapiro@google.com> | 2011-01-21 14:45:14 -0800 |
commit | ae12a50a35c0d8425430d0e934c022ecb9cd4936 (patch) | |
tree | 0528dd701200c3d779f205bd7407a9ae31923bff /media/jni/android_media_MediaMetadataRetriever.cpp | |
parent | 63d64a14790ae21db31b60747864b4a7565b33c3 (diff) | |
download | frameworks_base-ae12a50a35c0d8425430d0e934c022ecb9cd4936.zip frameworks_base-ae12a50a35c0d8425430d0e934c022ecb9cd4936.tar.gz frameworks_base-ae12a50a35c0d8425430d0e934c022ecb9cd4936.tar.bz2 |
Perform orthogonal rotations without using a Skia canvas.
Bug: 3371653
Change-Id: I315f671c0016f61417ff7c2a98d2c96f6b243bdf
Diffstat (limited to 'media/jni/android_media_MediaMetadataRetriever.cpp')
-rw-r--r-- | media/jni/android_media_MediaMetadataRetriever.cpp | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index ec88bb2..5d14763 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -22,9 +22,6 @@ #include <utils/Log.h> #include <utils/threads.h> #include <core/SkBitmap.h> -#include <core/SkCanvas.h> -#include <core/SkDevice.h> -#include <core/SkScalar.h> #include <media/mediametadataretriever.h> #include <private/media/VideoFrame.h> @@ -136,6 +133,61 @@ static void android_media_MediaMetadataRetriever_setDataSourceFD(JNIEnv *env, jo process_media_retriever_call(env, retriever->setDataSource(fd, offset, length), "java/lang/RuntimeException", "setDataSource failed"); } +template<typename T> +static void rotate0(T* dst, const T* src, size_t width, size_t height) +{ + memcpy(dst, src, width * height * sizeof(T)); +} + +template<typename T> +static void rotate90(T* dst, const T* src, size_t width, size_t height) +{ + for (size_t i = 0; i < height; ++i) { + for (size_t j = 0; j < width; ++j) { + dst[j * height + height - 1 - i] = src[i * width + j]; + } + } +} + +template<typename T> +static void rotate180(T* dst, const T* src, size_t width, size_t height) +{ + for (size_t i = 0; i < height; ++i) { + for (size_t j = 0; j < width; ++j) { + dst[(height - 1 - i) * width + width - 1 - j] = src[i * width + j]; + } + } +} + +template<typename T> +static void rotate270(T* dst, const T* src, size_t width, size_t height) +{ + for (size_t i = 0; i < height; ++i) { + for (size_t j = 0; j < width; ++j) { + dst[(width - 1 - j) * height + i] = src[i * width + j]; + } + } +} + +template<typename T> +static void rotate(T *dst, const T *src, size_t width, size_t height, int angle) +{ + switch (angle) { + case 0: + rotate0(dst, src, width, height); + break; + case 90: + rotate90(dst, src, width, height); + break; + case 180: + rotate180(dst, src, width, height); + break; + case 270: + rotate270(dst, src, width, height); + break; + } +} + static jobject android_media_MediaMetadataRetriever_getFrameAtTime(JNIEnv *env, jobject thiz, jlong timeUs, jint option) { LOGV("getFrameAtTime: %lld us option: %d", timeUs, option); @@ -166,30 +218,33 @@ static jobject android_media_MediaMetadataRetriever_getFrameAtTime(JNIEnv *env, fields.createConfigMethod, SkBitmap::kRGB_565_Config); + size_t width, height; + if (videoFrame->mRotationAngle == 90 || videoFrame->mRotationAngle == 270) { + width = videoFrame->mDisplayHeight; + height = videoFrame->mDisplayWidth; + } else { + width = videoFrame->mDisplayWidth; + height = videoFrame->mDisplayHeight; + } + jobject jBitmap = env->CallStaticObjectMethod( fields.bitmapClazz, fields.createBitmapMethod, - videoFrame->mDisplayWidth, - videoFrame->mDisplayHeight, + width, + height, config); + SkBitmap *bitmap = (SkBitmap *) env->GetIntField(jBitmap, fields.nativeBitmap); bitmap->lockPixels(); - - memcpy((uint8_t*)bitmap->getPixels(), - (uint8_t*)videoFrame + sizeof(VideoFrame), videoFrame->mSize); - + rotate((uint16_t*)bitmap->getPixels(), + (uint16_t*)((char*)videoFrame + sizeof(VideoFrame)), + videoFrame->mDisplayWidth, + videoFrame->mDisplayHeight, + videoFrame->mRotationAngle); bitmap->unlockPixels(); - if (videoFrame->mRotationAngle != 0) { - SkDevice device(*bitmap); - SkCanvas canvas(&device); - canvas.rotate((SkScalar) (videoFrame->mRotationAngle * 1.0)); - canvas.drawBitmap(*bitmap, 0, 0); - } - - LOGV("Return a new bitmap constructed with the rotation matrix"); return jBitmap; } |