From patchwork Thu Jan 26 09:45:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 40124 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3ca3:b0:b9:1511:ac2c with SMTP id b35csp387178pzj; Thu, 26 Jan 2023 01:46:07 -0800 (PST) X-Google-Smtp-Source: AMrXdXst8HYt2AEu+DAzGwoUY3JwZSuVxQfGL8nLHl/3Cfq+AqkBqClCUzUfCJNPgWvc044kLK2y X-Received: by 2002:a05:6402:f20:b0:468:58d4:a0f2 with SMTP id i32-20020a0564020f2000b0046858d4a0f2mr44077776eda.23.1674726366991; Thu, 26 Jan 2023 01:46:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674726366; cv=none; d=google.com; s=arc-20160816; b=GseUBgjJrbFhCeBwQvdRUKorAAQKpybYWPah4r9oiPgaz6oEjQFAPCRSKn9IBHCi1g TVF+0HjUyrxhe2VAQHMAiP3D//eCU5wqRQVvEk/vgxB/uUoL+MaWmNXvDWVEWB4pxY/q df81Dlncy7fonc+2u53Qaw2VAxKrncTBqjjL6dfOrinZrTdv7Xt1ghluGmMFCR+aPRKe N+IZa78XpmNjtDBmsd2VgmTFqNKO8AhJaNfnM2Omy8/1C89l672XdoxnSbwFolEOn/8f xH1cP3E1Vzwmzrdo3i2VtXqEEAgUe0j1Nvvi2RKBYJ1knV02OH+cX3uOb1NcmH7ykXs9 vIWA== 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:references:in-reply-to:message-id :date:to:from:delivered-to; bh=/0wxNu8jZjLhRCqCTmn11SsMid8A6nQcJJ2hBIjp6nw=; b=0x+nnrxM9B+iPRois0Svbo0DWPwSfiQf/2VZf3TYUJjaLfOLoOEtSjU7VeeIIbFVoq tgTW6Gbpjd5SnUzo4lQP3EL7yQrMiNKYwUbGi6rV5cdtoPBOqsW1S9UL5d7odIVuU9qo vw0w2XOK3minMNZhqU54YvxCT4kyj3nEBBgMsr52EGyF4VPtNtgR/7eP6DHJEh/pe5F5 76nlGEmiJim0z3+R8b+OQ4SGLmb8hnkHaKZxrLhLh/z1gSA71c25yERBMtdH+qGBJUCD 18FS31OVRQEAAfcnC45BkprYO/Ez+NmhW2v4psyAtcfe776eW1WXGFl2+Yag2Ndw58bA ULzA== 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 j1-20020a170906104100b008779b708a5bsi867865ejj.288.2023.01.26.01.46.05; Thu, 26 Jan 2023 01:46:06 -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 1B23B68B607; Thu, 26 Jan 2023 11:46:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8F6ED68B0C1 for ; Thu, 26 Jan 2023 11:45:54 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 756D72404EC for ; Thu, 26 Jan 2023 10:45:53 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id QOL31CiWZnjz for ; Thu, 26 Jan 2023 10:45:52 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id AC33B240178 for ; Thu, 26 Jan 2023 10:45:52 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id EC0DF3A0101 for ; Thu, 26 Jan 2023 10:45:50 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Jan 2023 10:45:46 +0100 Message-Id: <20230126094546.21411-1-anton@khirnov.net> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20230125205130.GC1949656@pb2> References: <20230125205130.GC1949656@pb2> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavc/libwebpenc_animencoder: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE 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: REoq5bn4Wc9q --- libavcodec/libwebpenc_animencoder.c | 39 +++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/libavcodec/libwebpenc_animencoder.c b/libavcodec/libwebpenc_animencoder.c index 977f880d6c..440cae1de5 100644 --- a/libavcodec/libwebpenc_animencoder.c +++ b/libavcodec/libwebpenc_animencoder.c @@ -24,6 +24,8 @@ * WebP encoder using libwebp (WebPAnimEncoder API) */ +#include "libavutil/buffer.h" + #include "config.h" #include "codec_internal.h" #include "encode.h" @@ -35,6 +37,12 @@ typedef struct LibWebPAnimContext { LibWebPContextCommon cc; WebPAnimEncoder *enc; // the main AnimEncoder object int64_t first_frame_pts; // pts of the first encoded frame. + int64_t end_pts; // pts + duration of the last frame + + int64_t reordered_opaque; + void *first_frame_opaque; + AVBufferRef *first_frame_opaque_ref; + int done; // If true, we have assembled the bitstream already } LibWebPAnimContext; @@ -78,6 +86,17 @@ static int libwebp_anim_encode_frame(AVCodecContext *avctx, AVPacket *pkt, WebPDataClear(&assembled_data); s->done = 1; pkt->pts = s->first_frame_pts; + + if (pkt->pts != AV_NOPTS_VALUE && s->end_pts > pkt->pts) + pkt->duration = s->end_pts - pkt->pts; + + avctx->reordered_opaque = s->reordered_opaque; + if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) { + pkt->opaque = s->first_frame_opaque; + pkt->opaque_ref = s->first_frame_opaque_ref; + s->first_frame_opaque_ref = NULL; + } + *got_packet = 1; return 0; } else { @@ -107,8 +126,21 @@ static int libwebp_anim_encode_frame(AVCodecContext *avctx, AVPacket *pkt, goto end; } - if (!avctx->frame_number) + if (!avctx->frame_number) { s->first_frame_pts = frame->pts; + s->reordered_opaque = frame->reordered_opaque; + + if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) { + s->first_frame_opaque = frame->opaque; + ret = av_buffer_replace(&s->first_frame_opaque_ref, frame->opaque_ref); + if (ret < 0) + goto end; + } + } + + if (frame->pts != AV_NOPTS_VALUE) + s->end_pts = frame->pts + frame->duration; + ret = 0; *got_packet = 0; @@ -126,6 +158,8 @@ static int libwebp_anim_encode_close(AVCodecContext *avctx) av_frame_free(&s->cc.ref); WebPAnimEncoderDelete(s->enc); + av_buffer_unref(&s->first_frame_opaque_ref); + return 0; } @@ -134,7 +168,8 @@ const FFCodec ff_libwebp_anim_encoder = { CODEC_LONG_NAME("libwebp WebP image"), .p.type = AVMEDIA_TYPE_VIDEO, .p.id = AV_CODEC_ID_WEBP, - .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, + .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | + AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, .p.pix_fmts = ff_libwebpenc_pix_fmts, .p.priv_class = &ff_libwebpenc_class, .p.wrapper_name = "libwebp",