From patchwork Fri Jan 6 15:42:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 39902 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp1236598pzb; Fri, 6 Jan 2023 07:42:46 -0800 (PST) X-Google-Smtp-Source: AMrXdXslsuK6zSIKb4yn0BDIqz1hfPbgk8gu8G5ZzIp+3UL2s7nuXL+XHPUfF6cQUmzrRCiPBwlV X-Received: by 2002:a05:6402:5d6:b0:467:8e69:ff10 with SMTP id n22-20020a05640205d600b004678e69ff10mr51188964edx.26.1673019766088; Fri, 06 Jan 2023 07:42:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673019766; cv=none; d=google.com; s=arc-20160816; b=PvEdzOiej3RrL6Q+eQjmXgczozht4eTCGlu1AR1BpDQZSOanqGdb7jGf71b/FsH/3c zzbN2zzsXzYI8Re1z2eX8cKjbyajg3MMjrhh2VYsD2wQTGtOVm4vfHfjzP2ecxZVz6zB hNpdBwdXwqyhLFxU7jcIDDhxxnKUwlljT8hIeuCUbN25tAAOeic4bBMuJxO/hGzdeibg wnE4eS59Nd6Ogns1q8IS7VTjrlf5HZtabVp/xqVNNsgHzTTyfrzk20cht6t3A2E5WqxH JlK0mpl2Mp+O7iQDQMH8Lhch3X43sxXYT42/YakTN7yBiG4A+gTV/hEFmUw4v3Vp0pDa O3fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:date:to:from:message-id:delivered-to; bh=vorlTEq7WuOdJinuJT9l8lNRh6kflNDtUjtGcf+VYTE=; b=JZorNWxubXjDSa9uSadiTPyw3xOOiL9n0s2bnnjV9TfhILcLHSuouPUCm3ZzgR/MT0 Ph1KdYXumX0EcwEF7diKCRNTJxEKT2wpoPrCGKrfymS3GT2HC9xj/MYmrsZTcC5LUAA2 hDnDSs8iDejLW+sVF5hxbYLRmn6fE7CX1RroiD2DyxvfRB5BOtGGCB1umZz8Bd9mKY7z D0nDjP6arkEJMcz6/+yOJDywdlwG8pD2/DULOd2XExceFAViE8z/nt6AzWGAFJCTuz2n x7B67fhqfoT05m0fDo3nWzYMqoOqlB/7TZSE1saDnFwA0D15PS/tAenn8BdkEAZU4qHv bM8w== ARC-Authentication-Results: i=1; mx.google.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cr20-20020a170906d55400b0079198b89adbsi1774008ejc.890.2023.01.06.07.42.45; Fri, 06 Jan 2023 07:42:46 -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; 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 8F40868BCEB; Fri, 6 Jan 2023 17:42:43 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.frobbit.se (mail.frobbit.se [85.30.129.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 062E768BCC0 for ; Fri, 6 Jan 2023 17:42:37 +0200 (EET) Received: from laptop.lan (h-79-136-39-105.A258.priv.bahnhof.se [79.136.39.105]) by mail.frobbit.se (Postfix) with ESMTPSA id 9223E1FD26 for ; Fri, 6 Jan 2023 16:42:36 +0100 (CET) Message-ID: <1a215429e2ac714005e4bc2ccb08c0c3d0bf9356.camel@haerdin.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Fri, 06 Jan 2023 16:42:36 +0100 User-Agent: Evolution 3.38.3-1+deb11u1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] lavc/mediacodecenc: Probe supported pixel formats 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: pofX/5Ln40fi From eb6d090967b8ed7ea0ee0651a1f557633fa23517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Thu, 22 Dec 2022 13:29:58 +0100 Subject: [PATCH 1/2] lavc/mediacodecenc: Probe supported pixel formats For each entry in color_formats[] an encoder is configured and opened. If this succeeds then the corresponding pixel format is added to probed_pix_fmts[]. This patch has been released by Epic Games' legal department. --- libavcodec/mediacodecenc.c | 76 ++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c index 4c1809093c..fd90d41625 100644 --- a/libavcodec/mediacodecenc.c +++ b/libavcodec/mediacodecenc.c @@ -2,6 +2,7 @@ * Android MediaCodec encoders * * Copyright (c) 2022 Zhao Zhili + * Modifications by Epic Games, Inc., 2022. * * This file is part of FFmpeg. * @@ -89,12 +90,8 @@ static const struct { { COLOR_FormatSurface, AV_PIX_FMT_MEDIACODEC }, }; -static const enum AVPixelFormat avc_pix_fmts[] = { - AV_PIX_FMT_MEDIACODEC, - AV_PIX_FMT_YUV420P, - AV_PIX_FMT_NV12, - AV_PIX_FMT_NONE -}; +// filled in by mediacodec_init_static_data() +static enum AVPixelFormat probed_pix_fmts[FF_ARRAY_ELEMS(color_formats)+1]; static void mediacodec_output_format(AVCodecContext *avctx) { @@ -534,6 +531,69 @@ static av_cold int mediacodec_close(AVCodecContext *avctx) return 0; } +static av_cold void mediacodec_init_static_data(FFCodec *ffcodec) +{ + const char *codec_mime = ffcodec->p.id == AV_CODEC_ID_H264 ? "video/avc" : "video/hevc"; + FFAMediaCodec *codec; + int num_pix_fmts = 0; + int use_ndk_codec = !av_jni_get_java_vm(NULL); + + if (!(codec = ff_AMediaCodec_createEncoderByType(codec_mime, use_ndk_codec))) { + av_log(NULL, AV_LOG_ERROR, "Failed to create encoder for type %s\n", codec_mime); + return; + } + + for (int i = 0; i < FF_ARRAY_ELEMS(color_formats); i++) { + if (color_formats[i].pix_fmt == AV_PIX_FMT_MEDIACODEC) { + // assumme AV_PIX_FMT_MEDIACODEC always works + // we don't have a context at this point with which to test it + probed_pix_fmts[num_pix_fmts++] = color_formats[i].pix_fmt; + } else { + FFAMediaFormat *format; + int ret; + + if (!(format = ff_AMediaFormat_new(use_ndk_codec))) { + av_log(NULL, AV_LOG_ERROR, "Failed to create media format\n"); + ff_AMediaCodec_delete(codec); + continue; + } + + ff_AMediaFormat_setString(format, "mime", codec_mime); + ff_AMediaFormat_setInt32(format, "width", 1280); + ff_AMediaFormat_setInt32(format, "height", 720); + ff_AMediaFormat_setInt32(format, "color-format", color_formats[i].color_format); + ff_AMediaFormat_setInt32(format, "bitrate", 1000000); + ff_AMediaFormat_setInt32(format, "bitrate-mode", BITRATE_MODE_VBR); + ff_AMediaFormat_setInt32(format, "frame-rate", 30); + ff_AMediaFormat_setInt32(format, "i-frame-interval", 1); + + // no need to set profile, level or number of B-frames it seems + ret = ff_AMediaCodec_getConfigureFlagEncode(codec); + ret = ff_AMediaCodec_configure(codec, format, NULL, NULL, ret); + if (ret) { + av_log(NULL, AV_LOG_ERROR, "MediaCodec configure failed, %s\n", av_err2str(ret)); + goto bailout; + } + + ret = ff_AMediaCodec_start(codec); + if (ret) { + av_log(NULL, AV_LOG_ERROR, "MediaCodec failed to start, %s\n", av_err2str(ret)); + goto bailout; + } + ff_AMediaCodec_stop(codec); + + probed_pix_fmts[num_pix_fmts++] = color_formats[i].pix_fmt; + bailout: + // format is never NULL here + ff_AMediaFormat_delete(format); + } + } + + probed_pix_fmts[num_pix_fmts] = AV_PIX_FMT_NONE; + ffcodec->p.pix_fmts = probed_pix_fmts; + ff_AMediaCodec_delete(codec); +} + static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = { &(const AVCodecHWConfigInternal) { .public = { @@ -579,7 +639,7 @@ static const AVClass name ## _mediacodec_class = { \ #define DECLARE_MEDIACODEC_ENCODER(short_name, long_name, codec_id) \ MEDIACODEC_ENCODER_CLASS(short_name) \ -const FFCodec ff_ ## short_name ## _mediacodec_encoder = { \ +FFCodec ff_ ## short_name ## _mediacodec_encoder = { \ .p.name = #short_name "_mediacodec", \ CODEC_LONG_NAME(long_name " Android MediaCodec encoder"), \ .p.type = AVMEDIA_TYPE_VIDEO, \ @@ -587,7 +647,6 @@ const FFCodec ff_ ## short_name ## _mediacodec_encoder = { \ .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY \ | AV_CODEC_CAP_HARDWARE, \ .priv_data_size = sizeof(MediaCodecEncContext), \ - .p.pix_fmts = avc_pix_fmts, \ .init = mediacodec_init, \ FF_CODEC_RECEIVE_PACKET_CB(mediacodec_encode), \ .close = mediacodec_close, \ @@ -595,6 +654,7 @@ const FFCodec ff_ ## short_name ## _mediacodec_encoder = { \ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \ .p.wrapper_name = "mediacodec", \ .hw_configs = mediacodec_hw_configs, \ + .init_static_data = mediacodec_init_static_data, \ }; \ #if CONFIG_H264_MEDIACODEC_ENCODER -- 2.30.2