> 发件人: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> 代表 > tong1.wu-at-intel....@ffmpeg.org <tong1.wu-at-intel....@ffmpeg.org> > 发送时间: 2024年2月2日 2:16 > 收件人: ffmpeg-devel@ffmpeg.org > 抄送: Tong Wu > 主题: [FFmpeg-devel] [PATCH v3 8/9] avcodec: add D3D12VA hardware HEVC encoder > > From: Tong Wu <tong1...@intel.com> > > This implementation is based on D3D12 Video Encoding Spec: > https://microsoft.github.io/DirectX-Specs/d3d/D3D12VideoEncoding.html > > Sample command line for transcoding: > ffmpeg.exe -hwaccel d3d12va -hwaccel_output_format d3d12 -i input.mp4 > -c:v hevc_d3d12va output.mp4 > > Signed-off-by: Tong Wu <tong1...@intel.com> > --- > configure | 6 + > libavcodec/Makefile | 4 +- > libavcodec/allcodecs.c | 1 + > libavcodec/d3d12va_encode.c | 1441 ++++++++++++++++++++++++++++++ > libavcodec/d3d12va_encode.h | 275 ++++++ > libavcodec/d3d12va_encode_hevc.c | 1011 +++++++++++++++++++++ > libavcodec/hw_base_encode.h | 2 +- > 7 files changed, 2738 insertions(+), 2 deletions(-) > create mode 100644 libavcodec/d3d12va_encode.c > create mode 100644 libavcodec/d3d12va_encode.h > create mode 100644 libavcodec/d3d12va_encode_hevc.c > > >+ min_cu_size = >d3d12va_encode_hevc_map_cusize(ctx->codec_conf.pHEVCConfig->MinLumaCodingUnitSize); >+ max_cu_size = >d3d12va_encode_hevc_map_cusize(ctx->codec_conf.pHEVCConfig->MaxLumaCodingUnitSize); >+ min_tu_size = >d3d12va_encode_hevc_map_tusize(ctx->codec_conf.pHEVCConfig->MinLumaTransformUnitSize); >+ max_tu_size = >d3d12va_encode_hevc_map_tusize(ctx->codec_conf.pHEVCConfig->MaxLumaTransformUnitSize); >+ >+ // VPS >+ >+ vps->nal_unit_header = (H265RawNALUnitHeader) {
Should this blank line be removed, because the comment is for the codes below? > + vps->vps_timing_info_present_flag = 0; > + > + // SPS > + > + sps->nal_unit_header = (H265RawNALUnitHeader) { > + .nal_unit_type = HEVC_NAL_SPS, > + .nuh_layer_id = 0, > + .nuh_temporal_id_plus1 = 1, > + }; The same as above. > +static uint8_t > d3d12va_encode_hevc_map_cusize(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE > cusize) > +{ > + switch (cusize) { > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8: > return 8; > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_16x16: > return 16; > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_32x32: > return 32; > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_64x64: > return 64; > + } > + return 0; > +} > + > +static uint8_t > d3d12va_encode_hevc_map_tusize(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE > tusize) > +{ > + switch (tusize) { > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4: > return 4; > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_8x8: > return 8; > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_16x16: > return 16; > + case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32: > return 32; > + } > + return 0; > +} A default branch is needed or we can use 8 << cusize and 4 << tusize for simplification. > + hr = ID3D12Device3_QueryInterface(ctx->device3, &IID_ID3D12VideoDevice3, > (void **)&ctx->video_device3); > + if (FAILED(hr)) { > + err = AVERROR_UNKNOWN; > + goto fail; > + } > + > + if (FAILED(ID3D12VideoDevice3_CheckFeatureSupport(ctx->video_device3, > D3D12_FEATURE_VIDEO_FEATURE_AREA_SUPPORT, > + &support, > sizeof(support))) && !support.VideoEncodeSupport) { > + av_log(avctx, AV_LOG_ERROR, "D3D12 video device has no video encoder > support"); > + err = AVERROR(EINVAL); > + goto fail; > + } We need to output the log for the ID3D12Device3_QueryInterface call, or the user will not know the error is resulting from that, the OS and the driver don't support the ID3D12VideoDevice3 interface. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".