9#include <QtMultimedia/qvideoframeformat.h>
14#include <QtCore/qdebug.h>
16#import <AVFoundation/AVFoundation.h>
17#include <CoreVideo/CVPixelBuffer.h>
18#include <CoreVideo/CVImageBuffer.h>
27- (
void)legibleOutput:(AVPlayerItemLegibleOutput *)output
28 didOutputAttributedStrings:(NSArray<NSAttributedString *> *)strings
29 nativeSampleBuffers:(NSArray *)nativeSamples
30 forItemTime:(CMTime)itemTime;
38 if (!(self = [super
init]))
46- (
void)legibleOutput:(AVPlayerItemLegibleOutput *)output
47 didOutputAttributedStrings:(NSArray<NSAttributedString *> *)strings
48 nativeSampleBuffers:(NSArray *)nativeSamples
49 forItemTime:(CMTime)itemTime
52 for (NSAttributedString *
s :
strings) {
67 connect(m_displayLink,
SIGNAL(tick(CVTimeStamp)),
SLOT(updateVideoFrame(CVTimeStamp)));
75 m_displayLink->
stop();
77 [m_videoOutput release];
79 [m_subtitleOutput release];
80 if (m_subtitleDelegate)
90 m_displayLink->
stop();
96 m_displayLink->
start();
106 AVPlayerLayer *plLayer = playerLayer();
109 [[[plLayer player] currentItem] removeOutput:m_videoOutput];
111 if (m_subtitleOutput)
112 [[[plLayer player] currentItem] removeOutput:m_subtitleOutput];
123 m_rotation = rotation;
128 m_mirrored = mirrored;
131void AVFVideoRendererControl::updateVideoFrame(
const CVTimeStamp &ts)
141 auto *
layer = playerLayer();
142 if (!
layer.readyForDisplay)
148 CVPixelBufferRef pixelBuffer = copyPixelBufferFromLayer(
width,
height);
153 CVPixelBufferRelease(pixelBuffer);
156 frame.setRotationAngle(m_rotation);
157 frame.setMirrored(m_mirrored);
161CVPixelBufferRef AVFVideoRendererControl::copyPixelBufferFromLayer(
size_t&
width,
size_t&
height)
163 AVPlayerLayer *
layer = playerLayer();
167 qWarning(
"copyPixelBufferFromLayer: invalid layer");
172 AVPlayerItem *
item = [[layer player] currentItem];
174 if (!m_videoOutput) {
177 m_videoOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:m_outputSettings];
178 [m_videoOutput setDelegate:nil queue:nil];
180 if (!m_subtitleOutput) {
181 m_subtitleOutput = [[AVPlayerItemLegibleOutput alloc] init];
183 [m_subtitleOutput setDelegate:m_subtitleDelegate queue:dispatch_get_main_queue()];
185 if (![
item.outputs containsObject:m_videoOutput])
186 [
item addOutput:m_videoOutput];
187 if (![
item.outputs containsObject:m_subtitleOutput])
188 [
item addOutput:m_subtitleOutput];
190 CFTimeInterval currentCAFrameTime = CACurrentMediaTime();
191 CMTime currentCMFrameTime = [m_videoOutput itemTimeForHostTime:currentCAFrameTime];
193 if (CMTimeCompare(currentCMFrameTime, kCMTimeZero) < 0) {
197 if (![m_videoOutput hasNewPixelBufferForItemTime:currentCMFrameTime])
200 CVPixelBufferRef pixelBuffer = [m_videoOutput copyPixelBufferForItemTime:currentCMFrameTime
201 itemTimeForDisplay:nil];
204 qWarning(
"copyPixelBufferForItemTime returned nil");
205 CMTimeShow(currentCMFrameTime);
210 width = CVPixelBufferGetWidth(pixelBuffer);
211 height = CVPixelBufferGetHeight(pixelBuffer);
220#include "moc_avfvideorenderercontrol_p.cpp"
void setVideoMirrored(bool mirrored)
virtual ~AVFVideoRendererControl()
void setSubtitleText(const QString &subtitle)
void setLayer(CALayer *layer) override
void setVideoRotation(QVideoFrame::RotationAngle)
AVFVideoRendererControl(QObject *parent=nullptr)
void reconfigure() override
virtual void setLayer(CALayer *layer)
NSDictionary * m_outputSettings
virtual void setOutputSettings()
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
The QVideoFrame class represents a frame of video data.
RotationAngle
The angle of the clockwise rotation that should be applied to a video frame before displaying.
AVFVideoRendererControl * m_renderer
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
GLint GLsizei GLsizei height
GLsizei const GLchar ** strings
[1]
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)
QSvgRenderer * renderer
[0]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent