目前做了一个视频加字幕显示,用了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一次