6#include <QtCore/qcoreapplication.h>
9#include <QtCore/qdebug.h>
14#import <Foundation/NSRunLoop.h>
15#if !defined(QT_PLATFORM_UIKIT)
16#import <AppKit/NSScreen.h>
21@interface QT_MANGLE_NAMESPACE (DisplayLinkObserver) : NSObject
23 AVFDisplayLink *
_Nonnull m_avfDisplayLink;
24 CADisplayLink *m_displayLink;
26- (
id)initWithAVFDisplayLink:(AVFDisplayLink *
_Nonnull)link;
27- (
void)setDisplayLink:(CADisplayLink *)displayLink;
30- (
void)displayLinkNotification:(CADisplayLink *)sender;
33@implementation QT_MANGLE_NAMESPACE (DisplayLinkObserver)
35- (id)initWithAVFDisplayLink:(AVFDisplayLink *
_Nonnull)link
39 m_avfDisplayLink = link;
45 [self setDisplayLink:
nullptr];
49- (
void)setDisplayLink:(CADisplayLink *)displayLink
51 if (m_displayLink == displayLink)
54 [m_displayLink invalidate];
55 [m_displayLink release];
58 m_displayLink = [displayLink retain];
63 [m_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
68 [m_displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
71- (
void)displayLinkNotification:(CADisplayLink *)sender
74 m_avfDisplayLink->displayLinkEvent();
80using DisplayLinkObserver = QT_MANGLE_NAMESPACE(DisplayLinkObserver);
83AVFDisplayLink::AVFDisplayLink(QObject *parent)
86#if defined(QT_PLATFORM_UIKIT)
87 m_observer = [[DisplayLinkObserver alloc] initWithAVFDisplayLink:
this];
88 CADisplayLink *dl = [CADisplayLink displayLinkWithTarget:m_observer
89 selector:@selector(displayLinkNotification:)];
90 [m_observer setDisplayLink:dl];
92 if (@available(macOS 15.0, *)) {
93 m_observer = [[DisplayLinkObserver alloc] initWithAVFDisplayLink:
this];
94 CADisplayLink *
_Nonnull dl =
95 [NSScreen.mainScreen displayLinkWithTarget:m_observer
96 selector:@selector(displayLinkNotification:)];
97 [m_observer setDisplayLink:dl];
102 QT_WARNING_DISABLE_DEPRECATED
103 CVDisplayLinkCreateWithCGDisplay(kCGDirectMainDisplay, &m_cvDisplayLink);
104 if (m_cvDisplayLink) {
105 CVDisplayLinkSetCurrentCGDisplay(m_cvDisplayLink, kCGDirectMainDisplay);
106 CVDisplayLinkSetOutputCallback(m_cvDisplayLink,
107 [](CVDisplayLinkRef,
const CVTimeStamp *,
108 const CVTimeStamp *, CVOptionFlags, CVOptionFlags *,
109 void *displayLinkContext) -> CVReturn {
110 static_cast<AVFDisplayLink *>(displayLinkContext)->displayLinkEvent();
111 return kCVReturnSuccess;
120AVFDisplayLink::~AVFDisplayLink()
123 qDebug() << Q_FUNC_INFO;
129 [m_observer release];
133#if !defined(QT_PLATFORM_UIKIT)
134 if (m_cvDisplayLink) {
136 QT_WARNING_DISABLE_DEPRECATED
137 CVDisplayLinkRelease(m_cvDisplayLink);
139 m_cvDisplayLink =
nullptr;
144bool AVFDisplayLink::isValid()
const
146#if !defined(QT_PLATFORM_UIKIT)
147 return m_observer || m_cvDisplayLink !=
nullptr;
153bool AVFDisplayLink::isActive()
const
158void AVFDisplayLink::start()
163#if !defined(QT_PLATFORM_UIKIT)
164 else if (m_cvDisplayLink) {
166 QT_WARNING_DISABLE_DEPRECATED
167 CVDisplayLinkStart(m_cvDisplayLink);
175void AVFDisplayLink::stop()
180#if !defined(QT_PLATFORM_UIKIT)
181 else if (m_cvDisplayLink) {
183 QT_WARNING_DISABLE_DEPRECATED
184 CVDisplayLinkStop(m_cvDisplayLink);
188 m_framePending =
false;
193void AVFDisplayLink::displayLinkEvent()
195 if (!m_framePending.exchange(
true))
196 qApp->postEvent(
this,
new QEvent(QEvent::User), Qt::HighEventPriority);
199bool AVFDisplayLink::event(QEvent *event)
201 switch (event->type()){
203 if (!m_framePending.exchange(
false))
213 return QObject::event(event);
216#include "moc_avfdisplaylink_p.cpp"