>> 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_CONFI >GURATION_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_CONFI >GURATION_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.
Have updated in v4. Thanks for the review. BRs, Tong _______________________________________________ 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".