From patchwork Wed Mar 30 06:43:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Chen, Wenbin" X-Patchwork-Id: 35052 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp661929pzb; Tue, 29 Mar 2022 23:44:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx682MfrGU2FfFcA2/+34P84PjHXYg1U3uMxvXYeXXQ1s8Nm+SqhFQcfzcrBxBsEaJ872Vp X-Received: by 2002:a17:907:6d0a:b0:6db:f0f8:6528 with SMTP id sa10-20020a1709076d0a00b006dbf0f86528mr37698744ejc.466.1648622668924; Tue, 29 Mar 2022 23:44:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648622668; cv=none; d=google.com; s=arc-20160816; b=EqPDtTDqb0lAqqXOEUq0y91/e20A//cP5TZ0PC8Ivq5ZukWj84KOvyOFtAERf4JjEI 0hCDes7h5cm5v69WxtkgB3fV1lrQQ8rZAaCMZsk/aXSi+Cx2GkbpQ3qLPRxhYXrpBejM iiuIl3UL0jc7kUoY4R7I9xm4+BJkqDVRa0Vjk/h9t8gNIcp75JrWcQmXQc/1SF3VK/up 7Xg0gCYdYyoKS9SSb/Cz1iBODtd2ZcJMg5LiVy/wuT/3hwYlT9/mnIfO1fF+hs8SUuyT LG8p/Z51UxCabtSzChWWy3yUaxghBq9xFSfbs5vR1VKa681iGreGxY/ndyA7f7X/0VwT RQ4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=tzxJSFsttkPmt7wcWTgvs0gaFCQlf597FGD+ROBEIq8=; b=Bo2Xq/rL2AG+5gjRqaLRiwinLOxTfu9tv7Fgmv1gw9dImkYQsNYod0BIxcNgX4Xl7E qraQMUYMkoLRg1LFGTTS/VuXcmI3Y1pRPS4AU04WPVXUrWcA+hzSGJymwY2lKYPilE2Z jCkjaj+CEt697oO4PWe0vvA30wccFJQIDM65i9ven6QgeUcCFdjaVAoYhdhxcwqDrl+j AZZ4H4v/t5XvzvU3XWFrQmbwylUdMgT4xYlh8dFiIieBV/Kzp4zPEEZqLUAdJzqAF/9n rkkLwUnbfgyKaA1O7ZKsPgFhr18oDqo+dDus6xVQ0J6ysTi2H0oqKMsZo96k7pawEgaG K7Gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=lew0flbU; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h16-20020aa7c610000000b00418c2b5bdb6si19972373edq.152.2022.03.29.23.44.28; Tue, 29 Mar 2022 23:44:28 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=lew0flbU; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E2C5768B1A5; Wed, 30 Mar 2022 09:44:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 507996802A5 for ; Wed, 30 Mar 2022 09:44:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1648622662; x=1680158662; h=from:to:subject:date:message-id:mime-version: content-transfer-encoding; bh=L07IW7/3bGjvVJYdeI6Val0yEB/E+Stjr3R2DaDjLZc=; b=lew0flbUL/gQkjimGPTC1GwSpknHPocZs635pHcZP2UmrdEBxu+/Lxmj VClTuLOgk0bZAVlhB1ZfEKTGDQvayN8ilHL2txXa1VCk2Sui+vAF4jt8F G461QlnN7iK2VPcO7V25tqpYXBiqSCv0eQgW4xiEMDXYpkwACo/T73Ljs nhlqhQGcKHlio5s5c8T0JZ5Kngteb7PxOr/GXpQMLXXuU/ZY4MgOff4iX qAqhbz4h5gPvCuUHIQewb7iAhC5PsFSn22wFMAu0ZMmWXTO+RFqdDA2e+ RVIaGC0O0jmWqRM6BCF3O+kL+nCGIoj3VfkYcrOuVYHMmBqELDtEy3z2p w==; X-IronPort-AV: E=McAfee;i="6200,9189,10301"; a="345896683" X-IronPort-AV: E=Sophos;i="5.90,221,1643702400"; d="scan'208";a="345896683" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Mar 2022 23:44:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,221,1643702400"; d="scan'208";a="836831265" Received: from wenbin-z390-aorus-ultra.sh.intel.com ([10.239.35.4]) by fmsmga005.fm.intel.com with ESMTP; 29 Mar 2022 23:44:13 -0700 From: Wenbin Chen To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Mar 2022 14:43:48 +0800 Message-Id: <20220330064349.850881-1-wenbin.chen@intel.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] libavcodec/qsvdec: Add more pixel format support to qsvdec 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: kS+Yo2+rjtPL Qsv decoder only supports directly output nv12 and p010 to system memory. For other format, we need to download frame from qsv format to system memory. Now add other supported format to qsvdec. Signed-off-by: Wenbin Chen --- libavcodec/qsv.c | 36 ++++++++++++++++++++++++++++++++++++ libavcodec/qsv_internal.h | 3 +++ libavcodec/qsvdec.c | 23 +++++++++++++++++------ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index 67d0e3934a..8010eef172 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -244,6 +244,42 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) } } +int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +{ + switch (frame->format) { + case AV_PIX_FMT_NV12: + case AV_PIX_FMT_P010: + surface->Data.Y = frame->data[0]; + surface->Data.UV = frame->data[1]; + /* The SDK checks Data.V when using system memory for VP9 encoding */ + surface->Data.V = surface->Data.UV + 1; + break; + case AV_PIX_FMT_X2RGB10LE: + case AV_PIX_FMT_BGRA: + surface->Data.B = frame->data[0]; + surface->Data.G = frame->data[0] + 1; + surface->Data.R = frame->data[0] + 2; + surface->Data.A = frame->data[0] + 3; + break; + case AV_PIX_FMT_YUYV422: + surface->Data.Y = frame->data[0]; + surface->Data.U = frame->data[0] + 1; + surface->Data.V = frame->data[0] + 3; + break; + + case AV_PIX_FMT_Y210: + surface->Data.Y16 = (mfxU16 *)frame->data[0]; + surface->Data.U16 = (mfxU16 *)frame->data[0] + 1; + surface->Data.V16 = (mfxU16 *)frame->data[0] + 3; + break; + default: + return MFX_ERR_UNSUPPORTED; + } + surface->Data.PitchLow = frame->linesize[0]; + + return 0; +} + int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame) { int i; diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index 58186ea7ca..e2aecdcbd6 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -147,4 +147,7 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame); void ff_qsv_frame_add_ext_param(AVCodecContext *avctx, QSVFrame *frame, mfxExtBuffer *param); +int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface); + + #endif /* AVCODEC_QSV_INTERNAL_H */ diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 661f15bc75..f159e2690f 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -132,21 +132,28 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, frame->linesize[0] = FFALIGN(avctx->width, 128); break; case AV_PIX_FMT_P010: + case AV_PIX_FMT_YUYV422: frame->linesize[0] = 2 * FFALIGN(avctx->width, 128); break; + case AV_PIX_FMT_Y210: + frame->linesize[0] = 4 * FFALIGN(avctx->width, 128); + break; default: av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n"); return AVERROR(EINVAL); } - frame->linesize[1] = frame->linesize[0]; frame->buf[0] = av_buffer_pool_get(pool); if (!frame->buf[0]) return AVERROR(ENOMEM); frame->data[0] = frame->buf[0]->data; - frame->data[1] = frame->data[0] + - frame->linesize[0] * FFALIGN(avctx->height, 64); + if (avctx->pix_fmt == AV_PIX_FMT_NV12 || + avctx->pix_fmt == AV_PIX_FMT_P010) { + frame->linesize[1] = frame->linesize[0]; + frame->data[1] = frame->data[0] + + frame->linesize[0] * FFALIGN(avctx->height, 64); + } ret = ff_attach_decode_data(frame); if (ret < 0) @@ -426,9 +433,11 @@ static int alloc_frame(AVCodecContext *avctx, QSVContext *q, QSVFrame *frame) if (frame->frame->format == AV_PIX_FMT_QSV) { frame->surface = *(mfxFrameSurface1*)frame->frame->data[3]; } else { - frame->surface.Data.PitchLow = frame->frame->linesize[0]; - frame->surface.Data.Y = frame->frame->data[0]; - frame->surface.Data.UV = frame->frame->data[1]; + ret = ff_qsv_map_frame_to_surface(frame->frame, &frame->surface); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "map frame to surface failed.\n"); + return AVERROR(EINVAL); + } } frame->surface.Info = q->frame_info; @@ -993,6 +1002,8 @@ const FFCodec ff_##x##_qsv_decoder = { \ .p.priv_class = &x##_qsv_class, \ .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ AV_PIX_FMT_P010, \ + AV_PIX_FMT_YUYV422, \ + AV_PIX_FMT_Y210, \ AV_PIX_FMT_QSV, \ AV_PIX_FMT_NONE }, \ .hw_configs = qsv_hw_configs, \