private:
static void updateCameraDevices();
- void attachInputDevices();
+ void attachVideoInputDevice();
+ void applyImageEncoderSettings();
+ void applyViewfinderSettings();
static int m_defaultCameraIndex;
static QList<AVFCameraInfo> m_cameraDevices;
AVCaptureSession *m_captureSession;
AVCaptureDeviceInput *m_videoInput;
- AVCaptureDeviceInput *m_audioInput;
AVFCameraSessionObserver *m_observer;
+
+ QSet<AVFMediaVideoProbeControl *> m_videoProbes;
+ QMutex m_videoProbesMutex;
+
+ FourCharCode m_defaultCodec;
};
QT_END_NAMESPACE
, m_state(QCamera::UnloadedState)
, m_active(false)
, m_videoInput(nil)
- , m_audioInput(nil)
+ , m_defaultCodec(0)
{
m_captureSession = [[AVCaptureSession alloc] init];
m_observer = [[AVFCameraSessionObserver alloc] initWithCameraSession:this];
}
}
}
-
- //Attach audio input device:
- if (m_service->audioInputSelectorControl()->isDirty()) {
- if (m_audioInput) {
- [m_captureSession removeInput:m_audioInput];
- [m_audioInput release];
- m_audioInput = 0;
- }
-
- AVCaptureDevice *audioDevice = m_service->audioInputSelectorControl()->createCaptureDevice();
-
- NSError *error = nil;
- m_audioInput = [AVCaptureDeviceInput
- deviceInputWithDevice:audioDevice
- error:&error];
-
- if (!m_audioInput) {
- qWarning() << "Failed to create audio device input";
- } else {
- [m_audioInput retain];
- [m_captureSession addInput:m_audioInput];
- }
- }
}
+void AVFCameraSession::applyImageEncoderSettings()
+{
+ if (AVFImageEncoderControl *control = m_service->imageEncoderControl())
+ control->applySettings();
+}
+
+void AVFCameraSession::applyViewfinderSettings()
+{
+ if (AVFCameraViewfinderSettingsControl2 *vfControl = m_service->viewfinderSettingsControl2()) {
+ QCameraViewfinderSettings vfSettings(vfControl->requestedSettings());
+ if (AVFImageEncoderControl *imControl = m_service->imageEncoderControl()) {
+ const QSize imageResolution(imControl->imageSettings().resolution());
+ if (!imageResolution.isNull() && imageResolution.isValid()) {
+ vfSettings.setResolution(imageResolution);
+ vfControl->setViewfinderSettings(vfSettings);
+ return;
+ }
+ }
+
+ if (!vfSettings.isNull())
+ vfControl->applySettings();
+ }
+}
+
+void AVFCameraSession::addProbe(AVFMediaVideoProbeControl *probe)
+{
+ m_videoProbesMutex.lock();
+ if (probe)
+ m_videoProbes << probe;
+ m_videoProbesMutex.unlock();
+}
+
+void AVFCameraSession::removeProbe(AVFMediaVideoProbeControl *probe)
+{
+ m_videoProbesMutex.lock();
+ m_videoProbes.remove(probe);
+ m_videoProbesMutex.unlock();
+}
+
+FourCharCode AVFCameraSession::defaultCodec()
+{
+ if (!m_defaultCodec) {
+#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_7_0)
+ if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_7, QSysInfo::MV_IOS_7_0)) {
+ if (AVCaptureDevice *device = videoCaptureDevice()) {
+ AVCaptureDeviceFormat *format = device.activeFormat;
+ if (!format || !format.formatDescription)
+ return m_defaultCodec;
+ m_defaultCodec = CMVideoFormatDescriptionGetCodecType(format.formatDescription);
+ }
+ }
+#else
+ // TODO: extract media subtype.
+#endif
+ }
+ return m_defaultCodec;
+}
+
+void AVFCameraSession::onCameraFrameFetched(const QVideoFrame &frame)
+{
+ m_videoProbesMutex.lock();
+ QSet<AVFMediaVideoProbeControl *>::const_iterator i = m_videoProbes.constBegin();
+ while (i != m_videoProbes.constEnd()) {
+ (*i)->newFrameProbed(frame);
+ ++i;
+ }
+ m_videoProbesMutex.unlock();
+}
+
#include "moc_avfcamerasession.cpp"