summaryrefslogtreecommitdiffstats
path: root/multimedia/aegisub/patches/ffms2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia/aegisub/patches/ffms2.patch')
-rw-r--r--multimedia/aegisub/patches/ffms2.patch387
1 files changed, 0 insertions, 387 deletions
diff --git a/multimedia/aegisub/patches/ffms2.patch b/multimedia/aegisub/patches/ffms2.patch
deleted file mode 100644
index ed40181e14..0000000000
--- a/multimedia/aegisub/patches/ffms2.patch
+++ /dev/null
@@ -1,387 +0,0 @@
-From 1aa9215e7fc360de05da9b7ec2cd68f1940af8b2 Mon Sep 17 00:00:00 2001
-From: Thomas Goyne <plorkyeran@aegisub.org>
-Date: Wed, 6 Apr 2016 11:24:21 -0700
-Subject: [PATCH] Use FFMS_DoIndexing2 when using a recent version of ffms2
-
-And clean up the audio track selection logic a bit.
----
- src/audio_provider_ffmpegsource.cpp | 40 ++++++++------------------
- src/ffmpegsource_common.cpp | 44 +++++++++++++++++++++--------
- src/ffmpegsource_common.h | 25 +++++-----------
- src/video_provider_ffmpegsource.cpp | 12 ++++----
- 4 files changed, 56 insertions(+), 65 deletions(-)
-
-diff --git a/src/audio_provider_ffmpegsource.cpp b/src/audio_provider_ffmpegsource.cpp
-index 4e44b1d29..606d5b415 100644
---- a/src/audio_provider_ffmpegsource.cpp
-+++ b/src/audio_provider_ffmpegsource.cpp
-@@ -91,18 +91,20 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
- }
-
- std::map<int, std::string> TrackList = GetTracksOfType(Indexer, FFMS_TYPE_AUDIO);
-- if (TrackList.empty())
-- throw agi::AudioDataNotFound("no audio tracks found");
-
- // initialize the track number to an invalid value so we can detect later on
- // whether the user actually had to choose a track or not
- int TrackNumber = -1;
- if (TrackList.size() > 1) {
-- TrackNumber = AskForTrackSelection(TrackList, FFMS_TYPE_AUDIO);
-- // if it's still -1 here, user pressed cancel
-- if (TrackNumber == -1)
-+ auto Selection = AskForTrackSelection(TrackList, FFMS_TYPE_AUDIO);
-+ if (Selection == TrackSelection::None)
- throw agi::UserCancelException("audio loading canceled by user");
-+ TrackNumber = static_cast<int>(Selection);
- }
-+ else if (TrackList.size() == 1)
-+ TrackNumber = TrackList.begin()->first;
-+ else
-+ throw agi::AudioDataNotFound("no audio tracks found");
-
- // generate a name for the cache file
- agi::fs::path CacheName = GetCacheFilename(filename);
-@@ -114,24 +116,13 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
- if (Index && FFMS_IndexBelongsToFile(Index, filename.string().c_str(), &ErrInfo))
- Index = nullptr;
-
-- // index valid but track number still not set?
- if (Index) {
-- // track number not set? just grab the first track
-- if (TrackNumber < 0)
-- TrackNumber = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_AUDIO, &ErrInfo);
-- if (TrackNumber < 0)
-- throw agi::AudioDataNotFound(std::string("Couldn't find any audio tracks: ") + ErrInfo.Buffer);
--
-- // index is valid and track number is now set,
-- // but do we have indexing info for the desired audio track?
-+ // we already have an index, but the desired track may not have been
-+ // indexed, and if it wasn't we need to reindex
- FFMS_Track *TempTrackData = FFMS_GetTrackFromIndex(Index, TrackNumber);
- if (FFMS_GetNumFrames(TempTrackData) <= 0)
- Index = nullptr;
- }
-- // no valid index exists and the file only has one audio track, index it
-- else if (TrackNumber < 0)
-- TrackNumber = FFMS_TRACKMASK_ALL;
-- // else: do nothing (keep track mask as it is)
-
- // reindex if the error handling mode has changed
- FFMS_IndexErrorHandling ErrorHandling = GetErrorHandlingMode();
-@@ -142,17 +133,10 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
-
- // moment of truth
- if (!Index) {
-- int TrackMask;
-- if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool() || TrackNumber == FFMS_TRACKMASK_ALL)
-- TrackMask = FFMS_TRACKMASK_ALL;
-- else
-- TrackMask = (1 << TrackNumber);
--
-+ TrackSelection TrackMask = static_cast<TrackSelection>(TrackNumber);
-+ if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool())
-+ TrackMask = TrackSelection::All;
- Index = DoIndexing(Indexer, CacheName, TrackMask, ErrorHandling);
--
-- // if tracknumber still isn't set we need to set it now
-- if (TrackNumber == FFMS_TRACKMASK_ALL)
-- TrackNumber = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_AUDIO, &ErrInfo);
- }
- else
- FFMS_CancelIndexing(Indexer);
-diff --git a/src/ffmpegsource_common.cpp b/src/ffmpegsource_common.cpp
-index 60a7e91e6..d66be0222 100644
---- a/src/ffmpegsource_common.cpp
-+++ b/src/ffmpegsource_common.cpp
-@@ -60,7 +60,10 @@ FFmpegSourceProvider::FFmpegSourceProvider(agi::BackgroundRunner *br)
- /// @param Indexer A pointer to the indexer object representing the file to be indexed
- /// @param CacheName The filename of the output index file
- /// @param Trackmask A binary mask of the track numbers to index
--FFMS_Index *FFmpegSourceProvider::DoIndexing(FFMS_Indexer *Indexer, agi::fs::path const& CacheName, int Trackmask, FFMS_IndexErrorHandling IndexEH) {
-+FFMS_Index *FFmpegSourceProvider::DoIndexing(FFMS_Indexer *Indexer,
-+ agi::fs::path const& CacheName,
-+ TrackSelection Track,
-+ FFMS_IndexErrorHandling IndexEH) {
- char FFMSErrMsg[1024];
- FFMS_ErrorInfo ErrInfo;
- ErrInfo.Buffer = FFMSErrMsg;
-@@ -78,8 +81,22 @@ FFMS_Index *FFmpegSourceProvider::DoIndexing(FFMS_Indexer *Indexer, agi::fs::pat
- ps->SetProgress(Current, Total);
- return ps->IsCancelled();
- };
-- Index = FFMS_DoIndexing(Indexer, Trackmask, FFMS_TRACKMASK_NONE,
-+#if FFMS_VERSION >= ((2 << 24) | (21 << 16) | (0 << 8) | 0)
-+ if (Track == TrackSelection::All)
-+ FFMS_TrackTypeIndexSettings(Indexer, FFMS_TYPE_AUDIO, 1, 0);
-+ else if (Track != TrackSelection::None)
-+ FFMS_TrackIndexSettings(Indexer, static_cast<int>(Track), 1, 0);
-+ FFMS_SetProgressCallback(Indexer, callback, ps);
-+ Index = FFMS_DoIndexing2(Indexer, IndexEH, &ErrInfo);
-+#else
-+ int Trackmask = 0;
-+ if (Track == TrackSelection::All)
-+ Trackmask = std::numeric_limits<int>::max();
-+ else if (Track != TrackSelection::None)
-+ Trackmask = 1 << static_cast<int>(Track);
-+ Index = FFMS_DoIndexing(Indexer, Trackmask, 0,
- nullptr, nullptr, IndexEH, callback, ps, &ErrInfo);
-+#endif
- });
-
- if (Index == nullptr)
-@@ -99,21 +116,24 @@ std::map<int, std::string> FFmpegSourceProvider::GetTracksOfType(FFMS_Indexer *I
- std::map<int,std::string> TrackList;
- int NumTracks = FFMS_GetNumTracksI(Indexer);
-
-+ // older versions of ffms2 can't index audio tracks past 31
-+#if FFMS_VERSION < ((2 << 24) | (21 << 16) | (0 << 8) | 0)
-+ if (Type == FFMS_TYPE_AUDIO)
-+ NumTracks = std::min(NumTracks, std::numeric_limits<int>::digits);
-+#endif
-+
- for (int i=0; i<NumTracks; i++) {
- if (FFMS_GetTrackTypeI(Indexer, i) == Type) {
-- const char *CodecName = FFMS_GetCodecNameI(Indexer, i);
-- if (CodecName)
-- TrackList.insert(std::pair<int,std::string>(i, CodecName));
-+ if (auto CodecName = FFMS_GetCodecNameI(Indexer, i))
-+ TrackList[i] = CodecName;
- }
- }
- return TrackList;
- }
-
--/// @brief Ask user for which track he wants to load
--/// @param TrackList A std::map with the track numbers as keys and codec names as values
--/// @param Type The track type to ask about
--/// @return Returns the track number chosen (an integer >= 0) on success, or a negative integer if the user cancelled.
--int FFmpegSourceProvider::AskForTrackSelection(const std::map<int, std::string> &TrackList, FFMS_TrackType Type) {
-+FFmpegSourceProvider::TrackSelection
-+FFmpegSourceProvider::AskForTrackSelection(const std::map<int, std::string> &TrackList,
-+ FFMS_TrackType Type) {
- std::vector<int> TrackNumbers;
- wxArrayString Choices;
-
-@@ -128,8 +148,8 @@ int FFmpegSourceProvider::AskForTrackSelection(const std::map<int, std::string>
- Choices);
-
- if (Choice < 0)
-- return Choice;
-- return TrackNumbers[Choice];
-+ return TrackSelection::None;
-+ return static_cast<TrackSelection>(TrackNumbers[Choice]);
- }
-
- /// @brief Set ffms2 log level according to setting in config.dat
-diff --git a/src/ffmpegsource_common.h b/src/ffmpegsource_common.h
-index 8cb7f33f6..5f6df7cfa 100644
---- a/src/ffmpegsource_common.h
-+++ b/src/ffmpegsource_common.h
-@@ -42,11 +42,6 @@
-
- namespace agi { class BackgroundRunner; }
-
--/// Index all tracks
--#define FFMS_TRACKMASK_ALL -1
--/// Index no tracks
--#define FFMS_TRACKMASK_NONE 0
--
- /// @class FFmpegSourceProvider
- /// @brief Base class for FFMS2 source providers; contains common functions etc
- class FFmpegSourceProvider {
-@@ -56,24 +51,18 @@ class FFmpegSourceProvider {
- public:
- FFmpegSourceProvider(agi::BackgroundRunner *br);
-
-- /// Logging level constants from avutil/log.h
-- enum FFMS_LogLevel {
-- /// nothing printed
-- FFMS_LOG_QUIET = -8,
-- FFMS_LOG_PANIC = 0,
-- FFMS_LOG_FATAL = 8,
-- FFMS_LOG_ERROR = 16,
-- FFMS_LOG_WARNING = 24,
-- FFMS_LOG_INFO = 32,
-- FFMS_LOG_VERBOSE = 40,
-- FFMS_LOG_DEBUG = 48,
-+ enum class TrackSelection : int {
-+ None = -1,
-+ All = -2
- };
-
- void CleanCache();
-
-- FFMS_Index *DoIndexing(FFMS_Indexer *Indexer, agi::fs::path const& Cachename, int Trackmask, FFMS_IndexErrorHandling IndexEH);
-+ FFMS_Index *DoIndexing(FFMS_Indexer *Indexer, agi::fs::path const& Cachename,
-+ TrackSelection Track,
-+ FFMS_IndexErrorHandling IndexEH);
- std::map<int, std::string> GetTracksOfType(FFMS_Indexer *Indexer, FFMS_TrackType Type);
-- int AskForTrackSelection(const std::map<int, std::string>& TrackList, FFMS_TrackType Type);
-+ TrackSelection AskForTrackSelection(const std::map<int, std::string>& TrackList, FFMS_TrackType Type);
- agi::fs::path GetCacheFilename(agi::fs::path const& filename);
- void SetLogLevel();
- FFMS_IndexErrorHandling GetErrorHandlingMode();
-diff --git a/src/video_provider_ffmpegsource.cpp b/src/video_provider_ffmpegsource.cpp
-index 5fd14f69c..8bd68fbbf 100644
---- a/src/video_provider_ffmpegsource.cpp
-+++ b/src/video_provider_ffmpegsource.cpp
-@@ -149,14 +149,12 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
- if (TrackList.size() <= 0)
- throw VideoNotSupported("no video tracks found");
-
-- // initialize the track number to an invalid value so we can detect later on
-- // whether the user actually had to choose a track or not
- int TrackNumber = -1;
- if (TrackList.size() > 1) {
-- TrackNumber = AskForTrackSelection(TrackList, FFMS_TYPE_VIDEO);
-- // if it's still -1 here, user pressed cancel
-- if (TrackNumber == -1)
-+ auto Selection = AskForTrackSelection(TrackList, FFMS_TYPE_VIDEO);
-+ if (Selection == TrackSelection::None)
- throw agi::UserCancelException("video loading cancelled by user");
-+ TrackNumber = static_cast<int>(Selection);
- }
-
- // generate a name for the cache file
-@@ -180,9 +178,9 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
-
- // moment of truth
- if (!Index) {
-- int TrackMask = FFMS_TRACKMASK_NONE;
-+ auto TrackMask = TrackSelection::None;
- if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool() || OPT_GET("Video/Open Audio")->GetBool())
-- TrackMask = FFMS_TRACKMASK_ALL;
-+ TrackMask = TrackSelection::All;
- Index = DoIndexing(Indexer, CacheName, TrackMask, GetErrorHandlingMode());
- }
- else {
-
-From 7a6da26be6a830f4e1255091952cc0a1326a4520 Mon Sep 17 00:00:00 2001
-From: Thomas Goyne <plorkyeran@aegisub.org>
-Date: Fri, 8 Apr 2016 12:14:28 -0700
-Subject: [PATCH] Fix compilation on X11-using platforms
-
----
- src/ffmpegsource_common.h | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/ffmpegsource_common.h b/src/ffmpegsource_common.h
-index 5f6df7cfa..383d5baa2 100644
---- a/src/ffmpegsource_common.h
-+++ b/src/ffmpegsource_common.h
-@@ -51,6 +51,9 @@ class FFmpegSourceProvider {
- public:
- FFmpegSourceProvider(agi::BackgroundRunner *br);
-
-+ // X11 is wonderful
-+#undef None
-+
- enum class TrackSelection : int {
- None = -1,
- All = -2
-commit 89c4e8d34ab77c3322f097b91fd9de22cbea7a37
-Author: Thomas Goyne <plorkyeran@aegisub.org>
-Date: Wed Nov 21 16:41:05 2018 -0800
-
- Update ffmpeg and ffms2
-
-diff --git a/src/video_provider_ffmpegsource.cpp b/src/video_provider_ffmpegsource.cpp
-index 8bd68fbbf..f4ed6a2f2 100644
---- a/src/video_provider_ffmpegsource.cpp
-+++ b/src/video_provider_ffmpegsource.cpp
-@@ -44,6 +44,23 @@
- #include <libaegisub/make_unique.h>
-
- namespace {
-+typedef enum AGI_ColorSpaces {
-+ AGI_CS_RGB = 0,
-+ AGI_CS_BT709 = 1,
-+ AGI_CS_UNSPECIFIED = 2,
-+ AGI_CS_FCC = 4,
-+ AGI_CS_BT470BG = 5,
-+ AGI_CS_SMPTE170M = 6,
-+ AGI_CS_SMPTE240M = 7,
-+ AGI_CS_YCOCG = 8,
-+ AGI_CS_BT2020_NCL = 9,
-+ AGI_CS_BT2020_CL = 10,
-+ AGI_CS_SMPTE2085 = 11,
-+ AGI_CS_CHROMATICITY_DERIVED_NCL = 12,
-+ AGI_CS_CHROMATICITY_DERIVED_CL = 13,
-+ AGI_CS_ICTCP = 14
-+} AGI_ColorSpaces;
-+
- /// @class FFmpegSourceVideoProvider
- /// @brief Implements video loading through the FFMS library.
- class FFmpegSourceVideoProvider final : public VideoProvider, FFmpegSourceProvider {
-@@ -78,7 +95,7 @@ public:
- if (matrix == RealColorSpace)
- FFMS_SetInputFormatV(VideoSource, CS, CR, FFMS_GetPixFmt(""), nullptr);
- else if (matrix == "TV.601")
-- FFMS_SetInputFormatV(VideoSource, FFMS_CS_BT470BG, CR, FFMS_GetPixFmt(""), nullptr);
-+ FFMS_SetInputFormatV(VideoSource, AGI_CS_BT470BG, CR, FFMS_GetPixFmt(""), nullptr);
- else
- return;
- ColorSpace = matrix;
-@@ -103,16 +120,16 @@ std::string colormatrix_description(int cs, int cr) {
- std::string str = cr == FFMS_CR_JPEG ? "PC" : "TV";
-
- switch (cs) {
-- case FFMS_CS_RGB:
-+ case AGI_CS_RGB:
- return "None";
-- case FFMS_CS_BT709:
-+ case AGI_CS_BT709:
- return str + ".709";
-- case FFMS_CS_FCC:
-+ case AGI_CS_FCC:
- return str + ".FCC";
-- case FFMS_CS_BT470BG:
-- case FFMS_CS_SMPTE170M:
-+ case AGI_CS_BT470BG:
-+ case AGI_CS_SMPTE170M:
- return str + ".601";
-- case FFMS_CS_SMPTE240M:
-+ case AGI_CS_SMPTE240M:
- return str + ".240M";
- default:
- throw VideoOpenError("Unknown video color space");
-@@ -206,8 +223,10 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
-
- // set thread count
- int Threads = OPT_GET("Provider/Video/FFmpegSource/Decoding Threads")->GetInt();
-+#if FFMS_VERSION < ((2 << 24) | (30 << 16) | (0 << 8) | 0)
- if (FFMS_GetVersion() < ((2 << 24) | (17 << 16) | (2 << 8) | 1) && FFMS_GetSourceType(Index) == FFMS_SOURCE_LAVF)
- Threads = 1;
-+#endif
-
- // set seekmode
- // TODO: give this its own option?
-@@ -235,18 +254,22 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
- else
- DAR = double(Width) / Height;
-
-- CS = TempFrame->ColorSpace;
-+ int VideoCS = CS = TempFrame->ColorSpace;
- CR = TempFrame->ColorRange;
-
-- if (CS == FFMS_CS_UNSPECIFIED)
-- CS = Width > 1024 || Height >= 600 ? FFMS_CS_BT709 : FFMS_CS_BT470BG;
-+ if (CS == AGI_CS_UNSPECIFIED)
-+ CS = Width > 1024 || Height >= 600 ? AGI_CS_BT709 : AGI_CS_BT470BG;
- RealColorSpace = ColorSpace = colormatrix_description(CS, CR);
-
- #if FFMS_VERSION >= ((2 << 24) | (17 << 16) | (1 << 8) | 0)
-- if (CS != FFMS_CS_RGB && CS != FFMS_CS_BT470BG && ColorSpace != colormatrix && (colormatrix == "TV.601" || OPT_GET("Video/Force BT.601")->GetBool())) {
-- if (FFMS_SetInputFormatV(VideoSource, FFMS_CS_BT470BG, CR, FFMS_GetPixFmt(""), &ErrInfo))
-+ if (CS != AGI_CS_RGB && CS != AGI_CS_BT470BG && ColorSpace != colormatrix && (colormatrix == "TV.601" || OPT_GET("Video/Force BT.601")->GetBool())) {
-+ CS = AGI_CS_BT470BG;
-+ ColorSpace = colormatrix_description(AGI_CS_BT470BG, CR);
-+ }
-+
-+ if (CS != VideoCS) {
-+ if (FFMS_SetInputFormatV(VideoSource, CS, CR, FFMS_GetPixFmt(""), &ErrInfo))
- throw VideoOpenError(std::string("Failed to set input format: ") + ErrInfo.Buffer);
-- ColorSpace = colormatrix_description(FFMS_CS_BT470BG, CR);
- }
- #endif
-