diff options
author | Denis Kormalev <dkormalev@ics.com> | 2014-01-08 17:06:59 +0400 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-08 16:09:27 +0100 |
commit | 0ebcf43f2235017a6844948ef6d26c74865083aa (patch) | |
tree | 6c4cb0761935b81f2206c57dbc9ff6b8880cd5b3 /src/plugins/android/src/mediacapture/qandroidcamerasession.cpp | |
parent | a0d39a2ab6c94cdb59a8009611669304372915e6 (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.cpp | 52 |
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) |