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:CMEM 显示问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/673756/linux-am5728-cmem-display-issue

器件型号:AM5728

工具/软件:Linux

您好!

我尝试使用 VPE 的 CMEM 存储映像缓冲区,而不是显示它。

我参考双摄像头演示并在 capturevpedisplay 演示中采用 alloc_cmem_pbuffer ()。

下面是我在 Pro captuprepedisplay 中的 VPE_common.c 中更改的内容。

int vpe_output_init (struct vpe * vpe)
{
int ret、i;
struct v4l2_format fmt;
struct v4l2_requestbuffers rqbuf;
bool saved_multiplanar;

memset (&fmt、0、sizeof fmt);
fmt.type = V4L2_BUF_TYPE_ VIDEO_CAPTURE_MPLANE;
fmt.fmt.pix_mp.width = VPE->dst.width;
fmt.fmt.pix_mp.height = vpE->dst.height;
fmt.fmt.pix_mp.pixelformat = vpE->dst.fccc;
fmt.fpix_mp.field = V4L2_field_any;
fmt.fmt.flat平面 x_mp.space = vpix->dst.pix.pix.field
= vpix.dst_pix.pix.pix.ad.pix.pix.field = vpix.ad.ad.pose.pix_pix. 2:1;

ret = ioctl (VPE->FD、VIDIOC_S_FMT、&fmt);
if (ret <0)
pexit ("VPE o/p:s_FMT 失败:%s\n"、strerror (errno));

ret = ioctl (VPE->MT、VIDIOC_G_FFD);&ft
如果(ret < 0)
pexit ("VPE o/p:G_FMT_2失败:%s\n"、strerror (errno)));



printf ("VPE o/p:g_FMT:width =%u、height =%u、4cc =%.mt\n"、
fmt.fmt.pix_mp.width、fmt.fmt.fmp.sx、height
(char*)&fmt.fmt.pix_mp.pixelformat);



memset (&rqbufs、0、sizeof (rqbufs));
rqbufs.count = NUMBUF;
rqbufs.type = V4L2_BUF_TYPLE_VIDEO_CAPTURE_MPLANE;
rqbufs.memory = V4L2_MEMORY_DMABUF;


ret = ioctl (VPE->FD、VIDIOC_REQBUFS、&rqbufs);
如果(ret < 0)
pexit("VPE o/p:REQBUFS 失败:%s\n"、strerror (errno));

VPE->dst.numbuf = rqbufs.count;
dprintf ("VPE o/p:分配的缓冲区=%d\n"、rqbufs.count);

*
在分配多
平面缓冲区时*禁用多平面缓冲区。
* VPE 确实正确处理多平面 NV12缓冲
器*但 VIP 只能处理单平面缓冲器
*所以默认情况下、我们设置为使用单平面、并且在
严格分配 VPE 缓冲器时仅覆盖*它。
*在这里、我们保存到当前值、并在完成后将其恢复
*分配 VPE 将用于输出的缓冲区。
//

saved_multilar = vp->disp->multilar;
vp->disp->multilar = false;

//vp->disp_bufs = disp_get_vid_buffers (vp->disp、nUMBUF、vpE->dst.fourcc、
//VPE->dst.width、VPE->dst.height);

VPE->disp_bufs = get_cmem_buffers (VPE->disp、NUMBUF、VPE->dst.fourcc、
vpe->dst.width、vpE->dst.height);


vp->disp->multiplar = saved_multimanar;
if (!vp->disp_Bufs)
pexit ("分配显示缓冲区失败\n");

// SetCrbo with an





vpar bubuffer first *// disp_get_fb (vp_bufp)(i = dvp_dfp = dfb);[vp_aboutput<>mp_mfp = dsp>vp_dfp = df_dfp <>mp_aboutput<>mp_mf>vp>mp_df</df</df>vp>mp_dsp</df<vp>mp_df</df</dvp>mp_df</df>vp>mp_df</df_aboutput<vp>vp>mp_df</df</df<vp>vp_df</df>v







/*按比例返回显示分辨率*/VPE->disp_bufs[i]->noScale
= false;
dprintf ("VPE->disp_bufs_fd[%d]=%d\n"、i、VPE->output_buf_dmafd[i]);
}

dprintf ("allocating succeeds"
;返回0)

如果我在 (带有 memcpy) cmem_buf 中使用另一个图像封面,它将在 顶部图片上显示一些条纹。

我尝试保存并显示图片。然后我检查我保存的图片是否正常。

我认为这个问题发生在 display_buffer (VPE、index)中;

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

    它是否不能与默认演示一起使用?

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

    您好!

    不、我已经更改了它。我尝试在 cmem_buf 中接收 VPE 输出 buf。

    如果我进行配置、我会找到:

    CMEM_AllocParams cmem_alloc_params ={
    CMEM_HEAP、/*类型*/
    CMEM_NONCACHED、/*标志*//   默认为 CMEM_Cached
    1 /*对齐*/
    };

    它将正常显示。

    但 数据复制效率越来越低。

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

    让我检查一下、当我有什么东西时、我会回来的。

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

    从 CPU 访问 CMEM 缓冲区时,需要通过调用 dma_buf_do_cache_operation()函数使缓存无效,并且在写入该缓冲区时,需要通过调用 dma_Buf_do_cache_operation() API 来写回缓存。