4#include "private/qabstractvideobuffer_p.h"
5#include "private/qcameradevice_p.h"
18#import <AVFoundation/AVFoundation.h>
21#include <QtGui/qopengl.h>
24#include <private/qabstractvideobuffer_p.h>
26#include <QtMultimedia/qvideoframeformat.h>
34- (
void) captureOutput:(AVCaptureOutput *)captureOutput
35 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
36 fromConnection:(AVCaptureConnection *)connection;
48 if (!(self = [super
init]))
55- (
void)captureOutput:(AVCaptureOutput *)captureOutput
56 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
57 fromConnection:(AVCaptureConnection *)connection
65 CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
74 m_renderer->syncHandleViewfinderFrame(
frame);
91 [m_videoDataOutput release];
94 dispatch_release(m_delegateQueue);
97 CFRelease(m_textureCache);
114 if (!m_videoDataOutput)
117 if (m_cameraSession) {
136 m_cameraSession = cameraSession;
137 connect(m_cameraSession,
SIGNAL(readyToConfigureConnections()),
138 this,
SLOT(updateCaptureConnection()));
140 m_needsHorizontalMirroring =
false;
142 m_videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
145 m_delegateQueue = dispatch_queue_create(
"vf_queue",
nullptr);
147 setSampleBufferDelegate:m_viewfinderFramesDelegate
148 queue:m_delegateQueue];
153void AVFCameraRenderer::updateCaptureConnection()
155 AVCaptureConnection *
connection = [m_videoDataOutput connectionWithMediaType:AVMediaTypeVideo];
165 m_needsHorizontalMirroring = !
connection.isVideoMirrored
173 AVCaptureConnection *
connection = [m_videoDataOutput connectionWithMediaType:AVMediaTypeVideo];
183 AVCaptureVideoOrientation orientation = AVCaptureVideoOrientationPortrait;
188 orientation = AVCaptureVideoOrientationLandscapeRight;
194 orientation = AVCaptureVideoOrientationLandscapeLeft;
208 if (!m_lastViewfinderFrame.
isValid()) {
210 metaObject()->indexOfMethod(
"handleViewfinderFrame()"));
215 m_lastViewfinderFrame =
frame;
220 return m_videoDataOutput;
225 return m_viewfinderFramesDelegate;
230 [m_videoDataOutput setSampleBufferDelegate:m_viewfinderFramesDelegate queue:m_delegateQueue];
233void AVFCameraRenderer::handleViewfinderFrame()
238 frame = m_lastViewfinderFrame;
245 if (m_needsHorizontalMirroring)
257 qWarning() <<
"OpenGL rhi backend only supports 32BGRA pixel format.";
266 cvPixelFormat = kCVPixelFormatType_32BGRA;
267 qWarning() <<
"QCamera::setCameraFormat: couldn't convert requested pixel format, using ARGB32";
270 bool isSupported =
false;
271 NSArray *supportedPixelFormats = m_videoDataOutput.availableVideoCVPixelFormatTypes;
272 for (NSNumber *currentPixelFormat
in supportedPixelFormats)
274 if ([currentPixelFormat unsignedIntValue] == cvPixelFormat) {
281 NSDictionary *outputSettings = @{
283 kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:cvPixelFormat]
286 (NSString *)kCVPixelBufferMetalCompatibilityKey : @
true
290 [m_outputSettings release];
291 m_outputSettings = [[NSDictionary alloc] initWithDictionary:outputSettings];
293 qWarning() <<
"QCamera::setCameraFormat: requested pixel format not supported. Did you use a camera format from another camera?";
297#include "moc_avfcamerarenderer_p.cpp"
void reconfigure() override
void syncHandleViewfinderFrame(const QVideoFrame &frame)
AVFCameraRenderer(QObject *parent=nullptr)
void newViewfinderFrame(const QVideoFrame &frame)
AVCaptureVideoDataOutput * videoDataOutput() const
void setOutputSettings() override
AVFCaptureFramesDelegate * captureDelegate() const
void configureAVCaptureSession(AVFCameraSession *cameraSession)
void setPixelFormat(QVideoFrameFormat::PixelFormat pixelFormat, QVideoFrameFormat::ColorRange colorRange)
void deviceOrientationChanged(int angle=-1)
void resetCaptureDelegate() const
AVCaptureDevice * videoCaptureDevice() const
QCameraFormat cameraFormat() const
NSDictionary * m_outputSettings
virtual void setOutputSettings()
void setNativeSize(QSize size)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
The QVideoFrame class represents a frame of video data.
bool isValid() const
Identifies whether a video frame is valid.
void orientationChanged(int angle)
int currentOrientation() const
CvPixelFormat toCVPixelFormat(QVideoFrameFormat::PixelFormat pixFmt, QVideoFrameFormat::ColorRange colorRange)
constexpr CvPixelFormat CvPixelFormatInvalid
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
DBusConnection * connection
GLint GLsizei GLsizei GLenum format
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
obj metaObject() -> className()
QSvgRenderer * renderer
[0]