Hello everyone,
I am trying to change the code of ffplay (which is a simple video player
provided by the ffmpeg library) so, that it converts the current video
frame which is an YUV overlay into RGB or RGBA format and copies it to a
buffer in system memory. This is then used to create/update an openGL
texture, but in an ada progam which uses the ffplay functionality as
library. So I have only that buffer and do not want to mess around with
openGL in the SDL-part of the program.
I played around with the different ways of creating surfaces, but only
SDL_SetVideoMode worked so far, that I could read out the pixelbuffer of
the surface and copy it to the texture buffer. But that way I had
another window, which I don’t need.
It didn’t work with SDL_CreateRGBSurface () or SDL_CreateRGBSurfaceFrom.
When I used these two, though without calling SDL_SetVideoMode first,
but I got my surface. Only when I called SDL_DisplayYUVOverlay(vp->bmp,
&rect) it didn’t update the pixelbuffer of that surface.
The overlay is always created with the one surface which I get in using
one of these 3 functions, mentioned above.
The overlay is created like this:
vp->bmp = SDL_CreateYUVOverlay(is->video_st->codec->width,
is->video_st->codec->height, SDL_YV12_OVERLAY, screen);
The overlay definitely contains the current video frame (though not in
RGB of course).
So is there a way of calling SetVideoMode without creating a window? The
main window is already created in the ADA part and I only need the video
image in a texture buffer anyway.
If not, since I already have the YUVOverlay containing valid data, is
there a convenient way of converting it to RGB or RGBA into the buffer
where I need it? I think I can not use SDL_DisplayYUVOverlay(vp->bmp,
&rect) because it calls a function pointer in the end:
return overlay->hwfuncs->Display(current_video, overlay, &src, &dst);
But it does nothing when I do not use SetVideoMode (which will give me
the additional window)
And I don’t have access to that part of the overlay struct, or at least
I shouldn’t, it’s not called “private_yuvhwfuncs” for nothing.
Any suggestions greatly appreciated, thanks in advance.
Kind regards,
Denis