diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c
index e427f0c48c..7089498fe7 100644
--- a/gst-libs/gst/gl/gstgldisplay.c
+++ b/gst-libs/gst/gl/gstgldisplay.c
@@ -201,7 +201,7 @@ gst_gl_display_init (GstGLDisplay * display)
   display->download_width = 0;
   display->download_height = 0;
   display->download_video_format = 0;
-  display->download_data = NULL;
+  display->download_frame = NULL;
   display->ouput_texture = 0;
   display->ouput_texture_width = 0;
   display->ouput_texture_height = 0;
@@ -1549,7 +1549,10 @@ gst_gl_display_thread_init_download (GstGLDisplay * display)
 void
 gst_gl_display_thread_do_download (GstGLDisplay * display)
 {
-  switch (display->download_video_format) {
+  GstVideoFormat video_format =
+      GST_VIDEO_INFO_FORMAT (&display->download_frame->info);
+
+  switch (video_format) {
     case GST_VIDEO_FORMAT_RGBx:
     case GST_VIDEO_FORMAT_BGRx:
     case GST_VIDEO_FORMAT_xRGB:
@@ -1573,7 +1576,7 @@ gst_gl_display_thread_do_download (GstGLDisplay * display)
       break;
     default:
       gst_gl_display_set_error (display, "Unsupported download video format %d",
-          display->download_video_format);
+          video_format);
   }
 }
 
@@ -2312,7 +2315,7 @@ gst_gl_display_init_download (GstGLDisplay * display,
 /* Called by the gldownload and glcolorscale element */
 gboolean
 gst_gl_display_do_download (GstGLDisplay * display, GLuint texture,
-    gint width, gint height, gpointer data)
+    GstVideoFrame * frame)
 {
   gboolean isAlive = TRUE;
 
@@ -2320,10 +2323,8 @@ gst_gl_display_do_download (GstGLDisplay * display, GLuint texture,
   isAlive = display->isAlive;
   if (isAlive) {
     //data size is aocciated to the glcontext size
-    display->download_data = data;
+    display->download_frame = frame;
     display->ouput_texture = texture;
-    display->ouput_texture_width = width;
-    display->ouput_texture_height = height;
     gst_gl_window_send_message (display->gl_window,
         GST_GL_WINDOW_CB (gst_gl_display_thread_do_download), display);
     isAlive = display->isAlive;
@@ -3208,7 +3209,7 @@ void
 gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
 {
   GstVideoFormat video_format = display->download_video_format;
-  gpointer data = display->download_data;
+  GstVideoFrame *frame = display->download_frame;
 
 #ifndef OPENGL_ES2
   if (display->upload_colorspace_conversion == GST_GL_DISPLAY_CONVERSION_GLSL)
@@ -3216,8 +3217,8 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
   glEnable (GL_TEXTURE_RECTANGLE_ARB);
   glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->ouput_texture);
 #else
-  gint width = display->ouput_texture_width;
-  gint height = display->ouput_texture_height;
+  gint width = GST_VIDEO_INFO_WIDTH (&frame->info);
+  gint height = GST_VIDEO_INFO_HEIGHT (&frame->info);
 
   const GLfloat vVertices[] = { 1.0f, -1.0f, 0.0f,
     1.0f, 0.0f,
@@ -3262,9 +3263,10 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
     case GST_VIDEO_FORMAT_ARGB:
 #ifndef OPENGL_ES2
       glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
-          GL_UNSIGNED_BYTE, data);
+          GL_UNSIGNED_BYTE, frame->data[0]);
 #else
-      glReadPixels (0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
+      glReadPixels (0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
+          frame->data[0]);
 #endif
       break;
     case GST_VIDEO_FORMAT_BGRx:
@@ -3273,21 +3275,22 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
     case GST_VIDEO_FORMAT_ABGR:
 #ifndef OPENGL_ES2
       glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_BGRA,
-          GL_UNSIGNED_BYTE, data);
+          GL_UNSIGNED_BYTE, frame->data[0]);
 #endif
       break;
     case GST_VIDEO_FORMAT_RGB:
 #ifndef OPENGL_ES2
       glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB,
-          GL_UNSIGNED_BYTE, data);
+          GL_UNSIGNED_BYTE, frame->data[0]);
 #else
-      glReadPixels (0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
+      glReadPixels (0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE,
+          frame->data[0]);
 #endif
       break;
     case GST_VIDEO_FORMAT_BGR:
 #ifndef OPENGL_ES2
       glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_BGR,
-          GL_UNSIGNED_BYTE, data);
+          GL_UNSIGNED_BYTE, frame->data[0]);
 #endif
       break;
     default:
@@ -3309,13 +3312,13 @@ gst_gl_display_thread_do_download_draw_yuv (GstGLDisplay * display)
   gint width, height;
   GstVideoFormat video_format;
   GstVideoInfo vinfo;
-  gpointer data;
+  GstVideoFrame *frame;
 
-  width = display->download_width;
-  height = display->download_height;
-  video_format = display->download_video_format;
-  data = display->download_data;
-  gst_video_info_set_format (&vinfo, video_format, width, height);
+  frame = display->download_frame;
+  vinfo = frame->info;
+  width = GST_VIDEO_INFO_WIDTH (&vinfo);
+  height = GST_VIDEO_INFO_HEIGHT (&vinfo);
+  video_format = GST_VIDEO_INFO_FORMAT (&vinfo);
 
 #ifdef OPENGL_ES2
   GLint viewport_dim[4];
@@ -3508,30 +3511,31 @@ gst_gl_display_thread_do_download_draw_yuv (GstGLDisplay * display)
     case GST_VIDEO_FORMAT_AYUV:
     case GST_VIDEO_FORMAT_xRGB:
       glReadPixels (0, 0, width, height, GL_BGRA,
-          GL_UNSIGNED_INT_8_8_8_8, data);
+          GL_UNSIGNED_INT_8_8_8_8, frame->data[0]);
       break;
     case GST_VIDEO_FORMAT_YUY2:
     case GST_VIDEO_FORMAT_UYVY:
       glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2, height, GL_BGRA,
-          GL_UNSIGNED_INT_8_8_8_8_REV, data);
+          GL_UNSIGNED_INT_8_8_8_8_REV, frame->data[0]);
       break;
     case GST_VIDEO_FORMAT_I420:
     case GST_VIDEO_FORMAT_YV12:
     {
-      glReadPixels (0, 0, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
+      glReadPixels (0, 0, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE,
+          frame->data[0]);
 
 #ifndef OPENGL_ES2
       glReadBuffer (GL_COLOR_ATTACHMENT1_EXT);
 #endif
       glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2,
           GST_ROUND_UP_2 (height) / 2, GL_LUMINANCE, GL_UNSIGNED_BYTE,
-          (guint8 *) data + GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 1));
+          frame->data[1]);
 #ifndef OPENGL_ES2
       glReadBuffer (GL_COLOR_ATTACHMENT2_EXT);
 #endif
       glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2,
           GST_ROUND_UP_2 (height) / 2, GL_LUMINANCE, GL_UNSIGNED_BYTE,
-          (guint8 *) data + GST_VIDEO_INFO_COMP_OFFSET (&vinfo, 2));
+          frame->data[2]);
     }
       break;
     default:
diff --git a/gst-libs/gst/gl/gstgldisplay.h b/gst-libs/gst/gl/gstgldisplay.h
index 8eae2c4330..8f77e538cf 100644
--- a/gst-libs/gst/gl/gstgldisplay.h
+++ b/gst-libs/gst/gl/gstgldisplay.h
@@ -180,7 +180,7 @@ struct _GstGLDisplay
   gint download_width;
   gint download_height;
   GstVideoFormat download_video_format;
-  gpointer download_data;
+  GstVideoFrame *download_frame;
   GLenum multipleRT[3];
   GLuint ouput_texture;
   GLuint ouput_texture_width;
@@ -269,7 +269,7 @@ gboolean gst_gl_display_do_upload (GstGLDisplay * display, GLuint texture,
 gboolean gst_gl_display_init_download (GstGLDisplay * display,
     GstVideoFormat video_format, gint width, gint height);
 gboolean gst_gl_display_do_download (GstGLDisplay * display, GLuint texture,
-    gint width, gint height, gpointer data);
+    GstVideoFrame *frame);
 
 gboolean gst_gl_display_gen_fbo (GstGLDisplay * display, gint width, gint height,
     GLuint * fbo, GLuint * depthbuffer);