From patchwork Mon Jan 9 02:05:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Zhengxu" X-Patchwork-Id: 2133 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp6861418vsb; Sun, 8 Jan 2017 18:05:37 -0800 (PST) X-Received: by 10.28.144.135 with SMTP id s129mr1298981wmd.18.1483927537811; Sun, 08 Jan 2017 18:05:37 -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 b6si6974145wrd.321.2017.01.08.18.05.37; Sun, 08 Jan 2017 18:05:37 -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 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 E992068A60F; Mon, 9 Jan 2017 04:05:27 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1E2A168A5E4 for ; Mon, 9 Jan 2017 04:05:22 +0200 (EET) Received: by mail-pg0-f66.google.com with SMTP id 204so3358928pge.2 for ; Sun, 08 Jan 2017 18:05:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version; bh=UHSjRe+RKOcjYs4gY+Fhxw/3xidsep5dmspYXH9zM/4=; b=MWEFiOQwUfljgKI3zWxYcyfub/EkyfLggD66E16jbMNvZruHL4V1y/GOFQwVx/XpNt mwdFvXVoEqVDA3UmLgeR0A+hmNOwfBu0LEGFFXYy0k3+6NlcSQLmWeBfAPvC8Z+/xPc8 XyB5q9pgJvOgbit7StAsLk2clS2OnOlrogX02DVBlIqrElo1T/H85vqDoKuN2ZvkY1Bn Kslv8iuZNPBdt8IqS+hLq57TmuLtwOhMw2Yn4sDncMPQBZ0OBuIkp+DAS2xO9FvS6P75 DJdz/ZWMI73c9whfW5sQqVjeJDPcDZ8MnzqV09ADL+RYQpR0+cLenjSV0qairvl3lP/4 dfAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version; bh=UHSjRe+RKOcjYs4gY+Fhxw/3xidsep5dmspYXH9zM/4=; b=EJuqsSxvjykgbad3g92nk0gvk2oS7iCxyufdwrcinmFMOmvbDT2zOQfjMgoalFvZbG +Z59nKEz6oeMPvJ+4Riq2kGHQFdp1o/FO1UiIYHKhbhgWuLC3T2Fhno/EHRzCOC44u3o yPxqrpTa9TjphQvZwKs3FbFhULMpeylUr4U7L2GhXG23mD3zjlNIcS273nDo/G4xPt2A 2Yt4S9bFboQ2PNNTX5ho916IYVuZ/IaxmpgBh3mR8J9QGlygO1PueZ4XpIkSl1ZE+Nh6 FArrKOxQyo3s9RZbKHvp/LpO78kUyqInanxnAvkN6p+s3bn0EUJca4iwVV+KlXRQEWSa 534g== X-Gm-Message-State: AIkVDXKcXkEs4QHplPrqh0wIa7s+D2G+rp49NZk7HzgRUiVbGtRkL0c1d8LC/AP3/P7upA== X-Received: by 10.98.158.78 with SMTP id s75mr15612743pfd.146.1483927527582; Sun, 08 Jan 2017 18:05:27 -0800 (PST) Received: from [10.239.205.12] (fmdmzpr01-ext.fm.intel.com. [192.55.54.36]) by smtp.gmail.com with ESMTPSA id r2sm174057508pfi.67.2017.01.08.18.05.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 08 Jan 2017 18:05:27 -0800 (PST) To: sw@jkqxz.net, huazh407@gmail.com, chaox.a.liu@gmail.com, FFmpeg development discussions and patches From: "Huang, Zhengxu" Message-ID: <0c89be32-7d85-2249-14e3-75024241e6dc@gmail.com> Date: Mon, 9 Jan 2017 10:05:23 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] libavcodec/qsvdec: Fix the QSV decoder can't work 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" From 37629f14294125c7396e5e12970d75e895b1caba Mon Sep 17 00:00:00 2001 From: Zhengxu Date: Mon, 19 Dec 2016 01:27:06 -0500 Subject: [PATCH 1/2] libavcodec/qsvdec: Fix the QSV decoder can't work when using system memory Description: ./ffmpeg -c:v h264_qsv -i in -c:v h264 output.h264 does not work because the qsv decode will failed. Root cuase: when using the system rather than the hwaccel,ff_qsv_init_internal_session does not set the vaDisplay handle for the session. The qsv decode will failed. Solution: when creating the internal session , call the HwContext API to get session and release all resource when close the decoder. Signed-off-by: ChaoX A Liu Signed-off-by: Huang, Zhengxu Signed-off-by: Andrew, Zhang --- libavcodec/qsv.c | 6 ++--- libavcodec/qsv_internal.h | 5 ++++ libavcodec/qsvdec.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--- libavcodec/qsvdec.h | 1 + 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index aac6ce6..a932fc3 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -120,7 +120,7 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) } } -static int qsv_load_plugins(mfxSession session, const char *load_plugins, +int ff_qsv_load_plugins(mfxSession session, const char *load_plugins, void *logctx) { if (!load_plugins || !*load_plugins) @@ -185,7 +185,7 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, return ff_qsv_error(ret); } - ret = qsv_load_plugins(*session, load_plugins, avctx); + ret = ff_qsv_load_plugins(*session, load_plugins, avctx); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n"); return ret; @@ -329,7 +329,7 @@ int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession, } } - ret = qsv_load_plugins(session, load_plugins, avctx); + ret = ff_qsv_load_plugins(session, load_plugins, avctx); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n"); return ret; diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index 5d2a216..13f23ef 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -50,6 +50,10 @@ typedef struct QSVFrame { struct QSVFrame *next; } QSVFrame; +typedef struct QSVDeviceContext { + AVBufferRef *hw_device_ctx; +} QSVDeviceContext; + typedef struct QSVFramesContext { AVBufferRef *hw_frames_ctx; mfxFrameInfo info; @@ -73,5 +77,6 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *session, QSVFramesContext *qsv_frames_ctx, const char *load_plugins, int opaque); +int ff_qsv_load_plugins(mfxSession session, const char *load_plugins, void *logctx); #endif /* AVCODEC_QSV_INTERNAL_H */ diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 258042d..ccd5e26 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -41,6 +41,58 @@ #include "qsv_internal.h" #include "qsvdec.h" +static int qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, + QSVContext *q, const char *load_plugins) +{ + mfxIMPL impl = MFX_IMPL_AUTO_ANY; + mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } }; + + const char *desc; + int ret; + AVHWDeviceContext *device_hw; + AVQSVDeviceContext *hwctx; + AVBufferRef *hw_device_ctx; + + ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_QSV, NULL, NULL, 0); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Failed to create a QSV device\n"); + return ret; + } + 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 qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session, AVBufferRef *hw_frames_ref) { @@ -70,13 +122,13 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses q->session = q->internal_session; } else { if (!q->internal_session) { - 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; + /* the session will close when unref the hw_device_ctx */ + // q->session = q->internal_session; } /* make sure the decoder is uninitialized */ @@ -428,6 +480,7 @@ int ff_qsv_decode_close(QSVContext *q) MFXClose(q->internal_session); 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/qsvdec.h b/libavcodec/qsvdec.h index 41fb716..ae810bc 100644 --- a/libavcodec/qsvdec.h +++ b/libavcodec/qsvdec.h @@ -44,6 +44,7 @@ typedef struct QSVContext { mfxSession internal_session; QSVFramesContext frames_ctx; + QSVDeviceContext device_ctx; /** * a linked list of frames currently being used by QSV