title: Display ffmpeg frames on opgel texture
body: <p>I am using <code>Dranger</code> tutorial01 (<code>ffmpeg</code>) to decode the video and get <code>AVI</code> frames. I want to use <code>OpenGL</code> to display the video.</p>
  
  <p><a href="http://dranger.com/ffmpeg/tutorial01.html" rel="nofollow noreferrer">http://dranger.com/ffmpeg/tutorial01.html</a></p>
  
  <p>The main function is as follows:</p>
  
  <pre><code>int main (int argc, char** argv) {
  // opengl stuff
  glutInit(&amp;argc, argv);
  glutInitDisplayMode(GLUT_RGBA);
  glutInitWindowSize(800, 600);
  glutCreateWindow("Hello GL");
  
  glutReshapeFunc(changeViewport);
  glutDisplayFunc(render);
  
  GLenum err = glewInit();
  if(GLEW_OK !=err){
      fprintf(stderr, "GLEW error");
      return 1;
  }
  
  glClear(GL_COLOR_BUFFER_BIT);
  
  
  glEnable(GL_TEXTURE_2D);
  GLuint texture;
  glGenTextures(1, &amp;texture); //Make room for our texture
  glBindTexture(GL_TEXTURE_2D, texture);
  
  //ffmpeg stuff
  
   AVFormatContext *pFormatCtx = NULL;
   int             i, videoStream;
   AVCodecContext  *pCodecCtx = NULL;
   AVCodec         *pCodec = NULL;
   AVFrame         *pFrame = NULL; 
   AVFrame         *pFrameRGB = NULL;
   AVPacket        packet;
   int             frameFinished;
   int             numBytes;
   uint8_t         *buffer = NULL;
  
   AVDictionary    *optionsDict = NULL;
  
  
   if(argc &lt; 2) {
  printf("Please provide a movie file\n");
  return -1;
   }
   // Register all formats and codecs
  
  av_register_all();
  
   // Open video file
   if(avformat_open_input(&amp;pFormatCtx, argv[1], NULL, NULL)!=0)
     return -1; // Couldn't open file
  
  // Retrieve stream information
  
  if(avformat_find_stream_info(pFormatCtx, NULL)&lt;0)
  return -1; // Couldn't find stream information
  
  // Dump information about file onto standard error
   av_dump_format(pFormatCtx, 0, argv[1], 0);
  
  // Find the first video stream
  
  videoStream=-1;
   for(i=0; i&lt;pFormatCtx-&gt;nb_streams; i++)
  if(pFormatCtx-&gt;streams[i]-&gt;codec-&gt;codec_type==AVMEDIA_TYPE_VIDEO) {
    videoStream=i;
    break;
  }
   if(videoStream==-1)
  return -1; // Didn't find a video stream
  
   // Get a pointer to the codec context for the video stream
   pCodecCtx=pFormatCtx-&gt;streams[videoStream]-&gt;codec;
  
   // Find the decoder for the video stream
   pCodec=avcodec_find_decoder(pCodecCtx-&gt;codec_id);
   if(pCodec==NULL) {
     fprintf(stderr, "Unsupported codec!\n");
     return -1; // Codec not found
   }
   // Open codec
  if(avcodec_open2(pCodecCtx, pCodec, &amp;optionsDict)&lt;0)
     return -1; // Could not open codec
  
   // Allocate video frame
   pFrame=av_frame_alloc();
  
   // Allocate an AVFrame structure
  pFrameRGB=av_frame_alloc();
  if(pFrameRGB==NULL)
  return -1;
  
   // Determine required buffer size and allocate buffer
   numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx-&gt;width,
                pCodecCtx-&gt;height);
   buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
  
  struct SwsContext      *sws_ctx = sws_getContext(pCodecCtx-&gt;width,
             pCodecCtx-&gt;height, pCodecCtx-&gt;pix_fmt, 800,
             600, PIX_FMT_RGB24, SWS_BICUBIC, NULL,
             NULL, NULL);
  
  
   // Assign appropriate parts of buffer to image planes in pFrameRGB
   // Note that pFrameRGB is an AVFrame, but AVFrame is a superset
   // of AVPicture
   avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,
       pCodecCtx-&gt;width, pCodecCtx-&gt;height);
  
   // Read frames and save first five frames to disk
   i=0;
   while(av_read_frame(pFormatCtx, &amp;packet)&gt;=0) {
  
  
  // Is this a packet from the video stream?
  if(packet.stream_index==videoStream) {
    // Decode video frame
    avcodec_decode_video2(pCodecCtx, pFrame, &amp;frameFinished, 
             &amp;packet);
  
    // Did we get a video frame?
    if(frameFinished) {
  // Convert the image from its native format to RGB
    /*  sws_scale
      (
          sws_ctx,
          (uint8_t const * const *)pFrame-&gt;data,
          pFrame-&gt;linesize,
          0,
          pCodecCtx-&gt;height,
          pFrameRGB-&gt;data,
          pFrameRGB-&gt;linesize
      );
     */
  sws_scale(sws_ctx, pFrame-&gt;data, pFrame-&gt;linesize, 0, pCodecCtx-&gt;height, pFrameRGB-&gt;data, pFrameRGB-&gt;linesize);
    // additional opengl
      glBindTexture(GL_TEXTURE_2D, texture);
  
          //gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pCodecCtx-&gt;width, pCodecCtx-&gt;height, GL_RGB, GL_UNSIGNED_INT, pFrameRGB-&gt;data[0]);
     // glTexSubImage2D(GL_TEXTURE_2D, 0, 0,0, 840, 460, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB-&gt;data[0]);
  
          glTexImage2D(GL_TEXTURE_2D,                //Always GL_TEXTURE_2D
              0,                            //0 for now
              GL_RGB,                       //Format OpenGL uses for image
              pCodecCtx-&gt;width, pCodecCtx-&gt;height,  //Width and height
              0,                            //The border of the image
              GL_RGB, //GL_RGB, because pixels are stored in RGB format
              GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
                              //as unsigned numbers
              pFrameRGB-&gt;data[0]);               //The actual pixel data
    // additional opengl end   
  
  // Save the frame to disk
  if(++i&lt;=5)
    SaveFrame(pFrameRGB, pCodecCtx-&gt;width, pCodecCtx-&gt;height, 
          i);
    }
  }
  
  glColor3f(1,1,1);
  glBindTexture(GL_TEXTURE_2D, texture);
  glBegin(GL_QUADS);
      glTexCoord2f(0,1);
      glVertex3f(0,0,0);
  
      glTexCoord2f(1,1);
      glVertex3f(pCodecCtx-&gt;width,0,0);
  
      glTexCoord2f(1,0);
      glVertex3f(pCodecCtx-&gt;width, pCodecCtx-&gt;height,0);
  
      glTexCoord2f(0,0);
      glVertex3f(0,pCodecCtx-&gt;height,0);
  
  glEnd();
  // Free the packet that was allocated by av_read_frame
  av_free_packet(&amp;packet);
   }
  
  
    // Free the RGB image
   av_free(buffer);
   av_free(pFrameRGB);
  
   // Free the YUV frame
   av_free(pFrame);
  
   // Close the codec
   avcodec_close(pCodecCtx);
  
   // Close the video file
   avformat_close_input(&amp;pFormatCtx);
  
   return 0;
  }
  </code></pre>
  
  <p>Unfortunately i could not find my solution here</p>
  
  <p><a href="https://stackoverflow.com/questions/6495523/ffmpeg-video-to-opengl-texture">ffmpeg video to opengl texture</a></p>
  
  <p>The program compiles but does not show any video on the texture. Just a <code>OpenGL</code> window is created.</p>