ImxVpuDecReturnCodes imx_vpu_dec_unload(void) { IMX_VPU_TRACE("VPU load instance counter: %lu", vpu_load_inst_counter); if (vpu_load_inst_counter == 0) return IMX_VPU_DEC_RETURN_CODE_OK; ImxVpuDecReturnCodes ret = dec_convert_retcode(VPU_DecUnLoad()); if (ret != IMX_VPU_DEC_RETURN_CODE_OK) IMX_VPU_ERROR("unloading decoder failed: %s", imx_vpu_dec_error_string(ret)); else { IMX_VPU_TRACE("unloaded decoder"); --vpu_load_inst_counter; } return ret; }
void CDVDVideoCodecIMX::Dispose(void) { VpuDecRetCode ret; bool VPU_loaded = m_vpuHandle; // Prevent rendering thread from using frame buffers Enter(); // Release last buffer if(m_lastBuffer) SAFE_RELEASE(m_lastBuffer); // Invalidate output buffers to prevent the renderer from mapping this memory for (int i=0; i<m_vpuFrameBufferNum; i++) { m_outputBuffers[i]->ReleaseFramebuffer(&m_vpuHandle); SAFE_RELEASE(m_outputBuffers[i]); } Leave(); if (m_vpuHandle) { ret = VPU_DecFlushAll(m_vpuHandle); if (ret != VPU_DEC_RET_SUCCESS) { CLog::Log(LOGERROR, "%s - VPU flush failed with error code %d.\n", __FUNCTION__, ret); } ret = VPU_DecClose(m_vpuHandle); if (ret != VPU_DEC_RET_SUCCESS) { CLog::Log(LOGERROR, "%s - VPU close failed with error code %d.\n", __FUNCTION__, ret); } m_vpuHandle = 0; } m_frameCounter = 0; // Release memory if (m_outputBuffers != NULL) { delete m_outputBuffers; m_outputBuffers = NULL; } VpuFreeBuffers(); m_vpuFrameBufferNum = 0; if (m_vpuFrameBuffers != NULL) { delete m_vpuFrameBuffers; m_vpuFrameBuffers = NULL; } if (VPU_loaded) { ret = VPU_DecUnLoad(); if (ret != VPU_DEC_RET_SUCCESS) { CLog::Log(LOGERROR, "%s - VPU unload failed with error code %d.\n", __FUNCTION__, ret); } } if (m_converter) { m_converter->Close(); SAFE_DELETE(m_converter); } return; }