yuanjc

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc  发布于  2017-04-26 16:58:14
采纳率 0%
3个问答
3454

[his3516A]JPEG 编码第二帧失败

 
hi3516平台
单独创建一个编码通道,需要抓拍时才把数据送入编码通道,结果发现第二次送入时就出现了a0088003的错误。
向懂的人请教
流程如下:

   SAMPLE_PRT("%s %d\n",__FUNCTION__,__LINE__);
    stRecvParam.s32RecvPicNum = 1;
    s32Ret = HI_MPI_VENC_StartRecvPicEx(gpOsdJpegObj->JpegChn, &stRecvParam);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VENC_StartRecvPic faild with%#x!\n", s32Ret);
        return HI_FAILURE;
    }

        SAMPLE_PRT("Jpeg Enc Wid %d hei %d \n",pSrc->frameIn.frame.stVFrame.u32Width,pSrc->frameIn.frame.stVFrame.u32Height);
    s32Ret = HI_MPI_VENC_SendFrame(gpOsdJpegObj->JpegChn,&(pSrc->frameIn.frame),-1);
    if (HI_SUCCESS != s32Ret)
    {
           
        SAMPLE_PRT("HI_MPI_VENC_SendFrame faild with%#x!\n", s32Ret);
                s32Ret = HI_MPI_VENC_StopRecvPic(gpOsdJpegObj->JpegChn);
                if (HI_SUCCESS != s32Ret)
                {
                        SAMPLE_PRT("HI_MPI_VENC_StopRecvPic faild with%#x!\n", s32Ret);               
                }               
        return HI_FAILURE;
    }   

    s32VencFd = HI_MPI_VENC_GetFd(gpOsdJpegObj->JpegChn);
    if (s32VencFd < 0)
    {
        SAMPLE_PRT("HI_MPI_VENC_GetFd faild with%#x!\n", s32VencFd);
        return HI_FAILURE;
    }

    SAMPLE_PRT("%s %d\n",__FUNCTION__,__LINE__);


    FD_ZERO(&read_fds);
    FD_SET(s32VencFd, &read_fds);
    TimeoutVal.tv_sec  = 60;
    TimeoutVal.tv_usec = 0;
    s32Ret = select(s32VencFd + 1, &read_fds, NULL, NULL, &TimeoutVal);
    if (s32Ret < 0)
    {
        SAMPLE_PRT("snap select failed!\n");
        return HI_FAILURE;
    }
    else if (0 == s32Ret)
    {
        SAMPLE_PRT("snap time out!\n");
        return HI_FAILURE;
    }
    else
    {
        if (FD_ISSET(s32VencFd, &read_fds))
        {
            s32Ret = HI_MPI_VENC_Query(gpOsdJpegObj->JpegChn, &stStat);
            if (s32Ret != HI_SUCCESS)
            {
                SAMPLE_PRT("HI_MPI_VENC_Query failed with %#x!\n", s32Ret);
                return HI_FAILURE;
            }                                               
            /*******************************************************
                        suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example:
                         if(0 == stStat.u32CurPacks || 0 == stStat.u32LeftStreamFrames)
                         {                                SAMPLE_PRT("NOTE: Current  frame is NULL!\n");
                                return HI_SUCCESS;
                         }                       
                         *******************************************************/
            if (0 == stStat.u32CurPacks)
            {
                SAMPLE_PRT("NOTE: Current  frame is NULL!\n");
                return HI_SUCCESS;
            }
               
            stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);
            if (NULL == stStream.pstPack)
            {
                SAMPLE_PRT("malloc memory failed!\n");
                return HI_FAILURE;
            }
            stStream.u32PackCount = stStat.u32CurPacks;
            s32Ret = HI_MPI_VENC_GetStream(gpOsdJpegObj->JpegChn, &stStream, -1);
            if (HI_SUCCESS != s32Ret)
            {
                SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", s32Ret);
                free(stStream.pstPack);
                stStream.pstPack = NULL;
                return HI_FAILURE;
            }
               
                        u32JpegLen = 0;
                        for ( s32PackIdx = 0 ; s32PackIdx < stStream.u32PackCount ; s32PackIdx ++ )
                        {
                                u32JpegLen += (stStream.pstPack[s32PackIdx].u32Len - stStream.pstPack[s32PackIdx].u32Offset);
                        }
                       
                        if (u32JpegLen + sizeof(JPEG_HEADER) + sizeof(VEHICLE_DETECT_HEADER) < gpOsdJpegObj->u32MaxJpegLen )
                        {
                                gpOsdJpegObj->u32JpegLen = sizeof(JPEG_HEADER) + sizeof(VEHICLE_DETECT_HEADER) ;
                                for ( s32PackIdx = 0 ; s32PackIdx < stStream.u32PackCount ; s32PackIdx ++ )
                                {
                                        memcpy(gpOsdJpegObj->pJpegBuf + gpOsdJpegObj->u32JpegLen,\
                                                stStream.pstPack[s32PackIdx].pu8Addr + stStream.pstPack[s32PackIdx].u32Offset,\
                                                stStream.pstPack[s32PackIdx].u32Len - stStream.pstPack[s32PackIdx].u32Offset);
                                        gpOsdJpegObj->u32JpegLen += (stStream.pstPack[s32PackIdx].u32Len - stStream.pstPack[s32PackIdx].u32Offset);
                                }
                       
                       
                        }
                       
            s32Ret = HI_MPI_VENC_ReleaseStream(gpOsdJpegObj->JpegChn, &stStream);
            if (s32Ret)
            {
                SAMPLE_PRT("HI_MPI_VENC_ReleaseStream failed with %#x!\n", s32Ret);
                free(stStream.pstPack);
                stStream.pstPack = NULL;
                return HI_FAILURE;
            }
            free(stStream.pstPack);
            stStream.pstPack = NULL;
        }
    }   
    /******************************************
     step 4:  stop recv picture
    ******************************************/
    s32Ret = HI_MPI_VENC_StopRecvPic(gpOsdJpegObj->JpegChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VENC_StopRecvPic failed with %#x!\n",  s32Ret);
        return HI_FAILURE;
    }
    return HI_SUCCESS;
我来回答
回答7个
时间排序
认可量排序

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc 2017-04-26 16:59:57
认可0
之前采用了一种方法来避开这个问题,就是编完一帧,注销一次,下次再创建进行编码,是可以解决问题的。
但这个问题还是悬而未决,向各位高手请教

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc 2017-04-26 17:02:27
认可0
帧数据不是在系统的VB POOL里面,而是另外分配的。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-04-26 17:12:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=48785&ptid=14979]yuanjc 发表于 2017-4-26 17:02[/url]
帧数据不是在系统的VB POOL里面,而是另外分配的。[/quote]

出错误a0088003是哪个接口?

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc 2017-04-26 17:30:23
认可0
HI_MPI_VENC_SendFrame这个接口

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc 2017-04-26 17:33:05
认可0
刚才思考了一下,怀疑是这样的原因:
输入的帧数据不是来自系统的缓存池,编码之后把帧数据送到系统缓存池中就会出问题。
另外 编一帧就 关闭这个通道的方式也可能存在问题。

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc 2017-04-27 08:50:26
认可0
我在StopRecvPic之后加上ResetChn之后每一帧都正常了。
没有加ResetChn之前,运行很多帧才有一帧是正确的。
    s32Ret = HI_MPI_VENC_StopRecvPic(gpOsdJpegObj->JpegChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VENC_StopRecvPic failed with %#x!\n",  s32Ret);
        return HI_FAILURE;
    }
    s32Ret = HI_MPI_VENC_ResetChn(gpOsdJpegObj->JpegChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VENC_ResetChn failed with %#x!\n",  s32Ret);
        return HI_FAILURE;
    }

yuanjc

0个粉丝

3

问答

0

专栏

0

资料

yuanjc 2017-04-27 08:51:15
认可0
这个问题可以收尾了,内部的原理还是不甚清楚,有内部人士解释一下就更好了。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区