ImxVpuDecReturnCodes imx_vpu_dec_close(ImxVpuDecoder *decoder) { VpuDecRetCode ret; IMX_VPU_TRACE("closing decoder"); ret = VPU_DecFlushAll(decoder->handle); if (ret == VPU_DEC_RET_FAILURE_TIMEOUT) { IMX_VPU_WARNING("resetting decoder after a timeout occurred"); ret = VPU_DecReset(decoder->handle); if (ret != VPU_DEC_RET_SUCCESS) IMX_VPU_ERROR("resetting decoder failed: %s", imx_vpu_dec_error_string(dec_convert_retcode(ret))); } else if (ret != VPU_DEC_RET_SUCCESS) IMX_VPU_ERROR("flushing decoder failed: %s", imx_vpu_dec_error_string(dec_convert_retcode(ret))); ret = VPU_DecClose(decoder->handle); if (ret != VPU_DEC_RET_SUCCESS) IMX_VPU_ERROR("closing decoder failed: %s", imx_vpu_dec_error_string(dec_convert_retcode(ret))); if (decoder->user_data_for_frames != NULL) IMX_VPU_FREE(decoder->user_data_for_frames, sizeof(void*) * decoder->num_framebuffers); if (decoder->wrapper_framebuffers != NULL) IMX_VPU_FREE(decoder->wrapper_framebuffers, sizeof(VpuFrameBuffer*) * decoder->num_framebuffers); if (decoder->virt_mem_sub_block != NULL) IMX_VPU_FREE(decoder->virt_mem_sub_block, decoder->virt_mem_sub_block_size); IMX_VPU_FREE(decoder, sizeof(ImxVpuDecoder)); IMX_VPU_TRACE("closed decoder"); return dec_convert_retcode(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; }