summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/CamcorderProfile.java18
-rw-r--r--media/java/android/media/CameraProfile.java16
-rw-r--r--media/java/android/media/MediaRecorder.java2
-rw-r--r--media/jni/android_media_MediaMetadataRetriever.cpp59
-rw-r--r--media/libmediaplayerservice/MetadataRetrieverClient.cpp2
-rw-r--r--media/libstagefright/StagefrightMetadataRetriever.cpp6
6 files changed, 96 insertions, 7 deletions
diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java
index a27df57..4004c76 100644
--- a/media/java/android/media/CamcorderProfile.java
+++ b/media/java/android/media/CamcorderProfile.java
@@ -16,6 +16,9 @@
package android.media;
+import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
+
/**
* The CamcorderProfile class is used to retrieve the
* predefined camcorder profile settings for camcorder applications.
@@ -119,12 +122,21 @@ public class CamcorderProfile
public int audioChannels;
/**
- * Returns the camcorder profile for the default camera at the given
- * quality level.
+ * Returns the camcorder profile for the first back-facing camera on the
+ * device at the given quality level. If the device has no back-facing
+ * camera, this returns null.
* @param quality the target quality level for the camcorder profile
*/
public static CamcorderProfile get(int quality) {
- return get(0, quality);
+ int numberOfCameras = Camera.getNumberOfCameras();
+ CameraInfo cameraInfo = new CameraInfo();
+ for (int i = 0; i < numberOfCameras; i++) {
+ Camera.getCameraInfo(i, cameraInfo);
+ if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
+ return get(i, quality);
+ }
+ }
+ return null;
}
/**
diff --git a/media/java/android/media/CameraProfile.java b/media/java/android/media/CameraProfile.java
index 6a0be08..905e2d2 100644
--- a/media/java/android/media/CameraProfile.java
+++ b/media/java/android/media/CameraProfile.java
@@ -16,6 +16,9 @@
package android.media;
+import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
+
import java.util.Arrays;
import java.util.HashMap;
@@ -46,12 +49,21 @@ public class CameraProfile
/**
* Returns a pre-defined still image capture (jpeg) quality level
* used for the given quality level in the Camera application for
- * the default camera.
+ * the first back-facing camera on the device. If the device has no
+ * back-facing camera, this returns 0.
*
* @param quality The target quality level
*/
public static int getJpegEncodingQualityParameter(int quality) {
- return getJpegEncodingQualityParameter(0, quality);
+ int numberOfCameras = Camera.getNumberOfCameras();
+ CameraInfo cameraInfo = new CameraInfo();
+ for (int i = 0; i < numberOfCameras; i++) {
+ Camera.getCameraInfo(i, cameraInfo);
+ if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
+ return getJpegEncodingQualityParameter(i, quality);
+ }
+ }
+ return 0;
}
/**
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index c102de4..ecabae8 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -286,7 +286,7 @@ public class MediaRecorder
/**
* Sets the orientation hint for output video playback.
- * This method should be called before start(). This method will not
+ * This method should be called before prepare(). This method will not
* trigger the source video frame to rotate during video recording, but to
* add a composition matrix containing the rotation angle in the output
* video if the output format is OutputFormat.THREE_GPP or
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index efea802..63e9dc8 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -36,6 +36,7 @@ struct fields_t {
jfieldID context;
jclass bitmapClazz;
jmethodID bitmapConstructor;
+ jmethodID createBitmapMethod;
};
static fields_t fields;
@@ -174,6 +175,41 @@ static jobject android_media_MediaMetadataRetriever_captureFrame(JNIEnv *env, jo
return NULL;
}
+ jobject matrix = NULL;
+ if (videoFrame->mRotationAngle != 0) {
+ LOGD("Create a rotation matrix: %d degrees", videoFrame->mRotationAngle);
+ jclass matrixClazz = env->FindClass("android/graphics/Matrix");
+ if (matrixClazz == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException",
+ "Can't find android/graphics/Matrix");
+ return NULL;
+ }
+ jmethodID matrixConstructor =
+ env->GetMethodID(matrixClazz, "<init>", "()V");
+ if (matrixConstructor == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException",
+ "Can't find Matrix constructor");
+ return NULL;
+ }
+ matrix =
+ env->NewObject(matrixClazz, matrixConstructor);
+ if (matrix == NULL) {
+ LOGE("Could not create a Matrix object");
+ return NULL;
+ }
+
+ LOGV("Rotate the matrix: %d degrees", videoFrame->mRotationAngle);
+ jmethodID setRotateMethod =
+ env->GetMethodID(matrixClazz, "setRotate", "(F)V");
+ if (setRotateMethod == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException",
+ "Can't find Matrix setRotate method");
+ return NULL;
+ }
+ env->CallVoidMethod(matrix, setRotateMethod, 1.0 * videoFrame->mRotationAngle);
+ env->DeleteLocalRef(matrixClazz);
+ }
+
// Create a SkBitmap to hold the pixels
SkBitmap *bitmap = new SkBitmap();
if (bitmap == NULL) {
@@ -191,7 +227,19 @@ static jobject android_media_MediaMetadataRetriever_captureFrame(JNIEnv *env, jo
// Since internally SkBitmap uses reference count to manage the reference to
// its pixels, it is important that the pixels (along with SkBitmap) be
// available after creating the Bitmap is returned to Java app.
- return env->NewObject(fields.bitmapClazz, fields.bitmapConstructor, (int) bitmap, true, NULL, -1);
+ jobject jSrcBitmap = env->NewObject(fields.bitmapClazz,
+ fields.bitmapConstructor, (int) bitmap, true, NULL, -1);
+
+ LOGV("Return a new bitmap constructed with the rotation matrix");
+ return env->CallStaticObjectMethod(
+ fields.bitmapClazz, fields.createBitmapMethod,
+ jSrcBitmap, // source Bitmap
+ 0, // x
+ 0, // y
+ videoFrame->mDisplayWidth, // width
+ videoFrame->mDisplayHeight, // height
+ matrix, // transform matrix
+ false); // filter
}
static jbyteArray android_media_MediaMetadataRetriever_extractAlbumArt(JNIEnv *env, jobject thiz)
@@ -291,6 +339,15 @@ static void android_media_MediaMetadataRetriever_native_init(JNIEnv *env)
jniThrowException(env, "java/lang/RuntimeException", "Can't find Bitmap constructor");
return;
}
+ fields.createBitmapMethod =
+ env->GetStaticMethodID(fields.bitmapClazz, "createBitmap",
+ "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)"
+ "Landroid/graphics/Bitmap;");
+ if (fields.createBitmapMethod == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException",
+ "Can't find Bitmap.createBitmap method");
+ return;
+ }
}
static void android_media_MediaMetadataRetriever_native_setup(JNIEnv *env, jobject thiz)
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
index ca229fa..39fce81 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
@@ -253,6 +253,8 @@ sp<IMemory> MetadataRetrieverClient::captureFrame()
frameCopy->mDisplayWidth = frame->mDisplayWidth;
frameCopy->mDisplayHeight = frame->mDisplayHeight;
frameCopy->mSize = frame->mSize;
+ frameCopy->mRotationAngle = frame->mRotationAngle;
+ LOGV("rotation: %d", frameCopy->mRotationAngle);
frameCopy->mData = (uint8_t *)frameCopy + sizeof(VideoFrame);
memcpy(frameCopy->mData, frame->mData, frame->mSize);
delete frame; // Fix memory leakage
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index a800a93..9b2dec9 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -191,6 +191,11 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
CHECK(meta->findInt32(kKeyWidth, &width));
CHECK(meta->findInt32(kKeyHeight, &height));
+ int32_t rotationAngle;
+ if (!trackMeta->findInt32(kKeyRotation, &rotationAngle)) {
+ rotationAngle = 0; // By default, no rotation
+ }
+
VideoFrame *frame = new VideoFrame;
frame->mWidth = width;
frame->mHeight = height;
@@ -198,6 +203,7 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
frame->mDisplayHeight = height;
frame->mSize = width * height * 2;
frame->mData = new uint8_t[frame->mSize];
+ frame->mRotationAngle = rotationAngle;
int32_t srcFormat;
CHECK(meta->findInt32(kKeyColorFormat, &srcFormat));