Merge "Scale the thumbnail if display dimension is different from the actual buffer size"
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 3d7dbf9..70e73ba 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -37,6 +37,7 @@
jclass bitmapClazz;
jfieldID nativeBitmap;
jmethodID createBitmapMethod;
+ jmethodID createScaledBitmapMethod;
jclass configClazz;
jmethodID createConfigMethod;
};
@@ -219,12 +220,14 @@
SkBitmap::kRGB_565_Config);
size_t width, height;
+ bool swapWidthAndHeight = false;
if (videoFrame->mRotationAngle == 90 || videoFrame->mRotationAngle == 270) {
- width = videoFrame->mDisplayHeight;
- height = videoFrame->mDisplayWidth;
+ width = videoFrame->mHeight;
+ height = videoFrame->mWidth;
+ swapWidthAndHeight = true;
} else {
- width = videoFrame->mDisplayWidth;
- height = videoFrame->mDisplayHeight;
+ width = videoFrame->mWidth;
+ height = videoFrame->mHeight;
}
jobject jBitmap = env->CallStaticObjectMethod(
@@ -240,11 +243,30 @@
bitmap->lockPixels();
rotate((uint16_t*)bitmap->getPixels(),
(uint16_t*)((char*)videoFrame + sizeof(VideoFrame)),
- videoFrame->mDisplayWidth,
- videoFrame->mDisplayHeight,
+ videoFrame->mWidth,
+ videoFrame->mHeight,
videoFrame->mRotationAngle);
bitmap->unlockPixels();
+ if (videoFrame->mDisplayWidth != videoFrame->mWidth ||
+ videoFrame->mDisplayHeight != videoFrame->mHeight) {
+ size_t displayWidth = videoFrame->mDisplayWidth;
+ size_t displayHeight = videoFrame->mDisplayHeight;
+ if (swapWidthAndHeight) {
+ displayWidth = videoFrame->mDisplayHeight;
+ displayHeight = videoFrame->mDisplayWidth;
+ }
+ LOGV("Bitmap dimension is scaled from %dx%d to %dx%d",
+ width, height, displayWidth, displayHeight);
+ jobject scaledBitmap = env->CallStaticObjectMethod(fields.bitmapClazz,
+ fields.createScaledBitmapMethod,
+ jBitmap,
+ displayWidth,
+ displayHeight,
+ true);
+ return scaledBitmap;
+ }
+
return jBitmap;
}
@@ -352,6 +374,15 @@
"Can't find Bitmap.createBitmap(int, int, Config) method");
return;
}
+ fields.createScaledBitmapMethod =
+ env->GetStaticMethodID(fields.bitmapClazz, "createScaledBitmap",
+ "(Landroid/graphics/Bitmap;IIZ)"
+ "Landroid/graphics/Bitmap;");
+ if (fields.createScaledBitmapMethod == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException",
+ "Can't find Bitmap.createScaledBitmap(Bitmap, int, int, boolean) method");
+ return;
+ }
fields.nativeBitmap = env->GetFieldID(fields.bitmapClazz, "mNativeBitmap", "I");
if (fields.nativeBitmap == NULL) {
jniThrowException(env, "java/lang/RuntimeException",
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index c371cd0..6f67ba7 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -231,6 +231,14 @@
frame->mData = new uint8_t[frame->mSize];
frame->mRotationAngle = rotationAngle;
+ int32_t displayWidth, displayHeight;
+ if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) {
+ frame->mDisplayWidth = displayWidth;
+ }
+ if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) {
+ frame->mDisplayHeight = displayHeight;
+ }
+
int32_t srcFormat;
CHECK(meta->findInt32(kKeyColorFormat, &srcFormat));
@@ -465,7 +473,7 @@
}
if (numTracks == 1 && hasAudio && audioBitrate >= 0) {
- sprintf(tmp, "%ld", audioBitrate);
+ sprintf(tmp, "%d", audioBitrate);
mMetaData.add(METADATA_KEY_BITRATE, String8(tmp));
} else {
off64_t sourceSize;