avmedia/source/qt6/QtPlayer.cxx |   86 ++++++----------------------------------
 avmedia/source/qt6/QtPlayer.hxx |   17 -------
 2 files changed, 15 insertions(+), 88 deletions(-)

New commits:
commit 697405b533a8ae5b6a8f5bd184b9344a96f71c69
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Wed Apr 9 09:42:45 2025 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Wed Apr 9 12:19:23 2025 +0200

    tdf#166055 qt avmedia: Provide media/player size right away
    
    There are 2 potential approaches for providing the
    preferred player size based on the media (which generally
    matches the the video resolution) in an XPlayer implementation:
    
    1) by implementing the css::media::XPlayerNotifier
       interface in addition and notifying listeners when the
       preferred player size is available, in which case
       XPlayer::getPreferredPlayerWindowSize doesn't need to
       return the proper size before then
    2) by not implementing that interface, but returning the
       correct value in XPlayer::getPreferredPlayerWindowSize
       right from the start.
    
    (See MediaWindow::isMediaURL and MediaWindow::grabFrame for
    how both approaches are supported there.)
    
    So far, QtPlayer was implementing approach 1), i.e. the
    css::media::XPlayerNotifier interface, like GtkPlayer does
    (by which the QtPlayer implementation was inspired, see
    
        commit 441d8ed9be0e7f831b455a69b8688dcb79a8bc00
        Author: Michael Weghorn <m.wegh...@posteo.de>
        Date:   Mon May 20 16:25:09 2024 +0200
    
            tdf#145735 avmedia qt: Use QtMultimedia for Qt 6 media playback
    
    ), while all other XPlayer implementations don't do
    that.
    
    With the previous implementation, listeners would be
    notified when the QMediaPlayer::mediaStatus [1] transitioned
    to one of the states where the media has been loaded, i.e.
    the information on video resolution can reliably be retrieved.
    
    Given the current implementation of avmedia's PlayerWindow
    and the call to Scheduler::ProcessEventsToIdle (frame #12404 below)
    in avmedia::qt::QtFrameGrabber::grabFrame (frame #12405) in order
    to allow video playback to then be able to retrieve a video frame,
    the current implementation with signals/slots resulted in infinite
    recursion.
    
    Fix/avoid the problem by no longer implementing
    the XPlayerNotifier interface, but ensuring that
    the media is past the QMediaPlayer::LoadingMedia
    status in QtPlayer's XPlayer::getPreferredPlayerWindowSize
    implementation instead (by starting to play the media and then
    processing events until that's the case).
    
    (Running some of the logic in a separate thread came to mind as a
    potential alternative solution, but then some of the QtMultimedia library
    logic seems to expect to be run in the main thread. What would probably
    work as an alternative would be to run the logic to retrieve a video frame
    in a separate process/helper program instead, but that would also imply
    further overhead.)
    
    Sample backtrace of infinite recursion with the default ffmpeg
    QtMultimedia media backend prior to this commit with the qt6 VCL
    plugin on Wayland when inserting a video (not every time, but
    quite often):
    
        [...]
        #12353 0x00007fffeec62967 in Scheduler::ProcessEventsToIdle () at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:435
        #12354 0x00007fffdd867acd in avmedia::qt::QtFrameGrabber::grabFrame 
(this=0x55555e3dd060, fMediaTime=3) at 
/home/michi/development/git/libreoffice/avmedia/source/qt6/QtFrameGrabber.cxx:103
        #12355 0x00007fffdd867bce in non-virtual thunk to 
avmedia::qt::QtFrameGrabber::grabFrame(double) () at 
/home/michi/development/git/libreoffice/instdir/program/../program/libavmediaqt6.so
        #12356 0x00007ffff0be5a43 in avmedia::MediaWindow::grabFrame 
(xPlayer=uno::Reference to (avmedia::qt::QtPlayer *) 0x7fffd4005ac8, 
rGraphic=empty uno::Reference)
            at 
/home/michi/development/git/libreoffice/avmedia/source/viewer/mediawindow.cxx:385
        #12357 0x00007ffff1c3282f in SdrMediaObj::getSnapshot() 
const::$_0::operator()(com::sun::star::uno::Reference<com::sun::star::media::XPlayer>
 const&) const
            (this=0x555557523ca0, rPlayer=uno::Reference to 
(avmedia::qt::QtPlayer *) 0x7fffd4005ac8) at 
/home/michi/development/git/libreoffice/svx/source/svdraw/svdomedia.cxx:195
        #12358 0x00007ffff1c327ad in std::__invoke_impl<void, 
SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> 
const&>(std::__invoke_other, SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> const&) 
(__f=..., __args=uno::Reference to (avmedia::qt::QtPlayer *) 0x7fffd4005ac8) at 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/invoke.h:61
        #12359 0x00007ffff1c3275d in std::__invoke_r<void, 
SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> 
const&>(SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> const&) 
(__fn=..., __args=uno::Reference to (avmedia::qt::QtPlayer *) 0x7fffd4005ac8) 
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/invoke.h:111
        #12360 0x00007ffff1c325d5 in 
std::_Function_handler<void(com::sun::star::uno::Reference<com::sun::star::media::XPlayer>
 const&), SdrMediaObj::getSnapshot() const::$_0>::_M_invoke
            (__functor=..., __args=uno::Reference to (avmedia::qt::QtPlayer *) 
0x7fffd4005ac8) at 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/std_function.h:290
        #12361 0x00007ffff0bebf96 in 
std::function<void(com::sun::star::uno::Reference<com::sun::star::media::XPlayer>
 const&)>::operator() (this=0x55555e9ea148, __args=uno::Reference to 
(avmedia::qt::QtPlayer *) 0x7fffd4005ac8)
            at 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/std_function.h:591
        #12362 0x00007ffff0be8191 in 
avmedia::PlayerListener::callPlayerWindowSizeAvailable (this=0x55555e9ea100, 
rPlayer=uno::Reference to (avmedia::qt::QtPlayer *) 0x7fffd4005ac8) at 
include/avmedia/mediawindow.hxx:74
        #12363 0x00007ffff0be676f in 
avmedia::PlayerListener::preferredPlayerWindowSizeAvailable 
(this=0x55555e9ea100) at 
/home/michi/development/git/libreoffice/avmedia/source/viewer/mediawindow.cxx:496
        #12364 0x00007fffdd8708f0 in avmedia::qt::QtPlayer::notifyListeners 
(this=0x7fffd4005a60) at 
/home/michi/development/git/libreoffice/avmedia/source/qt6/QtPlayer.cxx:386
        #12365 0x00007fffdd870718 in avmedia::qt::QtPlayer::notifyIfReady 
(this=0x7fffd4005a60) at 
/home/michi/development/git/libreoffice/avmedia/source/qt6/QtPlayer.cxx:324
        #12366 0x00007fffdd875636 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call(void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), avmedia::qt::QtPlayer*, 
void**)::{lambda()#1}::operator()() const (this=0x7fffffff7560) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:127
        #12367 0x00007fffdd8755b9 in 
QtPrivate::FunctorCallBase::call_internal<void, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call(void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), avmedia::qt::QtPlayer*, 
void**)::{lambda()#1}>(void**, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call(void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), avmedia::qt::QtPlayer*, 
void**)::{lambda()#1}&&) (args=0x7fffffff7930, fn=...)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:65
        #12368 0x00007fffdd875583 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call
            (f=(void (avmedia::qt::QtPlayer::*)(class avmedia::qt::QtPlayer * 
const, enum QMediaPlayer::MediaStatus)) 0x7fffdd8706c0 
<avmedia::qt::QtPlayer::notifyIfReady(QMediaPlayer::MediaStatus)>, 
o=0x7fffd4005a60, arg=0x7fffffff7930)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:126
        #12369 0x00007fffdd8754fd in QtPrivate::FunctionPointer<void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call<QtPrivate::List<QMediaPlayer::MediaStatus>,
 void>
            (f=(void (avmedia::qt::QtPlayer::*)(class avmedia::qt::QtPlayer * 
const, enum QMediaPlayer::MediaStatus)) 0x7fffdd8706c0 
<avmedia::qt::QtPlayer::notifyIfReady(QMediaPlayer::MediaStatus)>, 
o=0x7fffd4005a60, arg=0x7fffffff7930)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:174
        #12370 0x00007fffdd875426 in QtPrivate::QCallableObject<void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), 
QtPrivate::List<QMediaPlayer::MediaStatus>, void>::impl
            (which=1, this_=0x55555ea5ce20, r=0x7fffd4005a60, a=0x7fffffff7930, 
ret=0x0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:545
        #12371 0x00007fffe51050d2 in QtPrivate::QSlotObjectBase::call 
(this=0x55555ea5ce20, r=0x7fffd4005a60, a=0x7fffffff7930) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
        #12372 0x00007fffe5328554 in doActivate<false> (sender=0x555567c57080, 
signal_index=5, argv=0x7fffffff7930) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4241
        #12373 0x00007fffe531e763 in QMetaObject::activate 
(sender=0x555567c57080, m=0x7fffe29e91f8 <QMediaPlayer::staticMetaObject>, 
local_signal_index=2, argv=0x7fffffff7930)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4301
        #12374 0x00007fffe272fbab in QMetaObject::activate<void, 
QMediaPlayer::MediaStatus>
            (sender=0x555567c57080, mo=0x7fffe29e91f8 
<QMediaPlayer::staticMetaObject>, local_signal_index=2, ret=0x0, 
args=@0x7fffffff7974: QMediaPlayer::LoadedMedia) at 
qtbase/src/corelib/kernel/qobjectdefs.h:319
        #12375 0x00007fffe272a7ed in QMediaPlayer::mediaStatusChanged 
(this=0x555567c57080, _t1=QMediaPlayer::LoadedMedia) at 
qtmultimedia/src/multimedia/Multimedia_autogen/include/moc_qmediaplayer.cpp:563
        #12376 0x00007fffe272a79c in QMediaPlayerPrivate::setStatus 
(this=0x55555eaa23c0, s=QMediaPlayer::LoadedMedia) at 
/home/michi/development/git/qt5/qtmultimedia/src/multimedia/playback/qmediaplayer.cpp:118
        #12377 0x00007fffe271f553 in QPlatformMediaPlayer::mediaStatusChanged 
(this=0x7fffd4005300, status=QMediaPlayer::LoadedMedia) at 
/home/michi/development/git/qt5/qtmultimedia/src/multimedia/platform/qplatformmediaplayer.cpp:32
        #12378 0x00007fffa28f0e5c in QFFmpegMediaPlayer::mediaStatusChanged 
(this=0x7fffd40052f0, status=QMediaPlayer::LoadedMedia) at 
/home/michi/development/git/qt5/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp:131
        #12379 0x00007fffa28f1c0a in QFFmpegMediaPlayer::setMediaAsync 
(this=0x7fffd40052f0, mediaDataHolder=..., 
cancelToken=std::shared_ptr<QFFmpeg::CancelToken> (use count 3, weak count 0) = 
{...})
            at 
/home/michi/development/git/qt5/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp:269
        #12380 0x00007fffa28f36de in QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}::operator()() const 
(this=0x7fff34001870)
            at 
/home/michi/development/git/qt5/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp:211
        #12381 0x00007fffa28f3688 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, 
void**)::{lambda()#1}::operator()() const (this=0x7fffffff7d30) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:116
        #12382 0x00007fffa28f3669 in 
QtPrivate::FunctorCallBase::call_internal<void, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, 
void**)::{lambda()#1}>(void**, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, void**)::{lambda()#1}&&)
            (args=0x7fff340c3048, fn=...) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:65
        #12383 0x00007fffa28f3632 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, void**) (f=..., 
arg=0x7fff340c3048) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:115
        #12384 0x00007fffa28f35c1 in 
QtPrivate::FunctorCallable<QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}>::call<QtPrivate::List<>, 
void>(QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}&, void*, void**) (f=..., arg=0x7fff340c3048) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:337
        #12385 0x00007fffa28f350d in 
QtPrivate::QCallableObject<QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}, QtPrivate::List<>, 
void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) 
(which=1, this_=0x7fff34001860, r=0x7fffd40052f0, a=0x7fff340c3048, ret=0x0) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:547
        #12386 0x00007fffe51050d2 in QtPrivate::QSlotObjectBase::call 
(this=0x7fff34001860, r=0x7fffd40052f0, a=0x7fff340c3048) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
        #12387 0x00007fffe5312adc in QMetaCallEvent::placeMetaCall 
(this=0x7fff340c3000, object=0x7fffd40052f0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:620
        #12388 0x00007fffe5314831 in QObject::event (this=0x7fffd40052f0, 
e=0x7fff340c3000) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:1429
        #12389 0x00007fffe31e2ea0 in QApplicationPrivate::notify_helper 
(this=0x55555557cb40, receiver=0x7fffd40052f0, e=0x7fff340c3000) at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qapplication.cpp:3309
        #12390 0x00007fffe31e6da8 in QApplication::notify (this=0x55555556ea60, 
receiver=0x7fffd40052f0, e=0x7fff340c3000) at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qapplication.cpp:3259
        #12391 0x00007fffe524f159 in QCoreApplication::notifyInternal2 
(receiver=0x7fffd40052f0, event=0x7fff340c3000) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1111
        #12392 0x00007fffe524fdc9 in QCoreApplication::sendEvent 
(receiver=0x7fffd40052f0, event=0x7fff340c3000) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1551
        #12393 0x00007fffe5250d08 in QCoreApplicationPrivate::sendPostedEvents 
(receiver=0x0, event_type=0, data=0x5555555a3f80) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1891
        #12394 0x00007fffe524fc0c in QCoreApplication::sendPostedEvents 
(receiver=0x0, event_type=0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1745
        #12395 0x00007fffe5853b11 in postEventSourceDispatch (s=0x5555555ca600) 
at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:246
        #12396 0x00007fffe9f03f45 in ??? () at 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
        #12397 0x00007fffe9f06177 in ??? () at 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
        #12398 0x00007fffe9f068e0 in g_main_context_iteration () at 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
        #12399 0x00007fffe5852d4b in QEventDispatcherGlib::processEvents 
(this=0x555555558690, flags=...) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:399
        #12400 0x00007fffe4986d88 in QPAEventDispatcherGlib::processEvents 
(this=0x555555558690, flags=...) at 
/home/michi/development/git/qt5/qtbase/src/gui/platform/unix/qeventdispatcher_glib.cpp:89
        #12401 0x00007fffe61d5314 in QtInstance::ImplYield 
(this=0x5555555fa9c0, bWait=false, bHandleAllCurrentEvents=true) at 
vcl/qt6/../qt5/QtInstance.cxx:503
        #12402 0x00007fffe61d85c1 in QtInstance::DoYield (this=0x5555555fa9c0, 
bWait=false, bHandleAllCurrentEvents=true) at vcl/qt6/../qt5/QtInstance.cxx:512
        #12403 0x00007fffeec626a6 in ImplYield (i_bWait=false, 
i_bAllEvents=true) at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:385
        #12404 0x00007fffeec62967 in Scheduler::ProcessEventsToIdle () at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:435
        #12405 0x00007fffdd867acd in avmedia::qt::QtFrameGrabber::grabFrame 
(this=0x5555696d1210, fMediaTime=3) at 
/home/michi/development/git/libreoffice/avmedia/source/qt6/QtFrameGrabber.cxx:103
        #12406 0x00007fffdd867bce in non-virtual thunk to 
avmedia::qt::QtFrameGrabber::grabFrame(double) () at 
/home/michi/development/git/libreoffice/instdir/program/../program/libavmediaqt6.so
        #12407 0x00007ffff0be5a43 in avmedia::MediaWindow::grabFrame 
(xPlayer=uno::Reference to (avmedia::qt::QtPlayer *) 0x55556778be68, 
rGraphic=empty uno::Reference)
            at 
/home/michi/development/git/libreoffice/avmedia/source/viewer/mediawindow.cxx:385
        #12408 0x00007ffff1c3282f in SdrMediaObj::getSnapshot() 
const::$_0::operator()(com::sun::star::uno::Reference<com::sun::star::media::XPlayer>
 const&) const
            (this=0x5555696652b0, rPlayer=uno::Reference to 
(avmedia::qt::QtPlayer *) 0x55556778be68) at 
/home/michi/development/git/libreoffice/svx/source/svdraw/svdomedia.cxx:195
        #12409 0x00007ffff1c327ad in std::__invoke_impl<void, 
SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> 
const&>(std::__invoke_other, SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> const&) 
(__f=..., __args=uno::Reference to (avmedia::qt::QtPlayer *) 0x55556778be68) at 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/invoke.h:61
        #12410 0x00007ffff1c3275d in std::__invoke_r<void, 
SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> 
const&>(SdrMediaObj::getSnapshot() const::$_0&, 
com::sun::star::uno::Reference<com::sun::star::media::XPlayer> const&) 
(__fn=..., __args=uno::Reference to (avmedia::qt::QtPlayer *) 0x55556778be68) 
at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/invoke.h:111
        #12411 0x00007ffff1c325d5 in 
std::_Function_handler<void(com::sun::star::uno::Reference<com::sun::star::media::XPlayer>
 const&), SdrMediaObj::getSnapshot() const::$_0>::_M_invoke
            (__functor=..., __args=uno::Reference to (avmedia::qt::QtPlayer *) 
0x55556778be68) at 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/std_function.h:290
        #12412 0x00007ffff0bebf96 in 
std::function<void(com::sun::star::uno::Reference<com::sun::star::media::XPlayer>
 const&)>::operator() (this=0x7ffeac001728, __args=uno::Reference to 
(avmedia::qt::QtPlayer *) 0x55556778be68)
            at 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/std_function.h:591
        #12413 0x00007ffff0be8191 in 
avmedia::PlayerListener::callPlayerWindowSizeAvailable (this=0x7ffeac0016e0, 
rPlayer=uno::Reference to (avmedia::qt::QtPlayer *) 0x55556778be68) at 
include/avmedia/mediawindow.hxx:74
        #12414 0x00007ffff0be676f in 
avmedia::PlayerListener::preferredPlayerWindowSizeAvailable 
(this=0x7ffeac0016e0) at 
/home/michi/development/git/libreoffice/avmedia/source/viewer/mediawindow.cxx:496
        #12415 0x00007fffdd8708f0 in avmedia::qt::QtPlayer::notifyListeners 
(this=0x55556778be00) at 
/home/michi/development/git/libreoffice/avmedia/source/qt6/QtPlayer.cxx:386
        #12416 0x00007fffdd870718 in avmedia::qt::QtPlayer::notifyIfReady 
(this=0x55556778be00) at 
/home/michi/development/git/libreoffice/avmedia/source/qt6/QtPlayer.cxx:324
        #12417 0x00007fffdd875636 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call(void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), avmedia::qt::QtPlayer*, 
void**)::{lambda()#1}::operator()() const (this=0x7fffffffa280) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:127
        #12418 0x00007fffdd8755b9 in 
QtPrivate::FunctorCallBase::call_internal<void, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call(void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), avmedia::qt::QtPlayer*, 
void**)::{lambda()#1}>(void**, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call(void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), avmedia::qt::QtPlayer*, 
void**)::{lambda()#1}&&) (args=0x7fffffffa650, fn=...)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:65
        #12419 0x00007fffdd875583 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul>, 
QtPrivate::List<QMediaPlayer::MediaStatus>, void, void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call
            (f=(void (avmedia::qt::QtPlayer::*)(class avmedia::qt::QtPlayer * 
const, enum QMediaPlayer::MediaStatus)) 0x7fffdd8706c0 
<avmedia::qt::QtPlayer::notifyIfReady(QMediaPlayer::MediaStatus)>, 
o=0x55556778be00, arg=0x7fffffffa650)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:126
        #12420 0x00007fffdd8754fd in QtPrivate::FunctionPointer<void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus)>::call<QtPrivate::List<QMediaPlayer::MediaStatus>,
 void>
            (f=(void (avmedia::qt::QtPlayer::*)(class avmedia::qt::QtPlayer * 
const, enum QMediaPlayer::MediaStatus)) 0x7fffdd8706c0 
<avmedia::qt::QtPlayer::notifyIfReady(QMediaPlayer::MediaStatus)>, 
o=0x55556778be00, arg=0x7fffffffa650)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:174
        #12421 0x00007fffdd875426 in QtPrivate::QCallableObject<void 
(avmedia::qt::QtPlayer::*)(QMediaPlayer::MediaStatus), 
QtPrivate::List<QMediaPlayer::MediaStatus>, void>::impl
            (which=1, this_=0x55555ebc9d50, r=0x55556778be00, a=0x7fffffffa650, 
ret=0x0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:545
        #12422 0x00007fffe51050d2 in QtPrivate::QSlotObjectBase::call 
(this=0x55555ebc9d50, r=0x55556778be00, a=0x7fffffffa650) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
        #12423 0x00007fffe5328554 in doActivate<false> (sender=0x5555696e2b20, 
signal_index=5, argv=0x7fffffffa650) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4241
        #12424 0x00007fffe531e763 in QMetaObject::activate 
(sender=0x5555696e2b20, m=0x7fffe29e91f8 <QMediaPlayer::staticMetaObject>, 
local_signal_index=2, argv=0x7fffffffa650)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4301
        #12425 0x00007fffe272fbab in QMetaObject::activate<void, 
QMediaPlayer::MediaStatus>
            (sender=0x5555696e2b20, mo=0x7fffe29e91f8 
<QMediaPlayer::staticMetaObject>, local_signal_index=2, ret=0x0, 
args=@0x7fffffffa694: QMediaPlayer::LoadedMedia) at 
qtbase/src/corelib/kernel/qobjectdefs.h:319
        #12426 0x00007fffe272a7ed in QMediaPlayer::mediaStatusChanged 
(this=0x5555696e2b20, _t1=QMediaPlayer::LoadedMedia) at 
qtmultimedia/src/multimedia/Multimedia_autogen/include/moc_qmediaplayer.cpp:563
        #12427 0x00007fffe272a79c in QMediaPlayerPrivate::setStatus 
(this=0x5555696ece40, s=QMediaPlayer::LoadedMedia) at 
/home/michi/development/git/qt5/qtmultimedia/src/multimedia/playback/qmediaplayer.cpp:118
        #12428 0x00007fffe271f553 in QPlatformMediaPlayer::mediaStatusChanged 
(this=0x55556961c710, status=QMediaPlayer::LoadedMedia) at 
/home/michi/development/git/qt5/qtmultimedia/src/multimedia/platform/qplatformmediaplayer.cpp:32
        #12429 0x00007fffa28f0e5c in QFFmpegMediaPlayer::mediaStatusChanged 
(this=0x55556961c700, status=QMediaPlayer::LoadedMedia) at 
/home/michi/development/git/qt5/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp:131
        #12430 0x00007fffa28f1c0a in QFFmpegMediaPlayer::setMediaAsync 
(this=0x55556961c700, mediaDataHolder=..., 
cancelToken=std::shared_ptr<QFFmpeg::CancelToken> (use count 3, weak count 0) = 
{...})
            at 
/home/michi/development/git/qt5/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp:269
        #12431 0x00007fffa28f36de in QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}::operator()() const 
(this=0x7fff3c354ce0)
            at 
/home/michi/development/git/qt5/qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp:211
        #12432 0x00007fffa28f3688 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, 
void**)::{lambda()#1}::operator()() const (this=0x7fffffffaa50) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:116
        #12433 0x00007fffa28f3669 in 
QtPrivate::FunctorCallBase::call_internal<void, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, 
void**)::{lambda()#1}>(void**, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, void**)::{lambda()#1}&&)
            (args=0x7fff3c0045b8, fn=...) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:65
        #12434 0x00007fffa28f3632 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}>::call(QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}&, void**) (f=..., 
arg=0x7fff3c0045b8) at qtbase/src/corelib/kernel/qobjectdefs_impl.h:115
        #12435 0x00007fffa28f35c1 in 
QtPrivate::FunctorCallable<QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}>::call<QtPrivate::List<>, 
void>(QFFmpegMediaPlayer::setMedia(QUrl const&, QIODevice*)::$_0::operator()() 
const::{lambda()#1}&, void*, void**) (f=..., arg=0x7fff3c0045b8) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:337
        #12436 0x00007fffa28f350d in 
QtPrivate::QCallableObject<QFFmpegMediaPlayer::setMedia(QUrl const&, 
QIODevice*)::$_0::operator()() const::{lambda()#1}, QtPrivate::List<>, 
void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) 
(which=1, this_=0x7fff3c354cd0, r=0x55556961c700, a=0x7fff3c0045b8, ret=0x0) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:547
        #12437 0x00007fffe51050d2 in QtPrivate::QSlotObjectBase::call 
(this=0x7fff3c354cd0, r=0x55556961c700, a=0x7fff3c0045b8) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
        #12438 0x00007fffe5312adc in QMetaCallEvent::placeMetaCall 
(this=0x7fff3c004570, object=0x55556961c700) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:620
        #12439 0x00007fffe5314831 in QObject::event (this=0x55556961c700, 
e=0x7fff3c004570) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:1429
        #12440 0x00007fffe31e2ea0 in QApplicationPrivate::notify_helper 
(this=0x55555557cb40, receiver=0x55556961c700, e=0x7fff3c004570) at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qapplication.cpp:3309
        #12441 0x00007fffe31e6da8 in QApplication::notify (this=0x55555556ea60, 
receiver=0x55556961c700, e=0x7fff3c004570) at 
/home/michi/development/git/qt5/qtbase/src/widgets/kernel/qapplication.cpp:3259
        #12442 0x00007fffe524f159 in QCoreApplication::notifyInternal2 
(receiver=0x55556961c700, event=0x7fff3c004570) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1111
        #12443 0x00007fffe524fdc9 in QCoreApplication::sendEvent 
(receiver=0x55556961c700, event=0x7fff3c004570) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1551
        #12444 0x00007fffe5250d08 in QCoreApplicationPrivate::sendPostedEvents 
(receiver=0x0, event_type=0, data=0x5555555a3f80) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1891
        #12445 0x00007fffe524fc0c in QCoreApplication::sendPostedEvents 
(receiver=0x0, event_type=0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1745
        #12446 0x00007fffe5853b11 in postEventSourceDispatch (s=0x5555555ca600) 
at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:246
        #12447 0x00007fffe9f03f45 in ??? () at 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
        #12448 0x00007fffe9f06177 in ??? () at 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
        #12449 0x00007fffe9f068e0 in g_main_context_iteration () at 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
        #12450 0x00007fffe5852d4b in QEventDispatcherGlib::processEvents 
(this=0x555555558690, flags=...) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:399
        #12451 0x00007fffe4986d88 in QPAEventDispatcherGlib::processEvents 
(this=0x555555558690, flags=...) at 
/home/michi/development/git/qt5/qtbase/src/gui/platform/unix/qeventdispatcher_glib.cpp:89
        #12452 0x00007fffe61d52c2 in QtInstance::ImplYield 
(this=0x5555555fa9c0, bWait=true, bHandleAllCurrentEvents=false) at 
vcl/qt6/../qt5/QtInstance.cxx:501
        #12453 0x00007fffe61d85c1 in QtInstance::DoYield (this=0x5555555fa9c0, 
bWait=true, bHandleAllCurrentEvents=false) at vcl/qt6/../qt5/QtInstance.cxx:512
        #12454 0x00007fffeec626a6 in ImplYield (i_bWait=true, 
i_bAllEvents=false) at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:385
        #12455 0x00007fffeec61fbf in Application::Yield () at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:488
        #12456 0x00007fffeec61da0 in Application::Execute () at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:360
        #12457 0x00007ffff7b28029 in desktop::Desktop::Main 
(this=0x7fffffffd620) at 
/home/michi/development/git/libreoffice/desktop/source/app/app.cxx:1680
        #12458 0x00007fffeec83ee6 in ImplSVMain () at 
/home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:231
        #12459 0x00007fffeec85b19 in SVMain () at 
/home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:249
        #12460 0x00007ffff7ba238a in soffice_main () at 
/home/michi/development/git/libreoffice/desktop/source/app/sofficemain.cxx:122
        #12461 0x00005555555559fd in sal_main () at 
/home/michi/development/git/libreoffice/desktop/source/app/main.c:51
        #12462 0x00005555555559d7 in main (argc=2, argv=0x7fffffffd828) at 
/home/michi/development/git/libreoffice/desktop/source/app/main.c:49
    
    (Note that different QtPlayer objects are involved, i.e. it's not
    always the same QtPlayer object whose signal triggers another
    recursive call.)
    
    Backtrace when using the gstreamer backend using
    QT_MEDIA_BACKEND=gstreamer was comparable.
    
    [1] https://doc.qt.io/qt-6/qmediaplayer.html#mediaStatus-prop
    
    Change-Id: I8d928d0fd124d9b3f4f1947efe0d4d690e1d8851
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183867
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>
    Tested-by: Jenkins

diff --git a/avmedia/source/qt6/QtPlayer.cxx b/avmedia/source/qt6/QtPlayer.cxx
index b1d5fbb85370..1be226b248dd 100644
--- a/avmedia/source/qt6/QtPlayer.cxx
+++ b/avmedia/source/qt6/QtPlayer.cxx
@@ -9,6 +9,7 @@
 
 #include <sal/config.h>
 
+#include <QtCore/QCoreApplication>
 #include <QtCore/QUrl>
 #include <QtMultimedia/QAudioOutput>
 #include <QtMultimedia/QMediaMetaData>
@@ -40,7 +41,6 @@ namespace avmedia::qt
 {
 QtPlayer::QtPlayer()
     : QtPlayer_BASE(m_aMutex)
-    , m_lListener(m_aMutex)
     , m_pMediaWidgetParent(nullptr)
 {
 }
@@ -178,6 +178,19 @@ awt::Size SAL_CALL QtPlayer::getPreferredPlayerWindowSize()
     osl::MutexGuard aGuard(m_aMutex);
 
     assert(m_xMediaPlayer);
+
+    // if media hasn't been loaded yet, ensure this happens, since
+    // retrieving resolution doesn't work reliably otherwise
+    if (m_xMediaPlayer->mediaStatus() == QMediaPlayer::LoadingMedia)
+    {
+        m_xMediaPlayer->play();
+
+        while (m_xMediaPlayer->mediaStatus() == QMediaPlayer::LoadingMedia)
+            QCoreApplication::processEvents();
+
+        m_xMediaPlayer->stop();
+    }
+
     const QMediaMetaData aMetaData = m_xMediaPlayer->metaData();
     const QVariant aResolutionVariant = 
aMetaData.value(QMediaMetaData::Resolution);
     if (aResolutionVariant.canConvert<QSize>())
@@ -240,28 +253,6 @@ uno::Reference<media::XFrameGrabber> SAL_CALL 
QtPlayer::createFrameGrabber()
     return xFrameGrabber;
 }
 
-void SAL_CALL
-QtPlayer::addPlayerListener(const 
css::uno::Reference<css::media::XPlayerListener>& rListener)
-{
-    
m_lListener.addInterface(cppu::UnoType<css::media::XPlayerListener>::get(), 
rListener);
-    if (isReadyToPlay())
-    {
-        css::lang::EventObject aEvent;
-        aEvent.Source = getXWeak();
-        rListener->preferredPlayerWindowSizeAvailable(aEvent);
-    }
-    else
-    {
-        installNotify();
-    }
-}
-
-void SAL_CALL
-QtPlayer::removePlayerListener(const 
css::uno::Reference<css::media::XPlayerListener>& rListener)
-{
-    
m_lListener.removeInterface(cppu::UnoType<css::media::XPlayerListener>::get(), 
rListener);
-}
-
 OUString SAL_CALL QtPlayer::getImplementationName()
 {
     return u"com.sun.star.comp.avmedia.Player_Qt"_ustr;
@@ -296,36 +287,6 @@ QtPlayer::~QtPlayer()
     m_xMediaPlayer.reset();
 }
 
-bool QtPlayer::isReadyToPlay()
-{
-    assert(m_xMediaPlayer);
-    QMediaPlayer::MediaStatus eStatus = m_xMediaPlayer->mediaStatus();
-    return eStatus == QMediaPlayer::BufferingMedia || eStatus == 
QMediaPlayer::BufferedMedia
-           || eStatus == QMediaPlayer::LoadedMedia || eStatus == 
QMediaPlayer::EndOfMedia;
-}
-
-void QtPlayer::installNotify()
-{
-    connect(m_xMediaPlayer.get(), &QMediaPlayer::mediaStatusChanged, this,
-            &QtPlayer::notifyIfReady);
-}
-
-void QtPlayer::uninstallNotify()
-{
-    disconnect(m_xMediaPlayer.get(), &QMediaPlayer::mediaStatusChanged, this,
-               &QtPlayer::notifyIfReady);
-}
-
-void QtPlayer::notifyIfReady(QMediaPlayer::MediaStatus)
-{
-    if (isReadyToPlay())
-    {
-        rtl::Reference<QtPlayer> xThis(this);
-        xThis->notifyListeners();
-        xThis->uninstallNotify();
-    }
-}
-
 void QtPlayer::createMediaPlayerWidget()
 {
     assert(m_xMediaPlayer);
@@ -368,25 +329,6 @@ void QtPlayer::createMediaPlayerWidget()
     pLayout->addWidget(pWidget);
 }
 
-void QtPlayer::notifyListeners()
-{
-    comphelper::OInterfaceContainerHelper2* pContainer
-        = 
m_lListener.getContainer(cppu::UnoType<css::media::XPlayerListener>::get());
-    if (!pContainer)
-        return;
-
-    css::lang::EventObject aEvent;
-    aEvent.Source = getXWeak();
-
-    comphelper::OInterfaceIteratorHelper2 pIterator(*pContainer);
-    while (pIterator.hasMoreElements())
-    {
-        css::uno::Reference<css::media::XPlayerListener> xListener(
-            static_cast<css::media::XPlayerListener*>(pIterator.next()));
-        xListener->preferredPlayerWindowSizeAvailable(aEvent);
-    }
-}
-
 } // namespace
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/avmedia/source/qt6/QtPlayer.hxx b/avmedia/source/qt6/QtPlayer.hxx
index 07d1de183c46..bb35701f100f 100644
--- a/avmedia/source/qt6/QtPlayer.hxx
+++ b/avmedia/source/qt6/QtPlayer.hxx
@@ -23,9 +23,7 @@
 
 namespace avmedia::qt
 {
-typedef cppu::WeakComponentImplHelper<css::media::XPlayer, 
css::media::XPlayerNotifier,
-                                      css::lang::XServiceInfo>
-    QtPlayer_BASE;
+typedef cppu::WeakComponentImplHelper<css::media::XPlayer, 
css::lang::XServiceInfo> QtPlayer_BASE;
 
 class QtPlayer final : public QObject, public cppu::BaseMutex, public 
QtPlayer_BASE
 {
@@ -55,12 +53,6 @@ public:
         SAL_CALL createPlayerWindow(const css::uno::Sequence<css::uno::Any>& 
rArgs) override;
     virtual css::uno::Reference<css::media::XFrameGrabber> SAL_CALL 
createFrameGrabber() override;
 
-    // XPlayerNotifier
-    virtual void SAL_CALL
-    addPlayerListener(const css::uno::Reference<css::media::XPlayerListener>& 
rListener) override;
-    virtual void SAL_CALL removePlayerListener(
-        const css::uno::Reference<css::media::XPlayerListener>& rListener) 
override;
-
     // XServiceInfo
     virtual OUString SAL_CALL getImplementationName() override;
     virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) 
override;
@@ -70,7 +62,6 @@ public:
 
 private:
     std::unique_ptr<QMediaPlayer> m_xMediaPlayer;
-    comphelper::OMultiTypeInterfaceContainerHelper2 m_lListener;
 
     // area to use for the player widget
     css::awt::Rectangle m_aPlayerWidgetRect;
@@ -78,12 +69,6 @@ private:
     QWidget* m_pMediaWidgetParent;
 
     void createMediaPlayerWidget();
-    bool isReadyToPlay();
-
-    void installNotify();
-    void uninstallNotify();
-    void notifyListeners();
-    void notifyIfReady(QMediaPlayer::MediaStatus eStatus);
 };
 
 } // namespace avmedia::qt

Reply via email to