What's the fast way to play video?

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 );
			
			}