[vlc-devel] [PATCH] qt: player_controller: check item before restore playback position
Alexandre Janniaux
ajanni at videolabs.io
Fri Mar 20 16:03:45 CET 2020
Hi,
Thank you for review,
On Fri, Mar 20, 2020 at 02:57:01PM +0100, Pierre Lamot wrote:
> Hi,
>
> Shouldn't you apply the same principle for other player accessor ?
> vlc_player_ChangeRate, vlc_player_SetPosition, vlc_player_JumpTime, etc...
>
> IMHO, this is either all or nothing (but still ensure not restoring the
> position of a null intput in vlc_player_RestorePlaybackPos)
Yes, you're right, I'll fix this in one commit.
> > + if (d->m_currentItem.get() == nullptr ||
>
>
>
> nit, vlc_shared_data_ptr_type has a bool operator, maybe
>
> > if (!d->m_currentItem ||
>
> would be more concise
The file has both kind of check. To be honest, I stopped using the
implicit conversion to boolean the day there was confusion in overloaded
function, and now follow Hugo's convention. If you prefer I can change it
the boolean operator but it might not bring anything unless a convention
is chosen for the file.
Regards,
--
Alexandre Janniaux
Videolabs
> On 2020-03-20 13:50, Alexandre Janniaux wrote:
> > The restoration request is emitted from the UI, and the player event
> > signalling that the input item changed is emitted from a player thread
> > and asynchronously processed later by the UI thread. It means that the
> > restoration request could happen although there was no input item to
> > restore anymore.
> >
> > Store the input item currently acknowledged by the UI thread and check
> > it against the current item being played by the player when the
> > restoration is requested by the UI. If they don't match, avoid
> > processing the restoration request.
> >
> > Note that another solution would have been to use the item currently
> > acknowledged by the UI and restore it by rolling back the previous
> > playlist state to ensure the media is current. As it is far more complex
> > to implement and provide zero benefit in normal playback, where the
> > media is likely to be restored at the beginning of the playback, this
> > other implementation was chosen.
> >
> > Fixes #24347
> > ---
> > modules/gui/qt/player/player_controller.cpp | 17 +++++++++++++++++
> > modules/gui/qt/player/player_controller_p.hpp | 5 +++++
> > 2 files changed, 22 insertions(+)
> >
> > diff --git a/modules/gui/qt/player/player_controller.cpp
> > b/modules/gui/qt/player/player_controller.cpp
> > index 724232062b..eccbcd586d 100644
> > --- a/modules/gui/qt/player/player_controller.cpp
> > +++ b/modules/gui/qt/player/player_controller.cpp
> > @@ -241,6 +241,8 @@ static void
> > on_player_current_media_changed(vlc_player_t *, input_item_t *new_m
> > {
> > that->callAsync([that] () {
> > emit that->q_func()->inputChanged(false);
> > + vlc_player_locker lock{ that->m_player };
> > + that->m_currentItem.reset(nullptr);
> > });
> > return;
> > }
> > @@ -252,6 +254,11 @@ static void
> > on_player_current_media_changed(vlc_player_t *, input_item_t *new_m
> > that->UpdateArt( newMediaPtr.get() );
> > that->UpdateMeta( newMediaPtr.get() );
> >
> > + {
> > + vlc_player_locker lock{ that->m_player };
> > + that->m_currentItem = std::move(newMediaPtr);
> > + }
> > +
> > that->m_canRestorePlayback = false;
> > emit q->playbackRestoreQueried();
> >
> > @@ -1521,6 +1528,16 @@ void PlayerController::restorePlaybackPos()
> > {
> > Q_D(PlayerController);
> > vlc_player_locker lock{ d->m_player };
> > +
> > + /* The media can change before the UI gets updated and thus a
> > + * restorePlayback request can be submitted on the wrong media or
> > worse,
> > + * no media at all. Here d->m_currentItem is locked by the player
> > lock. */
> > + if (d->m_currentItem.get() == nullptr ||
>
>
>
> nit, vlc_shared_data_ptr_type has a bool operator, maybe
>
> > if (!d->m_currentItem ||
>
> would be more concise
>
>
> > + d->m_currentItem.get() != vlc_player_GetCurrentMedia(
> > d->m_player ))
> > + {
> > + return;
> > + }
> > +
> > vlc_player_RestorePlaybackPos( d->m_player );
> > }
> >
> > diff --git a/modules/gui/qt/player/player_controller_p.hpp
> > b/modules/gui/qt/player/player_controller_p.hpp
> > index c3f3dd4ea4..1f8a6020cc 100644
> > --- a/modules/gui/qt/player/player_controller_p.hpp
> > +++ b/modules/gui/qt/player/player_controller_p.hpp
> > @@ -82,6 +82,11 @@ public:
> > float m_position = 0.f;
> > VLCTick m_length= 0;
> >
> > + using InputItemPtr = vlc_shared_data_ptr_type(input_item_t,
> > + input_item_Hold,
> > + input_item_Release);
> > +
> > + InputItemPtr m_currentItem;
> > bool m_canRestorePlayback = false;
> >
> > int m_capabilities = 0;
More information about the vlc-devel
mailing list