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.

[参考译文] Linux/AM5728:写回 NV12格式单平面

Guru**** 2576215 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/628938/linux-am5728-writeback-nv12-format-single-planar

器件型号:AM5728

工具/软件:Linux

您好!

我正在使用 AM 5728 PSDK 04.00.04。

目前、我将 UYVY 格式与带 WrietBack 的3D GPU 配合使用、但我将更改为 NV12。

在使用 WB 处理 NV12格式单平面时、
创建缓冲区没有问题、但 ioctl "VIDIOC_QBUF"中出现 Ivalue 参数错误。

发送我们使用的测试代码。

========================================================================================

void Writeb回 写_描述格式()

(笑声)
  DRM_FORMAT_NV12案例:
   image->fourcc = V4L2_PI_FMT_NV12;
   image->size = image->height * image->width * 1.5;
   image->coplanar = 0;
   image->colorspace = V4L2_colorspace_SMPTE170M;
(笑声)   


int Writeback_OutputQbuf( int index )

 Int ret、I;
  struct v4l2_buffer buf;
  struct v4l2_plane planes[2];

 memset (&buf、0、sizeof buf);
  memset (&planes、0、sizeof planes);

  buf.type = V4L2_BUF_TYPE_视频_捕捉_MPLANE;
 buf.memory = V4L2_MEMORY_DMABUF;
  buf.index =索引;
 buf.m.planes =基准面[0];
 buf.length = 1;
 
 buf.m.planes[0].m.fd = m_wbparams.output_buf_dmafd[index];

 RET = ioctl (m_wbparams.fd、VIDIOC_QBUF、&buf);
 >>> 错误:WB o/p:QBUF 失败:参数无效,索引= 0
 
 返回0;

MAIN ()

 struct v4l2_format fmt;
 struct v4l2_requestbuffers rqbufs;

 fmt.fmt.pix_mp.height = m_wbparams.dst.height;
 fmt.fmt.pix_mp.pixelformat = m_wbparams.dst.fourcc;
 fmt.fmt.pix_mp.field = V4L2_field_any;
 fmt.fmt.pix_mp.colorspace = m_wbparams.dst.colorspace;
 fmt.fmt.pix_mp.num_planes = 1;

 ioctl (m_wbparams.fd、VIDIOC_S_FMT、&fmt);
 ioctl (m_wbparams.fd、VIDIOC_G_FMT、&fmt);
 
  memset (&rqbufs、0、sizeof (rqbufs));
 rqbufs.count = NUMBUF;
 rqbufs.type = V4L2_BUF_TYPLE_VIDEO_CAPTURE_MPLANE;
 rqbufs.memory = V4L2_MEMORY_DMABUF;

 对于(i = 0;i < NUMBUF;i++){
   m_wbparams.output_buf_dmafd[i]= omap_bo_dmabuf (m_wbparams.disp_bufs[i]->bo[0]);
   m_wbparams.disp_bufs[i]->fd[0]= m_wbparams.output_buf_dmafd[i];
   m_wbparams.disp_bufs[i]->noScale = true;
 }
 
  writeba_OutputQbuf (0);

===========================================================================================================================================

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们将对此进行研究。 反馈将发布在此处。

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

    您能否发布您看到的完全错误?

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

    您还可以查看本指南:
    processors.wiki.ti.com/.../Linux_Core_DSS_WB_User's_Guide

    希望这对您有所帮助。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在当前的 PLSDK 版本中、WB 不支持单平面/缓冲器 NV12。 当前、驱动程序将其作为两个平面/缓冲实体进行处理。 我们在 PLSDK 4Q、2017版本中增加了将其视为单个缓冲器实体的支持。

    看到您共享的代码片段、代码假定所需的 NV12缓冲区将是单平面。

    应用程序应始终检查返回的 S_FMT 调用结构并将其用作当前格式配置。 S_FMT 调用通常不会失败(根据 V4L2规范)、驱动程序可以自由地更正任何参数以提供工作配置。

    同样、应使用 REQBUFS 和 QUERYBUF ioctl 的结果来准备 QBUF 信息。

    您可以查看缓冲区处理部分的 yavta (git.ideasonboard.org/yavta.git)代码,以正确地握手和配置缓冲区参数。