From patchwork Mon Aug 8 08:57:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 37183 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:92a9:b0:8d:7f3b:94fc with SMTP id q41csp1706658pzg; Mon, 8 Aug 2022 01:58:04 -0700 (PDT) X-Google-Smtp-Source: AA6agR6d5hny3WNH/ia+R4G1S1buaJ7BIo24yntlADxNTtIkNirzkKHzZCFYYHcl0m5wOjkoxLNu X-Received: by 2002:a05:6402:540c:b0:434:d965:f8a with SMTP id ev12-20020a056402540c00b00434d9650f8amr17028608edb.30.1659949084752; Mon, 08 Aug 2022 01:58:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659949084; cv=none; d=google.com; s=arc-20160816; b=Dcv5mYtdMIyfBZoy+5gC+Hf1ZopMZiEY+ni+aKKk4nf1pKZ/8iEwTAzK/+cJGUkiO0 DR+qi6ZY86WMpFGR+BYJbD4iKodSwVn+9vQygpUUFO7fJ3eILzQKZNB7L9YcZ+p+HIMk 4lG1AQA1fqj0WVSnADVPwp9RmR77YyBBKLGOaiPbOpKdlb+4EC4P7mp9/oQPUAWHoMrV f647oZsudR/FWSQ36bM7DFNQqMmn1Nu59VioRnCOelR0hQM58ShiuV7QHmN52XxKprfe UmUegREtbQgi6g4Msc1nUf3II/6EkFRBNWtKe7UhNWeIVLTrF51I0ZD0HyVuCadsi6Q2 BVBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=rszK+atx3KbCyLpYUi9qItH6OqOvbmBGvLSB4iVxT4U=; b=eJaNDNoGUpGZDR4RIdVSsSKsrHtXDD5fl6OWrwA3BP53/XMJhWKXClLSwNiGFENuas 2KenHoCnmyTF7uvcfNBvS5lp8r810yNHlun2iiNdCJW4zqVFIR7FS1ncVKIBrNEGy/y0 DiPHxX/yElt9lDYnpMSUJAxUxxUqYOMPvGCv8M/Vcodb5P8miPTQdhVrrECwFmCLKwTP T/eaeM4QSI5LuA4nm3wqIPZqiiSg58VKcA6QNNuf0w4PdzHSwhU9tW0n2yW4DhQa8bD0 bLlAuw3U+vk6A68a4HOfkR3A+rB+G9K/+y+CM4FktUGwLyXvx+j/VmH1ds2aT4WbDQde P1Nw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@martin-st.20210112.gappssmtp.com header.s=20210112 header.b=XeutB65d; 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 cw6-20020a056402228600b00440072d0ae3si5445305edb.196.2022.08.08.01.58.04; Mon, 08 Aug 2022 01:58:04 -0700 (PDT) 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=@martin-st.20210112.gappssmtp.com header.s=20210112 header.b=XeutB65d; 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 7EB1768B747; Mon, 8 Aug 2022 11:58:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C4B4468B308 for ; Mon, 8 Aug 2022 11:57:55 +0300 (EEST) Received: by mail-lf1-f41.google.com with SMTP id v2so3068086lfi.6 for ; Mon, 08 Aug 2022 01:57:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=R6TTMV5WV5CkX9wEBGpSjzwvmE8w2ojrH0BFp38QnFY=; b=XeutB65dUJy5e0DxWIC/GS4U9ACOLYQoDh3fNwT1gSKzEoR5H1F1u6ybAHMBJqZVmT ctiXJodwhkuvoRmUY6Bky5N7sSMok9VTGl1Jdiv0iSWZhnHGDHRdfDN1+XIR7WaLQwUa JlZIUW0wM5Wf+H/tYE1J/P3wgEz8Gfo0C1+3D014hTRiiDhZfDeIJ6uHkc1ujp2W9TJG UfDe7sjfzLTiFnVxzY6J9ZkDDHD0h3mBxqUTqNgy7at7XVFENDN86kLTuz9I+6okRFZL lpI7k3IOctAQakjdFimCAMIuRRg9APwdkUaFg/kGPyNGVV3wzk8YWWrHh4ETfPzXV8hf BZwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=R6TTMV5WV5CkX9wEBGpSjzwvmE8w2ojrH0BFp38QnFY=; b=Tm/NshEQhvcXdCXJnzcmDtx1DIObCs5y+EbG/ZJImqDnUrXuKbUfa5V1JiLDaplSZv YZcxJ8aHdxThvbw9jcxXNZAuuZx3HbV6G7VWSKTJD/NvF2gtXkIGd0ItFe/0zxDgcgNp P9lZ5iBGCWWrypE/ezbrAwGBMgkzxbOMivDKhY7ss0oG3ARqMSnPDUrVs9D52kkuw/Bq jPbMiMfpeuIP2nAO2AH8+rA+plrylUeNONj7M0AhY9hTRau0xy3oQ8QiJR7MAHIFbYKL OoZ9LZn6BUHVQKxLYS8TlIp3hyv+VMJciZ6jY4pI1xthvwfKKIja893qkQWW2ZKioxzn 1jKQ== X-Gm-Message-State: ACgBeo0cpBzPiBiop0nh2lsLqo1vxdzr1C8Fh+TUmQb2qIW4LTFanpA7 wlrldN2KjUW6pv/ZPgKFQBeBm+i8cVE22z8/ X-Received: by 2002:a05:6512:3991:b0:48b:3313:2576 with SMTP id j17-20020a056512399100b0048b33132576mr6528988lfu.136.1659949074851; Mon, 08 Aug 2022 01:57:54 -0700 (PDT) Received: from localhost (dsl-tkubng21-58c01c-243.dhcp.inet.fi. [88.192.28.243]) by smtp.gmail.com with ESMTPSA id f12-20020a2eb5ac000000b0025e6a3556ffsm1300541ljn.22.2022.08.08.01.57.54 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 08 Aug 2022 01:57:54 -0700 (PDT) From: =?utf-8?q?Martin_Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Aug 2022 11:57:53 +0300 Message-Id: <20220808085753.76161-1-martin@martin.st> X-Mailer: git-send-email 2.32.0 (Apple Git-132) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavc/libx264: support AV_CODEC_CAP_ENCODER_RECON_FRAME 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: +mMimx3xA5m2 From: Anton Khirnov Bump the version requirement to 122, which introduced b_full_recon. --- configure | 2 +- libavcodec/libx264.c | 55 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/configure b/configure index eb413a6716..700003aba3 100755 --- a/configure +++ b/configure @@ -6675,7 +6675,7 @@ enabled libwebp && { enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; } enabled libx264 && require_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode && - require_cpp_condition libx264 x264.h "X264_BUILD >= 118" && { + require_cpp_condition libx264 x264.h "X264_BUILD >= 122" && { [ "$toolchain" != "msvc" ] || require_cpp_condition libx264 x264.h "X264_BUILD >= 158"; } && check_cpp_condition libx262 x264.h "X264_MPEG2" diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index e8c1fb2106..6afa3cdadb 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -311,6 +311,28 @@ static void free_picture(AVCodecContext *ctx) pic->extra_sei.num_payloads = 0; } +static enum AVPixelFormat csp_to_pixfmt(int csp) +{ + switch (csp) { +#ifdef X264_CSP_I400 + case X264_CSP_I400: return AV_PIX_FMT_GRAY8; + case X264_CSP_I400 | X264_CSP_HIGH_DEPTH: return AV_PIX_FMT_GRAY10; +#endif + case X264_CSP_I420: return AV_PIX_FMT_YUV420P; + case X264_CSP_I420 | X264_CSP_HIGH_DEPTH: return AV_PIX_FMT_YUV420P10; + case X264_CSP_I422: return AV_PIX_FMT_YUV422P; + case X264_CSP_I422 | X264_CSP_HIGH_DEPTH: return AV_PIX_FMT_YUV422P10; + case X264_CSP_I444: return AV_PIX_FMT_YUV444P; + case X264_CSP_I444 | X264_CSP_HIGH_DEPTH: return AV_PIX_FMT_YUV444P10; + case X264_CSP_NV12: return AV_PIX_FMT_NV12; +#ifdef X264_CSP_NV21 + case X264_CSP_NV21: return AV_PIX_FMT_NV21; +#endif + case X264_CSP_NV16: return AV_PIX_FMT_NV16; + }; + return AV_PIX_FMT_NONE; +} + static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int *got_packet) { @@ -496,6 +518,33 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0) return AVERROR_EXTERNAL; + if (nnal && (ctx->flags & AV_CODEC_FLAG_RECON_FRAME)) { + AVCodecInternal *avci = ctx->internal; + + av_frame_unref(avci->recon_frame); + + avci->recon_frame->format = csp_to_pixfmt(pic_out.img.i_csp); + if (avci->recon_frame->format == AV_PIX_FMT_NONE) { + av_log(ctx, AV_LOG_ERROR, + "Unhandled reconstructed frame colorspace: %d\n", + pic_out.img.i_csp); + return AVERROR(ENOSYS); + } + + avci->recon_frame->width = ctx->width; + avci->recon_frame->height = ctx->height; + for (int i = 0; i < pic_out.img.i_plane; i++) { + avci->recon_frame->data[i] = pic_out.img.plane[i]; + avci->recon_frame->linesize[i] = pic_out.img.i_stride[i]; + } + + ret = av_frame_make_writable(avci->recon_frame); + if (ret < 0) { + av_frame_unref(avci->recon_frame); + return ret; + } + } + ret = encode_nals(ctx, pkt, nal, nnal); if (ret < 0) return ret; @@ -928,6 +977,9 @@ static av_cold int X264_init(AVCodecContext *avctx) if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) x4->params.b_repeat_headers = 0; + if (avctx->flags & AV_CODEC_FLAG_RECON_FRAME) + x4->params.b_full_recon = 1; + if(x4->x264opts){ const char *p= x4->x264opts; while(p){ @@ -1223,7 +1275,8 @@ FFCodec ff_libx264_encoder = { .p.id = AV_CODEC_ID_H264, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS | - AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, + AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE | + AV_CODEC_CAP_ENCODER_RECON_FRAME, .p.priv_class = &x264_class, .p.wrapper_name = "libx264", .priv_data_size = sizeof(X264Context),