TI中文支持网
TI专业的中文技术问题搜集分享网站

DM368 OSD显示图片/logo问题

各位,

我想在我的视频上叠加logo, logo我使用的是IPNC自带的默认数组,代码如下:

1. Init:

if(SWOSD_init()!=0) /* Run SW OSD*/
{
printf(" SWOSD: SWOSD_init Failure…………….. \n");
return FAIL;}

iconBuff160_Y = (char *)OSD_CMEM_ALLOC((SWOSD_CHARWIDTHTILOGO_160_64*SWOSD_CHARHEIGHTTILOGO_160_64), 32) ;
iconBuff160_UV = (char *)OSD_CMEM_ALLOC(((SWOSD_CHARWIDTHTILOGO_160_64*SWOSD_CHARHEIGHTTILOGO_160_64)/2), 32);

swosdSetLogoPrm();

for(i=0; i<2; i++)

{

if(SWOSD_createHandle(&osdHndl, &idxHndl[i]) != GS_SUCCESS)
{
printf("Handle Creation Failed in SWOSD(%d)………….", i);
return FAIL;}
else
{
//Setting for 32 BMP windows currently
if(SWOSD_setNumWindows(osdHndl, SWOSD_WINMAX)!=0) /* Run SW OSD*/
{
printf(" SWOSD: SWOSD_setNumWindows Failure…………….. \n");
return FAIL; }
swosdSetWinParam(height, width);

//swosdMakeFixWinString(i);

}

algSwosdHndl[i] = osdHndl;

}

static inline void swosdSetLogoPrm(void)
{

OSD_MEMCPY(iconBuff160_Y, TILogo_Y_160_64, SWOSD_CHARWIDTHTILOGO_160_64*SWOSD_CHARHEIGHTTILOGO_160_64);
OSD_MEMCPY(iconBuff160_UV, TILogo_UV_160_64, (SWOSD_CHARWIDTHTILOGO_160_64*SWOSD_CHARHEIGHTTILOGO_160_64)/2);

}

static int swosdSetWinParam(int height, int width)
{
SWOSD_BmpWinPrm bmpWinPrm;
int i = 0;

#ifdef SWOSD_USER_TRANSPARANCY_ON
bmpWinPrm.userTransparancy = SWOSD_RBOOLTRUE;
#else
bmpWinPrm.userTransparancy = SWOSD_RBOOLFALSE;
#endif

//for window 1
bmpWinPrm.enable = SWOSD_RBOOLFALSE;
bmpWinPrm.format = SWOSD_FORMATYUV420p;
bmpWinPrm.startX = 0;
bmpWinPrm.startY = 0;
bmpWinPrm.width = SWOSD_CHARWIDTHTILOGO_160_64;
bmpWinPrm.height = SWOSD_CHARHEIGHTTILOGO_160_64;
bmpWinPrm.lineOffset = SWOSD_CHARWIDTHTILOGO_160_64;
bmpWinPrm.transperencyVal = SWOSD_OSDWHITETRANSVAL;
bmpWinPrm.transperencyRange = SWOSD_OSDWHITETRANSRANGE;
bmpWinPrm.transperencyEnable = SWOSD_BMPTRANSDISABLE;
bmpWinPrm.resizeEnable = 0;
bmpWinPrm.bmpWinAddr = iconBuff160_Y;
bmpWinPrm.bmpWinAddrUV = iconBuff160_UV;

if(SWOSD_setBmpWinPrm(osdHndl, SWOSD_WINDOW_ONE, &bmpWinPrm)!=0)
{
printf(" SWOSD: SWOSD_setBmpWinPrm Failure…………….. \n");
return FAIL; }

return SUCCESS;
}

2. Then call this function VIDEO_swosdTskRun() in the while loop of CAPTURE_ThrFxn():

int VIDEO_swosdTskRun(int streamId,int width, int height, int frameRate,void *pBufInfo)
{
int startX = 0;
int startY = 0;

SWOSD_MainWinPrm mainWinPrm;

static int osd_count[AVSERVER_MAX_STREAMS] = {0, 0, 0, 0};

//if(gAVSERVER_config.captureConfig[streamId].swosdConfig.swosdEnable)
{

osdHndl = (SWOSD_Hndl *)algSwosdHndl[streamId];

mainWinPrm.format = SWOSD_FORMATYUV420p;

mainWinPrm.lineOffset = width;
mainWinPrm.width = width;
mainWinPrm.height = height – OSA_floor(startY, 2 )/2;
/*OSD does not take care of Vertical offset, therefore care is needed to read UV data*/

if(SWOSD_setMainWinPrm(osdHndl, &mainWinPrm)!=0)
{ printf(" SWOSD: SWOSD_setMainWinPrm Failure…………….. \n");
return FAIL; }

if(osd_count[streamId]>=(frameRate/1000))

{
swosdDisplay(streamId, osdHndl);
osd_count[streamId] = 0;
}
else
osd_count[streamId]++;

SWOSD_MsgRecvHandler();

if(SWOSD_winDrawHandle(osdHndl, (short*)(pBufInfo))!=0)
{ printf(" SWOSD: SWOSD_winDrawHandle Failure…………….. \n");
return FAIL; }

}

return SUCCESS;
}

static int swosdDisplay(int streamId, SWOSD_Hndl *osdHndl )
{
int i = 0;

swosdMakeWinString(streamId);
//swosdChangeXYParmDetail(streamId, osdHndl);

if(SWOSD_setBmpWinEnable(osdHndl, SWOSD_WINDOW_ONE, SWOSD_BMPWINENABLE)!=0)
{ printf(" SWOSD: SWOSD_setBmpWinEnable Failure…………….. \n");
return FAIL; }

return SUCCESS;
}

static int swosdMakeWinString(int streamId)
{

if(SWOSD_setBmpchangeWinXYPrm(osdHndl, SWOSD_WINDOW_ONE, 0, 0)!=0)
{ printf(" SWOSD: SWOSD_setBmpchangeWinXYPrm Failure…………….. \n");
return FAIL; }

return SUCCESS;
}

其中streamID=0; width=1280;height=720;framerate=30000; pBufInfo=capBuf[0].start

我设置的SWOSD_setNumWindows(osdHndl, SWOSD_WINMAX) 用的SWOSD_WINMAX=28,参考代码原本的值

然后我所有函数都只有对SWOSD_WINDOW_ONE操作,其他窗口没有相关代码,这个可以只用一个窗口吧??

运行没有出错返回,但是没有看到有logo出现,只有正常的采集过来的视频。。。

我是哪里出错了呢?搞不清楚为什么,需要什么其他的配置?还是库用错了?我用的是framework/alg/lib/alg_osd_ti.a ,这个可以直接用吧,还是需要重新编译的?

麻烦大家帮我解答一下,谢谢。

Chris Meng:

你好,

streamID改为3试试?

用appro_avi_save需要使用streamID为3来存储第一个码流(http://www.deyisupport.com/question_answer/dsp_arm/davinci_digital_media_processors/f/39/t/47146.aspx)。

Jing1:

回复 Chris Meng:

谢谢Chris的回复,我会尝试下你的建议。

另外还有个问题,IPNC的代码中有:

static inline void swosdSetLogoPrm(void)函数会先从如下文件读数据,如果下面文件不存在的才使用默认的数组

#define SWOSD_TIICON_160 "/mnt/mmc/TI_Logo_160_64.yyuv420"#define SWOSD_TIICON_80 "/mnt/mmc/TI_Logo_80_32.yyuv420"

在Software OSD User Guide文档中,关于章节5 Software OSD Usage Details里面有关于使用OSD需要遵循几个步骤:

5.1 Creation of bmp image of string pattern

5.2 Conversion of bmp format to jpeg format

5.3 Conversion of JPEG format to YUV422 format

5.4 Conversion of YUV422 format to YUV420 planar (UV interleaved) format

5.5 Extract the y data and uv data

5.6 Conversion of YUV files to TEXT file

5.7 Steps to convert Y and UV file to TEXT file

你知道代码中的这个TI_Logo_160_64.yyuv420是上面步骤几完成后生成的文件啊?? 是步骤5.4?

那代码中默认使用的数组TILogo_Y_160_64和TILogo_UV_160_64又是上面步骤几完成后生成的文件?

文档上看的一直半解的,麻烦帮我解答一下谢谢。

Chris Meng:

回复 Jing1:

你好,

是“5.7 Steps to convert Y and UV file to TEXT file”。 Y和UV的文件是分别生成的,在合并起来。

Jing1:

回复 Chris Meng:

Chris,

你说的是TI_Logo_160_64.yyuv420是步骤5.7生成的?还是那两个默认数组所在ascii_TI_Logo_160_64.c文件是步骤5.7生成的?按照文档所说5.7生成的都是.c文件,那这个TI_Logo_160_64.yyuv420以yyuv420结尾的应该就不是5.7生成的,对吗?这个是哪个步骤生成的呢?

我这边自己在按照文档一步一步走,在步骤5.4 Conversion of YUV422 format to YUV420 planar (UV interleaved) format中,文档中说用image_convert这个TI自带工具,help看如下所示,

image_convert -i <in file> <in format> <in width> <in height> <in line offset> -o <out file> <out format> <out line offset>

步骤5.3步骤生成的文件是以.UYVY结尾的,文档中没有给出例子怎么使用这个工具,上面的选项分别对应什么意思,能否给个例子说明下这个工具怎么使用?

另外,步骤5.6和步骤5.7是不是独立的两种方式,不是先后顺序的?一个是把bin2c B1.yuv >C_YUV.c,一个是把B1.y >C_Y.c;B1.uv > C_UV.c 感觉是两种不同的方法,看的有点晕。

麻烦你帮忙解答下,十分感谢。

Jing1:

回复 Chris Meng:

好的,谢谢Chris的答复。

lucky2:

回复 Jing1:

您好

请问下哪里有image convert这个工具?

你有yuv420sp格式的视频帧文件吗?420sp的,即uv交叠放,能否发个保存下来的视频帧文件给我,验证之用。

谢谢!

Chris Meng:

回复 lucky2:

你好,

告诉我一下你的邮箱,我发给你image_convert.exe。

shawnstone:

回复 Chris Meng:

你好,

   image_convert.exe工具在哪里下载,可以发给我一下吗?

谢谢!

我的邮箱是:xiaodeo@126.com

Chris Meng:

回复 shawnstone:

你好,

你使用的是IPNC软件包么?如果是,里面就有。路径是:\Source\ipnc_rdk\av_capture\application\ipnc\av_server\src\fonts\font_utils\image_convert\bin。

赞(0)
未经允许不得转载:TI中文支持网 » DM368 OSD显示图片/logo问题
分享到: 更多 (0)