gpt4 book ai didi

ffmpeg - AVFrame : How to get/replace plane data buffer(s) and size?

转载 作者:行者123 更新时间:2023-12-04 23:02:38 28 4
gpt4 key购买 nike

我正在研究 gstreamer1.0-libav (1.6.3),试图从 gstreamer 0.10 移植基于 FPGA 的自定义 H264 视频加速。

数据平面 (YUV) 过去在 gstreamer 0.10 中由简单的 malloc 分配,因此我们只需将 AVFrame.data[i] 指针替换为指向视频加速核心中的内存的指针。在 gstreamer 1.12 中似乎要复杂得多。

对于初学者,我尝试将 YUV 平面从 AVFrame.data[i] 复制到单独的缓冲区 - 效果很好!由于我还没有看到获得 AVFrame.data[i] 大小的直接方法,并且我认识到 data[0]、data[1]、data[2] 似乎在一个连续的缓冲区中,所以我只是使用了(data[1] - data [0]) 用于 Y 平面的大小, (data[2] - data[1]) 分别用于 U/V 平面的大小。这工作正常,期待一种情况:

  • 输入分辨率为 800x600 或更高的 H264 流
  • 相机被遮住了(夹克,手,...)

  • 这会导致使用如上所述确定的大小在 V 平面 (data[2]) 的 memcpy 中出现 SEGFAULT。在覆盖相机之前,流显示完全正常......所以由于某种原因,暗屏改变了平面尺寸?

    我的最终目标是用我的自定义内存分配替换 gstreamer 分配的 data[i] 指针(用于进一步处理)......这些缓冲区究竟分配在哪里,我可以更改它们以及如何获得每个平面的大小(数据[0]、数据[1]、数据[2])?

    最佳答案

    不要使用像 (data[1] - data [0]) 之类的技巧,平面可能有填充。
    您可以像这样获得缓冲区大小:

    Y = data[0]  
    U = data[1]
    V = data[2]

    YUV444/422 Format:
    Size of data[0] is linesize[0] * AVFrame::height
    Size of data[1] is linesize[1] * AVFrame::height
    Size of data[2] is linesize[2] * AVFrame::height

    YUV420 Format:
    Size of data[0] is linesize[0] * AVFrame::height
    Size of data[1] is linesize[1] * (AVFrame::height / 2)
    Size of data[2] is linesize[2] * (AVFrame::height / 2)

    如果有 Alpha channel ,则使用与 Y 相同的公式。
    希望有帮助。

    关于ffmpeg - AVFrame : How to get/replace plane data buffer(s) and size?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401834/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com