qn1562136485

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485  发布于  2019-07-08 09:21:28
采纳率 0%
18个问答
4840

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

   
各位前辈,您好。我想请教一个问题:我的流程是h264->VDEC->VPSS->VO,并且经经过VPSS处理后的图像数据以.yuv的格式保存下来。图像的大小在各模块中设置的都是3072×2048,我将图像数据保存下来之后,使用能打开.yuv图像的工具查看,图像出现花屏,有绿色覆盖,而且使用yuv工具查看:保存的一个yuv图像数据被分成了好几块。有前辈知道这是什么原因吗?期待您的答复。
我来回答
回答11个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-07-08 16:05:25
认可0
海思的yuv是有多种格式的, 楼主保存的数据很可能不是yuv工具用的格式

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-08 19:58:32
认可0
[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,前辈知道这是为什么吗?

ebainar

0个粉丝

7

问答

0

专栏

0

资料

ebainar 2019-07-09 09:29:25
认可0
YUV420还有10种摆放格式,你确定是其中的哪一种?

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-09 10:10:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145171&ptid=75127]ebainar 发表于 2019-7-9 09:29[/url]
YUV420还有10种摆放格式,你确定是其中的哪一种?[/quote]

恩,谢谢您的答复,这个问题找到了解决的方法,是设置的w,h的问题。

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-09 10:19:57
认可0
[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,这种保存图像帧率过低的问题,您知道这是为什么吗?期待您的答复。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-07-09 11:33:27
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145178&ptid=75127]qn1562136485 发表于 2019-7-9 10:19[/url]
但是遇到了一个新的问题, 保存的图像大约1秒一帧,但是 vo 显示的是25fps,这种保存图像帧率过低的问题 ...[/quote]

把写文件的代码先屏蔽了, 看看不写文件帧率是否正常

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

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

是的,不写文件的帧率是正常的,怎样才能使得写文件的速度提升一些呢,还是说本身写文件就是一个很耗时的操作,是没有办法优化的呢?期待您的答复,十分感谢!!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-07-09 17:40:31
认可0
[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

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-09 17:50:35
认可0
[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文件夹下),还有其他可行的方法吗?

qn1539685212

0个粉丝

8

问答

0

专栏

0

资料

qn1539685212 2020-06-08 16:41:46
认可0
请问一下您是如何解决花屏的问题的

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-07-10 07:27:11
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145195&ptid=75127]qn1562136485 发表于 2019-7-9 17:50[/url]
恩,明白了。谢谢您!我还想问一个问题:就是我想在VPSS之后加上算法处理,因为保存文件有些费时间,所以 ...[/quote]

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

包含个头文件就好了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区