| 1269 | } |
| 1270 | |
| 1271 | HRESULT 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 | } |
no test coverage detected