in qt5 i could call mediaPlayerP->setVideoOutput(const QList<QVideoSink *> 
&sinks)
this is no longer available, unless enough of us complain, i guess. well here i 
am.

my media player app can output to 3 different scenes in 3 different windows. 
with qt6 it can no longer do that.

i thought i might be able to derive QVideoSink, and just make a 
"CMultiplexVideoSink" out of it, which is an accepted trick to get a 
QCameraDevice to be capable of sending its output to multiple destinations, but 
you can't derive from QVideoSink because there are no virtual methods :(

so that method won't work for media player (also won't work for camera, see my 
other post on that.

how am i supposed to do this now?

next question:
if one has a requirement to have a video's dimensions and duration BEFORE 
playing the video (eg: to create a buffer, resize a window, or to set up a 
timeline GUI that shows the proper end time), an acceptable method in the past 
was to "preroll" the video by starting to play it with no visible or audible 
interface, start it (secretly) playing, spin an event loop waiting for the 
messages "QAbstractVideoSurface::surfaceFormatChanged" and 
"QMediaPlayer::durationChanged", and when received, store the data, tear it all 
down, and THEN present the interface and start playing the video.

but... there is no surfaceFormatChanged signal in QVideoSink.

does metadata actually work now to the point where i can grab the dimensions 
and duration without prerolling the movie?

also, and this seems to be something rather important, there used to be a " 
QMediaPlayer::error" signal that one could listen for. it's gone. how do we 
know when an error occurs now?

similar to above, when constructing a QGraphicsScene with a QVideoGraphicsItem 
that was mapped from a QImage (not from a video), then, at the first 
presentation, one could ask the surface if it were active, and if not, one 
would have to call surfaceP->start() (do we need to do this any more?) then one 
would spin a bit on an event loop waiting for  handleNativeSizeChanged, so the 
graphicsItem could know the proper dimensions, so it would not first present 
with wrong dimensions..

like this:
void                            CG_Overlay::present(
        QtAbstractVideoSurface  *surfaceP,
        const QVideoFrame&      frame)
{
        #if _QT6_
        {
                QSize           vidSize(surfaceP->videoSize());

                CF_ASSERT(!vidSize.isEmpty());
        }
        #else
        if (!surfaceP->isActive()) {
                bool                    
startedB(surfaceP->start(surfaceFormat(frame)));
                CTimerSince             timer;

                CF_ASSERT(startedB);

                //      wait for dimensions to get got
                //      so the first presentation has
                //      correct aspect ratio
                setHasDimensions(false);

                while (!hasDimensions() && !QtFireTimersUntilExpire(timer)) {}
        }
        #endif

        //      if you can't get the CDG image to appear for
        //      presentation, see comment in CPixels::hqx_blit()
        #if _QT6_
                surfaceP->newVideoFrame(frame);
        #else
                surfaceP->present(frame);
        #endif
}

in the above, QtAbstractVideoSurface is a QVideoSink., and the first assert 
fires (vidSize is in fact empty)

in qt6 there isn't a way to do this :(

what am i missing?

-dave
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to