[Interest] Faster way of rendering QOpenGLFramebufferObject to image

Andy asmaloney at gmail.com
Wed Jul 14 21:38:10 CEST 2021


Yet another "not sure if this applies, but..."

Maybe take a look at what QRenderCapture is doing in Qt3D? It allows you to
capture a QImage per frame, so it might have some of the bit
processing/manipulation you're looking for.

I'm using it to capture video by saving images to a temp dir and then
processing them using ffmpeg.

I use QtConcurrent::run() to do image processing (e.g. adding an overlay) &
writing so it doesn't affect the main thread doing the capturing.

---
Andy Maloney  //  https://asmaloney.com
twitter ~ @asmaloney <https://twitter.com/asmaloney>



On Tue, Jul 13, 2021 at 9:32 AM Nuno Santos <nuno.santos at imaginando.pt>
wrote:

> Elvis,
>
> Thanks for sharing your thoughts. It makes sense.
>
> I need to dive into the toImage function, try to read directly the bytes
> from the FBO and see if that has any performance impact.
>
> Best regards,
>
> Nuno
>
> > On 13 Jul 2021, at 14:10, Elvis Stansvik <elvstone at gmail.com> wrote:
> >
> > Hi Nuno,
> >
> > I'm really out of my waters here, but, provided you don't need to hold
> > on to each AVFrame after you are "done with it", you could perhaps
> > avoid having to allocate a QImage for each frame (which toImage forces
> > you to do) by just allocating a a single AVFrame and a single memory
> > buffer for it, and then do what toImage does, which is make sure the
> > FBO is bound and read the pixels off of it with glReadPixels. Then you
> > could read the pixels straight into the memory buffer used by your
> > AVFrame.
> >
> > That way you would save the overhead of a new QImage being allocated
> > each time, which might speed things up..?
> >
> > Just ideas here. Have not worked with GL or ffmpeg before.
> >
> > Elvis
> >
> > Den tis 13 juli 2021 kl 11:22 skrev Nuno Santos <
> nuno.santos at imaginando.pt>:
> >>
> >> Hi,
> >>
> >> I’m trying to capture the content of an FBO to a video file. This video
> file should contain the animations generated by a qml scene.
> >>
> >> To do this, I’m recurring to QOpenGLFramebufferObject class toImage()
> method.
> >>
> >> My scene is being drawn at 1920x1080. Each call to toImage takes 30 ms!
> :(
> >>
> >> If I want to render to file at 60 fps, ideally, this call would need to
> take less than 16 ms to give me room to do other operations, such as video
> encoding and the actual render.
> >>
> >> As anyone been here before? What other strategies are available to copy
> the FBO data to an image?
> >>
> >> I’m using libav to encode the video file, therefor I need to fill an
> AVFrame. Right now I’m filling the AVFrame from the QImage generated by the
> FBO toImage method.
> >>
> >> Does any one knows a method of filling an AVFrame directly from texture
> data?
> >>
> >> Thanks
> >>
> >> Best regards,
> >>
> >> Nuno
> >> _______________________________________________
> >> Interest mailing list
> >> Interest at qt-project.org
> >> https://lists.qt-project.org/listinfo/interest
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20210714/0b370319/attachment.html>


More information about the Interest mailing list