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/DRA746:如何使用一个 DRM bo (NV12)作为编码器输入?

Guru**** 2582405 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/632980/linux-dra746-how-to-use-one-drm-bo-nv12-as-encoder-input

器件型号:DRA746

工具/软件:Linux

在 omapdrmtest/videnc2test.c 中、给定 NV12输入帧、Y 和 UV 分别具有 DRM bo。

但通常、我们在一个 DRM bo 中有 Y 和 UV 数据;在 这种情况下、如何填充 IVIDEO2_BufDESC?

我注意到  IVIDEO2_BufDesc 中有辅助射野偏移宽度/辅助射野偏移高度;

我们应该用 y_pitch 填充它、并填充它的高度;对吧?

是否有示例可以演示这一点?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    经过第二次思考,我变得有点困惑。

    1、二位偏移宽度/二位偏移高度似乎与字段/逐行编码更相关

    2.在 libdce 的 GST 插件中、它对 Y 平面和 UV 平面使用相同的 FD。 没有提到过 UV 偏移--我觉得很奇怪。
    self->inBufs->planeDesc[0].buf =(XDAS_Int8 *) dmabuf_fd_in;
    self->inBufs->planeDesc[0].memType = XDM_MEMLYPE_RAW;
    self->inBufs->planeDesc[0]。bufSize.tileMem.width = GST_VIDEO_INFO_WIDTH (&state->INFO);
    self->inBufs->planeDesc[0]。bufSize.tileMem.height = GST_VIDEO_INFO_HEIGHT (&state->INFO);
    self->inBufs->planeDesc[0]。bufSize.bytes = GST_VIDEO_INFO_WIDTH (&STATE->INFO)* GST_VIDEO_INFO_HEIGHT (&STATE->INFO);

    self->inBufs->planeDesc[1].buf =(XDAS_Int8 *) dmabuf_fd_in;
    self->inBufs->planeDesc[1].memType = XDM_MEMLYPE_RAW;
    self->inBufs->planeDesc[1].bufSize.tileMem.width = GST_VIDEO_INFO_WIDTH (&STATE->INFO);
    self->inBufs->planeDesc[1].bufSize.tileMem.height = GST_VIDEO_INFO_HEIGHT (&STATE->INFO)/2;
    self->inBufs->planeDesc[1].bufSize.bytes = GST_VIDEO_INFO_WIDTH (&STATE->INFO)* GST_VIDEO_INFO_HEIGHT (&STATE->INFO)/2;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我现在看到了。
    在 libdce 内部、自动为 UV 平面添加偏移会有点棘手

    #ifdef BUILDOS_Linux
    /*编码器的单平面输入缓冲器。 不需要对多平面情况进行调整*/
    if (count =Chroma_BUF && codec_id =OMA_DCE_VIDENC2 &&((IVIDEO2_BufDesc *) inBufs)->planeDesc[LUM_BUF].buf ==((IVIDEO2_BufDesc *) inBufs)->planeDesc[LUM_BUF]
    if (((IVIDEO2_BufDesc *) inBufs)->planeDesc[count].memType = XDM_MEMTYPE_RAW ||
    (((IVIDEO2_BufDesc *) inBufs)->planeDesc[count].memType = XDM_MEMYPE_TILEDPAGE)
    *data_buf +=((IVIDEO2_BufDesc *) inBufs)->planeDesc[LUM_BUF].bufSize.bytes;
    其他
    *data_buf +=((IVIDEO2_BufDesc *) inBufs)->planeDesc[LUM_BUF].bufSize.tileMem.width *
    (((IVIDEO2_BufDesc *) inBufs)->planeDesc[LUM_BUF].bufSize.tileMem.height;

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

    我已将您的问题转交给 omapdrmtest 专家进行评论。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Halley、
    您的理解是正确的。 创建一个宽度 x 高度 x 1.5的 Dmafd、并为两个 plameDesc 分配相同的 FD。 Libdce 将管理 UV 缓冲器的偏移。

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