14#include <CoreFoundation/CoreFoundation.h>
15#include <Foundation/Foundation.h>
17#include <QtCore/qcoreapplication.h>
18#include <QtCore/qdatetime.h>
19#include <QtCore/qurl.h>
20#include <QtCore/qelapsedtimer.h>
21#include <QtCore/qpermissions.h>
22#include <QtCore/qpointer.h>
24#include <private/qplatformaudioinput_p.h>
25#include <private/qplatformaudiooutput_p.h>
27#include <QtCore/qdebug.h>
34- (
void) processRuntimeError:(NSNotification *)notification;
35- (
void) processSessionStarted:(NSNotification *)notification;
36- (
void) processSessionStopped:(NSNotification *)notification;
49 if (!(self = [super
init]))
52 self->m_session = session;
55 [m_captureSession retain];
56 [[NSNotificationCenter defaultCenter] addObserver:self
57 selector:@selector(processRuntimeError:)
58 name:AVCaptureSessionRuntimeErrorNotification
59 object:m_captureSession];
61 [[NSNotificationCenter defaultCenter] addObserver:self
62 selector:@selector(processSessionStarted:)
63 name:AVCaptureSessionDidStartRunningNotification
64 object:m_captureSession];
66 [[NSNotificationCenter defaultCenter] addObserver:self
67 selector:@selector(processSessionStopped:)
68 name:AVCaptureSessionDidStopRunningNotification
69 object:m_captureSession];
76 [[NSNotificationCenter defaultCenter] removeObserver:self
77 name:AVCaptureSessionRuntimeErrorNotification
78 object:m_captureSession];
80 [[NSNotificationCenter defaultCenter] removeObserver:self
81 name:AVCaptureSessionDidStartRunningNotification
82 object:m_captureSession];
84 [[NSNotificationCenter defaultCenter] removeObserver:self
85 name:AVCaptureSessionDidStopRunningNotification
86 object:m_captureSession];
87 [m_captureSession release];
91- (
void) processRuntimeError:(NSNotification *)notification
97- (
void) processSessionStarted:(NSNotification *)notification
103- (
void) processSessionStopped:(NSNotification *)notification
123 [m_captureSession removeInput:m_videoInput];
124 [m_videoInput release];
128 [m_captureSession removeInput:m_audioInput];
129 [m_audioInput release];
133 [m_captureSession removeOutput:m_audioOutput];
134 [m_audioOutput release];
138 delete m_videoOutput;
141 [m_captureSession release];
146 if (m_activeCameraDevice !=
info) {
147 m_activeCameraDevice =
info;
149 if (checkCameraPermission())
156 if (m_cameraFormat ==
format)
159 updateCameraFormat(
format);
164 return m_cameraFormat;
182 if (m_videoOutput ==
output)
185 delete m_videoOutput;
188 output->configureAVCaptureSession(
this);
191void AVFCameraSession::addAudioCapture()
193 if (!m_audioOutput) {
194 m_audioOutput = [[AVCaptureAudioDataOutput alloc] init];
196 [m_captureSession addOutput:m_audioOutput];
206 return m_videoInput.device;
214 return m_audioInput.device;
221 m_inputVolume = volume;
227 AVCaptureConnection *audioInputConnection = [m_audioOutput connectionWithMediaType:AVMediaTypeAudio];
228 NSArray<AVCaptureAudioChannel *> *audioChannels = audioInputConnection.audioChannels;
230 for (AVCaptureAudioChannel *
channel in audioChannels) {
239 m_inputMuted = muted;
245 if (m_audioPreviewDelegate)
251 if (m_audioPreviewDelegate)
270 if (!m_activeCameraDevice.
isNull()) {
276 applyImageEncoderSettings();
282 [m_captureSession startRunning];
285 [m_captureSession stopRunning];
314AVCaptureDevice *AVFCameraSession::createVideoCaptureDevice()
316 AVCaptureDevice *
device =
nullptr;
320 device = [AVCaptureDevice deviceWithUniqueID:
321 [NSString stringWithUTF8String:
322 deviceId.constData()]];
328AVCaptureDevice *AVFCameraSession::createAudioCaptureDevice()
330 AVCaptureDevice *
device =
nullptr;
335 device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:deviceId.constData()]];
340void AVFCameraSession::attachVideoInputDevice()
342 if (!checkCameraPermission())
346 [m_captureSession removeInput:m_videoInput];
347 [m_videoInput release];
348 m_videoInput =
nullptr;
351 AVCaptureDevice *videoDevice = createVideoCaptureDevice();
355 m_videoInput = [AVCaptureDeviceInput
356 deviceInputWithDevice:videoDevice
359 [m_videoInput retain];
360 [m_captureSession addInput:m_videoInput];
362 qWarning() <<
"Failed to create video device input";
366void AVFCameraSession::attachAudioInputDevice()
369 [m_captureSession removeInput:m_audioInput];
370 [m_audioInput release];
371 m_audioInput =
nullptr;
374 AVCaptureDevice *audioDevice = createAudioCaptureDevice();
378 m_audioInput = [AVCaptureDeviceInput
379 deviceInputWithDevice:audioDevice
383 [m_audioInput retain];
384 [m_captureSession addInput:m_audioInput];
386 qWarning() <<
"Failed to create audio device input";
390bool AVFCameraSession::applyImageEncoderSettings()
393 return control->applySettings();
400 if (!m_defaultCodec) {
404 return m_defaultCodec;
405 m_defaultCodec = CMVideoFormatDescriptionGetCodecType(
format.formatDescription);
408 return m_defaultCodec;
415 if (m_videoSink == videoSink)
418 m_videoSink = videoSink;
429 [m_captureSession beginConfiguration];
431 attachVideoInputDevice();
432 if (!m_activeCameraDevice.
isNull() && !m_videoOutput) {
441 [m_captureSession commitConfiguration];
450 if (!checkMicrophonePermission())
457 [m_captureSession beginConfiguration];
459 AVCaptureConnection *lastConnection = [m_audioOutput connectionWithMediaType:AVMediaTypeAudio];
460 [m_captureSession removeConnection:lastConnection];
462 attachAudioInputDevice();
465 [m_captureSession commitConfiguration];
478 m_audioPreviewDelegate = nil;
483 deviceId.constData()]];
487void AVFCameraSession::updateVideoOutput()
493bool AVFCameraSession::checkCameraPermission()
498 qWarning() <<
"Access to camera not granted";
503bool AVFCameraSession::checkMicrophonePermission()
508 qWarning() <<
"Access to microphone not granted";
513#include "moc_avfcamerasession_p.cpp"
AVFCameraSession * m_session
AVCaptureSession * m_captureSession
bool qt_set_active_format(AVCaptureDevice *captureDevice, AVCaptureDeviceFormat *format, bool preserveFps)
AVCaptureDeviceFormat * qt_convert_to_capture_device_format(AVCaptureDevice *captureDevice, const QCameraFormat &cameraFormat, const std::function< bool(uint32_t)> &cvFormatValidator)
IOBluetoothL2CAPChannel * channel
IOBluetoothDevice * device
void setVolume:(float volume)
void setMuted:(bool muted)
void setupWithCaptureSession:audioOutputDevice:(AVFCameraSession *session,[audioOutputDevice] NSString *deviceId)
void newViewfinderFrame(const QVideoFrame &frame)
void deviceOrientationChanged(int angle=-1)
AVFMediaEncoder * recorderControl() const
QPlatformAudioOutput * audioOutput()
AVFImageCapture * avfImageCaptureControl() const
QPlatformAudioInput * audioInput()
void error(int error, const QString &errorString)
void processSessionStopped()
void setActive(bool active)
AVCaptureSession * captureSession() const
void setCameraFormat(const QCameraFormat &format)
AVCaptureDevice * videoCaptureDevice() const
void setAudioOutputMuted(bool muted)
QCameraFormat cameraFormat() const
void readyToConfigureConnections()
void setActiveCamera(const QCameraDevice &info)
void setAudioInputVolume(float volume)
AVFCameraSession(AVFCameraService *service, QObject *parent=nullptr)
AVCaptureDevice * audioCaptureDevice() const
void newViewfinderFrame(const QVideoFrame &frame)
void setVideoSink(QVideoSink *sink)
FourCharCode defaultCodec()
void processSessionStarted()
void setAudioOutputVolume(float volume)
void processRuntimeError()
void setAudioInputMuted(bool muted)
void setVideoSink(AVFVideoSink *sink)
QByteArray id
\qmlproperty string QtMultimedia::audioDevice::id
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
The QCameraDevice class provides general information about camera devices.
bool isNull() const
Returns true if this QCameraDevice is null or invalid.
QByteArray id
\qmlproperty string QtMultimedia::cameraDevice::id
Access the camera for taking pictures or videos.
Access the microphone for monitoring or recording sound.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
The QVideoSink class represents a generic sink for video data.
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,...)
GLint GLsizei GLsizei GLenum format
GLsizei GLenum GLboolean sink
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
QT_BEGIN_NAMESPACE typedef uchar * output
QFileInfo info(fileName)
[8]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent