【问题标题】:Why are there vaapi filters that exist in libavfilter but do not exist in my compiled version of ffmpeg?为什么在 libavfilter 中存在 vaapi 过滤器,但在我编译的 ffmpeg 版本中不存在?
【发布时间】:2020-06-12 21:25:17
【问题描述】:

我已经编译了启用 vaapi 的 ffmpeg 的最新快照

$ ffmpeg -hwaccesls
ffmpeg version N-98129-g0b182ff Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
  configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-vaapi --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
  libavutil      56. 54.100 / 56. 54.100
  libavcodec     58. 92.100 / 58. 92.100
  libavformat    58. 46.101 / 58. 46.101
  libavdevice    58. 11.100 / 58. 11.100
  libavfilter     7. 86.100 /  7. 86.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
Hardware acceleration methods:
vaapi

我知道vaapi 正在工作,因为我可以使用它对 h264 视频进行硬件解码和编码。我也可以看到一些vaapi 过滤器

$ ffmpeg -filters | grep vaapi
 ... deinterlace_vaapi V->V       (null)
 ... denoise_vaapi     V->V       (null)
 ... procamp_vaapi     V->V       (null)
 ... scale_vaapi       V->V       (null)
 ... sharpness_vaapi   V->V       (null)

但是,我注意到此列表缺少我专门寻找的过滤器,即 transpose_vaapi。如果您查看 libavfilter 源代码,您将看到以下内容

这显示了allfilters.c 文件中定义的transpose_vaapi 过滤器 https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/allfilters.c#L414

这显示了transpose_vaapi过滤器源代码 https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/vf_transpose_vaapi.c

如果过滤器是在源代码中定义的,它是在allfilters.c中定义的,并且我已经从这个源编译了ffmpeg并启用了vaapi,为什么我不能在ffmpeg中使用这个过滤器?

$ ffmpeg -y -hide_banner -nostats -loglevel error \
    -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
    -i ./test_video.mp4 \
    -vf 'format=nv12,transpose_vaapi=2' \
    -c:v h264_vaapi \
    /tmp/rotated_video.mp4
[AVFilterGraph @ 0xf14000] No such filter: 'transpose_vaapi'
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument

编辑-

查看vf_transpose_vaapi.c的源代码我看到如下逻辑

    if (!pipeline_caps.rotation_flags) {
        av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support transpose\n");
        return AVERROR(EINVAL);
    }

这在transpose_vaapi_build_filter_params 函数内部,它是过滤器初始化过程的一部分。我想有可能,如果该调用失败,过滤器将无法构建并且它不会被注册为有效过滤器?这似乎是在我尝试运行过滤器时会在运行时发生的事情,而不是在设置定义哪些过滤器时会在编译时发生的事情。

【问题讨论】:

  • ./configure 的输出是什么?

标签: ffmpeg vaapi


【解决方案1】:

过滤器还依赖于 VAProcFilterParameterBufferHDRToneMapping 的构建时间检查,如 ./configure 中所示

tonemap_vaapi_filter_deps="vaapi VAProcFilterParameterBufferHDRToneMapping"

【讨论】:

  • 您能帮我确定如何检查该依赖关系吗?我看到该字符串的唯一地方是config 和源文件本身,configure 如何在尝试将tonemap_vaapi_filter 包含为可用过滤器之前检查VAProcFilterParameterBufferHDRToneMapping 值是否有效?
  • 编译#include "va/va.h" #include "va/va_vpp.h" int main(void) { VAProcFilterParameterBufferHDRToneMapping v; return 0; }并检查对象是否生成成功。
  • 非常感谢!非常感谢您的帮助,这足以让我弄清楚我需要在未来做出哪些改变。
猜你喜欢
  • 2012-05-21
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2012-09-10
  • 2019-10-07
  • 2013-11-11
相关资源
最近更新 更多