GPU-CODEC_vaapi_mesa_front_API

GPU-CODEC_vaapi_mesa_front_API

talk is cheap read the fuck code… l禅师说的这句,不费话,直接整理代码

mesa va

mesa-21.3.8.3/src/gallium/frontends/va$ ls
meson.build
config.c context.c  buffer.c   surface.c    image.c    display.c    postproc.c
va_private.h

picture.c  subpicture.c
picture_h264.c    picture_h264_enc.c  
picture_hevc.c    picture_hevc_enc.c 
picture_mjpeg.c   
picture_vp9.c  
picture_mpeg4.c 
picture_mpeg12.c
picture_av1.c        
picture_vc1.c     

从上面文件列表经过我的整理就可看出:针对每种格式的解码h264,hevc,mjpeg,av1,vc1,mpeg4,mpeg12,vp9都有专门的实现,但公共的功能

  • config配置
  • context上下文环境
  • buffer缓存管理
  • surface参数管理
  • image图像
  • display显示
  • postproc预处理

如果一来一头扎入代码,可能就不识庐山真面目了,只缘身在此山中。
从哪看起呢?

libva_st = static_library(
  'va_st',
  files(
    'buffer.c', 'config.c', 'context.c', 'display.c', 'image.c', 'picture.c',
    'picture_mpeg12.c', 'picture_mpeg4.c', 'picture_h264.c', 'picture_hevc.c',
    'picture_vc1.c', 'picture_mjpeg.c', 'picture_vp9.c','picture_av1.c','postproc.c',
    'subpicture.c', 'surface.c', 'picture_h264_enc.c', 'picture_hevc_enc.c',
  ),
  c_args : [
    '-DVA_DRIVER_INIT_FUNC=__vaDriverInit_@0@_@1@'.format(
      libva_version[0], libva_version[1]
    ),
  ],

从这个meson.build中可看出;如上的文件共同生成库libva_st,其版本是依赖libva版本,源源地址:git clone https://salsa.debian.org/multimedia-team/libva.git

写到这里想起之前从来没有介绍过libva, 回头再说吧,反正就是个API接口,大佬们写代码总是从上写到下,先定上层轮廓,再来画出下面的枝节。

libva

那我们就看看上层轮廓吧

libva-2.14.0/va$ ls 
va.c   va.h  va_drmcommon.h  va_tpi.h 

a_str.h va_str.c  va_compat.h  va_compat.c  
sysdeps.h va_fool.h  va_fool.c      va_trace.c  va_trace.h va_internal.h

va_backend.h   va_backend_prot.h      va_backend_vpp.h      va_vpp.h
va_prot.h      va_x11.h    va_egl.h 
        
x11  glx   wayland  drm
 libva.syms 

va_fei.h  va_fei_h264.h  va_fei_hevc.h  va_enc_h264.h 
va_dec_hevc.h   va_enc_hevc.h 
va_dec_jpeg.h   va_enc_jpeg.h 
va_dec_vp8.h  va_enc_vp8.h 
va_dec_vp9.h  va_enc_vp9.h
va_enc_mpeg2.h
va_dec_av1.h   va_enc_av1.h

从上整理可看出大致轮廓了,与mesa 里frontends/va一一对应.
在va.c里文件里有一节很重要的话帮忙理解大体,贴在下:

 * \section intro Introduction
 *
 * The main motivation for VA-API (Video Acceleration API) is to
 * enable hardware accelerated video decode and encode at various
 * entry-points (VLD, IDCT, Motion Compensation etc.) for the
 * prevailing coding standards today (MPEG-2, MPEG-4 ASP/H.263, MPEG-4
 * AVC/H.264, VC-1/VMW3, and JPEG, HEVC/H265, VP8, VP9) and video pre/post
 * processing
 *
 * VA-API is split into several modules:
 * - \ref api_core
 * - Encoder (H264, HEVC, JPEG, MPEG2, VP8, VP9)
 *  - \ref api_enc_h264
 *  - \ref api_enc_hevc
 *  - \ref api_enc_jpeg
 *  - \ref api_enc_mpeg2
 *  - \ref api_enc_vp8
 *  - \ref api_enc_vp9
 *  - \ref api_enc_av1
 * - Decoder (HEVC, JPEG, VP8, VP9, AV1)
 *      - \ref api_dec_hevc
 *      - \ref api_dec_jpeg
 *      - \ref api_dec_vp8
 *      - \ref api_dec_vp9
 *      - \ref api_dec_av1
 * - \ref api_vpp
 * - \ref api_prot
 * - FEI (H264, HEVC)
 *  - \ref api_fei
 *  - \ref api_fei_h264
 *  - \ref api_fei_hevc
 *

从上可看出各个功能模块的划 分,有关entry-points 中的(VLD, IDCT, Motion Compensation etc.)就不在此详细展开了,大多知识点了,反正要入行视频解码,逆离散余弦变换之类的高等数学是基础的。
VLD Variable-Length Coding
FEI (Flexible Encoding Infrastructure)
摘张芯片规格书来放在这,大家可从硬件解码流程 来理解软件架构思路及提供的entry-points吧
dsp chip decoding flowchart

对应API代码如下

 *   // Find the decode entrypoint for H.264
 *   vaQueryConfigEntrypoints(dpy, h264_profile, entrypoints, ...);
 *
 *   // Create a config for H.264 decode
 *   vaCreateConfig(dpy, h264_profile, VAEntrypointVLD, ...);
 *

有关有哪些entrypoint可被找到,这里有个enum的范围,说见VAEntrypoint
接下来我们只要理清一根麻丝,其它便雷同了。我们选择跟h264相关的解码与显示,因h264资料最多,测试资源也丰富,谁让h264开源免费的早呢。

那从哪理起呢?总得找根麻蝇头吧

libva-utils

任何一个框架,想了解它,最好是先科普,再跑demo做测试,科普的事我就不写了,bing下一大把,都说的很清楚,但具体到实物还是要从demo说起,不然大多课程第一课就是helloworld 。我选择了 libva-utils中的demo -vainfo 和 mpeg2vldemo走起。

//libva里调用 vaMaxNumEntrypoints 可获取maximum number of entrypoints
* Get maximum number of entrypoints supported by the implementation */
int vaMaxNumEntrypoints( VADisplay dpy){return CTX(dpy)->max_entrypoints;}
但mesa 代码里已写成定值2 
ctx->max_entrypoints = 2;
ctx->max_attributes = 1;

mesa 对应代码摘取

enum pipe_video_profile
static inline enum pipe_video_profile  ProfileToPipe(VAProfile profile) 
static inline VAProfile  PipeToProfile(enum pipe_video_profile profile)

pipe_video_profile和VAProfile这两个枚举,实际是能过上面两个函数相互转换,将视频编解码规格与实际GPU pipe功能联系在一起,

enum pipe_video_format {
    PIPE_VIDEO_FORMAT_UNKNOWN = 0,
    PIPE_VIDEO_FORMAT_MPEG12,   /**< MPEG1, MPEG2 */
    PIPE_VIDEO_FORMAT_MPEG4,    /**< DIVX, XVID */
    PIPE_VIDEO_FORMAT_VC1,      /**< WMV */
    PIPE_VIDEO_FORMAT_MPEG4_AVC,/**< H.264 */
    PIPE_VIDEO_FORMAT_HEVC,     /**< H.265 */
    PIPE_VIDEO_FORMAT_JPEG,     /**< JPEG */
    PIPE_VIDEO_FORMAT_VP9,      /**< VP9 */
    PIPE_VIDEO_FORMAT_AV1       /**< AV1 */
};
static inline enum pipe_video_format
u_reduce_video_profile(enum pipe_video_profile profile) {
    switch (profile)
    {
    case PIPE_VIDEO_PROFILE_MPEG1:
            case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
                case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
                        return PIPE_VIDEO_FORMAT_MPEG12;

    case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
    case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
        return PIPE_VIDEO_FORMAT_MPEG4;

    case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
    case PIPE_VIDEO_PROFILE_VC1_MAIN:
    case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
        return PIPE_VIDEO_FORMAT_VC1;

    case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422:
    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444:
        return PIPE_VIDEO_FORMAT_MPEG4_AVC;
        //......

u_reduce_video_profile将很多详细的视频规格归结成了pipe_video_format中的8种,以便硬件处理。

  • 31
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值