增加解码器

增加 GN 参数

  • enable_hevc_demuxing=true

开启 HEVC demux 支持。

  • ffmpeg_branding=“Chrome”

使用为 Chrome 预订的参数。

  • proprietary_codecs=true

开启私有解码器支持。

增加 ffmpeg 解码器代码

HEVC 解码器代码

third_part/ffmpeg/ffmpeg_generated.gni 文件中确保以下文件被加入源文件中。

ffmpeg_c_sources += [
    "libavcodec/bswapdsp.c",
    "libavcodec/hevcdec.c",
    "libavcodec/hevc_cabac.c",
    "libavcodec/hevc_data.c",
    "libavcodec/hevc_filter.c",
    "libavcodec/hevc_mvs.c",
    "libavcodec/hevc_parse.c",
    "libavcodec/hevc_parser.c",
    "libavcodec/hevc_ps.c",
    "libavcodec/hevc_refs.c",
    "libavcodec/hevc_sei.c",
    "libavcodec/hevcdsp.c",
    "libavcodec/hevcpred.c",
    "libavcodec/h2645_parse.c",
    "libavcodec/x86/bswapdsp_init.c",
    "libavcodec/x86/hevcdsp_init.c",
    "libavformat/hevc.c",
    "libavformat/hevcdec.c",
]
ffmpeg_asm_sources += [
    "libavcodec/x86/bswapdsp.asm",
    "libavcodec/x86/hevc_deblock.asm",
    "libavcodec/x86/hevc_idct.asm",
    "libavcodec/x86/hevc_mc.asm",
    "libavcodec/x86/hevc_add_res.asm",
    "libavcodec/x86/hevc_sao.asm",
    "libavcodec/x86/hevc_sao_10bit.asm",
]

修改 ffmpeg 配置

HEVC 配置

  • third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h

修改 c++ 参数

#define CONFIG_HEVC_DECODER 1
#define CONFIG_HEVC_DEMUXER 1
#define CONFIG_HEVC_PARSER 1
  • third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.asm

修改汇编参数

%define CONFIG_HEVC_DECODER 1
%define CONFIG_HEVC_DEMUXER 1
%define CONFIG_HEVC_PARSER 1
  • third_party\ffmpeg\chromium\config\Chrome\win\ia32\libavcodec\codec_list.c

在解码器列表 codec_list 中增加解码器 ff_hevc_decoder

static const AVCodec * const codec_list[] = {
    // ...
    &ff_hevc_decoder,
    NULL };
  • third_party\ffmpeg\chromium\config\Chrome\win\ia32\libavcodec\parser_list.c

解析器列表 parser_list 中增加 ff_hevc_parser

static const AVCodecParser * const parser_list[] = {
    // ...
    &ff_hevc_parser,
    NULL };

third_party\ffmpeg\chromium\config\Chrome\win\ia32\libavformat\demuxer_list.c 文件中,对解复用器列表 demuxer_list 中增加 ff_hevc_demuxer

static const AVInputFormat * const demuxer_list[] = {
    // ...
    &ff_hevc_demuxer,
    NULL };

增加 chromium media 模块解码支持

media\base\decode_capabilities.cc 中确保相关解码器被支持。

// @bool IsSupportedVideoConfig(const VideoConfig& config) 
switch (config.codec) {
// ...
case media::kCodecMPEG4:
case media::kCodecHEVC:
    return true;
// ...
}