From patchwork Tue Jan 15 22:05:52 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: 11763 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 90E3144C9C2 for ; Wed, 16 Jan 2019 00:06:07 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AC9CE68AA83; Wed, 16 Jan 2019 00:05:55 +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 A51F568A996 for ; Wed, 16 Jan 2019 00:05:48 +0200 (EET) Received-SPF: Permerror (mailfrom) identity=mailfrom; client-ip=2a02:8106:c:6a00:1fb:17b:b8c0:d91b; helo=xaymar.com; envelope-from=michael.dirks@xaymar.com; receiver= DKIM-Signature: v=1; a=rsa-sha256; c=simple/relaxed; d=xaymar.com; s=mail; t=1547589962; bh=14Sg4e8lVKnIwPuOHLMqqDru+CpzW2MwciPPR1q/43Q=; h=From:To:Cc:Subject:Date:From; b=Gv4i6PUTZN9Hw44WwFaG/pqiLW87EPZy5YSMP4vdm+YPPRb7VX2IhWq1+Md5Hl3W8 PSXzJKd20nHNtDrXhx2fdFG02y1lno5WrqCK+a97YeoRqSCuyzIQoNhKlL6eTLAj+8 obyj+4lEXjc9hiWJh1XlMSq6GAWa4J0Q223pnG+GeE8LGlWzrt/P/VjeBRZK8E5rSQ pt2K6ugNB+1rE7txR+LSpb5T6OmQyzl/U3VcLEZn4Bc9xAAGAbIomjqo8w5e4HZJkC LW0O94fWTcG9OSXXEx3R+j77nGx8iY14QF2qhsUlQO8gSlHgr+56bduZE16ThdlIyG Y76X0agrN8twg== Received: from xaymar.com (unknown [IPv6:2a02:8106:c:6a00:1fb:17b:b8c0:d91b]) by xaymar.com (Postfix) with ESMTPSA id 9471C12A8FA0; Tue, 15 Jan 2019 23:06:02 +0100 (CET) From: michael.dirks@xaymar.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 15 Jan 2019 23:05:52 +0100 Message-Id: <20190115220552.18116-1-michael.dirks@xaymar.com> X-Mailer: git-send-email 2.20.1.windows.1 MIME-Version: 1.0 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: info@xaymar.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Michael Fabian 'Xaymar' Dirks 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 --- Changelog | 1 + libavcodec/amfenc.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/Changelog b/Changelog index 1cd53916cb..4fc48ba210 100644 --- a/Changelog +++ b/Changelog @@ -15,6 +15,7 @@ version : - hymt decoder - anlmdn filter - maskfun filter +- AMF now supports AVFrame->pict_type override version 4.1: diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 384d8efc92..3be9ff9ee2 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 == AV_CODEC_ID_H264) { + 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);