Files
nixpkgs/pkgs/by-name/op/openjfx/21/patches/backport-ffmpeg-7-support-jfx21.patch
Dark Steveneq 646b892680
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
push sheeet
2025-10-09 14:15:47 +02:00

214 lines
10 KiB
Diff

Backported from <https://github.com/openjdk/jfx/pull/1552>.
Original author: Alexander Matveev <alexander.matveev@oracle.com>
diff --git a/build.gradle b/build.gradle
index f9dbc53076..77856226a6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2946,6 +2946,7 @@
media name: "ffmpeg-4.0.2", ext: "tar.gz"
media name: "ffmpeg-5.1.2", ext: "tar.gz"
media name: "ffmpeg-6.0", ext: "tar.gz"
+ media name: "ffmpeg-7.0.2", ext: "tar.gz"
}
implementation project(":base")
implementation project(":graphics")
@@ -3292,8 +3293,8 @@
doLast {
project.ext.libav = [:]
project.ext.libav.basedir = "${buildDir}/native/linux/ffmpeg"
- project.ext.libav.versions = [ "3.3.3", "4.0.2", "5.1.2", "6.0" ]
- project.ext.libav.versionmap = [ "3.3.3" : "57", "4.0.2" : "58", "5.1.2" : "59", "6.0" : "60" ]
+ project.ext.libav.versions = [ "3.3.3", "4.0.2", "5.1.2", "6.0", "7.0.2" ]
+ project.ext.libav.versionmap = [ "3.3.3" : "57", "4.0.2" : "58", "5.1.2" : "59", "6.0" : "60", "7.0.2" : "61" ]
libav.versions.each { version ->
def libavDir = "${libav.basedir}/ffmpeg-${version}"
@@ -3373,7 +3374,7 @@
project.ext.libav.libavffmpeg.versions = [ "56" ]
project.ext.libav.ffmpeg = [:]
project.ext.libav.ffmpeg.basedir = "${buildDir}/native/linux/ffmpeg/ffmpeg"
- project.ext.libav.ffmpeg.versions = [ "57", "58", "59", "60" ]
+ project.ext.libav.ffmpeg.versions = [ "57", "58", "59", "60", "61" ]
project.ext.libav.versions.each { version ->
def libavDir = "${project.ext.libav.basedir}-${version}"
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 887b9d100c..a10610b0f5 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -28,6 +28,11 @@
<sha256 value="f4ccf961403752c93961927715f524576d1f4dd02cd76d8c76aed3bbe6686656" origin="Generated by Gradle"/>
</artifact>
</component>
+ <component group="" name="ffmpeg-7.0.2" version="">
+ <artifact name="ffmpeg-7.0.2-.tar.gz">
+ <sha256 value="1233b3a93dd7517cc3c56b72a67f64041c044848d981e3deff4bebffa25f1054" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
<component group="" name="icu4c-73_1-data-bin-l" version="">
<artifact name="icu4c-73_1-data-bin-l-.zip">
<sha256 value="4038298ee02a0c38917185ef8ff4ebde9c8b552c777fd03e4df6c6b4b1825e20" origin="Generated by Gradle"/>
diff --git a/modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/NativeMediaManager.java b/modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/NativeMediaManager.java
index 097004bd17..0c2ae1ddbc 100644
--- a/modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/NativeMediaManager.java
+++ b/modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/NativeMediaManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -127,6 +127,7 @@
dependencies.add("avplugin-ffmpeg-58");
dependencies.add("avplugin-ffmpeg-59");
dependencies.add("avplugin-ffmpeg-60");
+ dependencies.add("avplugin-ffmpeg-61");
}
if (PlatformUtil.isMac()) {
dependencies.add("fxplugins");
diff --git a/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c b/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c
index 22c8be9300..38bae197fe 100644
--- a/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c
+++ b/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gstregistry.c
@@ -146,7 +146,7 @@
// For ffmpeg (libavcodec-ffmpeg.so)
static const int AVCODEC_FFMPEG_EXPLICIT_VERSIONS[] = { 56 };
// For libav or ffmpeg (libavcodec.so)
-static const int AVCODEC_EXPLICIT_VERSIONS[] = { 57, 58, 59, 60 };
+static const int AVCODEC_EXPLICIT_VERSIONS[] = { 57, 58, 59, 60, 61 };
/*
* Callback passed to dl_iterate_phdr(): finds the path of
diff --git a/modules/javafx.media/src/main/native/gstreamer/plugins/av/avdefines.h b/modules/javafx.media/src/main/native/gstreamer/plugins/av/avdefines.h
index 60fa7b631c..f49ad56e1e 100644
--- a/modules/javafx.media/src/main/native/gstreamer/plugins/av/avdefines.h
+++ b/modules/javafx.media/src/main/native/gstreamer/plugins/av/avdefines.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,5 +53,13 @@
// Not required since 58 and removed in 59
#define NO_REGISTER_ALL (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59,0,0))
+// Do not use reordered_opaque to pass PTS. Use AVPacket.pts/AVFrame.pts instead.
+// reordered_opaque is removed since 61.
+#define NO_REORDERED_OPAQUE (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61,0,0))
+
+// Use AVCodecContext.frame_num instead of AVCodecContext.frame_number. They same
+// except frame_num is 64-bit and frame_number is 32-bit. Since 61.
+#define USE_FRAME_NUM (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61,0,0))
+
#endif /* AVDEFINES_H */
diff --git a/modules/javafx.media/src/main/native/gstreamer/plugins/av/videodecoder.c b/modules/javafx.media/src/main/native/gstreamer/plugins/av/videodecoder.c
index c9fa787e63..8a5cd78f2d 100644
--- a/modules/javafx.media/src/main/native/gstreamer/plugins/av/videodecoder.c
+++ b/modules/javafx.media/src/main/native/gstreamer/plugins/av/videodecoder.c
@@ -554,7 +554,11 @@
if (ret < 0)
return FALSE;
+#if NO_REORDERED_OPAQUE
+ decoder->dest_frame->pts = base->frame->pts;
+#else // NO_REORDERED_OPAQUE
decoder->dest_frame->reordered_opaque = base->frame->reordered_opaque;
+#endif // NO_REORDERED_OPAQUE
return TRUE;
}
@@ -679,7 +683,7 @@
GstMapInfo info2;
gboolean unmap_buf = FALSE;
gboolean set_frame_values = TRUE;
- int64_t reordered_opaque = AV_NOPTS_VALUE;
+ int64_t pts = AV_NOPTS_VALUE;
unsigned int out_buf_size = 0;
gboolean copy_error = FALSE;
uint8_t* data0 = NULL;
@@ -711,10 +715,17 @@
if (av_new_packet(&decoder->packet, info.size) == 0)
{
memcpy(decoder->packet.data, info.data, info.size);
+#if NO_REORDERED_OPAQUE
+ if (GST_BUFFER_TIMESTAMP_IS_VALID(buf))
+ decoder->packet.pts = (int64_t)GST_BUFFER_TIMESTAMP(buf);
+ else
+ decoder->packet.pts = AV_NOPTS_VALUE;
+#else // NO_REORDERED_OPAQUE
if (GST_BUFFER_TIMESTAMP_IS_VALID(buf))
base->context->reordered_opaque = GST_BUFFER_TIMESTAMP(buf);
else
base->context->reordered_opaque = AV_NOPTS_VALUE;
+#endif // NO_REORDERED_OPAQUE
#if USE_SEND_RECEIVE
num_dec = avcodec_send_packet(base->context, &decoder->packet);
if (num_dec == 0)
@@ -746,10 +757,17 @@
av_init_packet(&decoder->packet);
decoder->packet.data = info.data;
decoder->packet.size = info.size;
+#if NO_REORDERED_OPAQUE
+ if (GST_BUFFER_TIMESTAMP_IS_VALID(buf))
+ decoder->packet.pts = (int64_t)GST_BUFFER_TIMESTAMP(buf);
+ else
+ decoder->packet.pts = AV_NOPTS_VALUE;
+#else // NO_REORDERED_OPAQUE
if (GST_BUFFER_TIMESTAMP_IS_VALID(buf))
base->context->reordered_opaque = GST_BUFFER_TIMESTAMP(buf);
else
base->context->reordered_opaque = AV_NOPTS_VALUE;
+#endif // NO_REORDERED_OPAQUE
#if USE_SEND_RECEIVE
num_dec = avcodec_send_packet(base->context, &decoder->packet);
@@ -796,7 +814,11 @@
goto _exit;
}
- reordered_opaque = decoder->dest_frame->reordered_opaque;
+#if NO_REORDERED_OPAQUE
+ pts = decoder->dest_frame->pts;
+#else // NO_REORDERED_OPAQUE
+ pts = decoder->dest_frame->reordered_opaque;
+#endif // NO_REORDERED_OPAQUE
data0 = decoder->dest_frame->data[0];
data1 = decoder->dest_frame->data[1];
data2 = decoder->dest_frame->data[2];
@@ -806,7 +828,11 @@
if (set_frame_values)
{
- reordered_opaque = base->frame->reordered_opaque;
+#if NO_REORDERED_OPAQUE
+ pts = base->frame->pts;
+#else // NO_REORDERED_OPAQUE
+ pts = base->frame->reordered_opaque;
+#endif // NO_REORDERED_OPAQUE
data0 = base->frame->data[0];
data1 = base->frame->data[1];
data2 = base->frame->data[2];
@@ -825,10 +851,14 @@
}
else
{
+#if USE_FRAME_NUM
+ GST_BUFFER_OFFSET(outbuf) = base->context->frame_num;
+#else // USE_FRAME_NUM
GST_BUFFER_OFFSET(outbuf) = base->context->frame_number;
- if (reordered_opaque != AV_NOPTS_VALUE)
+#endif // USE_FRAME_NUM
+ if (pts != AV_NOPTS_VALUE)
{
- GST_BUFFER_TIMESTAMP(outbuf) = reordered_opaque;
+ GST_BUFFER_TIMESTAMP(outbuf) = pts;
GST_BUFFER_DURATION(outbuf) = GST_BUFFER_DURATION(buf); // Duration for video usually same
}