11#include "private/qmediastoragelocation_p.h"
12#include <private/qplatformimagecapture_p.h>
13#include <private/qmemoryvideobuffer_p.h>
15#include <QtCore/qurl.h>
16#include <QtCore/qfile.h>
17#include <QtCore/qbuffer.h>
18#include <QtConcurrent/qtconcurrentrun.h>
19#include <QtGui/qimagereader.h>
21#import <AVFoundation/AVFoundation.h>
28 m_stillImageOutput = [[AVCaptureStillImageOutput alloc]
init];
30 NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
31 AVVideoCodecTypeJPEG, AVVideoCodecKey, nil];
33 [m_stillImageOutput setOutputSettings:outputSettings];
44 return m_cameraControl && m_videoConnection && m_cameraControl->
isActive();
47void AVFImageCapture::updateReadyStatus()
51 qCDebug(qLcCamera) <<
"ReadyToCapture status changed:" << m_ready;
60 Q_ARG(
int, m_lastCaptureId),
67 Q_ARG(
int, m_lastCaptureId),
77 m_requestsMutex.
lock();
78 m_captureRequests.enqueue(
request);
83 [m_stillImageOutput captureStillImageAsynchronouslyFromConnection:m_videoConnection
84 completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *
error) {
112 qCDebug(qLcCamera) <<
"Image capture completed";
114 NSData *nsJpgData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
129 if (
f.write(jpgData) != -1) {
149 " for a preview frame.");
165 qCDebug(qLcCamera) <<
"Capture image to" << actualFileName;
178 if (m_captureRequests.isEmpty())
181 CaptureRequest
request = m_captureRequests.dequeue();
190void AVFImageCapture::onCameraChanged()
194 if (
camera == m_cameraControl)
200 connect(m_cameraControl,
SIGNAL(activeChanged(
bool)),
this,
SLOT(updateReadyStatus()));
204void AVFImageCapture::makeCapturePreview(CaptureRequest
request,
213 request.previewReady->release();
216void AVFImageCapture::updateCaptureConnection()
222 if (![captureSession.outputs containsObject:m_stillImageOutput]) {
223 if ([captureSession canAddOutput:m_stillImageOutput]) {
224 [captureSession beginConfiguration];
227 [captureSession addOutput:m_stillImageOutput];
228 m_videoConnection = [m_stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
229 [captureSession commitConfiguration];
233 m_videoConnection = [m_stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
243 if (!videoCaptureDeviceIsValid())
247 if (!captureDevice.activeFormat) {
263 if (
res.isNull() || !
res.isValid()) {
285 if (!videoCaptureDeviceIsValid())
309 if (!
res.isValid()) {
317 bool activeFormatChanged =
false;
333 imageOutput.highResolutionStillImageOutputEnabled = YES;
335 imageOutput.highResolutionStillImageOutputEnabled = NO;
338 return activeFormatChanged;
344 if (m_service == captureSession)
347 m_service = captureSession;
353 m_cameraControl =
nullptr;
354 m_videoConnection = nil;
356 m_session = m_service->
session();
360 connect(m_session,
SIGNAL(readyToConfigureConnections()),
SLOT(updateCaptureConnection()));
362 this, &AVFImageCapture::onNewViewfinderFrame);
365 updateCaptureConnection();
370bool AVFImageCapture::videoCaptureDeviceIsValid()
const
376 if (!captureDevice.formats || !captureDevice.formats.count)
382#include "moc_avfimagecapture_p.cpp"
QSize qt_device_format_resolution(AVCaptureDeviceFormat *format)
QSize qt_device_format_high_resolution(AVCaptureDeviceFormat *format)
bool qt_set_active_format(AVCaptureDevice *captureDevice, AVCaptureDeviceFormat *format, bool preserveFps)
AVCaptureDeviceFormat * qt_find_best_resolution_match(AVCaptureDevice *captureDevice, const QSize &request, FourCharCode filter, bool stillImage)
AVFCameraSession * session() const
AVFImageCapture * avfImageCaptureControl() const
QPlatformImageCapture * imageCapture() override
QPlatformCamera * camera() override
AVCaptureSession * captureSession() const
AVCaptureDevice * videoCaptureDevice() const
AVFCameraRenderer * videoOutput() const
void newViewfinderFrame(const QVideoFrame &frame)
FourCharCode defaultCodec()
AVFImageCapture(QImageCapture *parent=nullptr)
int doCapture(const QString &fileName)
AVCaptureStillImageOutput * stillImageOutput() const
void setCaptureSession(QPlatformMediaCaptureSession *session)
int captureToBuffer() override
QImageEncoderSettings imageSettings() const override
int capture(const QString &fileName) override
bool isReadyForCapture() const override
void setImageSettings(const QImageEncoderSettings &settings) override
bool isActive() const override
\inmodule QtCore \reentrant
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
QImageCapture::FileFormat format() const
The QImageReader class provides a format independent interface for reading images from files or other...
QSize size() const
Returns the size of the image, without actually reading the image contents.
The QMemoryVideoBuffer class provides a system memory allocated video data buffer.
void unlock() noexcept
Unlocks the mutex.
void lock() noexcept
Locks the mutex.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
static QSharedPointer create(Args &&...arguments)
This is an overloaded member function, provided for convenience. It differs from the above function o...
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
The QVideoFrame class represents a frame of video data.
auto run(QThreadPool *pool, Function &&f, Args &&...args)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define qCDebug(category,...)
#define Q_ARG(Type, data)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLenum GLenum transform
QLatin1StringView QLatin1String
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
QSettings settings("MySoft", "Star Runner")
[0]
QNetworkRequest request(url)
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent