目前做了一个视频加字幕显示,用了OSD中的Vsys_allocBuf();下面贴一段代码 ,问题在分配空间大小和地址偏移量这方面,还有多次Vsys_allocBuf和free。
osdBufSizeY = CHAINS_OSD_BUFF_WIDTH * CHAINS_OSD_BUFF_HEIGHT;//800*500设置太小当字体多的时候会出错
osdBufSize = osdBufSizeY * 2 ;
totalBuffSize = osdBufSize * chWinPrm->numWindows;
bufAlign = 128;
status = Vsys_allocBuf(0, totalBuffSize, bufAlign, &bufInfo);//一次分配,可不可以放在循环里面多次分配?
OSA_assert(status==OSA_SOK);
for(i=0; i<chWinPrm->numWindows; i++)
{
freetype_drawText(i,
fname,
pStoreFileParame,
pdynamicFont,
(pStoreFileParame->titleInfo.titleColour >> 16) & 0xFF, (pStoreFileParame->titleInfo.titleColour >> 8) & 0XFF, pStoreFileParame->titleInfo.titleColour & 0XFF);
bufOffset = osdBufSize*i/*widId*/;
chWinPrm->winPrm[i].addr[0][0] = (bufInfo.physAddr + bufOffset);//physAddr 和virtAddr 两个个地址有什么区别,要注意些什么?
curVirtAddr = bufInfo.virtAddr + bufOffset;
chWinPrm->winPrm[i].width = pdynamicFont->freewidth;//CHAINS_OSD_WIN_WIDTH; chWinPrm->winPrm[i].height = pdynamicFont->freeheight;//CHAINS_OSD_WIN_HEIGHT; chWinPrm->winPrm[i].lineOffset = pdynamicFont->freewidth;//CHAINS_OSD_WIN_PITCH; OSA_assert(pdynamicFont->nLengthfontY <= osdBufSize);
if(curVirtAddr != NULL && pdynamicFont->fontY != NULL)
{
memcpy(curVirtAddr, pdynamicFont->fontY, pdynamicFont->nLengthfontY);
}
if(pdynamicFont->fontY)
{
free(pdynamicFont->fontY);
pdynamicFont->fontY = NULL;
}
}
Vsys_freeBuf(0, bufInfo.virtAddr, totalBuffSize);//freec一次
Chris Meng:
你好,
请说明你使用的芯片名称,软件名称以及软件版本,谢谢!
user4865572:
回复 Chris Meng:
你好
我用的是DM8168 / RDK4.0
user4865572:
回复 Chris Meng:
我每一个字幕窗口使用一次Vsys_allocBuf(0, osdBufSize, bufAlign, &bufInfo[i]) 发现每次分配的
bufInfo[i].physAddr bufInfo[i].virtAddr;
物理地址和蓄力地址都是一样 0xbe6f0a00
效果是下一个字幕窗口的内容叠加到前面窗口上 以此类推
如果是一次分配 在进行地址偏移 就是正常的
Chris Meng:
回复 user4865572:
你好,
Vsys_allocBuf这个函数是在ARM侧调用的吧,就有linux下的虚拟地址和实际物理地址(系统地址),在dsp侧应该是一的是物理地址(系统地址)。
Vsys_allocBuf有源码的,你可以加点打印看看。
YesDayLucky:
回复 Chris Meng:
Vsys_allocBuf 这个函数的调用是不是只能在sr0 也就是共享内存里面分配。如果是这个内存最大是多少。
说的系统地址是什么地址。是linux下面占用的内存空间么