11#include <private/qplatformvideosink_p.h>
18class StateChangeNotifier
23 , mPreviousState(mp->state())
24 , mPreviousMediaStatus(mp->mediaStatus())
26 ++mControl->mActiveStateChangeNotifiers;
29 ~StateChangeNotifier()
31 if (--mControl->mActiveStateChangeNotifiers)
34 if (mPreviousMediaStatus != mControl->mediaStatus())
35 Q_EMIT mControl->mediaStatusChanged(mControl->mediaStatus());
37 if (mPreviousState != mControl->state())
38 Q_EMIT mControl->stateChanged(mControl->state());
55 &QAndroidMediaPlayer::onBufferingChanged);
59 &QAndroidMediaPlayer::onStateChanged);
61 &QAndroidMediaPlayer::onVideoSizeChanged);
63 &QAndroidMediaPlayer::positionChanged);
65 &QAndroidMediaPlayer::durationChanged);
67 &QAndroidMediaPlayer::updateTrackInfo);
108 return (mPendingPosition == -1) ? 0 : mPendingPosition;
119 if (seekPosition == currentPosition) {
122 mMediaPlayer->
seekTo(seekPosition);
134 mPendingPosition = seekPosition;
136 mMediaPlayer->
seekTo(seekPosition);
138 if (mPendingPosition != -1) {
139 mPendingPosition = -1;
143 Q_EMIT positionChanged(seekPosition);
146void QAndroidMediaPlayer::setVolume(
float volume)
155 mPendingVolume = volume;
163void QAndroidMediaPlayer::setMuted(
bool muted)
172 mPendingMute = muted;
187 return mBufferFilled ? 1. : mBufferPercent;
192 return mAudioAvailable;
197 return mVideoAvailable;
202 return mAvailablePlaybackRange;
205void QAndroidMediaPlayer::updateAvailablePlaybackRanges()
222 return mCurrentPlaybackRate;
230 if (mCurrentPlaybackRate !=
rate) {
231 mCurrentPlaybackRate =
rate;
232 mHasPendingPlaybackRate =
true;
239 mCurrentPlaybackRate =
rate;
246 return mMediaContent;
259 mReloadingMedia = (mMediaContent == mediaContent) && !mPendingSetMedia;
261 if (!mReloadingMedia) {
262 mMediaContent = mediaContent;
266 if (mediaContent.isEmpty()) {
269 if (mVideoOutput && !mVideoOutput->
isReady()) {
272 mPendingSetMedia =
true;
276 if (mVideoSize.
isValid() && mVideoOutput)
285 if (!mReloadingMedia)
289 resetBufferingProgress();
291 mReloadingMedia =
false;
296 if (m_videoSink ==
sink)
310 mVideoOutput =
nullptr;
316 &QAndroidMediaPlayer::onVideoOutputReady);
324 { mMediaPlayer->setDisplay(mVideoOutput->surfaceTexture()); });
329 if (m_audioOutput ==
output)
356 setMedia(mMediaContent, mMediaStream);
371 mVideoOutput->
start();
375 if (mHasPendingPlaybackRate) {
376 mHasPendingPlaybackRate =
false;
383 mMediaPlayer->
play();
408 mMediaPlayer->
pause();
427 if (mCurrentPlaybackRate != 1.)
429 mHasPendingPlaybackRate =
true;
432 mVideoOutput->
stop();
434 mMediaPlayer->
stop();
437void QAndroidMediaPlayer::onInfo(
qint32 what,
qint32 extra)
451 mPendingState =
state();
457 flushPendingStates();
470void QAndroidMediaPlayer::onError(
qint32 what,
qint32 extra)
517 ?
QLatin1String(
" (Unknown error/Insufficient resources or RTSP may not be supported)")
526void QAndroidMediaPlayer::onBufferingChanged(
qint32 percent)
530 mBuffering = percent != 100;
531 mBufferPercent = percent;
533 updateAvailablePlaybackRanges();
538 updateBufferStatus();
545 if (
width == 0 ||
height == 0 || newSize == mVideoSize)
548 setVideoAvailable(
true);
549 mVideoSize = newSize;
555void QAndroidMediaPlayer::onStateChanged(
qint32 state)
572 if (!mReloadingMedia)
581 onBufferingChanged(100);
585 setAudioAvailable(
true);
586 flushPendingStates();
611 Q_EMIT positionChanged(0);
616 Q_EMIT positionChanged(0);
621 mMediaPlayer->
play();
629 if (!mReloadingMedia) {
630 resetBufferingProgress();
631 mPendingPosition = -1;
632 mPendingSetMedia =
false;
635 Q_EMIT durationChanged(0);
636 Q_EMIT positionChanged(0);
638 setAudioAvailable(
false);
639 setVideoAvailable(
false);
650 mVideoOutput->
stop();
657 if (!mTracksMetadata.
contains(trackType))
660 auto tracks = mTracksMetadata.
value(trackType);
661 return tracks.count();
666 if (!mTracksMetadata.
contains(trackType))
669 auto tracks = mTracksMetadata.
value(trackType);
670 if (tracks.count() < streamNumber)
696int QAndroidMediaPlayer::convertTrackNumber(
int androidTrackNumber)
698 int trackNumber = androidTrackNumber;
701 if (trackNumber <= videoTrackCount)
704 trackNumber = trackNumber - videoTrackCount;
707 if (trackNumber <= audioTrackCount)
710 trackNumber = trackNumber - audioTrackCount;
713 int timedTextCount = 0;
714 int subtitleTextCount = 0;
715 for (
const auto &track : subtitleTracks) {
716 if (track.androidTrackType() == 3)
719 if (track.androidTrackType() == 4)
723 if (trackNumber <= timedTextCount)
726 trackNumber = trackNumber - timedTextCount;
728 if (trackNumber <= subtitleTextCount)
736 int androidTrackNumber = -1;
740 if (!mIsVideoTrackEnabled)
745 if (!mIsAudioTrackEnabled)
751 int timedTextSelectedTrack =
754 if (timedTextSelectedTrack > -1) {
755 androidTrackNumber = timedTextSelectedTrack;
759 int subtitleSelectedTrack =
761 if (subtitleSelectedTrack > -1) {
762 androidTrackNumber = subtitleSelectedTrack;
772 return convertTrackNumber(androidTrackNumber);
775void QAndroidMediaPlayer::disableTrack(TrackType trackType)
783 mIsVideoTrackEnabled =
false;
791 mIsAudioTrackEnabled =
false;
797 int subtitleSelectedTrack =
799 if (subtitleSelectedTrack > -1)
802 int timedTextSelectedTrack =
804 if (timedTextSelectedTrack > -1)
817 if (!mTracksMetadata.
contains(trackType)) {
819 <<
"Trying to set a active track which type has no available tracks.";
823 const auto &tracks = mTracksMetadata.
value(trackType);
824 if (streamNumber > tracks.count()) {
825 qCWarning(lcMediaPlayer) <<
"Trying to set a active track that does not exist.";
830 if (streamNumber < 0) {
831 disableTrack(trackType);
836 if (streamNumber == currentTrack) {
843 mIsVideoTrackEnabled =
true;
850 mIsAudioTrackEnabled =
true;
859 const auto &trackInfo = tracks.at(streamNumber);
860 const auto &trackNumber = trackInfo.androidTrackNumber();
871void QAndroidMediaPlayer::durationChanged(
qint64 duration)
876void QAndroidMediaPlayer::onVideoOutputReady(
bool ready)
878 if ((mMediaPlayer->
display() == 0) && mVideoOutput && ready)
881 flushPendingStates();
889 Q_EMIT durationChanged(0);
891 setAudioAvailable(
false);
892 setVideoAvailable(
false);
898 updateBufferStatus();
901void QAndroidMediaPlayer::setAudioAvailable(
bool available)
903 if (mAudioAvailable == available)
906 mAudioAvailable = available;
910void QAndroidMediaPlayer::setVideoAvailable(
bool available)
912 if (mVideoAvailable == available)
916 mVideoSize =
QSize();
918 mVideoAvailable = available;
922void QAndroidMediaPlayer::resetBufferingProgress()
929void QAndroidMediaPlayer::flushPendingStates()
931 if (mPendingSetMedia) {
933 mPendingSetMedia =
false;
940 if (mPendingPosition != -1)
942 if (mPendingVolume >= 0)
943 setVolume(mPendingVolume);
944 if (mPendingMute != -1)
945 setMuted((mPendingMute == 1));
962void QAndroidMediaPlayer::updateBufferStatus()
967 if (mBufferFilled != bufferFilled)
968 mBufferFilled = bufferFilled;
973void QAndroidMediaPlayer::updateTrackInfo()
975 const auto &androidTracksInfo = mMediaPlayer->
tracksInfo();
983 for (
const auto &androidTrackInfo : androidTracksInfo) {
986 auto &tracks = mTracksMetadata[mediaPlayerType];
988 const QAndroidMetaData metadata(mediaPlayerType, androidTrackInfo.trackType,
989 androidTrackInfo.trackNumber, androidTrackInfo.mimeType,
990 androidTrackInfo.language);
991 tracks.append(metadata);
999#include "moc_qandroidmediaplayer_p.cpp"
DarwinBluetooth::LECBManagerNotifier * notifier
void setSubtitle(const QString &subtitle)
void setVideoSize(const QSize &) override
AndroidSurfaceTexture * surfaceTexture() override
bool shouldTextureBeUpdated() const
QByteArray id
\qmlproperty string QtMultimedia::audioDevice::id
void mutedChanged(bool muted)
void volumeChanged(float volume)
\inmodule QtCore \reentrant
T value(const Key &key, const T &defaultValue=T()) const
bool contains(const Key &key) const
The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
constexpr bool isValid() const noexcept
Returns true if both the width and height is equal to or greater than 0; otherwise returns false.
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const
Returns true if the URL has no data; otherwise returns false.
QString scheme() const
Returns the scheme of the URL.
The QVideoSink class represents a generic sink for video data.
QPlatformVideoSink * platformVideoSink() const
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
DBusConnection const char DBusError * error
constexpr int Uninitialized
int qRound(qfloat16 d) noexcept
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
n void setPosition(void) \n\
GLint GLsizei GLsizei height
GLsizei GLenum GLboolean sink
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QLatin1StringView QLatin1String
QT_BEGIN_NAMESPACE typedef uchar * output
myObject disconnect()
[26]