lavc/d3d12va_encode: trim header alignment at output

It is d3d12va's requirement that the FrameStartOffset must be aligned as
per hardware limitation. However, we could trim this alignment at output
to reduce coded size. A aligned_header_size is added to
D3D12VAEncodePicture.

Signed-off-by: Tong Wu <wutong1208@outlook.com>
This commit is contained in:
Tong Wu 2024-07-08 23:13:23 +08:00 committed by Lynne
parent 9b4655c3a1
commit b1d410716b
2 changed files with 13 additions and 6 deletions

View File

@ -308,9 +308,9 @@ static int d3d12va_encode_issue(AVCodecContext *avctx,
}
pic->header_size = (int)bit_len / 8;
pic->header_size = pic->header_size % ctx->req.CompressedBitstreamBufferAccessAlignment ?
FFALIGN(pic->header_size, ctx->req.CompressedBitstreamBufferAccessAlignment) :
pic->header_size;
pic->aligned_header_size = pic->header_size % ctx->req.CompressedBitstreamBufferAccessAlignment ?
FFALIGN(pic->header_size, ctx->req.CompressedBitstreamBufferAccessAlignment) :
pic->header_size;
hr = ID3D12Resource_Map(pic->output_buffer, 0, NULL, (void **)&ptr);
if (FAILED(hr)) {
@ -318,7 +318,7 @@ static int d3d12va_encode_issue(AVCodecContext *avctx,
goto fail;
}
memcpy(ptr, data, pic->header_size);
memcpy(ptr, data, pic->aligned_header_size);
ID3D12Resource_Unmap(pic->output_buffer, 0, NULL);
}
@ -344,10 +344,10 @@ static int d3d12va_encode_issue(AVCodecContext *avctx,
input_args.PictureControlDesc.PictureControlCodecData = pic->pic_ctl;
input_args.PictureControlDesc.ReferenceFrames = d3d12_refs;
input_args.CurrentFrameBitstreamMetadataSize = pic->header_size;
input_args.CurrentFrameBitstreamMetadataSize = pic->aligned_header_size;
output_args.Bitstream.pBuffer = pic->output_buffer;
output_args.Bitstream.FrameStartOffset = pic->header_size;
output_args.Bitstream.FrameStartOffset = pic->aligned_header_size;
output_args.ReconstructedPicture.pReconstructedPicture = pic->recon_surface->texture;
output_args.ReconstructedPicture.ReconstructedPictureSubresource = 0;
output_args.EncoderOutputMetadata.pBuffer = pic->encoded_metadata;
@ -663,6 +663,12 @@ static int d3d12va_encode_get_coded_data(AVCodecContext *avctx,
goto end;
ptr = pkt->data;
memcpy(ptr, mapped_data, pic->header_size);
ptr += pic->header_size;
mapped_data += pic->aligned_header_size;
total_size -= pic->header_size;
memcpy(ptr, mapped_data, total_size);
ID3D12Resource_Unmap(pic->output_buffer, 0, NULL);

View File

@ -43,6 +43,7 @@ typedef struct D3D12VAEncodePicture {
FFHWBaseEncodePicture base;
int header_size;
int aligned_header_size;
AVD3D12VAFrame *input_surface;
AVD3D12VAFrame *recon_surface;