| 251 | |
| 252 | |
| 253 | bool MfMediaEngine::transferVideoFrame() |
| 254 | { |
| 255 | if (m_mediaEngine != nullptr && m_state == MEMediaState::Playing) |
| 256 | { |
| 257 | do |
| 258 | { |
| 259 | LONGLONG pts; |
| 260 | AX_BREAK_IF(FAILED(m_mediaEngine->OnVideoStreamTick(&pts))); |
| 261 | |
| 262 | const MFVideoNormalizedRect rect{0, 0, 1.0, 1.0}; |
| 263 | const RECT rcTarget{0, 0, m_videoExtent.x, m_videoExtent.y}; |
| 264 | HRESULT hr = m_mediaEngine->TransferVideoFrame(m_wicBitmap.Get(), &rect, &rcTarget, &m_bkgColor); |
| 265 | AX_BREAK_IF(FAILED(hr)); |
| 266 | |
| 267 | ComPtr<IWICBitmapLock> lockedData; |
| 268 | DWORD flags = WICBitmapLockRead; |
| 269 | WICRect srcRect{0, 0, m_videoExtent.x, m_videoExtent.y}; |
| 270 | |
| 271 | AX_BREAK_IF(FAILED(m_wicBitmap->Lock(&srcRect, flags, lockedData.GetAddressOf()))); |
| 272 | |
| 273 | UINT stride{0}; |
| 274 | AX_BREAK_IF(FAILED(lockedData->GetStride(&stride))); |
| 275 | |
| 276 | UINT bufferSize{0}; |
| 277 | BYTE* data{nullptr}; |
| 278 | AX_BREAK_IF(FAILED(lockedData->GetDataPointer(&bufferSize, &data))); |
| 279 | |
| 280 | _onVideoFrame(MEVideoFrame{data, nullptr, bufferSize, MEVideoPixelDesc{MEVideoPixelFormat::BGR32, m_videoExtent}, |
| 281 | m_videoExtent}); |
| 282 | return true; |
| 283 | } while (false); |
| 284 | } |
| 285 | return false; |
| 286 | } |
| 287 | |
| 288 | void MfMediaEngine::OnMediaEngineEvent(uint32_t meEvent) |
| 289 | { |
no test coverage detected