PDA

View Full Version : What's the fast way to play video?



v770729
03-25-2015, 12:23 AM
I want to use OpenGL to play video, and the I try to create glTexImage2D texture and update using glTexSubImage2D.
but this way is too slow to run when I play 1080P video, so I find FBO can do it faster, but I don't know how to use it to render texture.
I use OpenCV getting video every frame ,this is some parts of my code:

init function:


// Generate a new texture
glGenTextures(1, &textureID);

// Bind the texture to a name
glBindTexture(GL_TEXTURE_2D, textureID);

// Set texture clamping method
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

// Set texture interpolation method to use linear interpolation (no MIPMAPS)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

// Specify the texture specification
glTexImage2D(GL_TEXTURE_2D, // Type of texture
0, // Pyramid level (for mip-mapping) - 0 is the top level
3, // Image colour depth
1920, // Image width
1080, // Image height
0, // Border width in pixels (can either be 1 or 0)
GL_RGB, // Image format (i.e. RGB, RGBA, BGR etc.)
GL_UNSIGNED_BYTE, // Image data type
NULL); // The actual image data itself

// setup FBO
glGenFramebuffers( 1, &FFrameBuffer );
glBindFramebuffer( GL_FRAMEBUFFER, FFrameBuffer );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0 );
GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers
glBindFramebuffer( GL_FRAMEBUFFER, 0 );

//create video
capture = cvCreateFileCapture(HDFileName);




update function:


if(cvGrabFrame(capture))
{

IplImage *frame = cvQueryFrame(capture);
cvFlip(frame, NULL, -1);

GLubyte *texture_data = (unsigned char*)frame->imageData;

glBindFramebuffer( GL_FRAMEBUFFER, FFrameBuffer );

//how to write GLubyte data to Framebuffer?

glBindFramebuffer( GL_FRAMEBUFFER, 0 );

}