查看: 252|回复: 4

[hi3559/hi3559a] Hi3559A读取YUV文件调用VENC进行H264编码,HI_MPI_VENC_SendFrame报错0xa0088003

[复制链接]
发表于 2019-7-12 18:29:38 | 显示全部楼层 |阅读模式
Hi3559A读取YUV文件调用VENC进行H264编码,VB创建和通道创建都成功了,在调用HI_MPI_VENC_SendFrame函数时报错0xa0088003,/dev/logmpp日志输出以下内容:



  1. <3>[  venc] [Func]:AvcCheckPixelFormat [Line]:1379 [Info]:H.264 don't support format 25.
  2. <3>[  venc] [Func]:VencCheckVideoInfo [Line]:1575 [Info]:Venc 0 : Sendinfo pic info err.
复制代码



format 25应该是PIXEL_FORMAT_YVU_SEMIPLANAR_420,海思的SDK中明确说明VENC是支持Semi-planar YVU 4:2:0格式的<<HiMPP V4.0 媒体处理软件开发参考  649页>>,不知为何会报这个错。

YUV文件读取和发送给VNC的代码片段如下:
  1. 未省略代码,出错后面的部分就不发了
  2. HI_S32 SAMPLE_COMM_VENC_GetVencStreamProcEx(HI_VOID)
  3. {
  4.     //...一些变量定义

  5.     /******************************************
  6.      step 1:  check & prepare save-file & venc-fd
  7.     ******************************************/
  8.     /* decide the stream file name, and open file to save stream */
  9.     /* Set Venc Fd. */
  10.         pFile1 = fopen("test.h264","wb+");
  11.         if(pFile1 == NULL)
  12.         {
  13.                 printf("new test.h265 file failed\n");
  14.                 return -1;
  15.         }
  16.        
  17.         pFile2 = fopen("1080P.yuv","r+");
  18.     // pFile2 = fopen("1080P.yuv","r+");
  19.         if(pFile2 == NULL)
  20.         {
  21.                 printf("open 1080P.yuv file failed\n");
  22.                 return -1;
  23.         }
  24.        
  25.     VencFd = HI_MPI_VENC_GetFd(VencChn);
  26.     if (VencFd < 0)
  27.     {
  28.         SAMPLE_PRT("HI_MPI_VENC_GetFd failed with %#x!\n",VencFd);
  29.         return -1;
  30.     }
  31.        
  32.         VB_BLK handleY = VB_INVALID_HANDLE;
  33.         HI_U64 phyYaddr;
  34.     HI_U64 *pVirYaddr;
  35.    
  36.         VIDEO_FRAME_INFO_S *pstFrame = malloc(sizeof(VIDEO_FRAME_INFO_S));
  37.        
  38.     /******************************************
  39.      step 2:  Start to get streams of each channel.
  40.     ******************************************/
  41.     while (frame < 30)
  42.     {
  43.                 /* 分配物理buffer并且映射到用户空间 */
  44.                 do
  45.                 {
  46.                         handleY = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, 1920 * 1080 * 3 / 2 , NULL);
  47.             if (VB_INVALID_HANDLE == handleY) {
  48.                 SAMPLE_PRT("handleY is VB_INVALID_HANDLE\n");
  49.             }
  50.                 }
  51.                 while (VB_INVALID_HANDLE == handleY);       
  52.                 if( handleY == VB_INVALID_HANDLE)
  53.                 {
  54.                         printf("getblock for y failed\n");
  55.                         return -1;
  56.                 }
  57.                 else {
  58.             printf("handleY is %d\n", handleY);
  59.         }
  60.                 VB_POOL poolID =  HI_MPI_VB_Handle2PoolId (handleY);//得到poolID
  61.         printf("pool ID = %d\n", poolID);

  62.                 phyYaddr = HI_MPI_VB_Handle2PhysAddr(handleY);
  63.                 if( phyYaddr == 0)
  64.                 {
  65.                         printf("HI_MPI_VB_Handle2PhysAddr for handleY failed\n");
  66.                         return -1;
  67.                 }
  68.                
  69.                 pVirYaddr = (HI_U64 *) HI_MPI_SYS_Mmap(phyYaddr, 1920 * 1080 * 3 / 2);
  70.                
  71.                 /* 图像帧结构初始化 */
  72.                 memset(&(pstFrame->stVFrame),0x00,sizeof(VIDEO_FRAME_S));
  73.                 pstFrame->stVFrame.u32Width = 1920;
  74.                 pstFrame->stVFrame.u32Height = 1080;
  75.                 pstFrame->stVFrame.enPixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;//;
  76.                 pstFrame->u32PoolId = poolID;
  77.         pstFrame->enModId = HI_ID_USER;
  78.                 pstFrame->stVFrame.u64PhyAddr[0] = phyYaddr;
  79.                 pstFrame->stVFrame.u64PhyAddr[1] = phyYaddr + 1920 * 1080;
  80.                 pstFrame->stVFrame.u64VirAddr[0] = (HI_U64)(HI_UL)pVirYaddr;
  81.                 pstFrame->stVFrame.u64VirAddr[1] = (HI_U64)(HI_UL)pVirYaddr + 1920 * 1080;
  82.                 pstFrame->stVFrame.u32Stride[0] = 1920 ;
  83.                 pstFrame->stVFrame.u32Stride[1] = 1920 ;
  84.                 pstFrame->stVFrame.enField     = VIDEO_FIELD_FRAME;
  85.                 pstFrame->stVFrame.enCompressMode = COMPRESS_MODE_NONE;
  86.                 pstFrame->stVFrame.enVideoFormat  = VIDEO_FORMAT_LINEAR;
  87.         pstFrame->stVFrame.enDynamicRange = DYNAMIC_RANGE_SDR8;
  88.         pstFrame->stVFrame.enColorGamut = COLOR_GAMUT_BT709;
  89.                 pstFrame->stVFrame.u64PTS     = frame * 40;
  90.         pstFrame->stVFrame.u32TimeRef = frame * 2;

  91.                 /*  从原始文件读取yuv420sp帧,然后调用给编码接口 */
  92.         s32Ret = fread(pVirYaddr,1920 * 1080 * 3 / 2, 1, pFile2);
  93.                 if(s32Ret < 0)
  94.                 {
  95.                         printf("fread yuv420sp failed\n");
  96.                         return -1;
  97.                 }
  98.         else {
  99.             printf("Read 1 frame from file : length = %d\n", s32Ret);
  100.         }

  101.         getchar();

  102.                 /* 开始发送读到的数据到编码接口 报错!*/
  103.                 s32Ret = HI_MPI_VENC_SendFrame(VencChn, pstFrame, -1);
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2019-7-12 18:51:57 | 显示全部楼层
补充一下,在创建完通道,并开始发数据之前, cat /proc/umap/venc结果如下:
  1. cat /proc/umap/venc

  2. [VENC] Version: [Hi3559AV100_MPP_V2.0.1.0 B092 Release], Build Time[Jul 12 2018, 21:25:32]

  3. -----MODULE PARAM--------------------------------------------------------------
  4.     VencBufferCache   FrameBufRecycle
  5.                   0                 0

  6. -----VENC CHN ATTR 1-----------------------------------------------------------
  7.       ID   Width  Height  Type  ByFrame    Sequence   LeftBytes     LeftFrm  CurPacks   GopMode  Prio
  8.        0    1920    1080    96        Y           0           0           0         0   NormalP     0

  9. -----VENC CHN ATTR 2-----------------------------------------------------------
  10.    VeStr   SrcFr   TarFr     Timeref  PixFmt PicAddr      WakeUpFrmCnt
  11.        N      -1      -1           1      NA  0x       0           1

  12. -----VENC CHN RECEIVE STAT-----------------------------------------------------
  13.       ID       Start     StartEx    RecvLeft     EncLeft    JpegEncodeMode
  14.        0           1           1           1           1                NA

  15. -----VENC VPSS QUERY-----------------------------------------------------------
  16.       ID       Query     QueryOk     QueryFR       Invld        Full      VbFail   QueryFail     InfoErr        Stop
  17.        0           0           0           0           0           0           0           0           0           0

  18. -----VENC SEND1----------------------------------------------------------------
  19.       ID     VpssSnd     VInfErr     OthrSnd     OInfErr        Send        Stop        Full     CropErr    DrectSnd     SizeErr
  20.        0           0           0           0           0           0           0           0           0           0           0

  21. -----VENC SEND2----------------------------------------------------------------
  22.       ID     SendVgs     StartOk   StartFail       IntOk     IntFail      SrcAdd      SrcSub     DestAdd     DestSub
  23.        0           0           0           0           0           0           0           0           0           0

  24. -----VENC PIC QUEUE STATE------------------------------------------------------
  25.       ID    Free    Busy     Vgs
  26.        0       6       0       0

  27. -----VENC CHNL INFO------------------------------------------------------------
  28.       ID         Inq       InqOk       Start     StartOk      Config     VencInt  ChaResLost    OverLoad        Skip
  29.        0        4212           0           0           0           0           0           0           0           0

  30. -----VENC CROP INFO------------------------------------------------------------
  31.       ID  CropEn  StartX  StartY   Width  Height
  32.        0       N       0       0       0       0

  33. -----ROI INFO------------------------------------------------------------------
  34.      ID      Type     Index    bRoiEn    bAbsQp    Qp     Width    Height    StartX    StartY


  35. -----VENC STREAM STATE---------------------------------------------------------
  36.       ID     FreeCnt     BusyCnt     UserCnt     UserGet     UserRls    GetTimes    Interval   FrameRate
  37.        0           0           0           0           0           0           0           0           0
复制代码
发表于 2019-7-15 09:14:08 | 显示全部楼层
qn1562925782 发表于 2019-7-12 18:51
补充一下,在创建完通道,并开始发数据之前, cat /proc/umap/venc结果如下:

PIXEL_FORMAT_YVU_SEMIPLANAR_420 这个是25,

logmpp:
<3>[  venc] [Func]:AvcCheckPixelFormat [Line]:1379 [Info]:H.264 don't support format 25.

说明不支持

试试 PIXEL_FORMAT_YUV_SEMIPLANAR_420
一般来说是YUV,  YVU看上去好奇怪, 可以对比一下3.0和4.0的文档, 3.0的是YUV
 楼主| 发表于 2019-7-17 11:21:31 | 显示全部楼层
谢谢!已经找到问题,是SDK版本的问题
发表于 2019-7-17 11:26:16 | 显示全部楼层
qn1562925782 发表于 2019-7-17 11:21
谢谢!已经找到问题,是SDK版本的问题




pstFrame->stVFrame.enColorGamut = COLOR_GAMUT_BT709;
                pstFrame->stVFrame.u64PTS     = frame * 40;
        pstFrame->stVFrame.u32TimeRef = frame * 2;

第一个 709 是啥?
第二个是 是毫秒,  意思是25fs?
第三个 是啥?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2008-2017 当前位置 易百纳技术社区论坛 返回 易百纳技术社区 ( 苏ICP备14036084 )   Powered by Discuz! X3.1
快速回复 返回顶部 返回列表