summaryrefslogtreecommitdiffstats
path: root/media/jni/android_media_MediaMetadataRetriever.cpp
diff options
context:
space:
mode:
authorCarl Shapiro <cshapiro@google.com>2011-01-20 23:13:09 -0800
committerCarl Shapiro <cshapiro@google.com>2011-01-21 14:45:14 -0800
commitae12a50a35c0d8425430d0e934c022ecb9cd4936 (patch)
tree0528dd701200c3d779f205bd7407a9ae31923bff /media/jni/android_media_MediaMetadataRetriever.cpp
parent63d64a14790ae21db31b60747864b4a7565b33c3 (diff)
downloadframeworks_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.cpp89
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;
}