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.

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 ,这个可以直接用吧,还是需要重新编译的?

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

  • 你好,

    streamID改为3试试?

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

  • 谢谢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又是上面步骤几完成后生成的文件?

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

  • 你好,

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

  • 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 感觉是两种不同的方法,看的有点晕。

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

  • 你好,

    请参考:c:\temp>image_convert.exe -i test.yuv uyvy422 120 120 120 -o test420sp_3.yuv yyuv420 120

    5.6就是把一个含有yuv420sp的二进制文件变成了数组文本,你还需要把Y和C分开成两个数组。

    5.7应该是配合5.5的,Y和C分开了,二进制分别转换为数组。

    5.6和5.7二选一就可以了。

  • 好的,谢谢Chris的答复。

  • 您好

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

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

    谢谢!

  • 你好,

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

  • 你好,

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

    谢谢!

    我的邮箱是:xiaodeo@126.com

  • 你好,

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

  • 你好,

         我使用的是IPNC3.5 ,DM8148上跑的,没有找到你说的那个工具,可以发给我一下吗?

     谢谢!

  • 1 您好,可以给我发个image_convert?谢谢  我邮箱是1042348982@qq.com  我看那个pdf文档里面说开发包里面有这个工具 但是没有找到,麻烦发一个,谢谢

    2 另外就是,如果我想自由显示数字的话,是不是需要做出0-9的所有的库,然后显示的时候再把多位数拆成个位数调用字库显示吗?对这个不是很明白 谢谢

  • Brad,

    阿拉伯数字和英文字符目前都是支持的,请参考demo里面如何显示时间部分。

  • 谢谢  帮忙发一下那个工具  因为我除了显示数字还要显示汉字。。

  • 你好,

    请私信给我你的公司的邮箱,谢谢!

  • 你好 我们是通过代理商买的开发板,声音估计没签那个协议,我向代理商要了。

    通过参考时间和日期,我现在可以显示自己的东西了,但是还有两个问题:

    1 osd显示的时候会每隔一两秒就闪烁一下,这个怎么去掉?

    2 osd显示的背景是黑色的,挡住了画面,这个可以改成透明的吗?我修改padingColor好像没有用啊

    谢谢回复

  • brad white 说:
    1 osd显示的时候会每隔一两秒就闪烁一下,这个怎么去掉?

    请问是否是你系统使用的瞬时DDR吞吐比较大?如果降低编码帧率是否有改善?

    brad white 说:
    2 osd显示的背景是黑色的,挡住了画面,这个可以改成透明的吗?我修改padingColor好像没有用啊

    请问你具体使用的是哪个芯片?DM36x还是DM8168?请仔细阅读一下相应的SWOSD的文档,看看是否有blending/color key的支持。