From da45b374f0274fa014310c08164e67f7736c1f7d Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Mon, 5 Oct 2015 13:49:40 +0200
Subject: Bug 1239: Add support for UYVY422 (swizzled YUYV422)

---
 .../jogamp/opengl/util/av/VideoPixelFormat.java    |  2 +-
 .../opengl/util/av/impl/FFMPEGMediaPlayer.java     | 29 ++++++++++++++++++++--
 src/jogl/native/libav/ffmpeg_impl_template.c       |  6 +++--
 3 files changed, 32 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/jogl/classes/jogamp/opengl/util/av/VideoPixelFormat.java b/src/jogl/classes/jogamp/opengl/util/av/VideoPixelFormat.java
index 44d83e78d..db8da6157 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/VideoPixelFormat.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/VideoPixelFormat.java
@@ -64,7 +64,7 @@ public enum VideoPixelFormat {
     XVMC_MPEG2_MC,
     /** */
     XVMC_MPEG2_IDCT,
-    /** packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 */
+    /** packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 ( sharing Cb and Cr w/ 2 pixels ) */
     UYVY422,
     /** packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 */
     UYYVYY411,
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
index 7df5d6a9e..b7a8dec25 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
@@ -436,9 +436,10 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
                     }
                     break;
 
-                case 2: if( vPixelFmt == VideoPixelFormat.YUYV422 ) {
+                case 2: if( vPixelFmt == VideoPixelFormat.YUYV422 || vPixelFmt == VideoPixelFormat.UYVY422 ) {
                             // YUYV422: // < packed YUV 4:2:2, 2x 16bpp, Y0 Cb Y1 Cr
-                            // Stuffed into RGBA half width texture
+                            // UYVY422: // < packed YUV 4:2:2, 2x 16bpp, Cb Y0 Cr Y1
+                            // Both stuffed into RGBA half width texture
                             tf = GL.GL_RGBA; tif=GL.GL_RGBA; break;
                         } else {
                             tf = GL2ES2.GL_RG;   tif=GL2ES2.GL_RG; break;
@@ -606,6 +607,7 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
                     texWidth = vTexWidth[0] + vTexWidth[1] + vTexWidth[2]; texHeight = vH;
                     break;
                 case YUYV422: // < packed YUV 4:2:2, 2x 16bpp, Y0 Cb Y1 Cr - stuffed into RGBA half width texture
+                case UYVY422: // < packed YUV 4:2:2, 2x 16bpp, Cb Y0 Cr Y1 - stuffed into RGBA half width texture
                 case BGR24:
                     usesTexLookupShader = true;
                     texWidth = vTexWidth[0]; texHeight = vH;
@@ -764,6 +766,29 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
               "  return vec4(r, g, b, 1);\n"+
               "}\n"
           ;
+        case UYVY422: // < packed YUV 4:2:2, 2 x 16bpp, Cb Y0 Cr Y1
+                      // Stuffed into RGBA half width texture
+          return
+              "vec4 "+texLookupFuncName+"(in "+getTextureSampler2DType()+" image, in vec2 texCoord) {\n"+
+              "  "+
+              "  float y1,u,y2,v,y,r,g,b;\n"+
+              "  vec2 tc_halfw = vec2(texCoord.x*0.5, texCoord.y);\n"+
+              "  vec4 uyvy = texture2D(image, tc_halfw).rgba;\n"+
+              "  u  = uyvy.r;\n"+
+              "  y1 = uyvy.g;\n"+
+              "  v  = uyvy.b;\n"+
+              "  y2 = uyvy.a;\n"+
+              "  y = mix( y1, y2, mod(gl_FragCoord.x, 2) ); /* avoid branching! */\n"+
+              "  y = 1.1643*(y-0.0625);\n"+
+              "  u = u-0.5;\n"+
+              "  v = v-0.5;\n"+
+              "  r = y+1.5958*v;\n"+
+              "  g = y-0.39173*u-0.81290*v;\n"+
+              "  b = y+2.017*u;\n"+
+              "  return vec4(r, g, b, 1);\n"+
+              "}\n"
+          ;
+
         case BGR24:
           return
               "vec4 "+texLookupFuncName+"(in "+getTextureSampler2DType()+" image, in vec2 texCoord) {\n"+
diff --git a/src/jogl/native/libav/ffmpeg_impl_template.c b/src/jogl/native/libav/ffmpeg_impl_template.c
index ca283ef52..589cc3f39 100644
--- a/src/jogl/native/libav/ffmpeg_impl_template.c
+++ b/src/jogl/native/libav/ffmpeg_impl_template.c
@@ -1148,8 +1148,10 @@ JNIEXPORT void JNICALL FF_FUNC(setStream0)
                 #endif
             } else {
                 vLinesize[0] = pAV->pVFrame->linesize[0];
-                if( pAV->vPixFmt == PIX_FMT_YUYV422 ) {
-                    // Stuff 2x 16bpp (YUYV) into one RGBA pixel!
+                if( pAV->vPixFmt == PIX_FMT_YUYV422 || 
+                    pAV->vPixFmt == PIX_FMT_UYVY422 ) 
+                {
+                    // Stuff 2x 16bpp (YUYV, UYVY) into one RGBA pixel!
                     pAV->vTexWidth[0] = pAV->pVCodecCtx->width / 2;
                 } else {
                     pAV->vTexWidth[0] = pAV->pVCodecCtx->width;
-- 
cgit v1.2.3