From 1eea4278f1be5900f0d990d0a7d352923def217c Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Thu, 5 Feb 2015 16:27:56 +0100
Subject: FFMPEGMediaPlayer: Add support for libav-11 and ffmpeg 2.[4-x]
 (Latest release, used in Debian 8, etc)

---
 .../av/impl/FFMPEGDynamicLibraryBundleInfo.java    | 63 ++++++++++-------
 .../opengl/util/av/impl/FFMPEGMediaPlayer.java     | 16 ++++-
 .../opengl/util/av/impl/FFMPEGv11Natives.java      | 78 ++++++++++++++++++++++
 3 files changed, 131 insertions(+), 26 deletions(-)
 create mode 100644 src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv11Natives.java

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

diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
index 055fb4bae..f294d5bc0 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
@@ -115,7 +115,7 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
 /* 54 */ "avformat_find_stream_info", // 53.3.0    (opt)
 
          // libavdevice
-/* 55 */ "avdevice_register_all",     // ???
+/* 55 */ "avdevice_register_all",     // supported in all version <= 56
 
          // libavresample
          "avresample_alloc_context",  //  1.0.1
@@ -283,6 +283,9 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
             } else if( avCodecMajor == 55 && avFormatMajor == 55 && ( avUtilMajor == 52 || avUtilMajor == 53 ) ) {
                 // lavc55.lavf55.lavu52.lavr01 (ffmpeg) or lavc55.lavf55.lavu53.lavr01 (libav)
                 natives = new FFMPEGv10Natives();
+            } else if( avCodecMajor == 56 && avFormatMajor == 56 && avUtilMajor == 54 ) {
+                // lavc56.lavf56.lavu54.lavr02
+                natives = new FFMPEGv11Natives();
             } else {
                 System.err.println("LIB_AV No Version/Native-Impl Match");
                 natives = null;
@@ -333,13 +336,17 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
         final List<String> avutil = new ArrayList<String>();
         avutil.add("avutil");        // default
 
-        avutil.add("libavutil.so.53");     // dummy future proof
-        avutil.add("libavutil.so.52");     // ffmpeg 1.2 + 2 / libav 9 + 10
+        avutil.add("libavutil.so.55");     // dummy future proof
+        avutil.add("libavutil.so.54");     // ffmpeg 2.[4-x] / libav 11
+        avutil.add("libavutil.so.53");     // ffmpeg 2.[0-3] / libav 10
+        avutil.add("libavutil.so.52");     // ffmpeg 1.2 + 2.[0-3] / libav 9
         avutil.add("libavutil.so.51");     // 0.8
         avutil.add("libavutil.so.50");     // 0.7
 
-        avutil.add("avutil-53");     // dummy future proof
-        avutil.add("avutil-52");     // ffmpeg 1.2 + 2 / libav 9 + 10
+        avutil.add("avutil-55");     // dummy future proof
+        avutil.add("avutil-54");     // ffmpeg 2.[4-x] / libav 11
+        avutil.add("avutil-53");     // ffmpeg 2.[0-3] / libav 10
+        avutil.add("avutil-52");     // ffmpeg 1.2 + 2.[0-3] / libav 9
         avutil.add("avutil-51");     // 0.8
         avutil.add("avutil-50");     // 0.7
         libsList.add(avutil);
@@ -347,14 +354,16 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
         final List<String> avformat = new ArrayList<String>();
         avformat.add("avformat");    // default
 
-        avformat.add("libavformat.so.56"); // dummy future proof
-        avformat.add("libavformat.so.55"); // ffmpeg 2 / libav 10
+        avformat.add("libavformat.so.57"); // dummy future proof
+        avformat.add("libavformat.so.56"); // ffmpeg 2.[4-x] / libav 11
+        avformat.add("libavformat.so.55"); // ffmpeg 2.[0-3] / libav 10
         avformat.add("libavformat.so.54"); // ffmpeg 1.2 / libav 9
         avformat.add("libavformat.so.53"); // 0.8
         avformat.add("libavformat.so.52"); // 0.7
 
-        avformat.add("avformat-56"); // dummy future proof
-        avformat.add("avformat-55"); // ffmpeg 2 / libav 10
+        avformat.add("avformat-57"); // dummy future proof
+        avformat.add("avformat-56"); // ffmpeg 2.[4-x] / libav 11
+        avformat.add("avformat-55"); // ffmpeg 2.[0-3] / libav 10
         avformat.add("avformat-54"); // ffmpeg 1.2 / libav 9
         avformat.add("avformat-53"); // 0.8
         avformat.add("avformat-52"); // 0.7
@@ -363,14 +372,16 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
         final List<String> avcodec = new ArrayList<String>();
         avcodec.add("avcodec");      // default
 
-        avcodec.add("libavcodec.so.56");   // dummy future proof
-        avcodec.add("libavcodec.so.55");   // ffmpeg 2/ libav 10
+        avcodec.add("libavcodec.so.57");   // dummy future proof
+        avcodec.add("libavcodec.so.56");   // ffmpeg 2.[4-x] / libav 11
+        avcodec.add("libavcodec.so.55");   // ffmpeg 2.[0-3] / libav 10
         avcodec.add("libavcodec.so.54");   // ffmpeg 1.2 / libav 9
         avcodec.add("libavcodec.so.53");   // 0.8
         avcodec.add("libavcodec.so.52");   // 0.7
 
-        avcodec.add("avcodec-56");   // dummy future proof
-        avcodec.add("avcodec-55");   // ffmpeg 2/ libav 10
+        avcodec.add("avcodec-57");   // dummy future proof
+        avcodec.add("avcodec-56");   // ffmpeg 2.[4-x] / libav 11
+        avcodec.add("avcodec-55");   // ffmpeg 2.[0-3] / libav 10
         avcodec.add("avcodec-54");   // ffmpeg 1.2 / libav 9
         avcodec.add("avcodec-53");   // 0.8
         avcodec.add("avcodec-52");   // 0.7
@@ -379,13 +390,15 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
         final List<String> avdevice = new ArrayList<String>();
         avdevice.add("avdevice");        // default
 
-        avdevice.add("libavdevice.so.56");     // dummy future proof
-        avdevice.add("libavdevice.so.55");     // ffmpeg 2
+        avdevice.add("libavdevice.so.57");     // dummy future proof
+        avdevice.add("libavdevice.so.56");     // ffmpeg 2.[4-x]
+        avdevice.add("libavdevice.so.55");     // ffmpeg 2.[0-3] / libav 11
         avdevice.add("libavdevice.so.54");     // ffmpeg 1.2 / libav 10
         avdevice.add("libavdevice.so.53");     // 0.8 && libav 9
 
-        avdevice.add("avdevice-56");     // dummy future proof
-        avdevice.add("avdevice-55");     // ffmpeg 2
+        avdevice.add("avdevice-57");     // dummy future proof
+        avdevice.add("avdevice-56");     // ffmpeg 2.[4-x]
+        avdevice.add("avdevice-55");     // ffmpeg 2.[0-3] / libav 11
         avdevice.add("avdevice-54");     // ffmpeg 1.2 / libav 10
         avdevice.add("avdevice-53");     // 0.8 && libav 9
         libsList.add(avdevice);
@@ -393,21 +406,25 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo  {
         final List<String> avresample = new ArrayList<String>();
         avresample.add("avresample");        // default
 
-        avresample.add("libavresample.so.2");     // dummy future proof
+        avresample.add("libavresample.so.3");     // dummy future proof
+        avresample.add("libavresample.so.2");     // libav 11
         avresample.add("libavresample.so.1");     // libav 9 + 10
 
-        avresample.add("avresample-2");     // dummy future proof
+        avresample.add("avresample-3");     // dummy future proof
+        avresample.add("avresample-2");     // libav 11
         avresample.add("avresample-1");     // libav 9 + 10
         libsList.add(avresample);
 
         final List<String> swresample = new ArrayList<String>();
         swresample.add("swresample");        // default
 
-        swresample.add("libswresample.so.1");     // dummy future proof
-        swresample.add("libswresample.so.0");     // ffmpeg 1.2 + 2.x
+        swresample.add("libswresample.so.2");     // dummy future proof
+        swresample.add("libswresample.so.1");     // ffmpeg 2.[4-x]
+        swresample.add("libswresample.so.0");     // ffmpeg 1.2 + 2.[0-3]
 
-        swresample.add("swresample-1");     // dummy future proof
-        swresample.add("swresample-0");     // ffmpeg 1.2 + 2.x
+        swresample.add("swresample-2");     // dummy future proof
+        swresample.add("swresample-1");     // ffmpeg 2.[4-x]
+        swresample.add("swresample-0");     // ffmpeg 1.2 + 2.[0-3]
         libsList.add(swresample);
 
         return libsList;
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 a43f026ad..7df5d6a9e 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
@@ -106,14 +106,24 @@ import jogamp.opengl.util.av.VideoPixelFormat;
  * <p>
  * Currently we are binary compatible w/:
  * <table border="1">
- * <tr><th>libav / ffmpeg</th><th>lavc</th><th>lavf</th><th>lavu</th><th>lavr</th>    <th>FFMPEG* class</th></tr>
+ * <tr><th>libav / ffmpeg</th><th>lavc</th><th>lavf</th><th>lavu</th><th>lavr/lswr</th>    <th>FFMPEG* class</th></tr>
  * <tr><td>0.8</td>           <td>53</td>  <td>53</td>  <td>51</td>     <td></td>        <td>FFMPEGv08</td></tr>
  * <tr><td>9.0 / 1.2</td>     <td>54</td>  <td>54</td>  <td>52</td>     <td>01/00</td>   <td>FFMPEGv09</td></tr>
- * <tr><td>10 / 2</td>        <td>55</td>  <td>55</td>  <td>53/52</td>  <td>01/00</td>   <td>FFMPEGv10</td></tr>
+ * <tr><td>10 / 2.[0-3]</td>  <td>55</td>  <td>55</td>  <td>53/52</td>  <td>01/00</td>   <td>FFMPEGv10</td></tr>
+ * <tr><td>11 / 2.[4-x]</td>  <td>56</td>  <td>56</td>  <td>54</td>     <td>02/01</td>   <td>FFMPEGv11</td></tr>
  * </table>
  * </p>
  * <p>
- * See http://upstream-tracker.org/versions/libav.html
+ * See FFmpeg:
+ * <ul>
+ *  <li>http://ffmpeg.org/documentation.html</li>
+ *  <li>http://git.videolan.org/?p=ffmpeg.git;a=blob;f=doc/APIchanges;hb=HEAD</li>
+ * </ul>
+ * See libav:
+ * <ul>
+ *  <li>https://libav.org/documentation.html</li>
+ *  <li>http://upstream-tracker.org/versions/libav.html</li>
+ * </ul>
  * </p>
  * <p>
  * Check tag 'FIXME: Add more planar formats !'
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv11Natives.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv11Natives.java
new file mode 100644
index 000000000..9654eca82
--- /dev/null
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGv11Natives.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright 2015 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ *    1. Redistributions of source code must retain the above copyright notice, this list of
+ *       conditions and the following disclaimer.
+ *
+ *    2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *       of conditions and the following disclaimer in the documentation and/or other materials
+ *       provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.opengl.util.av.impl;
+
+class FFMPEGv11Natives extends FFMPEGNatives {
+    @Override
+    native boolean initSymbols0(Object mutex_avcodec_openclose, long[] symbols, int count);
+
+    @Override
+    native int getAvUtilMajorVersionCC0();
+
+    @Override
+    native int getAvFormatMajorVersionCC0();
+
+    @Override
+    native int getAvCodecMajorVersionCC0();
+
+    @Override
+    native int getAvResampleMajorVersionCC0();
+
+    @Override
+    native int getSwResampleMajorVersionCC0();
+
+    @Override
+    native long createInstance0(FFMPEGMediaPlayer upstream, boolean enableAvResample, boolean enableSwResample, boolean verbose);
+
+    @Override
+    native void destroyInstance0(long moviePtr);
+
+    @Override
+    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);
+
+    @Override
+    native void setGLFuncs0(long moviePtr, long procAddrGLTexSubImage2D, long procAddrGLGetError, long procAddrGLFlush, long procAddrGLFinish);
+
+    @Override
+    native int getVideoPTS0(long moviePtr);
+
+    @Override
+    native int getAudioPTS0(long moviePtr);
+
+    @Override
+    native int readNextPacket0(long moviePtr, int texTarget, int texFmt, int texType);
+
+    @Override
+    native int play0(long moviePtr);
+
+    @Override
+    native int pause0(long moviePtr);
+
+    @Override
+    native int seek0(long moviePtr, int position);
+}
-- 
cgit v1.2.3