This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DM388:写入已使用 IP 链接显示在显示屏上的视频帧

Guru**** 2587365 points
Other Parts Discussed in Thread: TVP7002

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/635742/dm388-write-video-frames-already-displayed-on-display-using-ip-links

器件型号:DM388
主题中讨论的其他器件:TVP7002

大家好、

我正在尝试使用 VDIS_getEmptyVideoFrames()捕获已显示的视频帧;

但是帧缓冲区列表正是这 一(VDIS_getEmptyVideoFrames())函数的一部分。

以下是我的用例:

   CaptureLink_CreateParams   CapturePrm;
   DisplayLink_CreateParams   displayPrm;

   CaptureLink_VipInstParams *pCaptureInstPrm;
   CaptureLink_OutParams    *pCaptureOutPrm;

   静态 SwMsLink_CreateParams      swMsPrm;
   MergeLink_CreateParams   mergePrm;

   uint32 mergerId;

   IpcFramesOutLinkHLS_CreateParams ipcFramesOutHostPrm;
   IpcFramesInLinkRTOS_CreateParams  ipcFramesInVpssFromHostPrm;

   MULTICH_INIT_STRUCT (IpcFramesOutLinkHLS_CreateParams、ipcFramesOutHostPrm);
   MULTICH_INIT_STRUCT (IpcFramesInLinkRTOS_CreateParams 、ipcFramesInVpssFromHostPrm);

   osa_printf ("Vias 播放_create\n");
   MultiCh_detectBoard();
   MULTICH_INIT_STRUCT (DisplayLink_CreateParams、displayPrm);
   System_linkControl (system_link_ID_M3VPSS、
                      System_M3VPSS_CMD_RESET_VIDEO 器件、
                      null、
                      0、
                      对
                     );

   /*初始化链接 ID*/
   gVcapModuleContext.captureId               = system_link_ID_capture;
   gVdisModuleContext.displayId[VDIS_DEV_HDMI]= system_link_ID_display_0;
   mergerId                                   = system_vPSS_link_ID_merge_0;  
   gVdisModuleContext.swMsId[0]               = system_link_ID_SW_MS_MULTI_INST_0;     

   gVdisModuleContext.ipcFramesOutHostId       = system_host_link_ID_IPC_FRAS_OUT_0;
   gVdisModuleContext.ipcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAS_IN_0;


               /*Capture Link 参数*/
   
                CaptureLink_CreateParams_Init (&capturePrm);

      capturePrm.numVipInst = 1;//vipInstId;

               CapturePrm.outQueParams[0].nextLink = mergerId;
               CapturePrm.outQueParams[1].nextLink = mergerId;

      CapturePrm.tilerEnable             = false;

      pCaptureInstPrm                    =&capturePrm.vipInst[0];
      pCaptureInstPrm->vipInstId         = system_capture_INST_VIP0_Porta;//+vipInstId;
      pCaptureInstPrm->videoDecoderId    = system_device_VID_DEC_TVP7002_DRV;
      pCaptureInstPrm->inDataFormat      = SYSTEM_DF_YUV422P;
               //pCaptureInstPrm->inDataFormat      = SYSTEM_DF_RGB24_888;
      pCaptureInstPrm->标准          = SYSTEM_STD_SXGA+ 60;
               //pCaptureInstPrm->标准          = SYSTEM_STD_720p_60;
               //pCaptureInstPrm->标准          = SYSTEM_STD_1080p_60;
               //pCaptureInstPrm->标准          = SYSTEM_STD_1080i_60;

      pCaptureInstPrm->numOutput         = 2;
               pCaptureOutPrm                     =&pCaptureInstPrm->outParams[0];
      pCaptureOutPrm->dataFormat         = system_DF_YUV420SP_UV;//system_DF_RGB24_888;//
      //pCaptureOutPrm->scEnable           = true;//false;
              // pCaptureOutPrm->scOutWidth         = 1500;//1280;//340;//1920;
               //pCaptureOutPrm->scOutHeight        = 1080;//1040;//340;//1080;
      pCaptureOutPrm->outQueId           = 0;

               pCaptureOutPrm                     =&pCaptureInstPrm->outParams[1];
      pCaptureOutPrm->dataFormat         = system_DF_YUV420SP_UV;//system_DF_RGB24_888;//
      //pCaptureOutPrm->scEnable           = true;
               //pCaptureOutPrm->scOutWidth         = 1500;//1280;//340;//1920;//1280;
               //pCaptureOutPrm->scOutHeight        = 1080;//1040;//340;//1024;
      pCaptureOutPrm->outQueId           = 1;
   

               mergePrm.numInQue                      = 2;
               mergePrm.inQueParams[0].prevLinkId     = gVcapModuleContext.captureId;
               mergePrm.inQueParams[0].prevLinkQueId  = 0;
               mergePrm.inQueParams[1].prevLinkId     = gVcapModuleContext.captureId;
               mergePrm.inQueParams[1].prevLinkQueId  = 1;
               mergePrm.outQueParams.nextLink         = gVdisModuleContext.swMsId[0];
               mergePrm.notifyNextLink                = true;

   /*用于裁剪的软件 Mosaic。*/
   swMsPrm.numSwMsInst              = 1;
   swMsPrm.swMsInstId[0]            = system_sw_ms_sc_INST_VIP1_SC;
   swMsPrm.inQueParams.prevLinkId   = mergerId;
   swMsPrm.inQueParams.prevLinkQueId = 0;
   swMsPrm.outQueParams.nextLink    = gVdisModuleContext.displayId[VDIS_DEV_HDMI];
   swMsPrm.maxInputQueLen           = system_sw_ms_default_input_que_LEN + 4;
   swMsPrm.maxOutRes                = VSYS_STD_1080p_60;
   swMsPrm.lineSkipMode             = false;
   swMsPrm.enableLayoutGridDraw     = false;

   swMsPrm.enableOutputDup           = true;
   swMsPrm.enableProcessTieWithDisplay = true;

   vias _播放_配件(&swMsPrm、start_x、start_y、cROP_HEIGHT、cROP_width、 接头、CAP_RES);

   /* IPC 初始化*///未测试
   ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = true;
   ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = false;
   ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = false;
   ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkId = system_link_ID_invalid;
   ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
   ipcFramesOutHostPrm.baseCreateParams.outQueueParams[0].nextLink = gVdisModuleContext.ipcFramesInVpssFromHostId;

   ipcFramesInVpssFromHostPrm.baseCreateParams.noNotifyMode = true;
   ipcFramesInVpssFromHostPrm.baseCreateParams.notifyNextLink = true;
   ipcFramesInVpssFromHostPrm.baseCreateParams.notifyPrevLink = false;
   ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkId = gVdisModuleContext.ipcFramesOutHostId;
   ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
   ipcFramesInVpssFromHostPrm.baseCreateParams.outQueueParams[0].nextLink = gVdisModuleContext.displayId[VDIS_DEV_HDMI];

   /*显示链接参数*/
   MULTICH_INIT_STRUCT (DisplayLink_CreateParams、displayPrm);
   displayPrm.inQueParams[0].prevLinkId = gVdisModuleContext.swMsId[0];
   displayPrm.inQueParams[0].prevLinkQueId = 0;
   displayPrm.displayRes = system_STD_1080p_60;
   displayPrm.displayId = display_link_display_sc1;//辅助视频路径(支持全高清/标清)

   /*创建链接*/
   System_linkCreate (gVcapModuleContext.captureId、&capturePrm、sizeof (capturePrm));
   System_linkCreate (mergerId、&mergePrm、sizeof (mergePrm));
   System_linkCreate (gVdisModuleContext.swMsId[0]、&swMsPrm、sizeof (swMsPrm));

   /*IPC 链接*/
   System_linkCreate (gVdisModuleContext.ipcFramesOutHostId、&ipcFramesOutHostPrm、sizeof (ipcFramesOutHostPrm));
   System_linkCreate (gVdisModuleContext.ipcFramesInVpssFromHostId、&ipcFramesInVpssFromHostPrm、sizeof (ipcFramesInVpssFromHostPrm));

   System_linkCreate (gVdisModuleContext.displayId[VDIS_DEV_HDMI]、&displayPrm、sizeof (displayPrm));

   MultiCh_memPrintHeapStatus();

下面是我的帧捕获函数

void Capture_FRAME ()

   VIDEO_FRAMEBUF_LIST_S bufList;
   INT 状态;
   uint32 frameSize = 0、frameId;
   VIDEO_FRAMEBUF_LIST_S * pFrameBufList;
   VIDEO_FRAMEBUF_S * pBuf;
   uint32 pMemVirtAddr;
   pMemVirtAddr = 0;
   uint32 writeDataSize;
   文件*fp=NULL;

   osa_printf ("MCFW_IPCFRAMES:%s:已输入..."、__func__);

   fp = fopen ("VIAS.YUV"、"WB");

   状态= VDIS_getEmptyVideoFrames (&bufList、0);
   OSA_ASSERT (0 = STATUS);

   pFrameBufList =&bufList;
   osa_printf ("numframes =%d"、pFrameBufList->numFrames);<--- 这个正在打印0,没有帧被分配到缓冲区。
   for (frameId=0;frameId < pFrameBufList->numFrames;frameId++)
   {
       pBuf =&pFrameBufList->frameId];      
       帧大小=(pBuf->frameWidth * pBuf->frameHeight)<<1;           
       app_mmap ((uint32)(pBuf->phyAddr[0][0])、frameSize、&pMemVirtAddr);
       writeDataSize = fwrite ((ptr) pMemVirtAddr、1、frameSize、FP);
       if (writeDataSize!=帧大小)
       {
          fclose (FP);
          osa_printf ("关闭文件\n");
          app_unmapMem();
          中断;
       }
       app_unmapMem();
   }      
   fclose (FP);

您能不能看看出现了什么问题。

谢谢

Kailash

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正在尝试从空队列中取消缓冲区的队列。 请参阅 MCFW 用户指南以了解 API
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ravikiran:

    我正在使用 ipnc3.8.1。

    以下片段来自 Mcfw 用户指南:
    VCAM_getFullVideoFrames–从前端获取捕获的 RAK/YUV 帧的 API
    –VCAM_putEmptyVideoFrames–用于释放应用消耗的 RAK/YUV 帧缓冲器的 API
    •发送帧缓冲区:
    –VDIS_putFullVideoFrames–用于将 RAW/YUV 帧发送到后端(显示屏)的 API
    –VDIS_getEmptyVideoFrames- API,用于收回 McFW 使用的原始/YUV 帧缓冲器

    根据这些定义,我应该使用 VDIS_getEmptyVideoFrames 返回已显示的帧。

    我的目的是获取显示的帧而不是捕获的帧。

    谢谢
    Kailash
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以插入一个链接(如"DUP"链接)来复制帧。 请参阅 DUP 链接示例。

    希望这对您有所帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kailash、

    getEmptyFrames API 会在显示后返回帧。 这些是您使用 putFullFrames API 提交到显示器的相同帧。您正在寻找这种帧吗?  

    Rgds、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢大家或回复。

    尊敬的 Ravi:

    我认为 DUP 链接不会为我提供已显示的框架。

    您好、Brijesh、

    是的、这正是我想要的。

    ipcFramesOutHostPrm 应请求 ipcFramesInVpssFromHostPrm,它将要求显示屏将已显示的帧放回 Linux (A8主机)。 但是、当我调用 VDIS_getEmptyVideoFrames 时、我将得到0帧。 我想知道我在这里遗漏了什么。

    谢谢
    Kailash
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Kailash、

    如果不返回任何帧、则说明驱动程序已用完帧。 驱动程序始终保留一个帧本身、因此如果它只是最后一个帧、它不会返回最后一个帧。 如果您希望该帧返回、则需要将另一个帧排队到显示屏。

    Rgds、
    Brijesh