aboutsummaryrefslogtreecommitdiff
path: root/graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp
diff options
context:
space:
mode:
authorDima Panov <fluffy@FreeBSD.org>2025-07-21 11:55:53 +0000
committerDima Panov <fluffy@FreeBSD.org>2025-07-21 11:59:27 +0000
commit3b84553e70c09adf08cd16ac0ad5b8897a5189df (patch)
tree9f4127e803eae0850803adb8f026cb36681e48fd /graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp
parent06475261fd6657c01efda21826f6eed146f6474f (diff)
Diffstat (limited to 'graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp')
-rw-r--r--graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp b/graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp
new file mode 100644
index 000000000000..ecf35527a878
--- /dev/null
+++ b/graphics/osg/files/patch-src_osgPlugins_ffmpeg_FFmpegDecoder.cpp
@@ -0,0 +1,207 @@
+--- src/osgPlugins/ffmpeg/FFmpegDecoder.cpp.orig 2022-12-01 18:17:31 UTC
++++ src/osgPlugins/ffmpeg/FFmpegDecoder.cpp
+@@ -1,4 +1,3 @@
+-
+ #include "FFmpegDecoder.hpp"
+ #include "FFmpegParameters.hpp"
+
+@@ -36,8 +35,10 @@ FFmpegDecoder::FFmpegDecoder() :
+ }
+
+ FFmpegDecoder::FFmpegDecoder() :
+- m_audio_stream(0),
+- m_video_stream(0),
++ m_audio_stream(nullptr),
++ m_video_stream(nullptr),
++ m_audio_index(-1),
++ m_video_index(-1),
+ m_audio_queue(100),
+ m_video_queue(100),
+ m_audio_decoder(m_audio_queue, m_clocks),
+@@ -61,10 +62,10 @@ bool FFmpegDecoder::open(const std::string & filename,
+ try
+ {
+ // Open video file
+- AVFormatContext * p_format_context = 0;
+- AVInputFormat *iformat = 0;
++ AVFormatContext * p_format_context = nullptr;
++ AVInputFormat *iformat = nullptr;
+
+- if (filename.compare(0, 5, "/dev/")==0)
++ if (filename.compare(0, 5, "/dev/") == 0)
+ {
+ #ifdef ANDROID
+ throw std::runtime_error("Device not supported on Android");
+@@ -78,24 +79,24 @@ bool FFmpegDecoder::open(const std::string & filename,
+ }
+
+ std::string format = "video4linux2";
+- iformat = av_find_input_format(format.c_str());
++ iformat = const_cast<AVInputFormat*>(av_find_input_format(format.c_str()));
+
+ if (iformat)
+ {
+- OSG_INFO<<"Found input format: "<<format<<std::endl;
++ OSG_INFO << "Found input format: " << format << std::endl;
+ }
+ else
+ {
+- OSG_INFO<<"Failed to find input format: "<<format<<std::endl;
++ OSG_INFO << "Failed to find input format: " << format << std::endl;
+ }
+
+ #endif
+ }
+ else
+ {
+- iformat = parameters ? parameters->getFormat() : 0;
+- AVIOContext* context = parameters ? parameters->getContext() : 0;
+- if (context != NULL)
++ iformat = parameters ? const_cast<AVInputFormat*>(parameters->getFormat()) : nullptr;
++ AVIOContext* context = parameters ? parameters->getContext() : nullptr;
++ if (context != nullptr)
+ {
+ p_format_context = avformat_alloc_context();
+ p_format_context->pb = context;
+@@ -105,22 +106,7 @@ bool FFmpegDecoder::open(const std::string & filename,
+ int error = avformat_open_input(&p_format_context, filename.c_str(), iformat, parameters->getOptions());
+ if (error != 0)
+ {
+- std::string error_str;
+- switch (error)
+- {
+- //case AVERROR_UNKNOWN: error_str = "AVERROR_UNKNOWN"; break; // same value as AVERROR_INVALIDDATA
+- case AVERROR_IO: error_str = "AVERROR_IO"; break;
+- case AVERROR_NUMEXPECTED: error_str = "AVERROR_NUMEXPECTED"; break;
+- case AVERROR_INVALIDDATA: error_str = "AVERROR_INVALIDDATA"; break;
+- case AVERROR_NOMEM: error_str = "AVERROR_NOMEM"; break;
+- case AVERROR_NOFMT: error_str = "AVERROR_NOFMT"; break;
+- case AVERROR_NOTSUPP: error_str = "AVERROR_NOTSUPP"; break;
+- case AVERROR_NOENT: error_str = "AVERROR_NOENT"; break;
+- case AVERROR_PATCHWELCOME: error_str = "AVERROR_PATCHWELCOME"; break;
+- default: error_str = "Unknown error"; break;
+- }
+-
+- throw std::runtime_error("av_open_input_file() failed : " + error_str);
++ throw std::runtime_error("avformat_open_input() failed: " + AvStrError(error));
+ }
+
+ m_format_context.reset(p_format_context);
+@@ -128,15 +114,15 @@ bool FFmpegDecoder::open(const std::string & filename,
+ // Retrieve stream info
+ // Only buffer up to one and a half seconds by default
+ float max_analyze_duration = 1.5;
+- AVDictionaryEntry *mad = av_dict_get( *parameters->getOptions(), "mad", NULL, 0 );
+- if ( mad ) {
++ AVDictionaryEntry *mad = av_dict_get(*parameters->getOptions(), "mad", NULL, 0);
++ if (mad) {
+ max_analyze_duration = atof(mad->value);
+ }
+ p_format_context->max_analyze_duration = AV_TIME_BASE * max_analyze_duration;
+ // p_format_context->probesize = 100000;
+
+ if (avformat_find_stream_info(p_format_context, NULL) < 0)
+- throw std::runtime_error("av_find_stream_info() failed");
++ throw std::runtime_error("avformat_find_stream_info() failed");
+
+ m_duration = double(m_format_context->duration) / AV_TIME_BASE;
+ if (m_format_context->start_time != static_cast<int64_t>(AV_NOPTS_VALUE))
+@@ -159,7 +145,7 @@ bool FFmpegDecoder::open(const std::string & filename,
+ m_audio_stream = m_format_context->streams[m_audio_index];
+ else
+ {
+- m_audio_stream = 0;
++ m_audio_stream = nullptr;
+ m_audio_index = std::numeric_limits<unsigned int>::max();
+ }
+
+@@ -271,7 +257,7 @@ bool FFmpegDecoder::readNextPacketNormal()
+ {
+ AVPacket packet;
+
+- if (! m_pending_packet)
++ if (!m_pending_packet)
+ {
+ bool end_of_stream = false;
+
+@@ -279,10 +265,10 @@ bool FFmpegDecoder::readNextPacketNormal()
+ int error = av_read_frame(m_format_context.get(), &packet);
+ if (error < 0)
+ {
+- if (error == static_cast<int>(AVERROR_EOF) ||
+- m_format_context.get()->pb->eof_reached)
++ if (error == static_cast<int>(AVERROR_EOF) || m_format_context.get()->pb->eof_reached)
+ end_of_stream = true;
+- else {
++ else
++ {
+ OSG_FATAL << "av_read_frame() returned " << AvStrError(error) << std::endl;
+ throw std::runtime_error("av_read_frame() failed");
+ }
+@@ -303,12 +289,6 @@ bool FFmpegDecoder::readNextPacketNormal()
+ }
+ else
+ {
+- // Make the packet data available beyond av_read_frame() logical scope.
+- if ((error = av_dup_packet(&packet)) < 0) {
+- OSG_FATAL << "av_dup_packet() returned " << AvStrError(error) << std::endl;
+- throw std::runtime_error("av_dup_packet() failed");
+- }
+-
+ m_pending_packet = FFmpegPacket(packet);
+ }
+ }
+@@ -340,8 +320,6 @@ bool FFmpegDecoder::readNextPacketNormal()
+ return false;
+ }
+
+-
+-
+ bool FFmpegDecoder::readNextPacketEndOfStream()
+ {
+ const FFmpegPacket packet(FFmpegPacket::PACKET_END_OF_STREAM);
+@@ -352,8 +330,6 @@ bool FFmpegDecoder::readNextPacketEndOfStream()
+ return false;
+ }
+
+-
+-
+ bool FFmpegDecoder::readNextPacketRewinding()
+ {
+ const FFmpegPacket packet(FFmpegPacket::PACKET_FLUSH);
+@@ -364,8 +340,6 @@ bool FFmpegDecoder::readNextPacketRewinding()
+ return false;
+ }
+
+-
+-
+ void FFmpegDecoder::rewindButDontFlushQueues()
+ {
+ const AVRational AvTimeBaseQ = { 1, AV_TIME_BASE }; // = AV_TIME_BASE_Q
+@@ -374,7 +348,8 @@ void FFmpegDecoder::rewindButDontFlushQueues()
+ const int64_t seek_target = av_rescale_q(pos, AvTimeBaseQ, m_video_stream->time_base);
+
+ int error = 0;
+- if ((error = av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0/*AVSEEK_FLAG_BYTE |*/ /*AVSEEK_FLAG_BACKWARD*/)) < 0) {
++ if ((error = av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0)) < 0)
++ {
+ OSG_FATAL << "av_seek_frame returned " << AvStrError(error) << std::endl;
+ throw std::runtime_error("av_seek_frame failed()");
+ }
+@@ -397,13 +372,14 @@ void FFmpegDecoder::seekButDontFlushQueues(double time
+ {
+ const AVRational AvTimeBaseQ = { 1, AV_TIME_BASE }; // = AV_TIME_BASE_Q
+
+- const int64_t pos = int64_t(m_clocks.getStartTime()+time * double(AV_TIME_BASE));
++ const int64_t pos = int64_t(m_clocks.getStartTime() + time * double(AV_TIME_BASE));
+ const int64_t seek_target = av_rescale_q(pos, AvTimeBaseQ, m_video_stream->time_base);
+
+ m_clocks.setSeekTime(time);
+
+ int error = 0;
+- if ((error = av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0/*AVSEEK_FLAG_BYTE |*/ /*AVSEEK_FLAG_BACKWARD*/)) < 0) {
++ if ((error = av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0)) < 0)
++ {
+ OSG_FATAL << "av_seek_frame() returned " << AvStrError(error) << std::endl;
+ throw std::runtime_error("av_seek_frame failed()");
+ }