From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id C9E52451A2 for ; Wed, 11 Jan 2023 07:33:33 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DBDB568BB85; Wed, 11 Jan 2023 09:33:30 +0200 (EET) 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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 */ -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".