From 30508c32477cad7e0dade724b3faa6d36911b0e5 Mon Sep 17 00:00:00 2001
From: Asd-g <65298684+Asd-g@users.noreply.github.com>
Date: Tue, 13 Oct 2020 11:27:41 +0300
Subject: [PATCH] Set frame properties
---
CHANGELOG.md | 5 ++++
build/D2VSource.vcxproj | 4 +--
src/AVISynthAPI.cpp | 56 +++++++++++++++++++++++++++++++++++++++++
src/AVISynthAPI.h | 1 +
src/d2vsource.rc | 8 +++---
5 files changed, 68 insertions(+), 6 deletions(-)
create mode 100644 CHANGELOG.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..6403ad5
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+##### 1.1.0:
+ Set frame properties - _DurationNum, _DurationDen, _FieldBased, _AspectRatio, _GOPNumber, _GOPPosition, _GOPClosed, _EncodedFrameTop, _EncodedFrameBottom, _PictType, _Matrix, _QuantsAverage, _QuantsAverage, _QuantsMax.
+
+##### 1.0.0:
+ Renamed the plugin and function to D2VSource.
\ No newline at end of file
diff --git a/build/D2VSource.vcxproj b/build/D2VSource.vcxproj
index 32e53c0..4c76d67 100644
--- a/build/D2VSource.vcxproj
+++ b/build/D2VSource.vcxproj
@@ -99,7 +99,7 @@
true
Speed
true
- false
+ true
true
Precise
@@ -119,7 +119,7 @@
true
Speed
true
- false
+ true
true
GenerateParallelCode
diff --git a/src/AVISynthAPI.cpp b/src/AVISynthAPI.cpp
index 0df4f4b..fb8a627 100644
--- a/src/AVISynthAPI.cpp
+++ b/src/AVISynthAPI.cpp
@@ -244,6 +244,10 @@ MPEG2Source::MPEG2Source(const char* d2v, int idct, bool showQ,
luminanceTable[i] = static_cast(value);
}
}
+
+ has_at_least_v8 = true;
+ try { env->CheckVersion(8); }
+ catch (const AvisynthError&) { has_at_least_v8 = false; }
}
@@ -277,6 +281,58 @@ PVideoFrame __stdcall MPEG2Source::GetFrame(int n, IScriptEnvironment* env)
if (d.info != 0)
show_info(n, d, frame, vi, env);
+ if (has_at_least_v8)
+ {
+ AVSMap* props = env->getFramePropsRW(frame);
+
+ /* Sample duration */
+ env->propSetInt(props, "_DurationNum", d.VF_FrameRate_Num, 0);
+ env->propSetInt(props, "_DurationDen", d.VF_FrameRate_Den, 0);
+ /* BFF or TFF */
+ uint32_t raw = std::max(d.FrameList[n].bottom, d.FrameList[n].top);
+ if (raw < d.BadStartingFrames)
+ raw = d.BadStartingFrames;
+
+ uint32_t gop = 0;
+ do {
+ if (raw >= d.GOPList[gop].number)
+ if (raw < d.GOPList[static_cast(gop) + 1].number)
+ break;
+ } while (++gop < d.GOPList.size() - 1);
+
+ const auto& rgop = d.GOPList[gop];
+
+ int field_based = 0;
+ if (!rgop.progressive)
+ field_based = d.Field_Order == 1 ? 2 : 1;
+ env->propSetInt(props, "_FieldBased", field_based, 0);
+ /* AR */
+ env->propSetData(props, "_AspectRatio", d.Aspect_Ratio, *(d.Aspect_Ratio), 0);
+ /* GOP */
+ int64_t gop_number[2] = { gop, rgop.number };
+ env->propSetIntArray(props, "_GOPNumber", gop_number, 2);
+ env->propSetInt(props, "_GOPPosition", rgop.position, 0);
+
+ int closed_gop = rgop.closed ? 1 : 0;
+ env->propSetInt(props, "_GOPClosed", closed_gop, 0);
+ /* Encoded frame */
+ const auto& fn = d.FrameList[n];
+
+ env->propSetInt(props, "_EncodedFrameTop", fn.top, 0);
+ env->propSetInt(props, "_EncodedFrameBottom", fn.bottom, 0);
+ /* Picture type */
+ const auto& fraw = d.FrameList[raw];
+ const char* pct = fraw.pct == I_TYPE ? "I" : fraw.pct == B_TYPE ? "B" : "P";
+
+ env->propSetData(props, "_PictType", pct, 1, 0);
+ /* Matrix */
+ env->propSetInt(props, "_Matrix", rgop.matrix, 0);
+ /* Quants */
+ env->propSetInt(props, "_QuantsAverage", d.avgquant, 0);
+ env->propSetInt(props, "_QuantsMin", d.minquant, 0);
+ env->propSetInt(props, "_QuantsMax", d.maxquant, 0);
+ }
+
return frame;
}
diff --git a/src/AVISynthAPI.h b/src/AVISynthAPI.h
index 4c812ce..d1531d3 100644
--- a/src/AVISynthAPI.h
+++ b/src/AVISynthAPI.h
@@ -39,6 +39,7 @@ class MPEG2Source: public IClip {
CMPEG2Decoder* decoder;
bool luminanceFlag;
uint8_t luminanceTable[256];
+ bool has_at_least_v8;
public:
MPEG2Source(const char* d2v, int idct, bool showQ, int _info, int _upConv, bool _i420, int iCC, IScriptEnvironment* env);
diff --git a/src/d2vsource.rc b/src/d2vsource.rc
index 9793c45..628e668 100644
--- a/src/d2vsource.rc
+++ b/src/d2vsource.rc
@@ -2,8 +2,8 @@
#include
VS_VERSION_INFO VERSIONINFO
-FILEVERSION 1,0,0,0
-PRODUCTVERSION 1,0,0,0
+FILEVERSION 1,1,0,0
+PRODUCTVERSION 1,1,0,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0x0L
FILEOS VOS__WINDOWS32
@@ -16,11 +16,11 @@ BEGIN
BEGIN
VALUE "Comments", "Modified DGDecode."
VALUE "FileDescription", "D2VSource for AviSynth 2.6 / AviSynth+"
- VALUE "FileVersion", "1.0.0"
+ VALUE "FileVersion", "1.1.0"
VALUE "InternalName", "D2VSource"
VALUE "OriginalFilename", "D2VSource.dll"
VALUE "ProductName", "D2VSource"
- VALUE "ProductVersion", "1.0.0"
+ VALUE "ProductVersion", "1.1.0"
END
END
BLOCK "VarFileInfo"