parent
a8dc2d594b
commit
5f30bb2484
@ -0,0 +1,105 @@ |
||||
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
|
Loading…
Reference in new issue