From patchwork Mon Jan 14 19:02:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Fabian 'Xaymar' Dirks X-Patchwork-Id: 11748 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E4C2644D17D for ; Mon, 14 Jan 2019 21:22:22 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 11DEF68A803; Mon, 14 Jan 2019 21:22:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from xaymar.com (xaymar.com [88.99.2.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4D5D668A616 for ; Mon, 14 Jan 2019 21:03:10 +0200 (EET) Received-SPF: Permerror (mailfrom) identity=mailfrom; client-ip=2a02:8106:c:6a00:9848:b146:69b3:7057; helo=xaymar.com; envelope-from=info@xaymar.com; receiver= DKIM-Signature: v=1; a=rsa-sha256; c=simple/relaxed; d=xaymar.com; s=mail; t=1547492603; bh=NWHivUFrBcmJZG42fRMjS5ZylUBFeErMnsrueY3FiaU=; h=From:To:Cc:Subject:Date:From; b=i1Q91lN4CldNUC2/yk9r4xw+GtzkG6D8lRg5nLVrvJky3oXnbAU9ViNGGngOlS83x LNr5iQ2eNiSC4PeA8JQkfcW8aohSvixWZFAGidkTFFF1JVAW85+nggphiG02jeZVGW eODB1zl9z2ZWvfb2I+mNjoMj/iP7iFI/HZOl8fuh4SAG/zrAxuUBqq7zPFGAhBdBgy 4OXeNOIfZCQ2x0vFQC3W7rRMUrMtFPH1spZ3jkxiuILaF2CdXkkWOwYUZ9jyZwJOP4 Z9L1UIWHoFiGJtp36azYUIBcBnY+eogU5DZX2ZumaafdN+NcVF1CnMxUjMNfIgG49n TlsuC8c7JNnhQ== Received: from xaymar.com (unknown [IPv6:2a02:8106:c:6a00:9848:b146:69b3:7057]) by xaymar.com (Postfix) with ESMTPSA id 9EA5D12B010A; Mon, 14 Jan 2019 20:03:23 +0100 (CET) From: Michael Fabian 'Xaymar' Dirks To: ffmpeg-devel@ffmpeg.org Date: Mon, 14 Jan 2019 20:02:20 +0100 Message-Id: <20190114190220.16236-1-info@xaymar.com> X-Mailer: git-send-email 2.20.1.windows.1 MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 14 Jan 2019 21:22:09 +0200 Subject: [FFmpeg-devel] [PATCH] amfenc: Add support for pict_type field X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Michael Fabian 'Xaymar' Dirks Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Adds support for the pict_type field in AVFrame to amf_h264 and amf_h265 simultaneously. This field is needed in cases where the application wishes to override the frame type with another one, such as forcefully inserting a key frame for chapter markers or similar. Additionally this abuses AV_PICTURE_TYPE_S for marking Skip frames, a special type of frame in AVC, SVC and HEVC which is a flag for the decoder to repeat the last frame. Signed-off-by: Michael Fabian 'Xaymar' Dirks --- libavcodec/amfenc.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 384d8efc92..eb4b65e4f2 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -680,6 +680,52 @@ int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) break; } + // Override Picture Type for Frame + if (avctx->codec->id) { + switch (frame->pict_type) { + case AV_PICTURE_TYPE_I: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_I); + break; + case AV_PICTURE_TYPE_P: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_P); + break; + case AV_PICTURE_TYPE_B: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_B); + break; + case AV_PICTURE_TYPE_S: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_SKIP); + break; + default: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_NONE); + break; + } + // Keyframe overrides previous assignment. + if (frame->key_frame) { + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_IDR); + } + } else if (avctx->codec->id == AV_CODEC_ID_HEVC) { + switch (frame->pict_type) { + case AV_PICTURE_TYPE_I: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_I); + break; + case AV_PICTURE_TYPE_P: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_P); + break; + case AV_PICTURE_TYPE_B: + av_log(ctx, AV_LOG_WARNING, "Ignoring B-Frame, unsupported by AMD AMF H.265 Encoder."); + break; + case AV_PICTURE_TYPE_S: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_SKIP); + break; + default: + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_NONE); + break; + } + // Keyframe overrides previous assignment. + if (frame->key_frame) { + AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_IDR); + } + } // submit surface res = ctx->encoder->pVtbl->SubmitInput(ctx->encoder, (AMFData*)surface);