From patchwork Sat Apr 4 20:05:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 18648 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 8BA1044BBDA for ; Sat, 4 Apr 2020 23:05:28 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A87668B4AD; Sat, 4 Apr 2020 23:05:28 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f179.google.com (mail-qt1-f179.google.com [209.85.160.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 83EFC68B1E0 for ; Sat, 4 Apr 2020 23:05:21 +0300 (EEST) Received: by mail-qt1-f179.google.com with SMTP id z24so9576533qtu.4 for ; Sat, 04 Apr 2020 13:05:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=shvm0RV7dUOWYFr8GL75tY3QV2AAWLp/0jqqGSZMvxc=; b=dF4yaiDZ3dqicRVxJhVaiXOZ5k7hod5nNn3SxDb4BQseTCriomCR/Vl94HTThGrzTI tsJZjITbCOgyx7KPVMIGGC36yRLelpH2sXi2XFE1MDSTgMuo/To+kRLLU3ot9Tvy/DKr tuG02TVLOr7dOmslVPDZL87zqgxEZjTRkqRthQ5GKqhni9GShKqCYxs/mpGyb34sXcVs 1D1B0k7PJIs6AftCYTMN0RkqnX4N/uMLype7wYKIEu3FRCpb4fTvkETr9Xv+f1bnGtKl ENAYN/dtA3CR7bem/JU5fwkh80zFx9Hr7FoMgldMcabtSPxPHNzXrOHKSSk5GAvAy1m0 7aUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=shvm0RV7dUOWYFr8GL75tY3QV2AAWLp/0jqqGSZMvxc=; b=ZUaZeAOi+PKNce9jQFLR6X1xA1g7NSOzqD46BsqnRtDvosZ6V3IEKCADQUmwOI4u5Q hHnvT/4PCU4XFdtMC0KsNgph+ytj3+1bzKm/2lgPm1Mr8tsnF5Qaa9xpISCREQjMMnZo Qzsp4JaiCyjzu8lXR4Dn1zm1fujt0ZtGn8Uw085HQVESi/2Eg+s37HqT8LgxMSFX8KRX 18fIyVTckOFFPrO7SOw9SDTfTlyDs0c0+dBcKixhjBaaUP6yyu8rNRpQGS53j1Chrlno zer7GFaZvhdbrLJQCFVHCVeQgh0ebcl8n8AUU+JfgYnvw4CZmpeYpwdaIgqsuhpR30IH bnDQ== X-Gm-Message-State: AGi0PuaBKsy87UAO+K3ZUAC7rpu9voRodwV9dOU+yjdmYr7zJIY6bHIp XTFN2BRPdGMKGmM82EmOieEJtIvO X-Google-Smtp-Source: APiQypKl8AkoJGngVgc8BEr3ZtKJwMpKDO/P5ttNnjI1SNXMHf+4nOEMQn9MpuuAghqEpyhKU7iE1g== X-Received: by 2002:ac8:3072:: with SMTP id g47mr14212362qte.278.1586030719751; Sat, 04 Apr 2020 13:05:19 -0700 (PDT) Received: from localhost.localdomain ([191.83.222.162]) by smtp.gmail.com with ESMTPSA id h11sm10067251qta.44.2020.04.04.13.05.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Apr 2020 13:05:19 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 4 Apr 2020 17:05:07 -0300 Message-Id: <20200404200507.4323-1-jamrial@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200403221901.16631-1-jamrial@gmail.com> References: <20200403221901.16631-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avcodec/amfenc: adapt to the new internal encode API 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: James Almer --- libavcodec/amfenc.c | 43 ++++++++++++++++------------------------ libavcodec/amfenc.h | 2 -- libavcodec/amfenc_h264.c | 1 - libavcodec/amfenc_hevc.c | 1 - 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 876fddd2b6..da0652943d 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -33,6 +33,7 @@ #include "libavutil/time.h" #include "amfenc.h" +#include "encode.h" #include "internal.h" #if CONFIG_D3D11VA @@ -588,17 +589,27 @@ static void amf_release_buffer_with_frame_ref(AMFBuffer *frame_ref_storage_buffe frame_ref_storage_buffer->pVtbl->Release(frame_ref_storage_buffer); } -int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) +int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) { AmfContext *ctx = avctx->priv_data; AMFSurface *surface; AMF_RESULT res; int ret; + AMF_RESULT res_query; + AMFData *data = NULL; + AVFrame *frame = ctx->delayed_frame; + int block_and_wait; if (!ctx->encoder) return AVERROR(EINVAL); - if (!frame) { // submit drain + if (!frame->buf[0]) { + ret = ff_encode_get_frame(avctx, frame); + if (ret < 0 && ret != AVERROR_EOF) + return ret; + } + + if (!frame->buf[0]) { // submit drain if (!ctx->eof) { // submit drain one time only if (ctx->delayed_surface != NULL) { ctx->delayed_drain = 1; // input queue is full: resubmit Drain() in ff_amf_receive_packet @@ -613,15 +624,10 @@ int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "Drain() failed with error %d\n", res); } } - } else{ - return AVERROR_EOF; } - } else { // submit frame + } else if (!ctx->delayed_surface) { // submit frame int hw_surface = 0; - if (ctx->delayed_surface != NULL) { - return AVERROR(EAGAIN); // should not happen when called from ffmpeg, other clients may resubmit - } // prepare surface from frame switch (frame->format) { #if CONFIG_D3D11VA @@ -693,38 +699,23 @@ int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame) break; } - // submit surface res = ctx->encoder->pVtbl->SubmitInput(ctx->encoder, (AMFData*)surface); if (res == AMF_INPUT_FULL) { // handle full queue //store surface for later submission ctx->delayed_surface = surface; - if (surface->pVtbl->GetMemoryType(surface) == AMF_MEMORY_DX11) { - av_frame_ref(ctx->delayed_frame, frame); - } } else { + int64_t pts = frame->pts; surface->pVtbl->Release(surface); AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "SubmitInput() failed with error %d\n", res); - if ((ret = timestamp_queue_enqueue(avctx, frame->pts)) < 0) { + av_frame_unref(frame); + if ((ret = timestamp_queue_enqueue(avctx, pts)) < 0) { return ret; } - } } - return 0; -} -int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) -{ - int ret; - AMF_RESULT res; - AMF_RESULT res_query; - AmfContext *ctx = avctx->priv_data; - AMFData *data = NULL; - int block_and_wait; - if (!ctx->encoder) - return AVERROR(EINVAL); do { block_and_wait = 0; diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h index b1361842bd..80658c6b2a 100644 --- a/libavcodec/amfenc.h +++ b/libavcodec/amfenc.h @@ -129,8 +129,6 @@ int ff_amf_encode_close(AVCodecContext *avctx); /** * Ecoding one frame - common function for all AMF encoders */ - -int ff_amf_send_frame(AVCodecContext *avctx, const AVFrame *frame); int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); /** diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c index 7f2817f115..7a8029f3b7 100644 --- a/libavcodec/amfenc_h264.c +++ b/libavcodec/amfenc_h264.c @@ -383,7 +383,6 @@ AVCodec ff_h264_amf_encoder = { .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_H264, .init = amf_encode_init_h264, - .send_frame = ff_amf_send_frame, .receive_packet = ff_amf_receive_packet, .close = ff_amf_encode_close, .priv_data_size = sizeof(AmfContext), diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c index 77e57d2461..8b2302f2af 100644 --- a/libavcodec/amfenc_hevc.c +++ b/libavcodec/amfenc_hevc.c @@ -313,7 +313,6 @@ AVCodec ff_hevc_amf_encoder = { .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_HEVC, .init = amf_encode_init_hevc, - .send_frame = ff_amf_send_frame, .receive_packet = ff_amf_receive_packet, .close = ff_amf_encode_close, .priv_data_size = sizeof(AmfContext),