This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 3b55818764 avcodec/amfdec: set context dimensions from decoder size
3b55818764 is described below

commit 3b5581876405d8617a7325f2c42b0d502b4d9a06
Author:     Araz Iusubov <[email protected]>
AuthorDate: Mon Mar 23 15:55:58 2026 +0100
Commit:     ArazIusubov <[email protected]>
CommitDate: Tue Mar 31 14:07:31 2026 +0000

    avcodec/amfdec: set context dimensions from decoder size
---
 libavcodec/amfdec.c | 55 +++++++++++++++++++++++++++++++++++++++++------------
 libavcodec/amfdec.h |  1 +
 2 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/libavcodec/amfdec.c b/libavcodec/amfdec.c
index 76b22ad750..38fae3f4e7 100644
--- a/libavcodec/amfdec.c
+++ b/libavcodec/amfdec.c
@@ -243,12 +243,13 @@ static int amf_init_frames_context(AVCodecContext *avctx, 
int sw_format, int new
 static int amf_decode_init(AVCodecContext *avctx)
 {
     AMFDecoderContext *ctx = avctx->priv_data;
+    ctx->dimensions_initialized = 0;
     int ret;
     ctx->in_pkt = av_packet_alloc();
     if (!ctx->in_pkt)
         return AVERROR(ENOMEM);
 
-    if  (avctx->hw_device_ctx) {
+    if (avctx->hw_device_ctx) {
         AVHWDeviceContext   *hwdev_ctx;
         hwdev_ctx = (AVHWDeviceContext*)avctx->hw_device_ctx->data;
         if (hwdev_ctx->type == AV_HWDEVICE_TYPE_AMF)
@@ -271,7 +272,7 @@ static int amf_decode_init(AVCodecContext *avctx)
         AVAMFDeviceContext    *amf_device_ctx = 
(AVAMFDeviceContext*)hw_device_ctx->hwctx;
         enum AVPixelFormat    surf_pix_fmt = AV_PIX_FMT_NONE;
 
-        if(amf_legacy_driver_no_bitness_detect(amf_device_ctx)){
+        if (amf_legacy_driver_no_bitness_detect(amf_device_ctx)) {
             // if bitness detection is not supported in legacy driver use 
format from container
             switch (avctx->pix_fmt) {
             case AV_PIX_FMT_YUV420P:
@@ -280,7 +281,7 @@ static int amf_decode_init(AVCodecContext *avctx)
             case AV_PIX_FMT_YUV420P10:
                 surf_pix_fmt = AV_PIX_FMT_P010; break;
             }
-        }else{
+        } else {
             AMFVariantStruct format_var = {0};
 
             ret = ctx->decoder->pVtbl->GetProperty(ctx->decoder, 
AMF_VIDEO_DECODER_OUTPUT_FORMAT, &format_var);
@@ -288,17 +289,26 @@ static int amf_decode_init(AVCodecContext *avctx)
 
             surf_pix_fmt = av_amf_to_av_format(format_var.int64Value);
         }
-        if(avctx->hw_frames_ctx)
+        if (avctx->hw_frames_ctx)
         {
             // this values should be set for avcodec_open2
             // will be updated after header decoded if not true.
-            if(surf_pix_fmt == AV_PIX_FMT_NONE)
+            if (surf_pix_fmt == AV_PIX_FMT_NONE)
                 surf_pix_fmt = AV_PIX_FMT_NV12; // for older drivers
-            if (!avctx->coded_width)
-                avctx->coded_width = 1280;
-            if (!avctx->coded_height)
-                avctx->coded_height = 720;
-            ret = amf_init_frames_context(avctx, surf_pix_fmt, 
avctx->coded_width, avctx->coded_height);
+            int frames_w = 0;
+            int frames_h = 0;
+
+            if (avctx->coded_width > 0 && avctx->coded_height > 0) {
+                frames_w = avctx->coded_width;
+                frames_h = avctx->coded_height;
+            } else if (avctx->width > 0 && avctx->height > 0) {
+                frames_w = avctx->width;
+                frames_h = avctx->height;
+            } else {
+                frames_w = 1280;
+                frames_h = 720;
+            }
+            ret = amf_init_frames_context(avctx, surf_pix_fmt, frames_w, 
frames_h);
             AMF_GOTO_FAIL_IF_FALSE(avctx, ret == 0, ret, "Failed to init 
frames context (AMF) : %s\n", av_err2str(ret));
         }
         else
@@ -495,6 +505,25 @@ static AMF_RESULT amf_buffer_from_packet(AVCodecContext 
*avctx, const AVPacket*
     return amf_update_buffer_properties(avctx, buf, pkt);
 }
 
+static void amf_init_dimensions(AVCodecContext *avctx)
+{
+    AMFDecoderContext *ctx = avctx->priv_data;
+    AMFVariantStruct size_var = {0};
+    AMF_RESULT res = AMF_OK;
+
+    res = ctx->decoder->pVtbl->GetProperty(ctx->decoder, 
AMF_VIDEO_DECODER_CURRENT_SIZE, &size_var);
+    if (res == AMF_OK && size_var.sizeValue.width > 0 && 
size_var.sizeValue.height > 0) {
+        avctx->width        = size_var.sizeValue.width;
+        avctx->height       = size_var.sizeValue.height;
+        avctx->coded_width  = size_var.sizeValue.width;
+        avctx->coded_height = size_var.sizeValue.height;
+
+        ctx->dimensions_initialized = 1;
+
+        av_log(avctx, AV_LOG_DEBUG, "AMF: detected initial decoder size 
%dx%d\n", avctx->width, avctx->height);
+    }
+}
+
 static int amf_decode_frame(AVCodecContext *avctx, struct AVFrame *frame)
 {
     AMFDecoderContext *ctx = avctx->priv_data;
@@ -556,9 +585,11 @@ static int amf_decode_frame(AVCodecContext *avctx, struct 
AVFrame *frame)
     }
 
     res = amf_receive_frame(avctx, frame);
-    if (res == AMF_OK)
+    if (res == AMF_OK) {
         got_frame = 1;
-    else if (res == AMF_REPEAT)
+        if (!ctx->dimensions_initialized)
+            amf_init_dimensions(avctx);
+    } else if (res == AMF_REPEAT)
         // decoder has no output yet
         res = AMF_OK;
     else if (res == AMF_EOF) {
diff --git a/libavcodec/amfdec.h b/libavcodec/amfdec.h
index 205d7a84a5..fd5e00f9db 100644
--- a/libavcodec/amfdec.h
+++ b/libavcodec/amfdec.h
@@ -55,6 +55,7 @@ typedef struct AMFDecoderContext {
     int                 drain;
     int                 resolution_changed;
     int                 copy_output;
+    int                 dimensions_initialized;
     AVPacket*           in_pkt;
     enum AMF_SURFACE_FORMAT output_format;
 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to