MCPcopy Create free account
hub / github.com/Aleksoid1978/VideoRenderer / ProcessSample

Method ProcessSample

Source/DX9VideoProcessor.cpp:1271–1328  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1269}
1270
1271HRESULT CDX9VideoProcessor::ProcessSample(IMediaSample* pSample)
1272{
1273 REFERENCE_TIME rtStart, rtEnd;
1274 if (FAILED(pSample->GetTime(&rtStart, &rtEnd))) {
1275 rtStart = m_pFilter->m_FrameStats.GeTimestamp();
1276 }
1277 const REFERENCE_TIME rtFrameDur = m_pFilter->m_FrameStats.GetAverageFrameDuration();
1278 rtEnd = rtStart + rtFrameDur;
1279
1280 m_rtStart = rtStart;
1281 CRefTime rtClock(rtStart);
1282
1283 HRESULT hr = CopySample(pSample);
1284 if (FAILED(hr)) {
1285 m_RenderStats.failed++;
1286 return hr;
1287 }
1288
1289 // always Render(1) a frame after CopySample()
1290 hr = Render(1, rtStart);
1291 m_pFilter->m_DrawStats.Add(GetPreciseTick());
1292 if (m_pFilter->m_filterState == State_Running) {
1293 m_pFilter->StreamTime(rtClock);
1294 }
1295
1296 m_RenderStats.syncoffset = rtClock - rtStart;
1297
1298 int so = (int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS);
1299#if SYNC_OFFSET_EX
1300 m_SyncDevs.Add(so - m_Syncs.Last());
1301#endif
1302 m_Syncs.Add(so);
1303
1304 if (m_bDoubleFrames) {
1305 if (rtEnd < rtClock) {
1306 m_RenderStats.dropped2++;
1307 return S_FALSE; // skip frame
1308 }
1309
1310 rtStart += rtFrameDur / 2;
1311
1312 hr = Render(2, rtStart);
1313 m_pFilter->m_DrawStats.Add(GetPreciseTick());
1314 if (m_pFilter->m_filterState == State_Running) {
1315 m_pFilter->StreamTime(rtClock);
1316 }
1317
1318 m_RenderStats.syncoffset = rtClock - rtStart;
1319
1320 so = (int)std::clamp(m_RenderStats.syncoffset, -UNITS, UNITS);
1321#if SYNC_OFFSET_EX
1322 m_SyncDevs.Add(so - m_Syncs.Last());
1323#endif
1324 m_Syncs.Add(so);
1325 }
1326
1327 return hr;
1328}

Callers 1

DoRenderSampleMethod · 0.45

Calls 5

GetPreciseTickFunction · 0.85
GeTimestampMethod · 0.80
LastMethod · 0.80
AddMethod · 0.45

Tested by

no test coverage detected