From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 19CAA4D266 for ; Fri, 16 May 2025 11:29:45 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id C5C9068CAEA; Fri, 16 May 2025 14:29:41 +0300 (EEST) Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 6790368C9EF for ; Fri, 16 May 2025 14:29:34 +0300 (EEST) Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-5fd0d383b32so3231137a12.3 for ; Fri, 16 May 2025 04:29:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747394973; x=1747999773; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=xmHc9tjsYGzB1rdsMVIQAo95OiNwkfz1bQtRDqmDfE8=; b=Vl74RibXfirIBJief9Ms4Gz6aWfyrHkNexwCfAWCA1DgCyaI95FwnlSGcd3XiwQ73q KdjMbigul/DjQ7WgVJgI2hCAAMGUPP6DDD/qYcAhwT7qLV82trv5ULNF7pcxwWVH+hvT PRP1vn9b0KqIN9dAhtml3XwPLFQx4v8LvuY2GyliRHgHpGDeIeH95ELGeirmp+LQd7Ls 3JBv+Lci3MTn9bHBc1tz6Xino/0fruiuf31B69p65X5L2FfFDJlTRUjtoWbDElU7cNdq S7qcB/OCrads04SeHffEfQslFTTV4DNUMUa6E1HLjUNrimr14oZuIrkNqM9a/bYeq/rD P19g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747394973; x=1747999773; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=xmHc9tjsYGzB1rdsMVIQAo95OiNwkfz1bQtRDqmDfE8=; b=OJIpU17dChqhP1RxAYgcXwRTUrrALFq+LC0mw7qK0kjH39PMLAii+qeTtu8hvaaV4B kQcQesmKqf0ESW2aWiZd59J/ksCdflIV8pCiDI+lYdby2oooVSOFkq2ehpuFjUden+I1 I7fS/BVb+bpGeRi5qNUKFEbdh9id4m1PK/kf/56H24SPWeioTa0YLD0gleQySoluwHkS vDD8z1Rcvt19oEoYHuQqx3OcuJroM1Z7zMI84u9M9GB18KXuYTh1BU9zeYjUd7+4N95W gAhML8Z8TT1NqYAPywDkPrGEPdBGFT5XShEOMqkmnEhEiKlTkVZNNtYHC2LIFlUQiln3 0MNw== X-Gm-Message-State: AOJu0YxvQrS/nozamHRTVaaIFUAwRX5PQdZ9gTrrWziLbyriQsF0F9Ql YDBn3enz8NVy7YAxnlm67xPySW/TWelnb4GcprCVc/VRl4XGx01uD597L6zYke0k X-Gm-Gg: ASbGnctPAcOgw0gHXM6IcJp/RSkMzpr+i1QenWdeC1hdzjqEJ28zT9AOR16b6+bjShN ckqF06aOsMlm5zfA+AlVP6oQWg1FWJj1uGcI6GKdJY8ULauA4bTkR0d0fAEUwyvIP9YZoekcQT0 ugH/MA/7pQ74MmnlqiV725h8uxkA5DFbY6+/Xs8dmhslBMU78nkaIffbSjO3QmQFXQSlB1U2xjH EafNbFXVnhAZj5gKErwjZuzyazGnGZk1jlyWbG0FQEep2XCLmIT554+l8DMIm9vPl6VoF6piKqe Ed2x5JigLX/lNqgC2tcHMn5jRYthjCDWeeNQfumZDfDxVv8R+Mhs3RDjf/NxpcNfDnoN7Zk4pgN cJw+iKRTTTaC6 X-Google-Smtp-Source: AGHT+IH81jDyXRhCFMEO32TKfYyiLfojAldqRM5vPOLRWBwRVN0Zjkt2u8JAN7t3rzT4kUMaXDP2ng== X-Received: by 2002:a05:6402:1cc1:b0:5fd:178d:f867 with SMTP id 4fb4d7f45d1cf-60090197bebmr2556614a12.25.1747394973119; Fri, 16 May 2025 04:29:33 -0700 (PDT) Received: from localhost.localdomain ([87.116.182.236]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6005ac32f5csm1291161a12.62.2025.05.16.04.29.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 04:29:32 -0700 (PDT) From: Dmitrii Ovchinnikov To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 May 2025 13:29:14 +0200 Message-ID: <20250516112914.2038-1-ovchinnikov.dmitrii@gmail.com> X-Mailer: git-send-email 2.47.1.windows.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/amfenc_h264: improve B-frame usability and simplify options X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Dmitrii Ovchinnikov Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: - Query GPU caps for B-frame support and warn if unsupported. - Make `-max_b_frames` optional - Drop explicit `-pa_lookahead_buffer_depth` requirement in adaptive mode. --- libavcodec/amfenc_h264.c | 69 ++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c index cfcc5482f0..260139f14f 100644 --- a/libavcodec/amfenc_h264.c +++ b/libavcodec/amfenc_h264.c @@ -468,26 +468,61 @@ static av_cold int amf_encode_init_h264(AVCodecContext *avctx) } // B-Frames - if (ctx->max_consecutive_b_frames != -1) { - AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES, ctx->max_consecutive_b_frames); - if (ctx->max_b_frames != -1) { - AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, ctx->max_b_frames); - if (res != AMF_OK) { - res = ctx->encoder->pVtbl->GetProperty(ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, &var); - av_log(ctx, AV_LOG_WARNING, "B-frames=%d is not supported by this GPU, switched to %d\n", - ctx->max_b_frames, (int)var.int64Value); - ctx->max_b_frames = (int)var.int64Value; + AMFVariantStruct is_adaptive_b_frames = { 0 }; + res = ctx->encoder->pVtbl->GetProperty(ctx->encoder, AMF_VIDEO_ENCODER_ADAPTIVE_MINIGOP, &is_adaptive_b_frames); + if (ctx->max_consecutive_b_frames != -1 || ctx->max_b_frames != -1 || is_adaptive_b_frames.boolValue == true) { + + //Get the capability of encoder + AMFCaps *encoder_caps = NULL; + ctx->encoder->pVtbl->GetCaps(ctx->encoder, &encoder_caps); + if (encoder_caps != NULL) + { + res = encoder_caps->pVtbl->GetProperty(encoder_caps, AMF_VIDEO_ENCODER_CAP_BFRAMES, &var); + if (res == AMF_OK) { + + //encoder supports H.264 B-frame + if(var.boolValue == true){ + //adaptive b-frames is higher priority than max_b_frames + if (is_adaptive_b_frames.boolValue == true) + { + //force AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES to 3 + AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES, 3); + + if(ctx->pa_lookahead_buffer_depth < 1) + { + //force AMF_PA_LOOKAHEAD_BUFFER_DEPTH to 1 if not set or smaller than 1 + AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_PA_LOOKAHEAD_BUFFER_DEPTH, 1); + } + } + else { + if (ctx->max_b_frames != -1) { + //in case user sets B-frames + AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, ctx->max_b_frames); + if (res != AMF_OK) { + res = ctx->encoder->pVtbl->GetProperty(ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, &var); + av_log(ctx, AV_LOG_WARNING, "B-frames=%d is not supported by this GPU, switched to %d\n", ctx->max_b_frames, (int)var.int64Value); + ctx->max_b_frames = (int)var.int64Value; + } + AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES, ctx->max_b_frames); + } + } + + } + //encoder doesn't support H.264 B-frame + else { + av_log(ctx, AV_LOG_WARNING, "The current GPU in use does not support H.264 B-frame encoding, there will be no B-frame in bitstream.\n"); + } + } else { + //Can't get the capability of encoder + av_log(ctx, AV_LOG_WARNING, "Unable to get H.264 B-frame capability.\n"); + av_log(ctx, AV_LOG_WARNING, "There will be no B-frame in bitstream.\n"); } - if (ctx->max_consecutive_b_frames < ctx->max_b_frames) { - av_log(ctx, AVERROR_BUG, "Maxium B frames needs to be greater than the specified B frame count.\n"); - } - } - } - else { - if (ctx->max_b_frames != -1) { - av_log(ctx, AVERROR_BUG, "Maxium number of B frames needs to be specified.\n"); + + encoder_caps->pVtbl->Release(encoder_caps); + encoder_caps = NULL; } } + res = ctx->encoder->pVtbl->GetProperty(ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, &var); if ((int)var.int64Value) { AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_DELTA_QP, ctx->b_frame_delta_qp); -- 2.47.1.windows.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".