From 9d619542bea7d4c376a5a8b4a55c795a796adef3 Mon Sep 17 00:00:00 2001 From: Nipun Kwatra Date: Thu, 9 Sep 2010 16:25:08 -0700 Subject: [PATCH] Adding hasProfile. - Added hasProfile to CamcorderProfile and JNI. - Added hasCamcorderProfile to MediaProfiles. - using android.hardware.Camera.CAMERA_ID_DEFAULT for default camera in get(). Change-Id: Ib57bb49ae79492d7cbc0ec6c7b6efcbf74f80013 --- include/media/MediaProfiles.h | 8 ++++++ .../java/android/media/CamcorderProfile.java | 25 ++++++++++++++++++- media/jni/android_media_MediaProfiles.cpp | 16 ++++++++++++ media/libmedia/MediaProfiles.cpp | 23 ++++++++++++----- 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/include/media/MediaProfiles.h b/include/media/MediaProfiles.h index df64ce8a7b282..183bb1e592041 100644 --- a/include/media/MediaProfiles.h +++ b/include/media/MediaProfiles.h @@ -78,6 +78,12 @@ public: int getCamcorderProfileParamByName(const char *name, int cameraId, camcorder_quality quality) const; + /** + * Returns true if a profile for the given camera at the given quality exists, + * or false if not. + */ + bool hasCamcorderProfile(int cameraId, camcorder_quality quality) const; + /** * Returns the output file formats supported. */ @@ -263,6 +269,8 @@ private: Vector mLevels; }; + int getCamcorderProfileIndex(int cameraId, camcorder_quality quality) const; + // Debug static void logVideoCodec(const VideoCodec& codec); static void logAudioCodec(const AudioCodec& codec); diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java index 4a591665a86c1..e9ad8ee753789 100644 --- a/media/java/android/media/CamcorderProfile.java +++ b/media/java/android/media/CamcorderProfile.java @@ -173,7 +173,7 @@ public class CamcorderProfile * @see #get(int, int) */ public static CamcorderProfile get(int quality) { - return get(0, quality); + return get(android.hardware.Camera.CAMERA_ID_DEFAULT, quality); } /** @@ -205,6 +205,27 @@ public class CamcorderProfile return native_get_camcorder_profile(cameraId, quality); } + /** + * Returns true if camcorder profile exists for the default camera at + * the given quality level. + * @param quality the target quality level for the camcorder profile + * @hide + */ + public static boolean hasProfile(int quality) { + return hasProfile(android.hardware.Camera.CAMERA_ID_DEFAULT, quality); + } + + /** + * Returns true if camcorder profile exists for the given camera at + * the given quality level. + * @param cameraId the id for the camera + * @param quality the target quality level for the camcorder profile + * @hide + */ + public static boolean hasProfile(int cameraId, int quality) { + return native_has_camcorder_profile(cameraId, quality); + } + static { System.loadLibrary("media_jni"); native_init(); @@ -242,4 +263,6 @@ public class CamcorderProfile private static native final void native_init(); private static native final CamcorderProfile native_get_camcorder_profile( int cameraId, int quality); + private static native final boolean native_has_camcorder_profile( + int cameraId, int quality); } diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp index 5aae853c09496..08a6de119bd75 100644 --- a/media/jni/android_media_MediaProfiles.cpp +++ b/media/jni/android_media_MediaProfiles.cpp @@ -212,6 +212,20 @@ android_media_MediaProfiles_native_get_camcorder_profile(JNIEnv *env, jobject th audioChannels); } +static jboolean +android_media_MediaProfiles_native_has_camcorder_profile(JNIEnv *env, jobject thiz, jint id, jint quality) +{ + LOGV("native_has_camcorder_profile: %d %d", id, quality); + if (!((quality >= CAMCORDER_QUALITY_LOW && quality <= CAMCORDER_QUALITY_1080P) || + (quality >= CAMCORDER_QUALITY_TIME_LAPSE_LOW && + quality <= CAMCORDER_QUALITY_TIME_LAPSE_1080P))) { + return false; + } + + camcorder_quality q = static_cast(quality); + return sProfiles->hasCamcorderProfile(id, q); +} + static jint android_media_MediaProfiles_native_get_num_video_decoders(JNIEnv *env, jobject thiz) { @@ -291,6 +305,8 @@ static JNINativeMethod gMethodsForCamcorderProfileClass[] = { {"native_init", "()V", (void *)android_media_MediaProfiles_native_init}, {"native_get_camcorder_profile", "(II)Landroid/media/CamcorderProfile;", (void *)android_media_MediaProfiles_native_get_camcorder_profile}, + {"native_has_camcorder_profile", "(II)Z", + (void *)android_media_MediaProfiles_native_has_camcorder_profile}, }; static JNINativeMethod gMethodsForDecoderCapabilitiesClass[] = { diff --git a/media/libmedia/MediaProfiles.cpp b/media/libmedia/MediaProfiles.cpp index 37a33ed2184e5..81647e088aebd 100644 --- a/media/libmedia/MediaProfiles.cpp +++ b/media/libmedia/MediaProfiles.cpp @@ -715,13 +715,8 @@ Vector MediaProfiles::getAudioDecoders() const return decoders; // copy out } -int MediaProfiles::getCamcorderProfileParamByName(const char *name, - int cameraId, - camcorder_quality quality) const +int MediaProfiles::getCamcorderProfileIndex(int cameraId, camcorder_quality quality) const { - LOGV("getCamcorderProfileParamByName: %s for camera %d, quality %d", - name, cameraId, quality); - int index = -1; for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { if (mCamcorderProfiles[i]->mCameraId == cameraId && @@ -730,6 +725,17 @@ int MediaProfiles::getCamcorderProfileParamByName(const char *name, break; } } + return index; +} + +int MediaProfiles::getCamcorderProfileParamByName(const char *name, + int cameraId, + camcorder_quality quality) const +{ + LOGV("getCamcorderProfileParamByName: %s for camera %d, quality %d", + name, cameraId, quality); + + int index = getCamcorderProfileIndex(cameraId, quality); if (index == -1) { LOGE("The given camcorder profile camera %d quality %d is not found", cameraId, quality); @@ -752,6 +758,11 @@ int MediaProfiles::getCamcorderProfileParamByName(const char *name, return -1; } +bool MediaProfiles::hasCamcorderProfile(int cameraId, camcorder_quality quality) const +{ + return (getCamcorderProfileIndex(cameraId, quality) != -1); +} + Vector MediaProfiles::getImageEncodingQualityLevels(int cameraId) const { Vector result;