Streaming video to OpenGl texture

I would like to know if there is a better way to stream a video file (e.g. AVI) to an OpenGl texture than what one of the Nehe tutorials suggests (i.e using vfw and AVIStreamGetFrame).

My problem with this is that a lot of codecs are not compatible with vfw and it is quite slow.

Of course, I can do this with DirectX and stream the video to a DirectDraw surface then copy every frame from there to an OpenGl texture. But is there a way to make this copy inside GPU memory ('blit') and without involving a much more costly download from GPU than upload it back again?