From patchwork Wed Jan 11 15:33:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 39962 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp4546036pzb; Tue, 10 Jan 2023 23:33:35 -0800 (PST) X-Google-Smtp-Source: AMrXdXtI21MISC/l+8cPgU3p9Xs+nZOUAT/+dW/mq6az/wM/2DypxaAjZxHIGo2VQWUXZr64AzC0 X-Received: by 2002:a17:906:5dd2:b0:7c1:7010:f413 with SMTP id p18-20020a1709065dd200b007c17010f413mr136831ejv.19.1673422415542; Tue, 10 Jan 2023 23:33:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673422415; cv=none; d=google.com; s=arc-20160816; b=TKpWUdXwL8JkJmc9xjYrpKp70k/d665TyZ2S/0JMqaaE2jweYMyI2a8+6yDqPd1+9T FmVKb54psUVuV7Ic/rJRIyr7XcHaqaHbchfbeYRIbLSrg7NAiLUZeEyTzZAC2w62Nhxt J8Ne0Ux61fDvOe0XWOnIaF9WaPKNjjDumdfcCtsSNofl3JHC8cvYpbLROYI5+QsYwr24 Rnihm9UVzafRWP6iV6C9nPMKV7Ez/dCU1XRzEIdluauz/NKrIzeVtt3rzK8afeYE0yCW KuMaPaYku9oSPvgUX2PjUjK4KdoLrUB4egNInCwfZu56v302dLp041vykoeMlAaGIpyn Lt6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=d6dilb6P4mU1vbrhmxbqMk3tlJExzoOJK1Jv8Yz7NlU=; b=b4PhNRzTmXslDatKjcJHmcee7MuMxmQX8ZIPCHgIraHmxnhpb3rWAx1Y5yRvbQKmC1 Au0O7fwqZ3A52R0iL++Q7NriyqZn7UWEoM5l8WgXL5SELlqKOwJh8x451ogCjWQzWStC OIJUjYhATQOdp1Yce8Zpzx2YLwjppH72eoEbrlzwDS4BQBcg3apVTJytg5UuuY8E9P/C PlB4pNPnoz6jGHXG2CvSQB+kGm1bhVTuyzp07O98ahcqo910HJcoNfADjZaAu+3N1Ild ckvkjU3xU6Rq+bsvFD2kGndCfNDmmuc1ZagSe0M2nnliSYQ89kk6DZYzmcOmPdUNsSxh fUSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=jJ2FNdvo; 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=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hb43-20020a170907162b00b007aeb99bbb99si16665333ejc.48.2023.01.10.23.33.34; Tue, 10 Jan 2023 23:33:35 -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=@foxmail.com header.s=s201512 header.b=jJ2FNdvo; 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=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1925468BC95; Wed, 11 Jan 2023 09:33:31 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out203-205-221-210.mail.qq.com (out203-205-221-210.mail.qq.com [203.205.221.210]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 770D368B1C7 for ; Wed, 11 Jan 2023 09:33:22 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1673422397; bh=Ev6zxHuJMKxx2VfleXvaR4Get2siNRkOAOZJmkOv+zc=; h=From:To:Cc:Subject:Date; b=jJ2FNdvow2DUz7BeDydXR8E6IKEtCBocnWRe+b8WVuANBCrOey5AevmDxP47tsdJJ I3sVxTwQZKwYUf2QDU+MknJVecvHih6GQcAPuOp9H8efpvE2cyb4vKUFWQy81DuRlE 6fPLZLVEncL+UfSfu+aznowSUyvEE8IxOwPGUSvs= Received: from localhost.localdomain ([59.37.125.102]) by newxmesmtplogicsvrsza2-0.qq.com (NewEsmtp) with SMTP id 850128B0; Wed, 11 Jan 2023 15:33:16 +0800 X-QQ-mid: xmsmtpt1673422396tgjjn9kn9 Message-ID: X-QQ-XMAILINFO: MW5hkHoBpWXyNALcGhK0MX75AXeHs6BMwpsW5BMrAhV2hr/1ylSekCFdiiH7aQ pAHOI4g+8HGqRzVi+lxebt47pYHSDKtO9BvTEIS5Q2rWBSEwNmnsWmvSqaeiYQ1ETLbxNlOSKzyb BKEQKHEmUWG46/4HVGz3dqT4TfwmqcPZhIEMBpeOCXq3CLiFQYy44Z6RqxBkIDfKYWLbpFdrvkVv 7pMAvr4AkhixxRSYtFj5fmVtrqaD1S+OpEm+46BHeVrDWeX8hsaJh2t4ns2Y24LeR2ctVK5+ph9I A+w/xb6CxZW4UggM2RFH0gsNZm2fkBCUyFutwnjC3qQNbWkEF3znGfGMpPtOVVlkjChwo/piKzfH LT3qAi82NW0JWV3I2xacJ3qoIBwV6J/KAIKcbMcLyiqZxwpcsAIoMwOYT94rURSgh3FOTmXl3I1Y 0LGdcXwdRmZhhKnEck5VyHhnqapzI8+GPX0WqmR53UVPPMtikHOIc9N9y+WeR529+2uGfn8sAMsa vIK5GzsPvmPBL0h6puDgm2wtKvCWR/UqujGYs/+0SFXtStdP930kIR27hxHTlmeimNXszlRdROb8 rnw/UcW+VSKpC7nF6sFf113JFAmkbM8chyjxEjkIL4V9JXn+i30i/Rd6kwV8bxhWwaBd9IJvqE0L 1UZ2JIsNFI4RRHvmI76yFpWfQaa2xQl6VuyYOp7qDYe4sb4x8G3sVSYFTKHGv/PlNHe1SqW6Uz+E 2YyjUVLYs95hOdaO5JSo4MTfUBzHlEdA/MLgsPzDU45dOOHPOJHNfidHub4isJE9TAPVP8G30GpG ERh/ddY1822/6+ho5PMHzfHzIF6fBM+lKqjzOITk5kKQCjsdl3onkR3BdHsFi8SY1jM4QrmNHJCK S8FP2nnaxpfTy1HF7F7mnXy0QCFknncpxT5P2uRnydkc1VKOzWG4QvOCxcM9UdmAJRbJ8w4He4pg TBEf4Pm4nv7z6xPNFhj0zg9ehZsZebNl2MYYzk8AI= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Wed, 11 Jan 2023 23:33:12 +0800 X-OQ-MSGID: <20230111153312.801364-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avutil/hwcontext_mediacodec: fix backward compatibility 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: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 7fFUUyKu4jh4 From: Zhao Zhili AVMediaCodecDeviceContext without surface or native_window is useless, it shouldn't be created at all. Such dummy AVHWDeviceContext is allowed before, and it's used by mpv player. Creating a ANativeWindow automatically breaks such usecases. So disable creating a ANativeWindow by default. It can be enabled via the create_window flag, or by set the AVDictionary of av_hwdevice_ctx_create(). The downside is that ffmpeg -hwaccel mediacodec -i input.mp4 \ -c:a copy -c:v hevc_mediacodec output.mp4 use ByteBuffer mode which isn't as efficient as before. The upside is libavfilter works now, which should be less surprise. To enable create_window on ffmpeg command line, use ffmpeg -hwaccel mediacodec \ -init_hw_device mediacodec=mediacodec,create_window=1 \ -i input.mp4 -c:a copy -c:v hevc_mediacodec output.mp4 Users should know what it is to enable create_window. It should be OK to take sometime to figure out the option. And there are comments inside hwcontext_mediacodec.h to help user figure it out. Signed-off-by: Zhao Zhili --- libavutil/hwcontext_mediacodec.c | 17 +++++++++++++++++ libavutil/hwcontext_mediacodec.h | 16 +++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/libavutil/hwcontext_mediacodec.c b/libavutil/hwcontext_mediacodec.c index bb1779d34d..9ed6a8717a 100644 --- a/libavutil/hwcontext_mediacodec.c +++ b/libavutil/hwcontext_mediacodec.c @@ -39,11 +39,23 @@ typedef struct MediaCodecDeviceContext { static int mc_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags) { + const AVDictionaryEntry *entry = NULL; + MediaCodecDeviceContext *s = ctx->hwctx; + AVMediaCodecDeviceContext *dev = &s->ctx; + if (device && device[0]) { av_log(ctx, AV_LOG_ERROR, "Device selection unsupported.\n"); return AVERROR_UNKNOWN; } + while ((entry = av_dict_iterate(opts, entry))) { + if (!strcmp(entry->key, "create_window")) + dev->create_window = atoi(entry->value); + } + + av_log(ctx, AV_LOG_DEBUG, "%s createPersistentInputSurface\n", + dev->create_window ? "Enable" : "Disable"); + return 0; } @@ -59,6 +71,11 @@ static int mc_device_init(AVHWDeviceContext *ctx) if (dev->native_window) return 0; + // For backward compatibility, don't return error for a dummy + // AVHWDeviceContext without surface or native_window. + if (!dev->create_window) + return 0; + s->libmedia = dlopen("libmediandk.so", RTLD_NOW); if (!s->libmedia) return AVERROR_UNKNOWN; diff --git a/libavutil/hwcontext_mediacodec.h b/libavutil/hwcontext_mediacodec.h index 920e17764f..fc0263cabc 100644 --- a/libavutil/hwcontext_mediacodec.h +++ b/libavutil/hwcontext_mediacodec.h @@ -36,12 +36,26 @@ typedef struct AVMediaCodecDeviceContext { * Pointer to ANativeWindow. * * It both surface and native_window is NULL, try to create it - * automatically if OS support. + * automatically if create_window is true and OS support + * createPersistentInputSurface. * * It can be used as output surface for decoder and input surface for * encoder. */ void *native_window; + + /** + * Enable createPersistentInputSurface automatically. + * + * Disabled by default. + * + * It can be enabled by setting this flag directly, or by setting + * AVDictionary of av_hwdevice_ctx_create(), with "create_window" as key. + * The second method is useful for ffmpeg cmdline, e.g., we can enable it + * via: + * -init_hw_device mediacodec=mediacodec,create_window=1 + */ + int create_window; } AVMediaCodecDeviceContext; #endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */