lyric

lyric

1个粉丝

22

问答

0

专栏

3

资料

lyric  发布于  2016-09-20 16:15:23
采纳率 0%
22个问答
5735

另外一个进程调用HI_MPI_VENC_SendFrame失败

 
求助大神:

我在一个进程(camera)采集到了图像,将图像的物理地址发到另外一个进程(encode),然后调用方法HI_MPI_VENC_SendFrame编码,返回错误码:0xA0088005,初步觉得原因是我在解码进程(encode)里调用了以下方法:
[code]    s32Ret = HI_MPI_VB_SetConf(pstVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VB_SetConf failed!\n");
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VB_Init();
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VB_Init failed!\n");
        return HI_FAILURE;
    }

    stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH;
    s32Ret = HI_MPI_SYS_SetConf(&stSysConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_SYS_SetConf failed\n");
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_SYS_Init();
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_SYS_Init failed!\n");
        return HI_FAILURE;
    }[/code]

所以相当于复位了vi里的vb buf(vi里初始化时也调用了这些方法),编码器再使用camera进程发过来的图像物理内存地址时就不可用了,所以编码就失败,但是不掉用上面这些方法,编码器创建通道会失败,请问大神们怎么解决这个问题呢?
我来回答
回答6个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-20 16:24:42
认可0
需要两个进程吗? 一个进程两个线程不能解决问题吗?

lyric

1个粉丝

22

问答

0

专栏

3

资料

lyric 2016-09-20 18:39:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38084&ptid=12713]zhuangweiye 发表于 2016-9-20 16:24[/url]
需要两个进程吗? 一个进程两个线程不能解决问题吗?[/quote]

是的,采集与编码需要在不同的进程里完成,难点就是在这地方,有什么好的方式可以解决么

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-21 08:09:07
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38093&ptid=12713]lyric 发表于 2016-9-20 18:39[/url]
是的,采集与编码需要在不同的进程里完成,难点就是在这地方,有什么好的方式可以解决么[/quote]


关于两个进程初始化海思的问题, 文档上这样说:

HI_MPI_SYS_Init
只要有一个进程进行初始化即可,不需要所有的进程都做系统初始化的操作。

也就是说只要一个进程做初始化即可, 但是这里有两点要注意
1. 先后次序问题, 即负责初始化的进程必须先把初始化的动作做完,另一个进程才可以跑
2. VB的问题, 初始化的进程在分配VB时必须考虑两个进程的需求, 一次都分配好

不过真的看不出来把采集和编码放在两个进程里面的必要性, 非常想了解这是什么样的需求

lyric

1个粉丝

22

问答

0

专栏

3

资料

lyric 2016-09-21 09:32:55
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38103&ptid=12713]zhuangweiye 发表于 2016-9-21 08:09[/url]
关于两个进程初始化海思的问题, 文档上这样说:

HI_MPI_SYS_Init
[/quote]

我尝试在在另外一个进程里不掉用HI_MPI_SYS_Init以及exit方法,可以编码一帧,但系统就卡死了,修改如下
[code]HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S* pstVbConf)
{
    MPP_SYS_CONF_S stSysConf = {0};
    HI_S32 s32Ret = HI_FAILURE;

//    HI_MPI_SYS_Exit();
//    HI_MPI_VB_Exit();

    if (NULL == pstVbConf)
    {
        SAMPLE_PRT("input parameter is null, it is invaild!\n");
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VB_SetConf(pstVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VB_SetConf failed!\n");
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VB_Init();
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VB_Init failed!\n");
        return HI_FAILURE;
    }

    stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH;
    s32Ret = HI_MPI_SYS_SetConf(&stSysConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_SYS_SetConf failed\n");
        return HI_FAILURE;
    }
//
//    s32Ret = HI_MPI_SYS_Init();
//    if (HI_SUCCESS != s32Ret)
//    {
//        SAMPLE_PRT("HI_MPI_SYS_Init failed!\n");
//        return HI_FAILURE;
//    }

    return HI_SUCCESS;
}[/code]

错误如下:
[code][   19.553178] flags: 0x00000000 size: 0x00c00a80 type:4
[   19.561550] emm phyAddr:8c87ca00 current alloc size:12585600
[   19.571403] Kernel panic - not syncing:
[   19.571403] ASSERT failed at:
[   19.571403]   >File name: /home/pub/platform-h6/mpp/code/shelf/venc2/venc/venc_ext.c
[   19.571403]   >Function : VENC_StartOneFrameH264
[   19.571403]   >Line No. : 3136
[   19.571403]   >Condition: 0
[   19.571403]
[   19.601087] CPU: 1 PID: 375 Comm: camencserver Tainted: P           O   3.18.20 #17
[   19.608753] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
[b_ vi _g e19t._f6ra1me6-493] [] (show_stack) from [] (dump_stack+0x88/0x98)
[   19.621507] flags: 0x00000000 size: 0x00c00a80 type:4
[   19.621556] emm phyAddr:8987a000 current alloc size:12585600
[   19.621946] flags: 0x00000000 size: 0x00c00a80 type:4
[   19.621987] emm phyAddr:8a47aa80 current alloc size:12585600
[   19.6ib5_v3i_0ge53t]_f ra[me<-c03fa13c>] (dump_stack) from [] (panic+0xa0/0x204)
[   19.653171] flags: 0x00000000 size: 0x00c00a80 type:4
[   19.653219] emm phyAddr:8b07b500 current alloc size:12585600
[   19.674606] [] (panic) from [] (osal_read+0x0/0x3c [hi_osal])
[   19.682099] [] (osal_read [hi_osal]) from [] (venc_mod_exit+0x5644/0x4 [hi3519v101_venc])
[   19.692031] CPU0: stopping
[   19.694748] CPU: 0 PID: 372 Comm: cameraserver Tainted: P           O   3.18.20 #17
[   19.702417] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
[   19.710163] [] (show_stack) from [] (dump_stack+0x88/0x98)
[   19.717385] [] (dump_stack) from [] (handle_IPI+0x1cc/0x1ec)
[   19.724778] [] (handle_IPI) from [] (gic_handle_irq+0x74/0x78)
[   19.732346] [] (gic_handle_irq) from [] (__irq_svc+0x40/0x54)
[   19.739819] Exception stack(0xc08d1db8 to 0xc08d1e00)
[   19.744865] 1da0:                                                       00000001 c05984c0
[   19.753037] 1dc0: 00000000 00000000 0000008a 00000000 00000000 00000001 c08d0000 c323f540
[   19.761210] 1de0: 00000000 c48aa000 00000000 c08d1e00 c05984c0 c0021064 200d0113 ffffffff
[   19.769391] [] (__irq_svc) from [] (__do_softirq+0xb8/0x230)
[   19.776787] [] (__do_softirq) from [] (irq_exit+0xac/0xf4)
[   19.784009] [] (irq_exit) from [] (__handle_domain_irq+0x60/0xa4)
[   19.791837] [] (__handle_domain_irq) from [] (gic_handle_irq+0x24/0x78)
[   19.800186] [] (gic_handle_irq) from [] (__irq_svc+0x40/0x54)
[   19.807658] Exception stack(0xc08d1e88 to 0xc08d1ed0)
[   19.812706] 1e80:                   c38eea10 a00d0013 c38eea10 00000952 00000fff c3898000
[   19.820879] 1ea0: c3b46800 c0412634 c48ac270 c323f540 00000000 c48aa000 00000000 c08d1ed0
[   19.829049] 1ec0: c0244ec8 c03fe328 600d0013 ffffffff
[   19.834102] [] (__irq_svc) from [] (_raw_spin_unlock_irqrestore+0x1c/0x20)
[   19.842715] [] (_raw_spin_unlock_irqrestore) from [] (uart_write_room+0x30/0x38)
[   19.851848] [] (uart_write_room) from [] (n_tty_write+0x140/0x4bc)
[   19.859764] [] (n_tty_write) from [] (tty_write+0x10c/0x2b8)
[   19.867160] [] (tty_write) from [] (vfs_write+0xa0/0x1ac)
[   19.874297] [] (vfs_write) from [] (SyS_write+0x44/0x9c)
[   19.881345] [] (SyS_write) from [] (ret_fast_syscall+0x0/0x38)
[   19.888907] yuanrui test sns_log_panic
[   19.909775] ---[ end Kernel panic - not syncing:
[   19.909775] ASSERT failed at:
[   19.909775]   >File name: /home/pub/platform-h6/mpp/code/shelf/venc2/venc/venc_ext.c
[   19.909775]   >Function : VENC_StartOneFrameH264
[   19.909775]   >Line No. : 3136
[   19.909775]   >Condition: 0
[   19.909775]
[/code]

请帮忙分析一下,因为我只使用h265通道,所以s32ChnNum我配置了1,只创建第0个通道。
1,另外一个进程跑之前,初始化是完成了的
2,对于“VB的问题, 初始化的进程在分配VB时必须考虑两个进程的需求, 一次都分配好”这个不太理解,还请详解,我觉得vi自己内部分配了VB内存,我的想法是编码器直接使用vi分配的VB内存(就是共享内存),但是编码器不掉用VB初始化自己分配VB内存,编码通道就会创建失败,对于你说的“考虑两个进程的需求,一次分配好”,是需要在camera进程里分配好,encode进程里使用么?这种怎么实现呢?
3,把编码与采集分开来,是与我们的设计模式有关,采集放在一个服务里实现,编解码放在一个服务里实现,所以才遇到这种问题,还请帮忙分析下,是否可以解决这个问题

谢谢!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-21 10:03:35
认可0
本帖最后由 zhuangweiye 于 2016-9-21 10:19 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=38111&ptid=12713]lyric 发表于 2016-9-21 09:32[/url]
我尝试在在另外一个进程里不掉用HI_MPI_SYS_Init以及exit方法,可以编码一帧,但系统就卡死了,修改如下
...[/quote]

01.HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S* pstVbConf)

这个函数全部屏蔽掉,不要调用

里面的VB相关的部分移到初始化的进程中

举例来说
采集进程要开一种VB, 大小为u32VbSize0, 个数为u32VbCnt0
那么代码一般会是

        HI_S32 s32Ret;
        VB_CONF_S stVbConf;
        MPP_SYS_CONF_S stSysConf = {0};

        memset(&stVbConf,0,sizeof(VB_CONF_S));
        stVbConf.u32MaxPoolCnt = 256;

        stVbConf.astCommPool[0].u32BlkSize = u32VbSize0;
        stVbConf.astCommPool[0].u32BlkCnt = u32VbCnt0;
        memset(stVbConf.astCommPool[0].acMmzName,0, sizeof(stVbConf.astCommPool[0].acMmzName));

        //**************************************

        //**************************************
       
        s32Ret = HI_MPI_VB_SetConf(&stVbConf);
        if (HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_VB_SetConf failed!\n");
                return HI_FAILURE;
        }

        s32Ret = HI_MPI_VB_Init();
        if (HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_VB_Init failed! 0x%x\n", s32Ret);
                return HI_FAILURE;
        }

        stSysConf.u32AlignWidth = ALIGN_WIDTH;
        s32Ret = HI_MPI_SYS_SetConf(&stSysConf);
        if (HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_SYS_SetConf failed 0x%x\n", s32Ret);
                return HI_FAILURE;
        }

        s32Ret = HI_MPI_SYS_Init();
        if (HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_SYS_Init failed! 0x%x\n", s32Ret);
                return HI_FAILURE;
        }

如果编码进程也需要分配VB, 比如大小为u32VbSize1, 个数为u32VbCnt1
那么只要在上面代码//*********中加入

        stVbConf.astCommPool[1].u32BlkSize = u32VbSize1;
        stVbConf.astCommPool[1].u32BlkCnt = u32VbCnt1;
        memset(stVbConf.astCommPool[1].acMmzName,0, sizeof(stVbConf.astCommPool[1].acMmzName));
即可


采集编码本来可以利用海思的绑定(多进程是否可用,没有试过,也许也是可以的), 又简单又高效, 分成两个进程如果没有非常有说服力的需求, 不建议这么搞

lyric

1个粉丝

22

问答

0

专栏

3

资料

lyric 2016-09-21 12:45:39
认可0
本帖最后由 lyric 于 2016-9-21 12:47 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=38115&ptid=12713]zhuangweiye 发表于 2016-9-21 10:03[/url]
01.HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S* pstVbConf)

这个函数全部屏蔽掉,不要调用
[/quote]

非常感谢,问题解决了,像你说的编码进程不调用VB初始化方法,使用采集进程创建的VB,之前编码器的通道创建失败是因为采集进程的VB没有初始化完成,现在调用这个方法HI_MPI_VENC_SendFrame没有返回错误,数据是否正确再一步验证,还有不配
[code]stVbConf.astCommPool[1].u32BlkSize = u32VbSize1;
stVbConf.astCommPool[1].u32BlkCnt = u32VbCnt1;[/code]
配了了好像有点问题,不知道是什么原因
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区