This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于osd加字幕的内存分配问题



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