From patchwork Thu Oct 6 07:35:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 38581 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4d9:b0:9c:f4b:4e41 with SMTP id 25csp68150pzd; Thu, 6 Oct 2022 00:39:00 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4NYMe0XUaszyO6FPcUpqMsmZ6jTHVazFuYIa6QIM+RXPb380mYNJ3rFfPGYxpqidVb1yJv X-Received: by 2002:a17:907:160d:b0:782:bc5d:162e with SMTP id hb13-20020a170907160d00b00782bc5d162emr2914993ejc.291.1665041939894; Thu, 06 Oct 2022 00:38:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665041939; cv=none; d=google.com; s=arc-20160816; b=aKbO/Ssurjol0jN6Hszv3Lk4JSYcefwO9S0wRc9IEDYCS759bYwGK/iBSYyClL+CUV Z7Isfxw1Ve+v/+iZIh083j6J8d7EyiFLfAuSo42FUkRif1whe54PTCf1M8Ex5M5jolof f7dVO68tlcSviUPC8TP7j02WDcwcoxuzs6xv2lwOFeUADf8Ylu+ysMNZNM0isJu1gPLb m5CNfKxRFD7dzFdjm+7QY0LR1GnQxZ1lYxPQ8viaR1cT2Jgml1y+cHorcn1E1Y+vpERq gErSaANcvtIt0KFj90H0izYnzelNJthVnOy0agMhO5KvIRSYlGMk3xA9O3izQBX0epzN /w4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=cGws01xoAqQaSKKW9p7XQ/DJHAI5Ba1Zx8OJa0nXbtQ=; b=fK3gMch4QRj5EnTvotdIxVGa0ClrQF1rF+JcEAOII242YG6Ib13H0+iXLNNO/WehTs q/c4erbc2XE5nu80MIxrniXQQk3Mi329tTbWs08bfAgfxJddXnI90yMeVSSCGBbptbx6 tnByqtbw361f9ewgSixbqU2px3Lz2OKmE33hWnrp8yJXrZKppRTWsTDFeF1oBOS4qiol Zlt98QcOu5wkA5/IL8mPlnrrQATrT5qwpvKJkl1r6+OIosBVO7hc8DxXnCqLhomSTds4 iW1qIPcalbkmjo57C+kDay6HVNUI1cRp+8KgVUzaPgv5jzzDVpZLwLResZNIww8Fh74V 34yw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=P9+HNdue; 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 z98-20020a509e6b000000b00458b9b7bb2fsi15000435ede.396.2022.10.06.00.38.59; Thu, 06 Oct 2022 00:38:59 -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=P9+HNdue; 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 3B8D168BC15; Thu, 6 Oct 2022 10:38:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3069A68BC05 for ; Thu, 6 Oct 2022 10:38:12 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1665041898; x=1696577898; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=j6GSkWjxew7m9ty8j54/4kD7o5rNd87DDaQ8y/oB02E=; b=P9+HNdueJz2ULzKFHThpSfUQOYVHgBQUE//VdPBJOd60PwaBsiBpynKU r4tgs7YdNPqO6W4yhmJh0Jv1Ejv0kp4brHsSydWXge1EHH8RJAXzdmEHf 3DfzoCSU7axqE6QWCtuwRkSBGDQ57IvLsCZxaImUEK/Z9Xs53EDEfXYfW 4r7f3nLCb8Fgn3XJZBiAMBdA4wLrLLKKs7g4lDZaNYL0Uud0C/d1/Kux5 wVl7D7hLU/QJgt1UaoAa1TCrWmhxyC/fzkezPlyLknGgZBI2iNMzYWADs ydZnCe1OUSRgg+MnlzotrgHSIXx+BHooeKZLEoeab9TZNwYSpT2qMOES7 w==; X-IronPort-AV: E=McAfee;i="6500,9779,10491"; a="300974408" X-IronPort-AV: E=Sophos;i="5.95,163,1661842800"; d="scan'208";a="300974408" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Oct 2022 00:38:06 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10491"; a="687319010" X-IronPort-AV: E=Sophos;i="5.95,163,1661842800"; d="scan'208";a="687319010" Received: from xhh-dg164.sh.intel.com ([10.238.5.169]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Oct 2022 00:38:04 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Thu, 6 Oct 2022 15:35:38 +0800 Message-Id: <20221006073538.27710-6-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20221006073538.27710-1-haihao.xiang@intel.com> References: <20221006073538.27710-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH 6/6] lavc/qsv: add support for decoding & encoding 12bit content 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: Haihao Xiang , Wenbin Chen , Fei Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: jneBDMwGeldk From: Fei Wang AV_PIX_FMT_P012, AV_PIX_FMT_Y212 and AV_PIX_FMT_XV36 are used in FFmpeg and MFX_FOURCC_P016, MFX_FOURCC_Y216, and MFX_FOURCC_Y416 are used in the SDK Signed-off-by: Fei Wang Signed-off-by: Wenbin Chen Signed-off-by: Haihao Xiang --- libavcodec/qsv.c | 30 ++++++++++++++++++++++++++++++ libavcodec/qsvdec.c | 11 ++++++++++- libavcodec/qsvenc_hevc.c | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index f38c617fc3..7af154202c 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -213,6 +213,11 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) case MFX_FOURCC_Y210: return AV_PIX_FMT_Y210; case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; case MFX_FOURCC_Y410: return AV_PIX_FMT_XV30; +#if QSV_VERSION_ATLEAST(1, 31) + case MFX_FOURCC_P016: return AV_PIX_FMT_P012; + case MFX_FOURCC_Y216: return AV_PIX_FMT_Y212; + case MFX_FOURCC_Y416: return AV_PIX_FMT_XV36; +#endif #endif } return AV_PIX_FMT_NONE; @@ -259,6 +264,20 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc, uint16_t *shi *fourcc = MFX_FOURCC_Y410; *shift = 0; return AV_PIX_FMT_XV30; +#if QSV_VERSION_ATLEAST(1, 31) + case AV_PIX_FMT_P012: + *fourcc = MFX_FOURCC_P016; + *shift = 1; + return AV_PIX_FMT_P012; + case AV_PIX_FMT_Y212: + *fourcc = MFX_FOURCC_Y216; + *shift = 1; + return AV_PIX_FMT_Y212; + case AV_PIX_FMT_XV36: + *fourcc = MFX_FOURCC_Y416; + *shift = 1; + return AV_PIX_FMT_XV36; +#endif #endif default: return AVERROR(ENOSYS); @@ -270,6 +289,7 @@ 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: + case AV_PIX_FMT_P012: surface->Data.Y = frame->data[0]; surface->Data.UV = frame->data[1]; /* The SDK checks Data.V when using system memory for VP9 encoding */ @@ -289,6 +309,7 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) break; case AV_PIX_FMT_Y210: + case AV_PIX_FMT_Y212: surface->Data.Y16 = (mfxU16 *)frame->data[0]; surface->Data.U16 = (mfxU16 *)frame->data[0] + 1; surface->Data.V16 = (mfxU16 *)frame->data[0] + 3; @@ -307,6 +328,15 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) surface->Data.U = frame->data[0]; break; + case AV_PIX_FMT_XV36: + surface->Data.U = frame->data[0]; + surface->Data.Y = frame->data[0] + 2; + surface->Data.V = frame->data[0] + 4; + // Only set Data.A to a valid address, the SDK doesn't + // use the value from the frame. + surface->Data.A = frame->data[0] + 6; + break; + default: return AVERROR(ENOSYS); } diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 912d58965a..73405b5747 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -137,14 +137,19 @@ 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_P012: case AV_PIX_FMT_YUYV422: frame->linesize[0] = 2 * FFALIGN(avctx->width, 128); break; case AV_PIX_FMT_Y210: case AV_PIX_FMT_VUYX: case AV_PIX_FMT_XV30: + case AV_PIX_FMT_Y212: frame->linesize[0] = 4 * FFALIGN(avctx->width, 128); break; + case AV_PIX_FMT_XV36: + frame->linesize[0] = 8 * FFALIGN(avctx->width, 128); + break; default: av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n"); return AVERROR(EINVAL); @@ -156,7 +161,8 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, frame->data[0] = frame->buf[0]->data; if (avctx->pix_fmt == AV_PIX_FMT_NV12 || - avctx->pix_fmt == AV_PIX_FMT_P010) { + avctx->pix_fmt == AV_PIX_FMT_P010 || + avctx->pix_fmt == AV_PIX_FMT_P012) { frame->linesize[1] = frame->linesize[0]; frame->data[1] = frame->data[0] + frame->linesize[0] * FFALIGN(avctx->height, 64); @@ -1041,10 +1047,13 @@ 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_P012, \ AV_PIX_FMT_YUYV422, \ AV_PIX_FMT_Y210, \ + AV_PIX_FMT_Y212, \ AV_PIX_FMT_VUYX, \ AV_PIX_FMT_XV30, \ + AV_PIX_FMT_XV36, \ AV_PIX_FMT_QSV, \ AV_PIX_FMT_NONE }, \ .hw_configs = qsv_hw_configs, \ diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c index 1e1574a6f2..8127fcc6c3 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c @@ -310,6 +310,7 @@ const FFCodec ff_hevc_qsv_encoder = { .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID, .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, AV_PIX_FMT_P010, + AV_PIX_FMT_P012, AV_PIX_FMT_YUYV422, AV_PIX_FMT_Y210, AV_PIX_FMT_QSV,