Revision control
Copy as Markdown
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef AVFMEDIAPLAYER_H
#define AVFMEDIAPLAYER_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtMultimedia/qmediaplayer.h>
#include <QtMultimedia/qvideoframe.h>
#include <QtMultimedia/private/qplatformmediaplayer_p.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qobject.h>
#include <QtCore/qresource.h>
#include <QtCore/qset.h>
#include <QtCore/qtimer.h>
#include <QtCore/qurl.h>
#import <AVFoundation/AVFoundation.h>
@class AVFMediaPlayerObserver;
QT_BEGIN_NAMESPACE
class AVFMediaPlayer;
class AVFVideoRendererControl;
class AVFVideoSink;
class AVFMediaPlayer : public QObject, public QPlatformMediaPlayer
{
Q_OBJECT
public:
AVFMediaPlayer(QMediaPlayer *parent);
~AVFMediaPlayer() override;
void setVideoSink(QVideoSink *sink) override;
void setVideoOutput(AVFVideoRendererControl *output);
AVAsset *currentAssetHandle();
QUrl media() const override;
QIODevice *mediaStream() const override;
void setMedia(const QUrl &content, QIODevice *stream) override;
qint64 position() const override;
qint64 duration() const override;
float bufferProgress() const override;
QMediaTimeRange availablePlaybackRanges() const override;
qreal playbackRate() const override;
void setAudioOutput(QPlatformAudioOutput *output) override;
QPlatformAudioOutput *m_audioOutput = nullptr;
QMediaMetaData metaData() const override;
static void videoOrientationForAssetTrack(AVAssetTrack *track,
QtVideo::Rotation &angle,
bool &mirrored);
PitchCompensationAvailability pitchCompensationAvailability() const override;
void setPitchCompensation(bool enabled) override;
bool pitchCompensation() const override;
public Q_SLOTS:
void setPlaybackRate(qreal rate) override;
void nativeSizeChanged(QSize size);
void setPosition(qint64 pos) override;
void play() override;
void pause() override;
void stop() override;
void setVolume(float volume);
void setMuted(bool muted);
void updateAudioOutputDevice();
void processEOS();
void processLoadStateChange(QMediaPlayer::PlaybackState newState);
void processPositionChange();
void processMediaLoadError(QMediaPlayer::Error errorCode);
void seekCompleted();
void processLoadStateChange();
void processLoadStateFailure();
void processBufferStateChange(int bufferProgress);
void processDurationChange(qint64 duration);
void streamReady();
void streamDestroyed();
void loadMediaStream();
void updateTracks();
void setActiveTrack(TrackType type, int index) override;
int activeTrack(TrackType type) override;
int trackCount(TrackType) override;
QMediaMetaData trackMetaData(TrackType type, int trackNumber) override;
public:
TrackTypeMap<QList<QMediaMetaData>> tracks;
TrackTypeMap<QList<AVPlayerItemTrack *>> nativeTracks;
private:
void resetStream(QIODevice *stream = nullptr);
void applyPitchCompensation(bool enabled);
void resetBufferProgress();
void orientationChanged(QtVideo::Rotation rotation, bool mirrored);
AVFVideoRendererControl *m_videoOutput = nullptr;
AVFVideoSink *m_videoSink = nullptr;
QSize m_nativeSize;
QIODevice *m_mediaStream;
QUrl m_resources;
QMediaMetaData m_metaData;
qreal m_rate;
qint64 m_requestedPosition;
qint64 m_duration;
int m_bufferProgress;
bool m_pitchCompensationEnabled{ false };
AVFMediaPlayerObserver *m_observer;
QTimer m_playbackTimer;
};
QT_END_NAMESPACE
#endif // AVFMEDIAPLAYER_H