ffmpeg | branch: master | Tong Wu <wutong1...@outlook.com> | Mon Jul  8 
23:13:23 2024 +0800| [b1d410716bb96041d318be997695670fc1394dff] | committer: 
Lynne

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 <wutong1...@outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b1d410716bb96041d318be997695670fc1394dff
---

 libavcodec/d3d12va_encode.c | 18 ++++++++++++------
 libavcodec/d3d12va_encode.h |  1 +
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/libavcodec/d3d12va_encode.c b/libavcodec/d3d12va_encode.c
index 9f7a42911e..9ee9da41e3 100644
--- a/libavcodec/d3d12va_encode.c
+++ b/libavcodec/d3d12va_encode.c
@@ -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);
diff --git a/libavcodec/d3d12va_encode.h b/libavcodec/d3d12va_encode.h
index 1a0abc5bd0..51440428e4 100644
--- a/libavcodec/d3d12va_encode.h
+++ b/libavcodec/d3d12va_encode.h
@@ -43,6 +43,7 @@ typedef struct D3D12VAEncodePicture {
     FFHWBaseEncodePicture base;
 
     int             header_size;
+    int             aligned_header_size;
 
     AVD3D12VAFrame *input_surface;
     AVD3D12VAFrame *recon_surface;

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to