summaryrefslogtreecommitdiffstats
path: root/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
diff options
context:
space:
mode:
authorDenis Kormalev <dkormalev@ics.com>2014-01-08 17:06:59 +0400
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-08 16:09:27 +0100
commit0ebcf43f2235017a6844948ef6d26c74865083aa (patch)
tree6c4cb0761935b81f2206c57dbc9ff6b8880cd5b3 /src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
parenta0d39a2ab6c94cdb59a8009611669304372915e6 (diff)
Android: QVideoProbe support for camera
QMediaVideoProbeControl sublclass added to capture service to make QVideoProbe work with Android camera. [ChangeLog][QtMultimedia][Android] QVideoProbe support for camera Task-number: QTBUG-35416 Change-Id: I14d0a0e8abd14ee8f577e2901b976b8ed46eb320 Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
Diffstat (limited to 'src/plugins/android/src/mediacapture/qandroidcamerasession.cpp')
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index cb5282394..86c5e3120 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -44,11 +44,13 @@
#include "jcamera.h"
#include "jmultimediautils.h"
#include "qandroidvideooutput.h"
+#include "qandroidmediavideoprobecontrol.h"
#include "qandroidmultimediautils.h"
#include <QtConcurrent/qtconcurrentrun.h>
#include <qfile.h>
#include <qguiapplication.h>
#include <qdebug.h>
+#include <qvideoframe.h>
QT_BEGIN_NAMESPACE
@@ -183,6 +185,9 @@ bool QAndroidCameraSession::open()
if (m_camera) {
connect(m_camera, SIGNAL(pictureExposed()), this, SLOT(onCameraPictureExposed()));
connect(m_camera, SIGNAL(previewFetched(QByteArray)), this, SLOT(onCameraPreviewFetched(QByteArray)));
+ connect(m_camera, SIGNAL(frameFetched(QByteArray)),
+ this, SLOT(onCameraFrameFetched(QByteArray)),
+ Qt::DirectConnection);
connect(m_camera, SIGNAL(pictureCaptured(QByteArray)), this, SLOT(onCameraPictureCaptured(QByteArray)));
connect(m_camera, SIGNAL(previewStarted()), this, SLOT(onCameraPreviewStarted()));
connect(m_camera, SIGNAL(previewStopped()), this, SLOT(onCameraPreviewStopped()));
@@ -200,6 +205,8 @@ bool QAndroidCameraSession::open()
if (m_camera->getPreviewFormat() != JCamera::NV21)
m_camera->setPreviewFormat(JCamera::NV21);
+ m_camera->fetchEachFrame(m_videoProbes.count());
+
emit opened();
} else {
m_status = QCamera::UnavailableStatus;
@@ -364,6 +371,25 @@ int QAndroidCameraSession::currentCameraRotation() const
return rotation;
}
+void QAndroidCameraSession::addProbe(QAndroidMediaVideoProbeControl *probe)
+{
+ m_videoProbesMutex.lock();
+ if (probe)
+ m_videoProbes << probe;
+ if (m_camera)
+ m_camera->fetchEachFrame(m_videoProbes.count());
+ m_videoProbesMutex.unlock();
+}
+
+void QAndroidCameraSession::removeProbe(QAndroidMediaVideoProbeControl *probe)
+{
+ m_videoProbesMutex.lock();
+ m_videoProbes.remove(probe);
+ if (m_camera)
+ m_camera->fetchEachFrame(m_videoProbes.count());
+ m_videoProbesMutex.unlock();
+}
+
void QAndroidCameraSession::applyImageSettings()
{
if (!m_camera || !m_imageSettingsDirty)
@@ -513,6 +539,19 @@ void QAndroidCameraSession::onCameraPreviewFetched(const QByteArray &preview)
}
}
+void QAndroidCameraSession::onCameraFrameFetched(const QByteArray &frame)
+{
+ m_videoProbesMutex.lock();
+ if (frame.size() && m_videoProbes.count()) {
+ QVideoFrame videoFrame(new DataVideoBuffer(frame),
+ m_camera->previewSize(),
+ QVideoFrame::Format_NV21);
+ foreach (QAndroidMediaVideoProbeControl *probe, m_videoProbes)
+ probe->newFrameProbed(videoFrame);
+ }
+ m_videoProbesMutex.unlock();
+}
+
void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
{
if (!m_captureCanceled) {
@@ -593,10 +632,15 @@ void QAndroidCameraSession::processCapturedImage(int id,
void QAndroidCameraSession::processPreviewImage(int id, const QByteArray &data, int rotation)
{
+ emit imageCaptured(id, prepareImageFromPreviewData(data, rotation));
+}
+
+QImage QAndroidCameraSession::prepareImageFromPreviewData(const QByteArray &data, int rotation)
+{
QSize frameSize = m_camera->previewSize();
- QImage preview(frameSize, QImage::Format_ARGB32);
+ QImage result(frameSize, QImage::Format_ARGB32);
qt_convert_NV21_to_ARGB32((const uchar *)data.constData(),
- (quint32 *)preview.bits(),
+ (quint32 *)result.bits(),
frameSize.width(),
frameSize.height());
@@ -610,9 +654,9 @@ void QAndroidCameraSession::processPreviewImage(int id, const QByteArray &data,
transform.rotate(rotation);
- preview = preview.transformed(transform);
+ result = result.transformed(transform);
- emit imageCaptured(id, preview);
+ return result;
}
void QAndroidCameraSession::onVideoOutputReady(bool ready)