From patchwork Fri Jun 18 22:02:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 28579 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:c91a:0:0:0:0:0 with SMTP id z26csp2052313iol; Fri, 18 Jun 2021 15:02:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyxtiZMlW2ynSDNUbPl0sRkwbr6OZ2qtyjIGoieLEJI24AY2p7VCK2l8OVpy2FcS3XT3cx2 X-Received: by 2002:a17:907:8313:: with SMTP id mq19mr12740831ejc.245.1624053774599; Fri, 18 Jun 2021 15:02:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624053774; cv=none; d=google.com; s=arc-20160816; b=0qPMx99VxDxP2P9vNWb2WNRACF7KtSueiBtJoFdXYf6aFAjudBvQvqzzjgrU53XMSS E9N+by1OqcF+rgkzqikhAXDl//uyk7EdBgYgw5alFcMAex3mxptEXGThFduhWnnymblG c1i5JwDs+XgCgwQNj5kof3cCseSyzpT6FU3C9knqpYHQO10ndiaEnimkDWRmuqYlCLNR 1lT5BFDnvDdrDG43Hix16h+2VU5fEXhYWD9eBxH1RkZ1qPRu6nQUaPQ3ttO/sWocD51L ezzlTNn6xtsC/XvrDw1KPI5SSMPKE2eYUnlI2sWOWvFf9JbhvfXU/+N4xkRvUVzxZwzo Td+g== 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:dkim-signature:delivered-to; bh=mR2mtxvHNSL6OndhgLZR2fZzB1p95W9Ior34sh+bFnU=; b=z+A02slAD3zyMb6mn6v0kKcptbu9eEyEN6TQUxlLUEm3fYnn2eq1GODnyCA893XRRb ZVkj3JGseRB5kThOkfefikmBVb1n7XxrTUucNtgkDXLLju/xLmXoh/4k7yyuVR/8AO6c qnObqpMESh7dsSTs4k/tO2L4SoMYe70lay2gcVJXRlkpGmaA8gz4vb4WkJqjqMEjqFT3 ciMK8FNxw13L30ODVbsnyGBOKnrUZbqGP1Fu8v4zU2AVtUJw2WTK5TJ6F+XLAs7bi4Q3 33wSHf1t0hvTog/k+34bQBMH1ZBd3cUJDHjel6FlAtumBB16yOlUJBscQZwReVwWnGxY 7mOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=aeHzvPGx; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u5si5998154edy.95.2021.06.18.15.02.54; Fri, 18 Jun 2021 15:02:54 -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=@gmail.com header.s=20161025 header.b=aeHzvPGx; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 90AF5689721; Sat, 19 Jun 2021 01:02:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f176.google.com (mail-qk1-f176.google.com [209.85.222.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 093EF6802A4 for ; Sat, 19 Jun 2021 01:02:45 +0300 (EEST) Received: by mail-qk1-f176.google.com with SMTP id g142so14486157qke.4 for ; Fri, 18 Jun 2021 15:02:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=XcgLTHbOxA9PWQZegw5FE1x1cTlrY4aV7dskgmdDZM4=; b=aeHzvPGxjqJS82if8IycdBUWqk0djMljr3RAU+qvESpRw0vkn+wZ/geeeesGk+nsDy UA6zZldKdzPkxKOyV5WQGlPw12Qh9IMQEcwkQBkTCLwldpml2OJLNdqfToRBjwR+Nngx u5xeb3feDJcVlpxno6GVnjXnAAPwezx4ZHdYOm+lYX0RZqFo5jI6aSzpLNHUetBDLauY IYlWGHlD112vUcHW4QAn7rSGv55NeyRdoAW5KZSvPXtLXbTcyk8n4pZQ8lN3SAIz/0Y0 fQNlYYNOrhWRteCaI+IiwwRq2I4RxDDwLcrdyqRrD4eriKIJRio8riuH7opbd81bKQja j5fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XcgLTHbOxA9PWQZegw5FE1x1cTlrY4aV7dskgmdDZM4=; b=EOpM1LBboddTV0CKxrlDAjKmVOz1bLSi2x2JmV+WrN30bwpTXVuI/u0VE2p9EjXvYp NisLSqazhhuUlOZUAW745b3cNY4a89pYZijH4b75ZeNro0G+KGx89xrU0tC6nf5NQrIf DvLK6IsZDkbJ4fniImFj1399UIDIvShV6GyvxYxFaTRrsYm5DrX8DkazhwH7UPJM1HGJ r2nF4CH19095r2uJMYcoLxtK8ub5eVqDNNd+W/l0ny1PFo2Nmlg35DhgcSGCR8E+VdIb eZVJ7PRZwdWy5ubuzP+aHzLC9QqB6R4dlpWO7fgcI9J/7wFd8UW9xkyWhvA2zNPDoQj2 MNGg== X-Gm-Message-State: AOAM533bvHhcIE8Z7IUV50H2VbeITYBqIK3MX9OU31/eZnVH+fEI+Oqo sgGmX7OVeSsumLw9YZW2HwQfuSl58fs= X-Received: by 2002:a37:4096:: with SMTP id n144mr11338680qka.271.1624053763529; Fri, 18 Jun 2021 15:02:43 -0700 (PDT) Received: from localhost.localdomain ([191.84.225.169]) by smtp.gmail.com with ESMTPSA id 5sm4975334qkj.99.2021.06.18.15.02.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 15:02:43 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 18 Jun 2021 19:02:12 -0300 Message-Id: <20210618220213.52768-2-jamrial@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210618220213.52768-1-jamrial@gmail.com> References: <20210618220213.52768-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/decode: add an internal codec flag to signal a decoder sets all output frame properties 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: EvzcYAI++dIx Decoders like cuviddec ignore and overwrite all the properties set by the generic code as derived from AVCodecInternal.last_pkt_props. This flag ensures libavcodec will not store and potentially queue input packets that ultimately will not be used. Signed-off-by: James Almer --- libavcodec/decode.c | 21 ++++++++++++++------- libavcodec/internal.h | 5 +++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 44f0b11546..68acf0cf8f 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -233,9 +233,11 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt) if (ret < 0) return ret; - ret = extract_packet_props(avctx->internal, pkt); - if (ret < 0) - goto finish; + if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { + ret = extract_packet_props(avctx->internal, pkt); + if (ret < 0) + goto finish; + } ret = apply_param_change(avctx, pkt); if (ret < 0) @@ -487,11 +489,13 @@ static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, pkt->data += consumed; pkt->size -= consumed; - avci->last_pkt_props->size -= consumed; // See extract_packet_props() comment. pkt->pts = AV_NOPTS_VALUE; pkt->dts = AV_NOPTS_VALUE; - avci->last_pkt_props->pts = AV_NOPTS_VALUE; - avci->last_pkt_props->dts = AV_NOPTS_VALUE; + if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { + avci->last_pkt_props->size -= consumed; // See extract_packet_props() comment. + avci->last_pkt_props->pts = AV_NOPTS_VALUE; + avci->last_pkt_props->dts = AV_NOPTS_VALUE; + } } if (got_frame) @@ -533,7 +537,8 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) if (ret == AVERROR_EOF) avci->draining_done = 1; - if (IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) + if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) && + IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props, sizeof(*avci->last_pkt_props), NULL); @@ -1494,6 +1499,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) { AV_PKT_DATA_S12M_TIMECODE, AV_FRAME_DATA_S12M_TIMECODE }, }; + if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { frame->pts = pkt->pts; frame->pkt_pos = pkt->pos; frame->pkt_duration = pkt->duration; @@ -1519,6 +1525,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) } else { frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD); } + } frame->reordered_opaque = avctx->reordered_opaque; if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED) diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 975ec0ba30..586819cd1b 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -78,6 +78,11 @@ * Codec handles avctx->thread_count == 0 (auto) internally. */ #define FF_CODEC_CAP_AUTO_THREADS (1 << 7) +/** + * Codec handles output frame properties internally instead of letting the + * internal logic derive them from AVCodecInternal.last_pkt_props. + */ +#define FF_CODEC_CAP_SETS_FRAME_PROPS (1 << 8) /** * AVCodec.codec_tags termination value