首页问答详情

使用HI_MPI_VPSS_GetChnFrame()获取图像数据花屏问题

   
qn1562136485
qn1562136485  发布于  2019-07-08 09:21:28
采纳率 0%
18个问答
各位前辈,您好。我想请教一个问题:我的流程是h264->VDEC->VPSS->VO,并且经经过VPSS处理后的图像数据以.yuv的格式保存下来。图像的大小在各模块中设置的都是3072×2048,我将图像数据保存下来之后,使用能打开.yuv图像的工具查看,图像出现花屏,有绿色覆盖,而且使用yuv工具查看:保存的一个yuv图像数据被分成了好几块。有前辈知道这是什么原因吗?期待您的答复。
我来回答
3244
0
0
回答
11个
易百纳技术社区
zhuangweiye 发布于2019-07-08 16:05:25
海思的yuv是有多种格式的, 楼主保存的数据很可能不是yuv工具用的格式
0
易百纳技术社区
qn1562136485 发布于2019-07-08 19:58:32
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145140&ptid=75127]zhuangweiye 发表于 2019-7-8 16:05[/url]
海思的yuv是有多种格式的, 楼主保存的数据很可能不是yuv工具用的格式[/quote]

前辈,您好。我用的是yuv420,保存的数据也是这个格式的,但还是出现了花屏问题:
这是我VPSS通道的参数配置:
memset(abChnEnable, 0, sizeof(abChnEnable));
abChnEnable[0] = HI_TRUE;
astVpssChnAttr[0].u32Width                    = stDispSize.u32Width;
astVpssChnAttr[0].u32Height                   = stDispSize.u32Height;
astVpssChnAttr[0].enChnMode                   = VPSS_CHN_MODE_USER;
astVpssChnAttr[0].enCompressMode              = COMPRESS_MODE_NONE;
astVpssChnAttr[0].enDynamicRange              = DYNAMIC_RANGE_SDR8;
astVpssChnAttr[0].enPixelFormat               = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
astVpssChnAttr[0].stFrameRate.s32SrcFrameRate = -1;
astVpssChnAttr[0].stFrameRate.s32DstFrameRate = -1;
astVpssChnAttr[0].u32Depth                    = 2; //用户获取通道图像的队列长度
astVpssChnAttr[0].bMirror                     = HI_FALSE;
astVpssChnAttr[0].bFlip                       = HI_FALSE;
astVpssChnAttr[0].stAspectRatio.enMode        = ASPECT_RATIO_NONE;
astVpssChnAttr[0].enVideoFormat               = VIDEO_FORMAT_LINEAR;



下面是对yuv数据的保存:
static void SAMPLE_COMM_VPSS_SaveYUVFile_Linear8Bit(FILE* pfd, VIDEO_FRAME_S* pVBuf)
{
    HI_U8* pY_map = NULL;
    HI_U8* pC_map = NULL;
    unsigned int w, h;
    HI_U8* pMemContent;
    HI_U8 *pTmpBuff=HI_NULL;
    HI_U64 phy_addr;
    HI_U32 u32Size;
    PIXEL_FORMAT_E  enPixelFormat = pVBuf->enPixelFormat; // 位图像素格式
    HI_U32 u32UvHeight;

    if (PIXEL_FORMAT_YVU_SEMIPLANAR_420 == enPixelFormat)  
    {       
  
        u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2;  
        u32UvHeight = pVBuf->u32Height / 2;
        
    }
    else if(PIXEL_FORMAT_YVU_SEMIPLANAR_422 == enPixelFormat)
    {
        u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2;
        u32UvHeight = pVBuf->u32Height;
    }
    else if(PIXEL_FORMAT_YUV_400 == enPixelFormat)
    {
        u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height);
        u32UvHeight = pVBuf->u32Height;
    }
    else
    {
        printf("%s %d: This YUV format is not support!\n",__func__, __LINE__);
        return;
    }

    phy_addr = pVBuf->u64PhyAddr[0];
    pY_map = (HI_U8*) HI_MPI_SYS_Mmap(phy_addr, u32Size);  //memory存储映射接口  (需映射的内存单元起始地址, 映射的字节数)
    if (HI_NULL == pY_map)
    {
        SAMPLE_PRT("HI_MPI_SYS_Mmap for pY_map fail!!\n");
        return;
    }

    pC_map = pY_map + (pVBuf->u32Stride[0]) * (pVBuf->u32Height);

    fprintf(stderr, "saving......Y......");
    fflush(stderr);
    for (h = 0; h < pVBuf->u32Height; h++)
    {
        pMemContent = pY_map + h * pVBuf->u32Stride[0];
        fwrite(pMemContent, pVBuf->u32Width, 1, pfd);
    }

    if(PIXEL_FORMAT_YUV_400 != enPixelFormat)
    {
        fflush(pfd);
        fprintf(stderr, "U......");
        fflush(stderr);

        pTmpBuff = (HI_U8 *)malloc(pVBuf->u32Stride[0]);
        if(HI_NULL == pTmpBuff)
        {
            SAMPLE_PRT("malloc pTmpBuff (size=%d) fail!!!\n",pVBuf->u32Stride[0]);
            return;
        }
        for (h = 0; h < u32UvHeight; h++)  
        {
            pMemContent = pC_map + h * pVBuf->u32Stride[1];

            pMemContent += 1;

            for (w = 0; w < pVBuf->u32Width / 2; w++)
            {
                pTmpBuff[w] = *pMemContent;
                pMemContent += 2;
            }
            fwrite(pTmpBuff, pVBuf->u32Width / 2, 1, pfd);
        }
        fflush(pfd);

        fprintf(stderr, "V......");
        fflush(stderr);
        for (h = 0; h < u32UvHeight; h++)
        {
            pMemContent = pC_map + h * pVBuf->u32Stride[1];

            for (w = 0; w < pVBuf->u32Width / 2; w++)
            {
                pTmpBuff[w] = *pMemContent;
                pMemContent += 2;
            }
            fwrite(pTmpBuff, pVBuf->u32Width / 2, 1, pfd);
        }
        free(pTmpBuff);
        pTmpBuff = HI_NULL;
    }
    fflush(pfd);

    fprintf(stderr, "done!\n");
    fflush(stderr);

    HI_MPI_SYS_Munmap(pY_map, u32Size);
    pY_map = HI_NULL;

    return;
}
yuv工具也是选的yuv420,前辈知道这是为什么吗?
0
易百纳技术社区
ebainar 发布于2019-07-09 09:29:25
YUV420还有10种摆放格式,你确定是其中的哪一种?
0
易百纳技术社区
qn1562136485 发布于2019-07-09 10:10:21
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145171&ptid=75127]ebainar 发表于 2019-7-9 09:29[/url]
YUV420还有10种摆放格式,你确定是其中的哪一种?[/quote]

恩,谢谢您的答复,这个问题找到了解决的方法,是设置的w,h的问题。
0
易百纳技术社区
qn1562136485 发布于2019-07-09 10:19:57
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145171&ptid=75127]ebainar 发表于 2019-7-9 09:29[/url]
YUV420还有10种摆放格式,你确定是其中的哪一种?[/quote]

但是遇到了一个新的问题, 保存的图像大约1秒一帧,但是 vo 显示的是25fps,这种保存图像帧率过低的问题,您知道这是为什么吗?期待您的答复。
0
易百纳技术社区
zhuangweiye 发布于2019-07-09 11:33:27
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145178&ptid=75127]qn1562136485 发表于 2019-7-9 10:19[/url]
但是遇到了一个新的问题, 保存的图像大约1秒一帧,但是 vo 显示的是25fps,这种保存图像帧率过低的问题 ...[/quote]

把写文件的代码先屏蔽了, 看看不写文件帧率是否正常
0
易百纳技术社区
qn1562136485 发布于2019-07-09 16:06:28
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145182&ptid=75127]zhuangweiye 发表于 2019-7-9 11:33[/url]
把写文件的代码先屏蔽了, 看看不写文件帧率是否正常[/quote]

是的,不写文件的帧率是正常的,怎样才能使得写文件的速度提升一些呢,还是说本身写文件就是一个很耗时的操作,是没有办法优化的呢?期待您的答复,十分感谢!!
0
易百纳技术社区
zhuangweiye 发布于2019-07-09 17:40:31
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145187&ptid=75127]qn1562136485 发表于 2019-7-9 16:06[/url]
是的,不写文件的帧率是正常的,怎样才能使得写文件的速度提升一些呢,还是说本身写文件就是一个很耗时的 ...[/quote]

和图像大小有关, 和文件放在哪里有关

比如1080P的YUV420 25fps的图, 数据量大概是 75MBytes/s

0
易百纳技术社区
qn1562136485 发布于2019-07-09 17:50:35
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145193&ptid=75127]zhuangweiye 发表于 2019-7-9 17:40[/url]
和图像大小有关, 和文件放在哪里有关

比如1080P的YUV420 25fps的图, 数据量大概是 75MBytes/s[/quote]

恩,明白了。谢谢您!我还想问一个问题:就是我想在VPSS之后加上算法处理,因为保存文件有些费时间,所以我想不保存文件了,直接将从VPSS中获得数据给算法。但是mpp_sample中给出的例子是分模块的,比如我想将VDEC和SVP两个模块联系起来,也就是说在VDEC中使用SVP的API,我是要将两个例子的代码放在一个文件夹下吗(例如将SVP中的代码放到VDEC文件夹下),还有其他可行的方法吗?
0
易百纳技术社区
qn1539685212 发布于2020-06-08 16:41:46
请问一下您是如何解决花屏的问题的
0
易百纳技术社区
zhuangweiye 发布于2019-07-10 07:27:11
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145195&ptid=75127]qn1562136485 发表于 2019-7-9 17:50[/url]
恩,明白了。谢谢您!我还想问一个问题:就是我想在VPSS之后加上算法处理,因为保存文件有些费时间,所以 ...[/quote]

通常来说, 代码放在不同目录下可能比较有利于管理, 尤其是文件比较多的情况

包含个头文件就好了
0

Markdown 语法

  • 加粗 **内容**
  • 斜体 *内容*
  • 删除线 ~~内容~~
  • 引用 > 引用内容
  • 代码 `代码`
  • 代码块 ```编程语言↵代码```
  • 链接 [链接标题](url)
  • 无序列表 - 内容
  • 有序列表 1. 内容
  • 缩进 内容
  • 图片 ![alt](url)

Markdown 语法

  • 加粗 **内容**
  • 斜体 *内容*
  • 删除线 ~~内容~~
  • 引用 > 引用内容
  • 代码 `代码`
  • 代码块 ```编程语言↵代码```
  • 链接 [链接标题](url)
  • 无序列表 - 内容
  • 有序列表 1. 内容
  • 缩进 内容
  • 图片 ![alt](url)
+ 添加网盘链接/附件
或将文件直接拖到这里
悬赏:
EBC
网盘
* 网盘链接:
* 提取码:
悬赏:
EBC
相关问答
无更多相似问答 去提问
Loading...
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区
易百纳技术社区
在专栏模块发布专栏,可获得其他E友的打赏
易百纳技术社区
回答悬赏问答,被题主采纳后即可获得悬赏金
易百纳技术社区
在上传资料时,有价值的资料可设置为付费资源
易百纳技术社区
达到一定金额,收益即可提现~
收益也可用来充值ebc,下载资料、兑换礼品更容易
易百纳技术社区
活动规则
  • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
  • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准
  • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
  • 4.每周最后三个任务将会有以下奖品掉落:社区热卖开发板、小米音响、视频年度会员、京东卡、华为手机等等
易百纳技术社区
升级提醒
易百纳技术社区

恭喜您由入门

社区送出礼品一份

请填写您的收件地址,礼品将在3个工作日寄出

易百纳技术社区