4#include "private/qabstractvideobuffer_p.h"
17#import <AVFoundation/AVFoundation.h>
20#include <QtGui/qopengl.h>
23#include <private/qabstractvideobuffer_p.h>
25#include <QtMultimedia/qvideoframeformat.h>
33- (
void) captureOutput:(AVCaptureOutput *)captureOutput
34 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
35 fromConnection:(AVCaptureConnection *)connection;
47 if (!(self = [super
init]))
54- (
void)captureOutput:(AVCaptureOutput *)captureOutput
55 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
56 fromConnection:(AVCaptureConnection *)connection
64 CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
73 m_renderer->syncHandleViewfinderFrame(
frame);
90 [m_videoDataOutput release];
93 dispatch_release(m_delegateQueue);
96 CFRelease(m_textureCache);
113 if (!m_videoDataOutput)
134 m_cameraSession = cameraSession;
135 connect(m_cameraSession,
SIGNAL(readyToConfigureConnections()),
136 this,
SLOT(updateCaptureConnection()));
138 m_needsHorizontalMirroring =
false;
140 m_videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
143 m_delegateQueue = dispatch_queue_create(
"vf_queue",
nullptr);
145 setSampleBufferDelegate:m_viewfinderFramesDelegate
146 queue:m_delegateQueue];
151void AVFCameraRenderer::updateCaptureConnection()
153 AVCaptureConnection *
connection = [m_videoDataOutput connectionWithMediaType:AVMediaTypeVideo];
163 m_needsHorizontalMirroring = !
connection.isVideoMirrored
171 AVCaptureConnection *
connection = [m_videoDataOutput connectionWithMediaType:AVMediaTypeVideo];
181 AVCaptureVideoOrientation orientation = AVCaptureVideoOrientationPortrait;
186 orientation = AVCaptureVideoOrientationLandscapeRight;
192 orientation = AVCaptureVideoOrientationLandscapeLeft;
206 if (!m_lastViewfinderFrame.
isValid()) {
208 metaObject()->indexOfMethod(
"handleViewfinderFrame()"));
213 m_lastViewfinderFrame =
frame;
218 return m_videoDataOutput;
223 return m_viewfinderFramesDelegate;
228 [m_videoDataOutput setSampleBufferDelegate:m_viewfinderFramesDelegate queue:m_delegateQueue];
231void AVFCameraRenderer::handleViewfinderFrame()
236 frame = m_lastViewfinderFrame;
243 if (m_needsHorizontalMirroring)
254 qWarning() <<
"OpenGL rhi backend only supports 32BGRA pixel format.";
261 unsigned avPixelFormat = kCVPixelFormatType_32BGRA;
263 qWarning() <<
"QCamera::setCameraFormat: couldn't convert requested pixel format, using ARGB32";
265 bool isSupported =
false;
266 NSArray *supportedPixelFormats = m_videoDataOutput.availableVideoCVPixelFormatTypes;
267 for (NSNumber *currentPixelFormat
in supportedPixelFormats)
269 if ([currentPixelFormat unsignedIntValue] == avPixelFormat) {
276 NSDictionary* outputSettings = @{
277 (NSString *)kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithUnsignedInt:avPixelFormat]
279 , (NSString *)kCVPixelBufferMetalCompatibilityKey: @
true
283 [m_outputSettings release];
284 m_outputSettings = [[NSDictionary alloc] initWithDictionary:outputSettings];
286 qWarning() <<
"QCamera::setCameraFormat: requested pixel format not supported. Did you use a camera format from another camera?";
290#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
void setPixelFormat(const QVideoFrameFormat::PixelFormat format)
AVFCaptureFramesDelegate * captureDelegate() const
void configureAVCaptureSession(AVFCameraSession *cameraSession)
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
bool toCVPixelFormat(QVideoFrameFormat::PixelFormat qtFormat, unsigned &conv)
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]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent