File: update-ffms2.patch

package info (click to toggle)
aegisub 3.2.2%2Bdfsg-7.3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 22,988 kB
  • sloc: cpp: 57,067; ansic: 16,457; asm: 3,618; sh: 3,525; makefile: 409; python: 350; perl: 274; cs: 205; xml: 196; objc: 47
file content (108 lines) | stat: -rw-r--r-- 3,927 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
From: Thomas Goyne <plorkyeran@aegisub.org>
Date: Wed, 21 Nov 2018 16:41:05 -0800
Subject: Update ffmpeg and ffms2

---
 src/video_provider_ffmpegsource.cpp | 49 +++++++++++++++++++++++++++----------
 1 file changed, 36 insertions(+), 13 deletions(-)

diff --git a/src/video_provider_ffmpegsource.cpp b/src/video_provider_ffmpegsource.cpp
index 5fd14f6..5231a08 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");
@@ -208,8 +225,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?
@@ -237,18 +256,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