diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2013-09-27 18:20:15 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-01 17:26:31 +0200 |
commit | 28df116570a1359585a314df17223a7b0e6b04c0 (patch) | |
tree | b59c62b7ef35d6a7219210cda0e94871b75a04da /src/plugins/android/src/wrappers | |
parent | be7a6241e77f67e4a19c63ac5683dd7fa566e9d2 (diff) | |
download | qtmultimedia-28df116570a1359585a314df17223a7b0e6b04c0.tar.gz |
Android: fixed image capture preview.
We used to generate the capture preview from the video output, grabbing
the pixels of the last frame (in a FBO). This is not possible anymore,
we instead query the camera for a preview frame, which is in the NV21
format and needs to be converted to RGB.
Change-Id: I1c728b3a708a6f052a83aebf9f15f511eab7a02f
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Diffstat (limited to 'src/plugins/android/src/wrappers')
-rw-r--r-- | src/plugins/android/src/wrappers/jcamera.cpp | 37 | ||||
-rw-r--r-- | src/plugins/android/src/wrappers/jcamera.h | 17 |
2 files changed, 53 insertions, 1 deletions
diff --git a/src/plugins/android/src/wrappers/jcamera.cpp b/src/plugins/android/src/wrappers/jcamera.cpp index f53fa4936..f858f4702 100644 --- a/src/plugins/android/src/wrappers/jcamera.cpp +++ b/src/plugins/android/src/wrappers/jcamera.cpp @@ -102,6 +102,18 @@ static void notifyPictureCaptured(JNIEnv *env, jobject, int id, jbyteArray data) } } +static void notifyPreviewFrame(JNIEnv *env, jobject, int id, jbyteArray data) +{ + JCamera *obj = g_objectMap.value(id, 0); + if (obj) { + QByteArray bytes; + int arrayLength = env->GetArrayLength(data); + bytes.resize(arrayLength); + env->GetByteArrayRegion(data, 0, arrayLength, (jbyte*)bytes.data()); + Q_EMIT obj->previewFrameAvailable(bytes); + } +} + JCamera::JCamera(int cameraId, jobject cam) : QObject() , QJNIObjectPrivate(cam) @@ -225,6 +237,23 @@ QList<QSize> JCamera::getSupportedPreviewSizes() return list; } +JCamera::ImageFormat JCamera::getPreviewFormat() +{ + if (!m_parameters.isValid()) + return Unknown; + + return JCamera::ImageFormat(m_parameters.callMethod<jint>("getPreviewFormat")); +} + +void JCamera::setPreviewFormat(ImageFormat fmt) +{ + if (!m_parameters.isValid()) + return; + + m_parameters.callMethod<void>("setPreviewFormat", "(I)V", jint(fmt)); + applyParameters(); +} + void JCamera::setPreviewSize(const QSize &size) { if (!m_parameters.isValid()) @@ -624,6 +653,11 @@ void JCamera::setJpegQuality(int quality) applyParameters(); } +void JCamera::requestPreviewFrame() +{ + callMethod<void>("requestPreviewFrame"); +} + void JCamera::takePicture() { callMethod<void>("takePicture"); @@ -672,7 +706,8 @@ QStringList JCamera::callStringListMethod(const char *methodName) static JNINativeMethod methods[] = { {"notifyAutoFocusComplete", "(IZ)V", (void *)notifyAutoFocusComplete}, {"notifyPictureExposed", "(I)V", (void *)notifyPictureExposed}, - {"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured} + {"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured}, + {"notifyPreviewFrame", "(I[B)V", (void *)notifyPreviewFrame} }; bool JCamera::initJNI(JNIEnv *env) diff --git a/src/plugins/android/src/wrappers/jcamera.h b/src/plugins/android/src/wrappers/jcamera.h index 0aea81f38..464ca3cb2 100644 --- a/src/plugins/android/src/wrappers/jcamera.h +++ b/src/plugins/android/src/wrappers/jcamera.h @@ -58,6 +58,16 @@ public: CameraFacingFront = 1 }; + enum ImageFormat { // same values as in android.graphics.ImageFormat Java class + Unknown = 0, + RGB565 = 4, + NV16 = 16, + NV21 = 17, + YUY2 = 20, + JPEG = 256, + YV12 = 842094169 + }; + ~JCamera(); static JCamera *open(int cameraId); @@ -75,6 +85,9 @@ public: QSize getPreferredPreviewSizeForVideo(); QList<QSize> getSupportedPreviewSizes(); + ImageFormat getPreviewFormat(); + void setPreviewFormat(ImageFormat fmt); + QSize previewSize() const { return m_previewSize; } void setPreviewSize(const QSize &size); void setPreviewTexture(jobject surfaceTexture); @@ -131,6 +144,8 @@ public: void startPreview(); void stopPreview(); + void requestPreviewFrame(); + void takePicture(); static bool initJNI(JNIEnv *env); @@ -143,6 +158,8 @@ Q_SIGNALS: void whiteBalanceChanged(); + void previewFrameAvailable(const QByteArray &data); + void pictureExposed(); void pictureCaptured(const QByteArray &data); |