vlc | branch: master | Ilkka Ollakka <[email protected]> | Fri Feb  8 22:29:39 
2013 +0100| [3422455f7e844bfc301ade6b5371bc29e62ecdd1] | committer: Felix Paul 
Kühne

opengl: implement manual unpacking for OpenGL ES

Signed-off-by: Felix Paul Kühne <[email protected]>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3422455f7e844bfc301ade6b5371bc29e62ecdd1
---

 modules/video_output/opengl.c |   33 ++++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
index 33a5a43..9079e5b 100644
--- a/modules/video_output/opengl.c
+++ b/modules/video_output/opengl.c
@@ -659,11 +659,34 @@ int vout_display_opengl_Prepare(vout_display_opengl_t 
*vgl,
         }
         glBindTexture(vgl->tex_target, vgl->texture[0][j]);
         glPixelStorei(GL_UNPACK_ROW_LENGTH, picture->p[j].i_pitch / 
picture->p[j].i_pixel_pitch);
-        glTexSubImage2D(vgl->tex_target, 0,
-                        0, 0,
-                        vgl->fmt.i_width  * vgl->chroma->p[j].w.num / 
vgl->chroma->p[j].w.den,
-                        vgl->fmt.i_height * vgl->chroma->p[j].h.num / 
vgl->chroma->p[j].h.den,
-                        vgl->tex_format, vgl->tex_type, 
picture->p[j].p_pixels);
+
+#if USE_OPENGL_ES
+        if ( (picture->p[j].i_pitch / picture->p[j].i_pixel_pitch) != 
(vgl->fmt.i_width  * vgl->chroma->p[j].w.num / vgl->chroma->p[j].w.den) ) {
+            uint8_t *new_plane = 
malloc(picture->p[j].i_pitch*picture->p[j].i_pixel_pitch *vgl->fmt.i_height * 
vgl->chroma->p[j].h.num / vgl->chroma->p[j].h.den);
+            uint8_t *destination = new_plane;
+            const uint8_t *source = picture->p[j].p_pixels;
+            for( unsigned height = 0; height < vgl->fmt.i_height * 
vgl->chroma->p[j].h.num / vgl->chroma->p[j].h.den; height++ )
+            {
+                memcpy( destination, source, vgl->fmt.i_width  * 
vgl->chroma->p[j].w.num / vgl->chroma->p[j].w.den );
+                source +=  picture->p[j].i_pitch*picture->p[j].i_pixel_pitch;
+                destination += vgl->fmt.i_width  * vgl->chroma->p[j].w.num / 
vgl->chroma->p[j].w.den;
+            }
+            glTexSubImage2D( vgl->tex_target, 0,
+                             0, 0,
+                             vgl->fmt.i_width  * vgl->chroma->p[j].w.num / 
vgl->chroma->p[j].w.den,
+                             vgl->fmt.i_height * vgl->chroma->p[j].h.num / 
vgl->chroma->p[j].h.den,
+                             vgl->tex_format, vgl->tex_type, new_plane );
+            free( new_plane );
+        } else {
+#endif
+            glTexSubImage2D(vgl->tex_target, 0,
+                            0, 0,
+                            vgl->fmt.i_width  * vgl->chroma->p[j].w.num / 
vgl->chroma->p[j].w.den,
+                            vgl->fmt.i_height * vgl->chroma->p[j].h.num / 
vgl->chroma->p[j].h.den,
+                            vgl->tex_format, vgl->tex_type, 
picture->p[j].p_pixels);
+#if USE_OPENGL_ES
+        }
+#endif
     }
 
     int         last_count = vgl->region_count;

_______________________________________________
vlc-commits mailing list
[email protected]
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to