>> >> 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 | 200 +++++ > > libavcodec/d3d12va_encode_hevc.c | 1016 +++++++++++++++++++++ > > libavcodec/hw_base_encode.h | 2 +- > > 7 files changed, 2668 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 > >> + D3D12_OBJECT_RELEASE(ctx->sync_ctx.fence); >> + if (ctx->sync_ctx.event) >> + CloseHandle(ctx->sync_ctx.event); >> + >> + D3D12_OBJECT_RELEASE(ctx->video_device3); >> + D3D12_OBJECT_RELEASE(ctx->device); >> + D3D12_OBJECT_RELEASE(ctx->encoder_heap); >> + D3D12_OBJECT_RELEASE(ctx->encoder); > >We need to release all of the objects, including the encoder and >encoder_heap, created by the device before releasing the device. > >> + >> +typedef struct D3D12VAEncodeProfile { >> + //lavc profile value (AV_PROFILE_*). >> + int av_profile; >> + //Supported bit depth. >> + int depth; >> + //Number of components. >> + int nb_components; >> + //Chroma subsampling in width dimension. >> + int log2_chroma_w; >> + //Chroma subsampling in height dimension. >> + int log2_chroma_h; >> + //D3D12 profile value. >> + D3D12_VIDEO_ENCODER_PROFILE_DESC d3d12_profile; >> +} D3D12VAEncodeProfile; >> + >> +typedef struct D3D12VAEncodeRCMode { >> + // Base. >> + HWBaseEncodeRCMode base; >> + // Supported by D3D12 HW. >> + int supported; >> + // D3D12 mode value. >> + D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE d3d12_mode; >> +} D3D12VAEncodeRCMode; >> + >> +typedef struct D3D12VAEncodeContext { >> + HWBaseEncodeContext base; >> + >> + //Codec-specific hooks. >> + const struct D3D12VAEncodeType *codec; >> + >> + //Chosen encoding profile details. >> + const D3D12VAEncodeProfile *profile; >> + >> + //Chosen rate control mode details. >> + const D3D12VAEncodeRCMode *rc_mode; >> + >> + AVD3D12VADeviceContext *hwctx; >> + >> + //Device3 interface. >> + ID3D12Device3 *device3; >> + >> + ID3D12VideoDevice3 *video_device3; >> + >> + //Pool of (reusable) bitstream output buffers. >> + AVBufferPool *output_buffer_pool; >> + >> + //D3D12 video encoder. >> + AVBufferRef *encoder_ref; >> + >> + ID3D12VideoEncoder *encoder; >> + >> + //D3D12 video encoder heap. >> + ID3D12VideoEncoderHeap *encoder_heap; >> + >> + //A cached queue for reusing the D3D12 command allocators. >> + //@see https://learn.microsoft.com/en- >us/windows/win32/direct3d12/recording-command-lists-and- >bundles#id3d12commandallocator >> + AVFifo *allocator_queue; >> + >> + //D3D12 command queue. >> + ID3D12CommandQueue *command_queue; >> + >> + //D3D12 video encode command list. >> + ID3D12VideoEncodeCommandList2 *command_list; >> + >> + //The sync context used to sync command queue. >> + AVD3D12VASyncContext sync_ctx; >> + >> + //bi_not_empty feature. >> + int bi_not_empty; >> + >> + //D3D12 hardware structures. >> + D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC resolution; >> + >> + D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf; >> + >> + D3D12_VIDEO_ENCODER_RATE_CONTROL rc; >> + >> + D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOURCE_REQUIREMENTS >req; >> + >> + D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE GOP; >> + >> + >D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS >res_limits; >> + >> + D3D12_VIDEO_ENCODER_LEVEL_SETTING level; >> +} D3D12VAEncodeContext; >> + >Can we use the comment style the same as D3D12VADecodeContext? >
Will update in V2 thanks for the review. Thanks, 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".