[Interest] Final QAbstractVideoSurface questions

Jason H scorp1us at yahoo.com
Fri Feb 14 21:53:31 CET 2014


Recap: I am setting up a QML element to intercept frames from a VideoSource going to a VideoOutput. It looks like:
{VideoSource}-frames-> {MySurfaceImplementation}-frames->{VideoOutput}

Thanks to all the people here, I got the first part of it working. Now I'm confused on the last half. 

MySurfaceImplementation (called VideoSurface):

1. takes a source (MediaPlayer or Camera}
2. takes various settings related to the frame/image grabbing and processing
3. takes the frame from source and relays them to a dest (VideoOutput)

Currently 1 & 2 work 3 is proving problematic.

When VideoSurface::present is called, I attempt to present frames to dest, immediately and always, but these never appear. And present() does not indicate an error. In fact, I don't get any errors. 

I am wondering what is needed to get this working. I investigated QMediaService, which reads: "In general, implementing a QMediaService is outside of the scope of this documentation and support on the relevant mailing lists or IRC channels should be sought."

So now I am here. I just want to provide frames to QVideoOutput, the same ones from the MediaPlayer. I don't care about sound.

One thing that might be very useful and gereral is a MediaTee element and class, where you take one source, and have two dests, so that I can get a frame and process it and the VideoOutput can continue unrestricted. Without it, I'm trying to patch my VideoSurface class the media graph. 

What do I need to do to send the frame I have to the VideoOutput?

Many, many thanks in advance!

------

void VideoSurface::setSource(QObject *source)
{
m_source = source;
if (m_source)
{
QMediaPlayer *player = qvariant_cast<QMediaPlayer*>(m_source->property("mediaObject"));
qDebug() << "videoSurface::setDest() player" << player;

if (player)
{
QVideoRendererControl* rendererControl = player->service()->requestControl<QVideoRendererControl*>();
if (rendererControl)
{
rendererControl->setSurface(this);
} else {
qDebug() << "VideoSurface::setSource()" << source <<  " Unable to get QVideoRenderControl for video integration.";
}
} else {
qDebug() << "VideoSurface::setSource()" << source <<  " Unable to get player " << player;
}
}
}
------
bool VideoSurface::start ( const QVideoSurfaceFormat & format )
{
qDebug() << "videoSurface::start()";
if (m_dest)
{
bool ret = ((QAbstractVideoSurface*)m_dest)->start(format);
if (!ret)
{
qDebug() << "VideoSurface::start() dest: " << m_dest <<  " start() failed";
}
return ret && QAbstractVideoSurface::start(format);
}
return QAbstractVideoSurface::start(format);
}

------

bool VideoSurface::present ( const QVideoFrame & videoFrame )
{
// qDebug() << "videoSurface::present()" << m_frameCount << m_emitRate;
// present the frame to the destiantion first, some don't block, so this might be quick. At least on those
if (m_dest) // cases we won't slow it down.
{
bool ret = ((QAbstractVideoSurface*)m_dest)->present(videoFrame);
if (!ret)
{
qDebug() << "VideoSurface::present() dest: " << m_dest <<  " present() failed, reason:" << ((QAbstractVideoSurface*)m_dest)->error();
}
} 
/* conversion code follows */
}
------


-QML--
Rectangle{
width:360
height:360

MediaPlayer{ id:player; source:"vin4.mp4"; autoPlay:true }
VideoSurface{ id:surface; source:player; dest:viewer ;emitRate:10  emitImages:true}
VideoOutput{ id:viewer; source:surface; anchors.fill:parent}
}




More information about the Interest mailing list