Skip to content

Commit 28ea701

Browse files
committed
Добавлен код для исследования разброса Sync offset.
1 parent 52866b8 commit 28ea701

File tree

4 files changed

+55
-35
lines changed

4 files changed

+55
-35
lines changed

Source/DX11VideoProcessor.cpp

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,7 +1678,12 @@ HRESULT CDX11VideoProcessor::ProcessSample(IMediaSample* pSample)
16781678
}
16791679

16801680
m_RenderStats.syncoffset = rtClock - rtStart;
1681-
m_Syncs.Add((int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS));
1681+
1682+
int so = (int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS);
1683+
#if SYNC_OFFSET_EX
1684+
m_SyncDevs.Add(so - m_Syncs.Last());
1685+
#endif
1686+
m_Syncs.Add(so);
16821687

16831688
if (m_bDoubleFrames) {
16841689
if (rtEnd < rtClock) {
@@ -1694,7 +1699,12 @@ HRESULT CDX11VideoProcessor::ProcessSample(IMediaSample* pSample)
16941699

16951700
rtStart += rtFrameDur / 2;
16961701
m_RenderStats.syncoffset = rtClock - rtStart;
1697-
m_Syncs.Add((int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS));
1702+
1703+
so = (int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS);
1704+
#if SYNC_OFFSET_EX
1705+
m_SyncDevs.Add(so - m_Syncs.Last());
1706+
#endif
1707+
m_Syncs.Add(so);
16981708
}
16991709

17001710
return hr;
@@ -3168,22 +3178,15 @@ HRESULT CDX11VideoProcessor::DrawStats(ID3D11Texture2D* pRenderTarget)
31683178
m_RenderStats.presentticks * 1000 / GetPreciseTicksPerSecondI());
31693179
str += fmt::format(L"\nSync offset : {:+3} ms", (m_RenderStats.syncoffset + 5000) / 10000);
31703180

3171-
#if SYNC_OFFSET_RANGE
3181+
#if SYNC_OFFSET_EX
31723182
{
3173-
const int* p = m_Syncs.Data();
3174-
const int* const end = p + m_Syncs.Size();
3175-
int so_min;
3176-
int so_max = so_min = *(p++);
3177-
while (p < end) {
3178-
auto so = *(p++);
3179-
if (so > so_max) {
3180-
so_max = so;
3181-
}
3182-
else if (so < so_min) {
3183-
so_min = so;
3184-
}
3185-
}
3186-
str += fmt::format(L", min={:+3}, max={:+3}, range={:3}", (so_min + 5000) / 10000, (so_max + 5000) / 10000, (so_max - so_min + 5000) / 10000);
3183+
const auto [so_min, so_max] = m_Syncs.MinMax();
3184+
const auto [sod_min, sod_max] = m_SyncDevs.MinMax();
3185+
str += fmt::format(L", range[{:+3.0f};{:+3.0f}], max change{:+3.0f}/{:+3.0f}",
3186+
so_min / 10000.0f,
3187+
so_max / 10000.0f,
3188+
sod_min / 10000.0f,
3189+
sod_max / 10000.0f);
31873190
}
31883191
#endif
31893192
#if TEST_TICKS

Source/DX9VideoProcessor.cpp

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,12 @@ HRESULT CDX9VideoProcessor::ProcessSample(IMediaSample* pSample)
12021202
}
12031203

12041204
m_RenderStats.syncoffset = rtClock - rtStart;
1205-
m_Syncs.Add((int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS));
1205+
1206+
int so = (int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS);
1207+
#if SYNC_OFFSET_EX
1208+
m_SyncDevs.Add(so - m_Syncs.Last());
1209+
#endif
1210+
m_Syncs.Add(so);
12061211

12071212
if (m_bDoubleFrames) {
12081213
if (rtEnd < rtClock) {
@@ -1218,7 +1223,12 @@ HRESULT CDX9VideoProcessor::ProcessSample(IMediaSample* pSample)
12181223

12191224
rtStart += rtFrameDur / 2;
12201225
m_RenderStats.syncoffset = rtClock - rtStart;
1221-
m_Syncs.Add((int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS));
1226+
1227+
so = (int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS);
1228+
#if SYNC_OFFSET_EX
1229+
m_SyncDevs.Add(so - m_Syncs.Last());
1230+
#endif
1231+
m_Syncs.Add(so);
12221232
}
12231233

12241234
return hr;
@@ -2731,22 +2741,15 @@ HRESULT CDX9VideoProcessor::DrawStats(IDirect3DSurface9* pRenderTarget)
27312741
m_RenderStats.presentticks * 1000 / GetPreciseTicksPerSecondI());
27322742
str += fmt::format(L"\nSync offset : {:+3} ms", (m_RenderStats.syncoffset + 5000) / 10000);
27332743

2734-
#if SYNC_OFFSET_RANGE
2744+
#if SYNC_OFFSET_EX
27352745
{
2736-
const int* p = m_Syncs.Data();
2737-
const int* const end = p + m_Syncs.Size();
2738-
int so_min;
2739-
int so_max = so_min = *(p++);
2740-
while (p < end) {
2741-
auto so = *(p++);
2742-
if (so > so_max) {
2743-
so_max = so;
2744-
}
2745-
else if (so < so_min) {
2746-
so_min = so;
2747-
}
2748-
}
2749-
str += fmt::format(L", min={:+3}, max={:+3}, range={:3}", (so_min + 5000) / 10000, (so_max + 5000) / 10000, (so_max - so_min + 5000) / 10000);
2746+
const auto [so_min, so_max] = m_Syncs.MinMax();
2747+
const auto [sod_min, sod_max] = m_SyncDevs.MinMax();
2748+
str += fmt::format(L", range[{:+3.0f};{:+3.0f}], max change{:+3.0f}/{:+3.0f}",
2749+
so_min / 10000.0f,
2750+
so_max / 10000.0f,
2751+
sod_min / 10000.0f,
2752+
sod_max / 10000.0f);
27502753
}
27512754
#endif
27522755
#if TEST_TICKS

Source/FrameStats.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
#include "Times.h"
2424

25-
#define SYNC_OFFSET_RANGE 0
25+
#define SYNC_OFFSET_EX 0
2626
#define TEST_TICKS 0
2727

2828
template<typename T, unsigned count> class CFrameTimestamps {
@@ -177,6 +177,7 @@ template<typename T> class CMovingAverage
177177
private:
178178
std::vector<T> fifo;
179179
unsigned oldestIndex = 0;
180+
unsigned lastIndex = 0;
180181
T sum = 0;
181182

182183
public:
@@ -188,16 +189,26 @@ template<typename T> class CMovingAverage
188189
void Add(T sample) {
189190
sum = sum + sample - fifo[oldestIndex];
190191
fifo[oldestIndex] = sample;
192+
lastIndex = oldestIndex;
191193
oldestIndex++;
192194
if (oldestIndex == fifo.size()) {
193195
oldestIndex = 0;
194196
}
195197
}
196198

199+
T Last() {
200+
return fifo[lastIndex];
201+
}
202+
197203
T Average() {
198204
return sum / fifo.size();
199205
}
200206

207+
std::pair<T, T> MinMax() {
208+
const auto [min_e, max_e] = minmax_element(fifo.begin(), fifo.end());
209+
return { *min_e, *max_e };
210+
}
211+
201212
T* Data() {
202213
return fifo.data();
203214
}

Source/VideoProcessor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ class CVideoProcessor
124124

125125
// Graph of a function
126126
CMovingAverage<int> m_Syncs = CMovingAverage<int>(120);
127+
#if SYNC_OFFSET_EX
128+
CMovingAverage<int> m_SyncDevs = CMovingAverage<int>(m_Syncs.Size()-1);
129+
#endif
127130
int m_Xstep = 4;
128131
int m_Yscale = 2;
129132
RECT m_GraphRect = {};

0 commit comments

Comments
 (0)