From patchwork Tue Jan 17 06:57:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Huang, Zhengxu" X-Patchwork-Id: 2227 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp385525vsb; Mon, 16 Jan 2017 22:57:50 -0800 (PST) X-Received: by 10.28.179.7 with SMTP id c7mr6039036wmf.128.1484636270007; Mon, 16 Jan 2017 22:57:50 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e68si14914689wmd.118.2017.01.16.22.57.49; Mon, 16 Jan 2017 22:57:49 -0800 (PST) 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=@gmail.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2988368A061; Tue, 17 Jan 2017 08:57:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E383C689F60 for ; Tue, 17 Jan 2017 08:57:30 +0200 (EET) Received: by mail-pf0-f193.google.com with SMTP id f144so15602049pfa.2 for ; Mon, 16 Jan 2017 22:57:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to; bh=3SnNNuj478nH77BTwh38uVNSCdsKP68wyxDvwG9unAY=; b=SD3+JK6YB8idFTmMoUdMn/A4+SRHmQUBeuPMuakpj36w/kYoHBHOMZWqkU9QmS4ujt rmjcKgjFimcMuYU/RP/VGjhoBQBMiuWKkTDRuuITaoZYE2jSsD/6YvyJ9hebSY+Db9X5 AsV8ifeAQZBw+6d4AUidOqII8k8/NeB+Gj/lUyMaCYXYCsKTypwSwrK51to/VDlgWg4o D9yOcCTidZfUk4j6pwKzNTd9vuF+8I9yaBv7g/6spL6Vu42XHuz233rnyasVmFxW5dFm +dAQj/TlpCjxBfAh+PrUJ79eNdEpADij2HCgCPlthFPy5MEc/i7QwgKXu1RVnCyypEbW NBdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to; bh=3SnNNuj478nH77BTwh38uVNSCdsKP68wyxDvwG9unAY=; b=iMFEwHir9IqV2QNzTTZA5I+QNz90rJiwxat7NHdZr0C1LqDqJlouH6vpAIVlIbcPW8 gyj/Axy5FnRUHxzOHCcYV18All0aZmYK5I64NuUsBqBW/q7mwzxWaMGlNLJ9h+MfZr2T 3mQWxwIfFoMWZ5LhB7gNzrwcIgJ0/vGqmjdWcDW6D7I0ShNVcf3o8IeVIhQ22xbWEr6/ R7rQf/MVU68GKKafshW3Y6HfL9yF8mrknxZh9VBAOnKS6b8pRugCuIkyWeLdGr7iKpik 9K1H7OPpVpZQR8dTiOyEwBWO/P+yD9XDDNsijKhZwxuB0fy1/EZPruyOtz2qLklebQ8B fNCw== X-Gm-Message-State: AIkVDXKA/OD7LCkW7j8uWBXOocChXIBbuvmnW+9QkJ3GX84SG7tWzbzMPwlul9532Uf9HA== X-Received: by 10.84.232.78 with SMTP id f14mr57108337pln.27.1484636259224; Mon, 16 Jan 2017 22:57:39 -0800 (PST) Received: from [10.239.205.21] (fmdmzpr04-ext.fm.intel.com. [192.55.55.39]) by smtp.gmail.com with ESMTPSA id z18sm18657260pfi.83.2017.01.16.22.57.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Jan 2017 22:57:38 -0800 (PST) To: sw@jkqxz.net, huazh407@gmail.com, chaox.a.liu@gmail.com, FFmpeg development discussions and patches References: From: "Huang, Zhengxu" Message-ID: Date: Tue, 17 Jan 2017 14:57:34 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: Subject: Re: [FFmpeg-devel] [PATCH 2/2 V2] libavcodec/qsvenc: Fix the encode part hwaccle issue when using system memory 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" 在 2017/1/9 10:10, Huang, Zhengxu 写道: > From 8466186d4622f760194edd62f7779a0ab8a230d2 Mon Sep 17 00:00:00 2001 From: Zhengxu Date: Mon, 19 Dec 2016 03:39:39 -0500 Subject: [PATCH 2/2] libavcodec/qsvenc: Fix the encode part hwaccle issue when using system memory Description: when using system memory the encode actually uses the PARTIAL_ACCELERATION which means the SW encoder of MSDK. And the performance will quite poor compared with the HW MSDK. eg: ./ffmpeg -c:v h264 -i in -c:v h264_qsv output.h264 Fix: Use the HWContext to get the vaDisplay and configure the encode to HW mode. The performance will be improved significantly Signed-off-by: ChaoX A Liu Signed-off-by: Huang, Zhengxu Signed-off-by: Andrew, Zhang --- libavcodec/qsvenc.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-- libavcodec/qsvenc.h | 4 +++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index ac443c1..f61aad7 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -651,6 +651,66 @@ static int qsv_init_opaque_alloc(AVCodecContext *avctx, QSVEncContext *q) return 0; } +static int qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, + QSVEncContext *q, const char *load_plugins) +{ + mfxIMPL impl = MFX_IMPL_AUTO_ANY; + const char *desc; + int ret; + AVHWDeviceContext *device_hw; + AVQSVDeviceContext *hwctx; + AVBufferRef *hw_device_ctx; + AVDictionary *dict = NULL; + + if (q->dev_name) { + ret = av_dict_set(&dict, "child_device", q->dev_name, 0); + if (ret < 0) + return ret; + } + + ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_QSV, NULL, dict, 0); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Failed to create a QSV device\n"); + av_dict_free(&dict); + return ret; + } + av_dict_free(&dict); + + device_hw = (AVHWDeviceContext*)hw_device_ctx->data; + hwctx = device_hw->hwctx; + + *session = hwctx->session; + + q->device_ctx.hw_device_ctx = hw_device_ctx; + + ret = ff_qsv_load_plugins(*session, load_plugins, avctx); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n"); + return ret; + } + MFXQueryIMPL(*session, &impl); + + switch (MFX_IMPL_BASETYPE(impl)) { + case MFX_IMPL_SOFTWARE: + desc = "software"; + break; + case MFX_IMPL_HARDWARE: + case MFX_IMPL_HARDWARE2: + case MFX_IMPL_HARDWARE3: + case MFX_IMPL_HARDWARE4: + desc = "hardware accelerated"; + break; + default: + desc = "unknown"; + } + + av_log(avctx, AV_LOG_VERBOSE, + "Initialized an internal MFX session using %s implementation\n", + desc); + + return 0; +} + static int qsvenc_init_session(AVCodecContext *avctx, QSVEncContext *q) { int ret; @@ -673,12 +733,12 @@ static int qsvenc_init_session(AVCodecContext *avctx, QSVEncContext *q) q->session = q->internal_session; } else { - ret = ff_qsv_init_internal_session(avctx, &q->internal_session, + ret = qsv_init_internal_session(avctx, &q->session, q, q->load_plugins); if (ret < 0) return ret; - q->session = q->internal_session; + // q->session = q->internal_session; } return 0; @@ -1088,6 +1148,7 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) q->internal_session = NULL; av_buffer_unref(&q->frames_ctx.hw_frames_ctx); + av_buffer_unref(&q->device_ctx.hw_device_ctx); av_freep(&q->frames_ctx.mids); q->frames_ctx.nb_mids = 0; diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index 361d933..42d3ed5 100644 --- a/libavcodec/qsvenc.h +++ b/libavcodec/qsvenc.h @@ -71,6 +71,7 @@ { "adaptive_b", "Adaptive B-frame placement", OFFSET(qsv.adaptive_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \ { "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(qsv.b_strategy), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \ { "cavlc", "Enable CAVLC", OFFSET(qsv.cavlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \ +{ "qsv_dev", "Set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", OFFSET(qsv.dev_name), AV_OPT_TYPE_STRING, { .str = "" }, 0, 128, VE }, \ typedef int SetEncodeCtrlCB (AVCodecContext *avctx, const AVFrame *frame, mfxEncodeCtrl* enc_ctrl); @@ -105,7 +106,7 @@ typedef struct QSVEncContext { AVFifoBuffer *async_fifo; QSVFramesContext frames_ctx; - + QSVDeviceContext device_ctx; // options set by the caller int async_depth; int idr_interval; @@ -141,6 +142,7 @@ typedef struct QSVEncContext { int a53_cc; char *load_plugins; + char *dev_name; SetEncodeCtrlCB *set_encode_ctrl_cb; } QSVEncContext;