From a19f810c9618e2fa6829f1c157d2e1a88ca178de Mon Sep 17 00:00:00 2001
From: Sven Göthel <sgothel@jausoft.com>
Date: Sun, 28 Jan 2024 22:05:18 +0100
Subject: FFMPEGPlayer: Prep for bitmap'ed subtitles: Use
 glEnable()/glBindTexture() func-ptr in native; readNextPacket0() passes
 video+subtitle texTarget and texID

For bitmap subtitles we need to push the bitmap into its own texture.
Hence readNextPacket0() must switch to used texture using glEnable() on !core and glBindTexture().
---
 .../opengl/util/av/impl/FFMPEGMediaPlayer.java     | 24 +++++++++++++++++-----
 .../jogamp/opengl/util/av/impl/FFMPEGNatives.java  | 13 ++++++++++--
 .../opengl/util/av/impl/FFMPEGv0400Natives.java    |  4 ++--
 .../opengl/util/av/impl/FFMPEGv0500Natives.java    |  4 ++--
 .../opengl/util/av/impl/FFMPEGv0600Natives.java    |  4 ++--
 5 files changed, 36 insertions(+), 13 deletions(-)

(limited to 'src/jogl/classes/jogamp/opengl/util/av/impl')

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 0cc36cc91..2e48b49e6 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
@@ -35,6 +35,7 @@ import java.security.PrivilegedAction;
 
 import com.jogamp.opengl.GL;
 import com.jogamp.opengl.GL2ES2;
+import com.jogamp.opengl.GLES2;
 import com.jogamp.opengl.GLException;
 import com.jogamp.common.av.AudioFormat;
 import com.jogamp.common.av.AudioSink;
@@ -450,7 +451,14 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
                     final long procAddrGLGetError = pt.getAddressFor("glGetError");
                     final long procAddrGLFlush = pt.getAddressFor("glFlush");
                     final long procAddrGLFinish = pt.getAddressFor("glFinish");
-                    natives.setGLFuncs0(moviePtr, procAddrGLTexSubImage2D, procAddrGLGetError, procAddrGLFlush, procAddrGLFinish);
+                    final long procAddrGLEnable;
+                    if( !gl.isGLcore() && GLES2.GL_TEXTURE_EXTERNAL_OES != getTextureTarget() ) {
+                        procAddrGLEnable = pt.getAddressFor("glEnable");
+                    } else {
+                        procAddrGLEnable = 0;
+                    }
+                    final long procAddrGLBindTexture = pt.getAddressFor("glBindTexture");
+                    natives.setGLFuncs0(moviePtr, procAddrGLTexSubImage2D, procAddrGLGetError, procAddrGLFlush, procAddrGLFinish, procAddrGLEnable, procAddrGLBindTexture);
                     return null;
             } } );
             audioQueueSize = AudioSink.DefaultQueueSizeWithVideo;
@@ -980,15 +988,18 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
             throw new GLException("FFMPEG native instance null");
         }
         int vPTS = TimeFrameI.INVALID_PTS;
+        int vTexID = 0; // invalid
         if( null != gl ) {
-            final Texture tex = nextFrame.getTexture();
-            tex.enable(gl);
-            tex.bind(gl);
+            // glEnable() and glBindTexture() are performed in native readNextPacket0()
+            // final Texture tex = nextFrame.getTexture();
+            // tex.enable(gl);
+            // tex.bind(gl);
+            vTexID = nextFrame.getTexture().getTextureObject();
         }
 
         /** Try decode up to 10 packets to find one containing video. */
         for(int i=0; TimeFrameI.INVALID_PTS == vPTS && 10 > i; i++) {
-           vPTS = natives.readNextPacket0(moviePtr, getTextureTarget(), getTextureFormat(), getTextureType());
+           vPTS = natives.readNextPacket0(moviePtr, getTextureTarget(), vTexID, getTextureFormat(), getTextureType(), GL.GL_TEXTURE_2D, 0);
         }
         if( null != nextFrame ) {
             nextFrame.setPTS(vPTS);
@@ -1013,5 +1024,8 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
             assEventListener.run( new ASSEventLine(ASSEventLine.Format.FFMPEG, ass, start_display_pts, end_display_pts) );
         }
     }
+    final void pushSubtitleTex(final int texID, final int x, final int y, final int width, final int height, final int pts, final int start_display_pts, final int end_display_pts) {
+        // System.err.println("SubTex["+texID+"]: "+x+"/"+y+" "+width+"x"+height+", pts "+pts+" ["+start_display_pts+".."+end_display_pts+"] "+(end_display_pts-start_display_pts+1));
+    }
 }
 
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGNatives.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGNatives.java
index ed34d6f0c..c28028bde 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGNatives.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGNatives.java
@@ -67,7 +67,8 @@ import com.jogamp.opengl.util.texture.TextureSequence.TextureFrame;
                              int aid, int aMaxChannelCount, int aPrefSampleRate,
                              int sid);
 
-    abstract void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish);
+    abstract void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish,
+                              long procAddrGLEnable, long procAddrGLBindTexture);
 
     abstract int getVideoPTS0(long moviePtr);
 
@@ -80,9 +81,17 @@ import com.jogamp.opengl.util.texture.TextureSequence.TextureFrame;
     abstract String getChapterTitle0(long moviePtr, int idx);
 
     /**
+     *
+     * @param moviePtr
+     * @param vTexTarget video texture target
+     * @param vTexID video texture ID/name
+     * @param vTexFmt video texture format
+     * @param vTexType video texture data type
+     * @param sTexTarget subtitle texture target
+     * @param sTexID subtitle texture ID/name
      * @return resulting current video PTS, or {@link TextureFrame#INVALID_PTS}
      */
-    abstract int readNextPacket0(long moviePtr, int texTarget, int texFmt, int texType);
+    abstract int readNextPacket0(long moviePtr, int vTexTarget, int vTexID, int vTexFmt, int vTexType, int sTexTarget, int sTexID);
 
     abstract int play0(long moviePtr);
     abstract int pause0(long moviePtr);
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0400Natives.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0400Natives.java
index ceb4b904f..8a567fa94 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0400Natives.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0400Natives.java
@@ -56,7 +56,7 @@ class FFMPEGv0400Natives extends FFMPEGNatives {
     native void setStream0(long moviePtr, String url, boolean isCameraInput, int vid, String sizes, int vWidth, int vHeight, int vRate, int aid, int aMaxChannelCount, int aPrefSampleRate, int sid);
 
     @Override
-    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish);
+    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish, long procAddrGLEnable, long procAddrGLBindTexture);
 
     @Override
     native int getVideoPTS0(long moviePtr);
@@ -65,7 +65,7 @@ class FFMPEGv0400Natives extends FFMPEGNatives {
     native int getAudioPTS0(long moviePtr);
 
     @Override
-    native int readNextPacket0(long moviePtr, int texTarget, int texFmt, int texType);
+    native int readNextPacket0(long moviePtr, int vTexTarget, int vTexID, int vTexFmt, int vTexType, int sTexTarget, int sTexID);
 
     @Override
     native int play0(long moviePtr);
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0500Natives.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0500Natives.java
index 92c8d36bd..09ae6b7b7 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0500Natives.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0500Natives.java
@@ -56,7 +56,7 @@ class FFMPEGv0500Natives extends FFMPEGNatives {
     native void setStream0(long moviePtr, String url, boolean isCameraInput, int vid, String sizes, int vWidth, int vHeight, int vRate, int aid, int aMaxChannelCount, int aPrefSampleRate, int sid);
 
     @Override
-    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish);
+    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish, long procAddrGLEnable, long procAddrGLBindTexture);
 
     @Override
     native int getVideoPTS0(long moviePtr);
@@ -65,7 +65,7 @@ class FFMPEGv0500Natives extends FFMPEGNatives {
     native int getAudioPTS0(long moviePtr);
 
     @Override
-    native int readNextPacket0(long moviePtr, int texTarget, int texFmt, int texType);
+    native int readNextPacket0(long moviePtr, int vTexTarget, int vTexID, int vTexFmt, int vTexType, int sTexTarget, int sTexID);
 
     @Override
     native int play0(long moviePtr);
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0600Natives.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0600Natives.java
index 8f33413ac..663e9cbd0 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0600Natives.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv0600Natives.java
@@ -56,7 +56,7 @@ class FFMPEGv0600Natives extends FFMPEGNatives {
     native void setStream0(long moviePtr, String url, boolean isCameraInput, int vid, String sizes, int vWidth, int vHeight, int vRate, int aid, int aMaxChannelCount, int aPrefSampleRate, int sid);
 
     @Override
-    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish);
+    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish, long procAddrGLEnable, long procAddrGLBindTexture);
 
     @Override
     native int getVideoPTS0(long moviePtr);
@@ -65,7 +65,7 @@ class FFMPEGv0600Natives extends FFMPEGNatives {
     native int getAudioPTS0(long moviePtr);
 
     @Override
-    native int readNextPacket0(long moviePtr, int texTarget, int texFmt, int texType);
+    native int readNextPacket0(long moviePtr, int vTexTarget, int vTexID, int vTexFmt, int vTexType, int sTexTarget, int sTexID);
 
     @Override
     native int play0(long moviePtr);
-- 
cgit v1.2.3