M_chenyang

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang  发布于  2018-11-20 21:43:05
采纳率 0%
14个问答
7917

HI_MPI_VDEC_GetFrame获取不到数据的问题

 
最近做hi3559A的方案  demo中是H264码流-->>VDEC-->>VPSS-->>VO  我在新增一个线程通过HI_MPI_VDEC_GetFrame获取通道的数据,结果返回缓冲区无数据的错误码;
如果 是H264码流-->>VDEC 在线程中通过HI_MPI_VDEC_GetFrame获取通道的数据,结果是返回成功的  但保存出来的数据是花屏,通过以下代码获取数据:
        
       s32Ret=HI_MPI_VDEC_GetFrame(pstVdecThreadParam->s32ChnId,  &stVFrame, 1000);
        if(HI_SUCCESS == s32Ret)
        {
            printf("Image w[%d] h[%d] plane[0][%d] plane[1][%d] plane[2][%d] serial[%ld] format:%d\n",
                stVFrame.stVFrame.u32Width, stVFrame.stVFrame.u32Height, stVFrame.stVFrame.u32Stride[0],
                stVFrame.stVFrame.u32Stride[1], stVFrame.stVFrame.u32Stride[2], stVFrame.stVFrame.u64PTS, stVFrame.stVFrame.enPixelFormat);

            if (!bSaveOK)
            {
                printf("save file\n");
               
                char name[32];
                sprintf(name, "/tmp/%d.yuv", 02);  
                HI_U32 u32Size = 0;
                HI_U8 *pTmpBuff=HI_NULL;
                HI_U32 u32YHeight = 0, u32UVHeight = 0;
               
                if (PIXEL_FORMAT_YVU_SEMIPLANAR_420 == stVFrame.stVFrame.enPixelFormat)
                {
                    u32Size = (stVFrame.stVFrame.u32Stride[0] * stVFrame.stVFrame.u32Height)*3/2;
                    u32YHeight = stVFrame.stVFrame.u32Height;
                    u32UVHeight = stVFrame.stVFrame.u32Height/2;
                }
               
                pTmpBuff = (HI_U8 *)malloc(u32Size);
                if (!pTmpBuff)
                {
                    printf("malloc for pTmpBuff fail!!\n");
                    return 0;
                }
               
                HI_U8* pY_map = NULL;
                HI_U8* pVU_map = NULL;
               
                pY_map = (HI_U8*) HI_MPI_SYS_Mmap(stVFrame.stVFrame.u64PhyAddr[0], stVFrame.stVFrame.u32Stride[0]*u32YHeight);
                if (HI_NULL == pY_map)
                {
                    printf("HI_MPI_SYS_Mmap for pY_map fail!!\n");
                    return 0;
                }
               
                pVU_map = (HI_U8*) HI_MPI_SYS_Mmap(stVFrame.stVFrame.u64PhyAddr[1], stVFrame.stVFrame.u32Stride[1]*u32UVHeight);
                if (HI_NULL == pVU_map)
                {
                    printf("HI_MPI_SYS_Mmap for pVU_map fail!!\n");
                    return 0;
                }
               
                if (pTmpBuff)
                {
                    memcpy(pTmpBuff, pY_map, stVFrame.stVFrame.u32Stride[0]*u32YHeight);
                    memcpy(pTmpBuff+stVFrame.stVFrame.u32Stride[0]*u32YHeight, pVU_map, stVFrame.stVFrame.u32Stride[1]*u32UVHeight);
                    FILE *fp = fopen(name, "w");
                    fwrite(pTmpBuff, u32Size, 1, fp);
                    fflush(fp);
                    fclose(fp);
                }
               
                HI_MPI_SYS_Munmap(pY_map, stVFrame.stVFrame.u32Stride[0]*u32YHeight);
                HI_MPI_SYS_Munmap(pVU_map, stVFrame.stVFrame.u32Stride[1]*u32UVHeight);
                if (pTmpBuff)
                {
                    free(pTmpBuff);
                    pTmpBuff = NULL;
                }
                pY_map = HI_NULL;
                pVU_map = HI_NULL;
                bSaveOK = HI_TRUE;               
            }
            s32Ret=HI_MPI_VDEC_ReleaseFrame(pstVdecThreadParam->s32ChnId,  &stVFrame);
            if (HI_SUCCESS != s32Ret)
            {
                SAMPLE_PRT("chn %d HI_MPI_VDEC_ReleaseFrame fail for s32Ret=0x%x!\n", pstVdecThreadParam->s32ChnId, s32Ret);
            }

有遇到类似问题的兄弟可以指点一二吗?
我来回答
回答14个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-21 09:00:09
认可0
1. vdec绑定vpss的情况下,是Get不到的frame的,绑定情况下,可以换个角度去得图,从vpss输入端,可以看看HI_MPI_VPSS_GetGrpFrame

2. 图花的问题
   就代码来看没问题,应该是写的文件没有被正确解析或者说文件没有存成需要的格式
   可能出问题的地方是:通常stride != width, 而楼主是一大块内存写文件,不是一行一行地写,
   这样文件在解析的时候也要根据stride来解析,如果用width来解析就会出现斜条状

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang 2018-11-21 14:32:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112431&ptid=53696]zhuangweiye 发表于 2018-11-21 09:00[/url]
1. vdec绑定vpss的情况下,是Get不到的frame的,绑定情况下,可以换个角度去得图,从vpss输入端,可以看看H ...[/quote]

对于花屏的问题  我换成以下方式进行写入:
              pY_map = (HI_U8*) HI_MPI_SYS_Mmap(stVFrame.stVFrame.u64PhyAddr[0], u32YSize);
                if (HI_NULL == pY_map)
                {
                    printf("HI_MPI_SYS_Mmap for pY_map fail!!\n");
                    return 0;
                }                              

                FILE *fp = fopen(name, "w");

                /* save Y ----------------------------------------------------------------*/
                for (int h = 0; h < stVFrame.stVFrame.u32Height; h++)
                {
                    pMemContent = pY_map + h * stVFrame.stVFrame.u32Stride[0];
                    fwrite(pMemContent,stVFrame.stVFrame.u32Width, 1, fp);
                }
                fflush(fp);
                                
                if (PIXEL_FORMAT_YUV_400 != stVFrame.stVFrame.enPixelFormat)
                {
                    pVU_map = (HI_U8*) HI_MPI_SYS_Mmap(stVFrame.stVFrame.u64PhyAddr[1], u32VUSize);
                    if (HI_NULL == pVU_map)
                    {
                        printf("HI_MPI_SYS_Mmap for pVU_map fail!!\n");
                        return 0;
                    }
                    
                    /* save U ----------------------------------------------------------------*/
                    for (int h = 0; h < u32UVHeight; h++)
                    {
                        pMemContent = pVU_map + h * stVFrame.stVFrame.u32Stride[1];
                    
                        pMemContent += 1;
                    
                        for (int w = 0; w < stVFrame.stVFrame.u32Width / 2; w++)
                        {
                            TmpBuff[w] = *pMemContent;
                            pMemContent += 2;
                        }
                        fwrite(TmpBuff, stVFrame.stVFrame.u32Width / 2, 1, fp);
                    }
                    fflush(fp);
                    
                    /* save V ----------------------------------------------------------------*/                    
                    for (int h = 0; h < u32UVHeight; h++)
                    {
                        pMemContent = pVU_map + h * stVFrame.stVFrame.u32Stride[1];
                    
                        for (int w = 0; w < stVFrame.stVFrame.u32Width / 2; w++)
                        {
                            TmpBuff[w] = *pMemContent;
                            pMemContent += 2;
                        }
                        fwrite(TmpBuff, stVFrame.stVFrame.u32Width / 2, 1, fp);
                    }
                    
                    fflush(fp);

                    HI_MPI_SYS_Munmap(pVU_map, u32VUSize);
                    pVU_map = NULL;
                }
   
                fclose(fp);
               
                HI_MPI_SYS_Munmap(pY_map, u32YSize);
                pY_map = HI_NULL;

现象依旧花屏, 参考vo_ch_dump.c的存储yuv文件来的,  如果不是YUV packed格式  stride通常是等于width的

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-21 15:09:44
认可0
本帖最后由 zhuangweiye 于 2018-11-21 15:22 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=112482&ptid=53696]M_chenyang 发表于 2018-11-21 14:32[/url]
对于花屏的问题  我换成以下方式进行写入:
              pY_map = (HI_U8*) HI_MPI_SYS_Mmap(stVFrame ...[/quote]

楼主把 stVFrame.stVFrame.enCompressMode 和 stVFrame.stVFrame.enVideoFormat打出来看看

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang 2018-11-21 16:46:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112501&ptid=53696]zhuangweiye 发表于 2018-11-21 15:09[/url]
楼主把 stVFrame.stVFrame.enCompressMode 和 stVFrame.stVFrame.enVideoFormat打出来看看[/quote]

打印出来分别为COMPRESS_MODE_TILE     VIDEO_FORMAT_LINEAR
我也看到vo_ch_dump.c中根据这两个值是否送到VGS模块

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-21 17:13:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112537&ptid=53696]M_chenyang 发表于 2018-11-21 16:46[/url]
打印出来分别为COMPRESS_MODE_TILE     VIDEO_FORMAT_LINEAR
我也看到vo_ch_dump.c中根据这两个值是否送 ...[/quote]

楼主的代码应该对应的是 COMPRESS_MODE_NONE

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang 2018-11-21 17:47:32
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112548&ptid=53696]zhuangweiye 发表于 2018-11-21 17:13[/url]
楼主的代码应该对应的是 COMPRESS_MODE_NONE[/quote]

是的   是我没注意到每模块的输出格式,还有个问题我想请教下,在HI_MPI_VDEC_SendFrame 时需要传到帧序号   在获取时得到对应的帧序号   我查看mpp文档并没有相对应的资料,有什么方法可以实现吗

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-22 08:23:25
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112557&ptid=53696]M_chenyang 发表于 2018-11-21 17:47[/url]
是的   是我没注意到每模块的输出格式,还有个问题我想请教下,在HI_MPI_VDEC_SendFrame 时需要传到帧序 ...[/quote]

如果不是绑定vo,可以利用pts,不过有不少限制

楼主可以看一下 视频解码一章重要概念中的时间戳(PTS)处理

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang 2018-11-22 10:55:27
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112573&ptid=53696]zhuangweiye 发表于 2018-11-22 08:23[/url]
如果不是绑定vo,可以利用pts,不过有不少限制

楼主可以看一下 视频解码一章重要概念中的时间戳(PTS ...[/quote]

目前是通过PTS来做处理的  谢谢哈!

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-03 16:31:23
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112557&ptid=53696]M_chenyang 发表于 2018-11-21 17:47[/url]
是的   是我没注意到每模块的输出格式,还有个问题我想请教下,在HI_MPI_VDEC_SendFrame 时需要传到帧序 ...[/quote]

楼主,您好,我也遇到了和您同样问题,
stChnParam.stVdecVideoParam.enCompressMode    = COMPRESS_MODE_TILE; //解码图像压缩模式
stChnParam.stVdecVideoParam.enVideoFormat     = VIDEO_FORMAT_TILE_64x16; //解码图像数据格式
//stChnParam.stVdecVideoParam.enCompressMode    = COMPRESS_MODE_NONE;
  //stChnParam.stVdecVideoParam.enVideoFormat     = VIDEO_FORMAT_LINEAR;
源代码中使用的enCompressMode, enVideoFormat  是 COMPRESS_MODE_TILE,VIDEO_FORMAT_TILE_64x16,当我修改成下面两行(注释的部分),代码就不能运行了,但是当我没有修改的时候保存图片时图片是花屏的。请问您的问题是怎样解决的,望指教一二,感激不尽!

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-04 10:01:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112431&ptid=53696]zhuangweiye 发表于 2018-11-21 09:00[/url]
1. vdec绑定vpss的情况下,是Get不到的frame的,绑定情况下,可以换个角度去得图,从vpss输入端,可以看看H ...[/quote]

前辈,您好,请问从VPSS输入端的是怎样得到图的?
I_S32 SAMPLE_COMM_VPSS_Start(VPSS_GRP VpssGrp, HI_BOOL* pabChnEnable, VPSS_GRP_ATTR_S* pstVpssGrpAttr, VPSS_CHN_ATTR_S* pastVpssChnAttr)
{
    VPSS_CHN VpssChn;
    HI_S32 s32Ret;
    HI_S32 j;

    s32Ret = HI_MPI_VPSS_CreateGrp(VpssGrp, pstVpssGrpAttr);

    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_CreateGrp(grp:%d) failed with %#x!\n", VpssGrp, s32Ret);
        return HI_FAILURE;
    }

    for (j = 0; j < VPSS_MAX_PHY_CHN_NUM; j++)
    {
        if(HI_TRUE == pabChnEnable[j])
        {
            VpssChn = j;
            s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, &pastVpssChnAttr[VpssChn]);

            if (s32Ret != HI_SUCCESS)
            {
                SAMPLE_PRT("HI_MPI_VPSS_SetChnAttr failed with %#x\n", s32Ret);
                return HI_FAILURE;
            }

            s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
            

            if (s32Ret != HI_SUCCESS)
            {
                SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret);
                return HI_FAILURE;
            }
        }
    }

    s32Ret = HI_MPI_VPSS_StartGrp(VpssGrp);
       
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_StartGrp failed with %#x\n", s32Ret);
        return HI_FAILURE;
    }
    /*
    VIDEO_FRAME_INFO_S stVFrame; //定义视频图像帧信息结构体
   
    while(1)
    {       
                s32Ret = HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stVFrame, 1000);  //用户从通道获取一帧处理完成的图像。 参数(VPSS GROUP 号, VPSS通道号,图像信息, 超时时间)
                printf("\n ------------s32Ret = %d--------\n", s32Ret);
    }*/
    return HI_SUCCESS;
}
实在开启这个代码之后吗?

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang 2019-07-15 16:25:25
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=144951&ptid=53696]qn1562136485 发表于 2019-7-4 10:01[/url]
前辈,您好,请问从VPSS输入端的是怎样得到图的?
I_S32 SAMPLE_COMM_VPSS_Start(VPSS_GRP VpssGrp, HI_ ...[/quote]

那你可以直接从输入端得到图像就行。有VI 或VDEC  都可以

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang 2019-07-15 16:27:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=144926&ptid=53696]qn1562136485 发表于 2019-7-3 16:31[/url]
楼主,您好,我也遇到了和您同样问题,
stChnParam.stVdecVideoParam.enCompressMode    = COMPRESS_MO ...[/quote]

那是因为图像数据是压缩的,可以通过VGS模块解压  或者修改格式即可

qn1562136485

0个粉丝

18

问答

0

专栏

0

资料

qn1562136485 2019-07-15 20:57:38
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=145405&ptid=53696]M_chenyang 发表于 2019-7-15 16:27[/url]
那是因为图像数据是压缩的,可以通过VGS模块解压  或者修改格式即可[/quote]

好的,感谢!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-11-22 07:22:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=112557&ptid=53696]M_chenyang 发表于 2018-11-21 17:47[/url]
是的   是我没注意到每模块的输出格式,还有个问题我想请教下,在HI_MPI_VDEC_SendFrame 时需要传到帧序 ...[/quote]

如果是sendstream和getImage的组合,不是绑定vo的情况,可以利用pts

楼主可以看一下视频解码一章中重要概念中的时间戳(PTS)处理
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区