Backported from . Original author: Alexander Matveev 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 @@ + + + + + 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 }