コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: DVDVideoCodecIMX.cpp プロジェクト: capitnflam/xbmc
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;
}
コード例 #4
0
ファイル: allocator.c プロジェクト: Radbug/gst-fsl
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;
}
コード例 #5
0
ファイル: DVDVideoCodecIMX.cpp プロジェクト: capitnflam/xbmc
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;
}