17class StateChangeNotifier
22 , mPreviousState(mp->
state())
25 ++mControl->mActiveStateChangeNotifiers;
28 ~StateChangeNotifier()
30 if (--mControl->mActiveStateChangeNotifiers)
33 if (mPreviousMediaStatus != mControl->mediaStatus())
34 Q_EMIT mControl->mediaStatusChanged(mControl->mediaStatus());
36 if (mPreviousState != mControl->state())
37 Q_EMIT mControl->stateChanged(mControl->state());
54 &QAndroidMediaPlayer::onBufferingChanged);
58 &QAndroidMediaPlayer::onStateChanged);
60 &QAndroidMediaPlayer::onVideoSizeChanged);
62 &QAndroidMediaPlayer::positionChanged);
64 &QAndroidMediaPlayer::durationChanged);
66 &QAndroidMediaPlayer::updateTrackInfo);
104 return (mPendingPosition == -1) ? 0 : mPendingPosition;
115 if (seekPosition == currentPosition) {
118 mMediaPlayer->
seekTo(seekPosition);
130 mPendingPosition = seekPosition;
132 mMediaPlayer->
seekTo(seekPosition);
134 if (mPendingPosition != -1) {
135 mPendingPosition = -1;
139 Q_EMIT positionChanged(seekPosition);
142void QAndroidMediaPlayer::setVolume(
float volume)
151 mPendingVolume = volume;
159void QAndroidMediaPlayer::setMuted(
bool muted)
168 mPendingMute = muted;
183 return mBufferFilled ? 1. : mBufferPercent;
188 return mAudioAvailable;
193 return mVideoAvailable;
198 return mAvailablePlaybackRange;
201void QAndroidMediaPlayer::updateAvailablePlaybackRanges()
218 return mCurrentPlaybackRate;
226 if (mCurrentPlaybackRate !=
rate) {
227 mCurrentPlaybackRate =
rate;
228 mHasPendingPlaybackRate =
true;
235 mCurrentPlaybackRate =
rate;
242 return mMediaContent;
255 mReloadingMedia = (mMediaContent == mediaContent) && !mPendingSetMedia;
257 if (!mReloadingMedia) {
258 mMediaContent = mediaContent;
265 if (mVideoOutput && !mVideoOutput->
isReady()) {
268 mPendingSetMedia =
true;
272 if (mVideoSize.
isValid() && mVideoOutput)
281 if (!mReloadingMedia)
285 resetBufferingProgress();
287 mReloadingMedia =
false;
292 if (m_videoSink ==
sink)
303 mVideoOutput =
nullptr;
309 &QAndroidMediaPlayer::onVideoOutputReady);
319 if (m_audioOutput ==
output)
346 setMedia(mMediaContent, mMediaStream);
361 mVideoOutput->
start();
365 if (mHasPendingPlaybackRate) {
366 mHasPendingPlaybackRate =
false;
373 mMediaPlayer->
play();
398 mMediaPlayer->
pause();
417 if (mCurrentPlaybackRate != 1.)
419 mHasPendingPlaybackRate =
true;
422 mVideoOutput->
stop();
424 mMediaPlayer->
stop();
427void QAndroidMediaPlayer::onInfo(
qint32 what,
qint32 extra)
441 mPendingState =
state();
447 flushPendingStates();
460void QAndroidMediaPlayer::onError(
qint32 what,
qint32 extra)
507 ?
QLatin1String(
" (Unknown error/Insufficient resources or RTSP may not be supported)")
516void QAndroidMediaPlayer::onBufferingChanged(
qint32 percent)
520 mBuffering = percent != 100;
521 mBufferPercent = percent;
523 updateAvailablePlaybackRanges();
528 updateBufferStatus();
535 if (
width == 0 ||
height == 0 || newSize == mVideoSize)
538 setVideoAvailable(
true);
539 mVideoSize = newSize;
545void QAndroidMediaPlayer::onStateChanged(
qint32 state)
562 if (!mReloadingMedia)
571 onBufferingChanged(100);
575 setAudioAvailable(
true);
576 flushPendingStates();
601 Q_EMIT positionChanged(0);
606 Q_EMIT positionChanged(0);
611 mMediaPlayer->
play();
619 if (!mReloadingMedia) {
620 resetBufferingProgress();
621 mPendingPosition = -1;
622 mPendingSetMedia =
false;
625 Q_EMIT durationChanged(0);
626 Q_EMIT positionChanged(0);
628 setAudioAvailable(
false);
629 setVideoAvailable(
false);
640 mVideoOutput->
stop();
641 mVideoOutput->
reset();
648 if (!mTracksMetadata.
contains(trackType))
651 auto tracks = mTracksMetadata.
value(trackType);
652 return tracks.count();
657 if (!mTracksMetadata.
contains(trackType))
660 auto tracks = mTracksMetadata.
value(trackType);
661 if (tracks.count() < streamNumber)
687int QAndroidMediaPlayer::convertTrackNumber(
int androidTrackNumber)
689 int trackNumber = androidTrackNumber;
692 if (trackNumber <= videoTrackCount)
695 trackNumber = trackNumber - videoTrackCount;
698 if (trackNumber <= audioTrackCount)
701 trackNumber = trackNumber - audioTrackCount;
704 int timedTextCount = 0;
705 int subtitleTextCount = 0;
706 for (
const auto &track : subtitleTracks) {
707 if (track.androidTrackType() == 3)
710 if (track.androidTrackType() == 4)
714 if (trackNumber <= timedTextCount)
717 trackNumber = trackNumber - timedTextCount;
719 if (trackNumber <= subtitleTextCount)
727 int androidTrackNumber = -1;
731 if (!mIsVideoTrackEnabled)
736 if (!mIsAudioTrackEnabled)
742 int timedTextSelectedTrack =
745 if (timedTextSelectedTrack > -1) {
746 androidTrackNumber = timedTextSelectedTrack;
750 int subtitleSelectedTrack =
752 if (subtitleSelectedTrack > -1) {
753 androidTrackNumber = subtitleSelectedTrack;
763 return convertTrackNumber(androidTrackNumber);
766void QAndroidMediaPlayer::disableTrack(TrackType trackType)
774 mIsVideoTrackEnabled =
false;
782 mIsAudioTrackEnabled =
false;
788 int subtitleSelectedTrack =
790 if (subtitleSelectedTrack > -1)
793 int timedTextSelectedTrack =
795 if (timedTextSelectedTrack > -1)
808 if (!mTracksMetadata.
contains(trackType)) {
810 <<
"Trying to set a active track which type has no available tracks.";
814 const auto &tracks = mTracksMetadata.
value(trackType);
815 if (streamNumber > tracks.count()) {
816 qCWarning(lcMediaPlayer) <<
"Trying to set a active track that does not exist.";
821 if (streamNumber < 0) {
822 disableTrack(trackType);
827 if (streamNumber == currentTrack) {
834 mIsVideoTrackEnabled =
true;
841 mIsAudioTrackEnabled =
true;
850 const auto &trackInfo = tracks.at(streamNumber);
851 const auto &trackNumber = trackInfo.androidTrackNumber();
862void QAndroidMediaPlayer::durationChanged(
qint64 duration)
867void QAndroidMediaPlayer::onVideoOutputReady(
bool ready)
869 if ((mMediaPlayer->
display() == 0) && mVideoOutput && ready)
872 flushPendingStates();
880 Q_EMIT durationChanged(0);
882 setAudioAvailable(
false);
883 setVideoAvailable(
false);
889 updateBufferStatus();
892void QAndroidMediaPlayer::setAudioAvailable(
bool available)
894 if (mAudioAvailable == available)
897 mAudioAvailable = available;
901void QAndroidMediaPlayer::setVideoAvailable(
bool available)
903 if (mVideoAvailable == available)
907 mVideoSize =
QSize();
909 mVideoAvailable = available;
913void QAndroidMediaPlayer::resetBufferingProgress()
920void QAndroidMediaPlayer::flushPendingStates()
922 if (mPendingSetMedia) {
924 mPendingSetMedia =
false;
931 if (mPendingPosition != -1)
933 if (mPendingVolume >= 0)
934 setVolume(mPendingVolume);
935 if (mPendingMute != -1)
936 setMuted((mPendingMute == 1));
953void QAndroidMediaPlayer::updateBufferStatus()
958 if (mBufferFilled != bufferFilled)
959 mBufferFilled = bufferFilled;
964void QAndroidMediaPlayer::updateTrackInfo()
966 const auto &androidTracksInfo = mMediaPlayer->
tracksInfo();
974 for (
const auto &androidTrackInfo : androidTracksInfo) {
977 auto &tracks = mTracksMetadata[mediaPlayerType];
979 const QAndroidMetaData metadata(mediaPlayerType, androidTrackInfo.trackType,
980 androidTrackInfo.trackNumber, androidTrackInfo.mimeType,
981 androidTrackInfo.language);
982 tracks.append(metadata);
990#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.
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
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
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent