海思抓图功能的实现

    海思3518ev200芯片的sdk中没有专用的抓图接口,在特定场合下需要jpeg图片的情况下,采用将h264数据编码为图片比较麻烦,因此可以采用海思自己的JPEG编码。

    不多说直接上代码:

char *pic_addr;
int VencFd, s32Ret;
INT32U maxfd = 0;

struct timeval TimeoutVal;
fd_set read_fds;
VENC_CHN_STAT_S stStat;
VENC_STREAM_S stStream;	
VIDEO_FRAME_INFO_S stFrame;

if (HI_MPI_VI_SetFrameDepth(0, 1))    //设置VI通道缓存的视频图像帧数   必须的
{
    printf("HI_MPI_VI_SetFrameDepth err, vi chn %d \n", 0);
     return -1;
}

usleep(90 * 1000);

VencFd = HI_MPI_VENC_GetFd(1);        //JPEG编码通道为1,获取通道句柄
if (VencFd < 0)
{
    printf("HI_MPI_VENC_GetFd failed with %#x!\n", VencFd);
    return -1;
}
	
maxfd = VencFd;
	
s32Ret = HI_MPI_VI_GetFrame(0, &stFrame, VIDEO_GET_FRAME_TIMEOUT);        //从VI获取一张原画
if (HI_SUCCESS != s32Ret)
{
    printf("HI_MPI_VI_GetFrame ext chn(%d) fail,Error(%#x)\n", 0 ,s32Ret);
    return -1;
}
	
s32Ret = HI_MPI_VENC_SendFrame(1, &stFrame, VIDEO_GET_FRAME_TIMEOUT);       //将VI原画发送到JPEG编码器
if (HI_SUCCESS != s32Ret)
{
    printf("HI_MPI_VENC_SendFrame ext chn(%d) fail,Error(%#x)\n", 1 ,s32Ret);
    return -1;
}

while(1)
{
    FD_ZERO(&read_fds);
    FD_SET(VencFd, &read_fds);
		
    TimeoutVal.tv_sec  = 0;
    TimeoutVal.tv_usec = 50 * 1000;
    s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal);        //等待JPEG编码完成
    if (s32Ret < 0)
    {
        printf("select failed!\n");
        return -1;
    }
    else if (s32Ret == 0)
    {
        printf("get venc stream time out\n");
        continue;
    }
    else
    {
        if (FD_ISSET(VencFd, &read_fds))
        {
            memset(&stStream, 0, sizeof(stStream));
            s32Ret = HI_MPI_VENC_Query(1, &stStat);        //查询编码通道状态,是否创建成功
	    if (VIDEO_SUCC != s32Ret)
	    {
	        printf("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", 1, s32Ret);
		return -1;
	    }
				
	    if(0 == stStat.u32CurPacks)
            {
		printf("NOTE: Current frame is NULL!\n");
		return -1;
	    }
	    stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);
	    if (NULL == stStream.pstPack)
	    {
		printf("malloc stream pack failed!\n");
		return -1;
	    }
			
	    stStream.u32PackCount = stStat.u32CurPacks;
	    s32Ret = HI_MPI_VENC_GetStream(1, &stStream, VIDEO_GET_FRAME_TIMEOUT);        //获取JPEG图片
	    if (VIDEO_SUCC != s32Ret)
            {
                free(stStream.pstPack);
                stStream.pstPack = NULL;
                printf("HI_MPI_VENC_GetStream failed with %#x!\n", s32Ret);
                return -1;
            }
	    else
	    {
	    	printf("\npicture data len is %d\n", stStream.pstPack->u32Len);
		pic_addr = (char *)stStream.pstPack[0].pu8Addr + stStream.pstPack[0].u32Offset;
					
		memcpy(picture_data, pic_addr, stStream.pstPack->u32Len);
		*data_len = stStream.pstPack->u32Len;
		break;
	    }
        }
    }	
free(stStream.pstPack);
HI_MPI_VI_ReleaseFrame(0, &stFrame);        //释放

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 海思是一家集成电路设计公司,致力于提供高性能芯片解决方案。在实现OSD(On-Screen Display)功能中,海思利用了VGS(Video Graphics Subsystem)技术。 VGS是一种视频图形子系统,它在芯片级别上处理图形、文字和图像的显示和处理。通过与海思芯片上的图形处理单元(GPU)和视频处理单元(VPE)的配合,VGS能够实现OSD功能。 OSD通常用于在显示设备的屏幕上叠加显示文字、图标、菜单等信息,以提供用户交互和显示额外的信息。在海思芯片中,通过VGS技术,可以通过GPU和VPE的协同工作,将OSD图形和字体数据混合处理,并将其叠加到视频信号上。 这种混合处理的过程主要包括两个关键步骤:一是通过GPU对图形和图像进行处理,如缩放、旋转、渐变等;二是通过文字和矢量图形字库等数据资源,使用VGS进行字体渲染和图形叠加,将其与视频信号合成为最终的OSD图像。 通过海思芯片的硬件加速和VGS的优化算法,实现了高效、流畅的OSD显示效果。这种技术不仅可以应用于电视、监控设备等需要OSD功能的场景,还可以用于自动驾驶、智能嵌入式系统等领域,以提供更多的信息和用户交互体验。 综上所述,海思利用VGS技术实现OSD功能,可以通过GPU和VPE的配合,将图形、文字和图像混合处理,并叠加到视频信号上,从而实现高效、流畅的OSD显示效果。 ### 回答2: 海思是一家芯片设计公司,常常应用其自家芯片实现各种功能。在图像处理方面,海思利用了一种技术称为VGS(Video Graphics System)来实现OSD(On-Screen Display)功能。 VGS是一种强大的图形处理引擎,能够处理和渲染各种图像和图形。海思使用VGS来实现OSD功能,主要是为了在视频图像上显示或叠加一些额外的信息,比如时间、信号源、画面分辨率等。 使用VGS实现OSD的过程大致如下:首先,将视频信号输入到海思的芯片中;然后,在芯片内部通过VGS处理引擎,提取视频信号的图像内容;接着,将OSD需要显示的信息通过VGS进行渲染和处理,然后与视频图像进行叠加;最后,将叠加后的图像输出到显示设备上。 通过使用VGS实现OSD功能海思可以在视频图像上方便地添加各种信息,提升用户体验。例如,在监控系统中,可以在视频画面上显示摄像头的名称、录像状态等;在电视和显示器中,可以显示频道信息、时间等。这种应用广泛的功能对于提供更多实时信息以及增强用户交互具有极大的帮助。 总之,海思利用VGS技术来实现OSD功能,能够在图像处理中轻松叠加各种信息,提升用户体验和功能扩展。这种技术为海思芯片在图像处理领域的应用带来了更多的可能性。 ### 回答3: 海思HiSilicon)是华为公司旗下的一家半导体设计公司,在视频处理领域有很高的专业性和影响力。在海思的产品中,使用了VGS(Video Graphics Subsystem)来实现OSD(On-Screen Display)功能。 VGS是一种专业的图形子系统,能够在视频信号中嵌入图形信息。它具有强大的图像处理能力和复杂的图形合成功能,能够对视频流进行实时的图形混合、叠加和处理操作。因此,通过在视频信号中嵌入OSD图形,可以实现在屏幕上显示各种文字、图标、图像等信息的功能海思在其视频处理芯片中使用VGS来实现OSD功能的好处是多方面的。首先,VGS具有高性能和低功耗的特点,可以满足实时处理大量视频数据的需求,同时节省能源和提高效率。其次,VGS支持多种图像格式和动画效果,可以实现丰富多样的OSD显示效果,提供更好的用户体验。此外,VGS还具有可编程性和灵活性,可以根据需求定制图形处理算法,扩展和升级系统功能。 综上所述,海思选择使用VGS实现OSD功能是出于其强大的图像处理能力和丰富的功能特点。这不仅可以提供高质量的OSD显示效果,还可以满足不同应用场景和需求的个性化显示要求,为用户提供更好的视觉体验。这也是海思在半导体设计领域取得成功的一部分原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值