mfxStatus CQuickSyncDecoder::InitFrameAllocator(mfxVideoParam* pVideoParams, mfxU32 nPitch) { MSDK_TRACE("QsDecoder: InitFrameAllocator\n"); // Already initialized if (m_pFrameSurfaces) { return MFX_ERR_NONE; } MSDK_CHECK_POINTER(m_pmfxDEC, MFX_ERR_NOT_INITIALIZED); mfxStatus sts = MFX_ERR_NONE; // Initialize frame allocator (if needed) sts = CreateAllocator(); MSDK_CHECK_NOT_EQUAL(sts, MFX_ERR_NONE, sts); // Find how many surfaces are needed mfxFrameAllocRequest allocRequest; MSDK_ZERO_VAR(allocRequest); sts = m_pmfxDEC->QueryIOSurf(pVideoParams, &allocRequest); MSDK_IGNORE_MFX_STS(sts, MFX_WRN_PARTIAL_ACCELERATION); MSDK_IGNORE_MFX_STS(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); MSDK_CHECK_RESULT_P_RET(sts, MFX_ERR_NONE); allocRequest.NumFrameSuggested = (mfxU16)m_nAuxFrameCount + allocRequest.NumFrameSuggested; allocRequest.NumFrameMin = allocRequest.NumFrameSuggested; // Decide memory type allocRequest.Type = MFX_MEMTYPE_EXTERNAL_FRAME | MFX_MEMTYPE_FROM_DECODE; allocRequest.Type |= (m_bUseD3DAlloc) ? MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET : MFX_MEMTYPE_SYSTEM_MEMORY; memcpy(&allocRequest.Info, &pVideoParams->mfx.FrameInfo, sizeof(mfxFrameInfo)); // Allocate frames with H aligned at 32 for both progressive and interlaced content allocRequest.Info.Height = MSDK_ALIGN32(allocRequest.Info.Height); allocRequest.Info.Width = (mfxU16)nPitch; // Perform allocation call. result is saved in m_AllocResponse sts = m_pFrameAllocator->Alloc(m_pFrameAllocator->pthis, &allocRequest, &m_AllocResponse); MSDK_CHECK_RESULT_P_RET(sts, MFX_ERR_NONE); m_nRequiredFramesNum = m_AllocResponse.NumFrameActual; ASSERT(m_nRequiredFramesNum == allocRequest.NumFrameSuggested); m_pFrameSurfaces = new mfxFrameSurface1[m_nRequiredFramesNum]; MSDK_CHECK_POINTER(m_pFrameSurfaces, MFX_ERR_MEMORY_ALLOC); MSDK_ZERO_MEMORY(m_pFrameSurfaces, sizeof(mfxFrameSurface1) * m_nRequiredFramesNum); // Allocate decoder work & output surfaces for (mfxU32 i = 0; i < m_nRequiredFramesNum; ++i) { // Copy frame info memcpy(&(m_pFrameSurfaces[i].Info), &pVideoParams->mfx.FrameInfo, sizeof(mfxFrameInfo)); // Save pointer to allocator specific surface object (mid) m_pFrameSurfaces[i].Data.MemId = m_AllocResponse.mids[i]; m_pFrameSurfaces[i].Data.Pitch = (mfxU16)nPitch; } return sts; }
HRESULT COutputPin::SetUserData(sUserData *pUserData) { HRESULT hr = S_OK; hr = CreateAllocator(); if (FAILED(hr)) return hr; hr = m_pAlloc->SetUserData(pUserData); if (FAILED(hr)) return hr; return S_OK; }
mfxStatus CRendererPipeline::Init(mfxU16 nWidth, mfxU16 nHeight, MemType memType, HWND hParentWnd) { mfxStatus sts = MFX_ERR_NONE; mfxVersion min_version; mfxVersion version; // real API version with which library is initialized // we set version to 1.0 and later we will query actual version of the library which will got leaded min_version.Major = 1; min_version.Minor = 0; //sts = m_mfxSession.Init(MFX_IMPL_SOFTWARE, &min_version); //sts = m_mfxSession.Init(MFX_IMPL_HARDWARE, &min_version); sts = m_mfxSession.Init(MFX_IMPL_RUNTIME, &min_version); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); sts = MFXQueryVersion(m_mfxSession , &version); // get real API version of the loaded library MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); // set memory type m_nHeight = nHeight; m_nWidth = nWidth; m_memType = memType; m_hParentWnd=hParentWnd; m_nY = m_nWidth*m_nHeight; m_nUV = (m_nY / 4); // create and init frame allocator sts = CreateAllocator(); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); sts = AllocFrames(); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); return MFX_ERR_NONE; }