static gboolean gst_test_vpu_dec_alloc_phys_mem(GstTestPhysMemAllocator *allocator, GstTestPhysMemory *memory, gssize size) { VpuDecRetCode ret; VpuMemDesc mem_desc; if (!gst_test_vpu_dec_load()) return FALSE; memset(&mem_desc, 0, sizeof(VpuMemDesc)); mem_desc.nSize = size; ret = VPU_DecGetMem(&mem_desc); if (ret == VPU_DEC_RET_SUCCESS) { memory->mem.size = mem_desc.nSize; memory->mapped_virt_addr = (gpointer)(mem_desc.nVirtAddr); memory->phys_addr = (gst_test_phys_addr_t)(mem_desc.nPhyAddr); memory->internal = (gpointer)(mem_desc.nCpuAddr); GST_DEBUG_OBJECT(allocator, "addresses: virt: %p phys: %" GST_TEST_PHYS_ADDR_FORMAT " cpu: %p", memory->mapped_virt_addr, memory->phys_addr, memory->internal); return TRUE; } else return FALSE; }
ImxVpuDecReturnCodes imx_vpu_dec_allocate_memory(ImxVpuMemBlock *mem_block) { VpuDecRetCode ret; VpuMemDesc mem_desc; if (mem_block->alignment == 0) mem_block->alignment = 1; mem_desc.nSize = mem_block->size + mem_block->alignment; if ((ret = VPU_DecGetMem(&mem_desc)) != VPU_DEC_RET_SUCCESS) { IMX_VPU_ERROR("allocating %d bytes of physical memory failed: %s", mem_block->size, imx_vpu_dec_error_string(dec_convert_retcode(ret))); return dec_convert_retcode(ret); } else IMX_VPU_TRACE("allocated %d bytes of physical memory", mem_block->size); convert_from_wrapper_mem_desc(&mem_desc, mem_block); mem_block->virtual_address = (void *)IMX_VPU_ALIGN_VAL_TO(mem_block->virtual_address_unaligned, mem_block->alignment); mem_block->physical_address = (imx_vpu_phys_addr_t)IMX_VPU_ALIGN_VAL_TO(mem_block->physical_address_unaligned, mem_block->alignment); return IMX_VPU_DEC_RETURN_CODE_OK; }
bool CDVDVideoCodecIMX::VpuAllocBuffers(VpuMemInfo *pMemBlock) { int i, size; void* ptr; VpuMemDesc vpuMem; VpuDecRetCode ret; for(i=0; i<pMemBlock->nSubBlockNum; i++) { size = pMemBlock->MemSubBlock[i].nAlignment + pMemBlock->MemSubBlock[i].nSize; if (pMemBlock->MemSubBlock[i].MemType == VPU_MEM_VIRT) { // Allocate standard virtual memory ptr = malloc(size); if(ptr == NULL) { CLog::Log(LOGERROR, "%s - Unable to malloc %d bytes.\n", __FUNCTION__, size); goto AllocFailure; } pMemBlock->MemSubBlock[i].pVirtAddr = (unsigned char*)Align(ptr, pMemBlock->MemSubBlock[i].nAlignment); m_decMemInfo.nVirtNum++; m_decMemInfo.virtMem = (void**)realloc(m_decMemInfo.virtMem, m_decMemInfo.nVirtNum*sizeof(void*)); m_decMemInfo.virtMem[m_decMemInfo.nVirtNum-1] = ptr; } else { // Allocate contigous mem for DMA vpuMem.nSize = size; ret = VPU_DecGetMem(&vpuMem); if(ret != VPU_DEC_RET_SUCCESS) { CLog::Log(LOGERROR, "%s - Unable alloc %d bytes of physical memory (%d).\n", __FUNCTION__, size, ret); goto AllocFailure; } pMemBlock->MemSubBlock[i].pVirtAddr = (unsigned char*)Align(vpuMem.nVirtAddr, pMemBlock->MemSubBlock[i].nAlignment); pMemBlock->MemSubBlock[i].pPhyAddr = (unsigned char*)Align(vpuMem.nPhyAddr, pMemBlock->MemSubBlock[i].nAlignment); m_decMemInfo.nPhyNum++; m_decMemInfo.phyMem = (VpuMemDesc*)realloc(m_decMemInfo.phyMem, m_decMemInfo.nPhyNum*sizeof(VpuMemDesc)); m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nPhyAddr = vpuMem.nPhyAddr; m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nVirtAddr = vpuMem.nVirtAddr; m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nCpuAddr = vpuMem.nCpuAddr; m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nSize = size; } } return true; AllocFailure: VpuFreeBuffers(); return false; }
static gboolean gst_fsl_vpu_dec_alloc_phys_mem(G_GNUC_UNUSED GstFslPhysMemAllocator *allocator, GstFslPhysMemory *memory, gssize size) { VpuDecRetCode ret; VpuMemDesc mem_desc; memset(&mem_desc, 0, sizeof(VpuMemDesc)); mem_desc.nSize = size; ret = VPU_DecGetMem(&mem_desc); if (ret == VPU_DEC_RET_SUCCESS) { memory->mem.size = mem_desc.nSize; memory->mapped_virt_addr = (gpointer)(mem_desc.nVirtAddr); memory->phys_addr = (guintptr)(mem_desc.nPhyAddr); memory->cpu_addr = (guintptr)(mem_desc.nCpuAddr); return TRUE; } else return FALSE; }
bool CDVDVideoCodecIMX::VpuAllocFrameBuffers(void) { VpuDecRetCode ret; VpuMemDesc vpuMem; int totalSize=0; int mvSize=0; int ySize=0; int uvSize=0; int yStride=0; int uvStride=0; unsigned char* ptr; unsigned char* ptrVirt; int nAlign; m_vpuFrameBufferNum = m_initInfo.nMinFrameBufferCount + m_extraVpuBuffers; m_vpuFrameBuffers = new VpuFrameBuffer[m_vpuFrameBufferNum]; yStride=Align(m_initInfo.nPicWidth,FRAME_ALIGN); if(m_initInfo.nInterlace) { ySize=Align(m_initInfo.nPicWidth,FRAME_ALIGN)*Align(m_initInfo.nPicHeight,(2*FRAME_ALIGN)); } else { ySize=Align(m_initInfo.nPicWidth,FRAME_ALIGN)*Align(m_initInfo.nPicHeight,FRAME_ALIGN); } //NV12 for all video uvStride=yStride; uvSize=ySize/2; mvSize=uvSize/2; nAlign=m_initInfo.nAddressAlignment; if(nAlign>1) { ySize=Align(ySize,nAlign); uvSize=Align(uvSize,nAlign); } m_outputBuffers = new CDVDVideoCodecIMXBuffer*[m_vpuFrameBufferNum]; for (int i=0 ; i < m_vpuFrameBufferNum; i++) { totalSize=(ySize+uvSize+mvSize+nAlign)*1; vpuMem.nSize=totalSize; ret = VPU_DecGetMem(&vpuMem); if(ret != VPU_DEC_RET_SUCCESS) { CLog::Log(LOGERROR, "%s: vpu malloc frame buf failure: ret=%d \r\n",__FUNCTION__,ret); return false; } //record memory info for release m_decMemInfo.nPhyNum++; m_decMemInfo.phyMem = (VpuMemDesc*)realloc(m_decMemInfo.phyMem, m_decMemInfo.nPhyNum*sizeof(VpuMemDesc)); m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nPhyAddr = vpuMem.nPhyAddr; m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nVirtAddr = vpuMem.nVirtAddr; m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nCpuAddr = vpuMem.nCpuAddr; m_decMemInfo.phyMem[m_decMemInfo.nPhyNum-1].nSize = vpuMem.nSize; //fill frameBuf ptr=(unsigned char*)vpuMem.nPhyAddr; ptrVirt=(unsigned char*)vpuMem.nVirtAddr; //align the base address if(nAlign>1) { ptr=(unsigned char*)Align(ptr,nAlign); ptrVirt=(unsigned char*)Align(ptrVirt,nAlign); } // fill stride info m_vpuFrameBuffers[i].nStrideY=yStride; m_vpuFrameBuffers[i].nStrideC=uvStride; // fill phy addr m_vpuFrameBuffers[i].pbufY=ptr; m_vpuFrameBuffers[i].pbufCb=ptr+ySize; m_vpuFrameBuffers[i].pbufCr=0; m_vpuFrameBuffers[i].pbufMvCol=ptr+ySize+uvSize; // fill virt addr m_vpuFrameBuffers[i].pbufVirtY=ptrVirt; m_vpuFrameBuffers[i].pbufVirtCb=ptrVirt+ySize; m_vpuFrameBuffers[i].pbufVirtCr=0; m_vpuFrameBuffers[i].pbufVirtMvCol=ptrVirt+ySize+uvSize; m_vpuFrameBuffers[i].pbufY_tilebot=0; m_vpuFrameBuffers[i].pbufCb_tilebot=0; m_vpuFrameBuffers[i].pbufVirtY_tilebot=0; m_vpuFrameBuffers[i].pbufVirtCb_tilebot=0; #ifdef TRACE_FRAMES m_outputBuffers[i] = new CDVDVideoCodecIMXBuffer(i); #else m_outputBuffers[i] = new CDVDVideoCodecIMXBuffer(); #endif } return true; }