From patchwork Wed Aug 24 01:40:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 37428 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp2229450pzh; Tue, 23 Aug 2022 18:41:02 -0700 (PDT) X-Google-Smtp-Source: AA6agR5XjD4oeGNdsndZ4c2LZ8dT7H3g1F9to6gUueA1FgOFpPEreJxsofyykG5OpxZNkHAb1VZu X-Received: by 2002:a17:906:9bd8:b0:73d:83d1:2222 with SMTP id de24-20020a1709069bd800b0073d83d12222mr1375778ejc.557.1661305262113; Tue, 23 Aug 2022 18:41:02 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v7-20020aa7cd47000000b0043bba5ae2bfsi453220edw.409.2022.08.23.18.41.01; Tue, 23 Aug 2022 18:41:02 -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=@outlook.com header.s=selector1 header.b=dEMF8yYb; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 01F5C68B9ED; Wed, 24 Aug 2022 04:40:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2071.outbound.protection.outlook.com [40.92.91.71]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DD51668B9DD for ; Wed, 24 Aug 2022 04:40:31 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PhA/2kvW7mgBh0CJ4yItxltcJosIxPN9jCHOqmELxC5TI/JKa0lQQe2rhhkEenFmxYf9GMNCmJbaOVo1D2UWj3dLjZuhlj3fVANwS1NLuBHo6U5JUOyNrwImSk/o47CEW6tlt1uxjT8ob4dpL0292wT46Ho0UdtDrQD4sbBUjfGzcOnE1KJW6ji1ZWvuBSZIVJFkwRbRMAQFBnQuNJjfGsGOfPlZ56ISSFykfRNAnWkBtMTovUXWQmMyUzvdBqjbHXD5ua2Wv1NQC6rXuBoMnscRr90MIhCgdYgnmz9MRbsmqmgx8ibGbRGLcMYb3ygsQ//Syr+0Q7mHvcpquALsEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OpYBkYTg4guvh+j2N/V9J8Dkkvb5v3DEuFsjiJtDHn4=; b=OMo37hJHFpCi0imnJCBSKIhc1cos82f6QXvBrYCzPlH8Qroi7sMk83CKiEB61/tEhlATznHJBwl+KwmsWyr+3iQkPRw7DGN+oBpOJNiJFNtkPp/VOQI2hvK8wIMBeQp829ipC2IkJK6chXnePZjWD6BdF3IUTenW2JT6BTMn3dWNYhvwXdMzL5pR1Zy6Z2Gqgj9mVdVX8khSsp081ItXibahAHtiVFgCpCwnt2TDXe0P+jsUOG21Gkod4YJAU3eDctGKbzqmE3YIOJYUd7Wu4tOf3xyH7YGcuTxqR580+ncoCRVNH0p2BIoKkt6idvZGEPfxyoWlPysunFuqzNSDug== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OpYBkYTg4guvh+j2N/V9J8Dkkvb5v3DEuFsjiJtDHn4=; b=dEMF8yYbEDkaWpx4ThUbhr9ZacsNIBsvrpM/18i/q8OpYSxzLw/veVelgjT3IvRz+oe07O8k4al+FdPalzdXuRIA09uRe4Ipxjud/oKO/I35aZPkIw4vZpf7LrIUnryci7f4MJnphSzk1CGt/7xOym5ymN9shWbtB3TRXFY41oJuxNztYxvL99YlFE4eygffzTdmZJ7oUS5z9sUQuPszqTc2VSZheBuVVbHRaR5DkrGG6r9iCSI/jCLWvITqtqzZM80ga8S+lEVfunmSIUPCCyTP7qh6TcEBnea8ENS22GWxPbAo7le8DtGMU6lS8CuE9F0eAvV1xwavkPKymiRuLQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by AS4PR01MB8966.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4e5::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Wed, 24 Aug 2022 01:40:22 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5546.022; Wed, 24 Aug 2022 01:40:22 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Aug 2022 03:40:01 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [lc3JPz4yQ2bmkJ9Qk6cQ1ajPtl8RMfzv] X-ClientProxiedBy: ZR0P278CA0110.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:20::7) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220824014006.2441856-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0ff2845b-70ad-4880-e8cb-08da85719bdc X-MS-Exchange-SLBlob-MailProps: EgT5Wr3QDKxUnxcm+B0m2g2rXtiL3/xX+JXlwXiSjyHQB+qBSLzg1maC65arnXSWxfc2Lgv1wMUBO1Ig+DjsSxkIGlQE/bRk/PWh5+wYlrNq5WpjUIDF3V6KJ9yIWwbvifJ005Rgd1QpZEwqueKjB4flJWVgtBrhk7qimUch18PY3a872hU1CkPJhq4Ok3cBngcgFeHWJE89efDxMrpwt6isBTlkJI+Jbs0F2jkybbM0pJEasyZ1hRZYMTkyt4k4+QYEUFjVnPPtlveLuNeY2EPZB6ZYRFYd2ktMRtk5/b54WNpbIjMWzOkQLsF0AFNebFWx8RNn1ho2DcJTN9EQZ9rCtxmUqa1GE6EqbH7mPDLCS/Q/Wf+bVmqG5g2OIDQoF9wsOUaWje8DR5jDToGz94Lj5W9jcoouHMFA+LeNxxAofum3qQx+HZonDx2naRoPAmRI8Gyk/VM+GMmqpHihnTdz0LRGA08nwGd+PwBzSXAWqwRefACS4mzP7d71+7wu8ByULoa2AIDkUpwr5hQhpb+cKh8nv0/Pkl2xaRGJOhg6X/xW5U5lQUUQ1HkjTSZ28kEKvrM7LZv/yn/AtbWcRTeeM2u3NvmfIepuCIgejNAnEW0STrYyu3NXszqeXQekrAZlVRnzWCJxjJSjuVBtkSs+pxUix6XSJXjzzzTGX3VIYPmBnPQtMTbUS1O3u2LtBS+HpRm159hVV2vjfo8ryZaoYqrzXJrESEiYZgxuhtQ= X-MS-TrafficTypeDiagnostic: AS4PR01MB8966:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: XRuG5IfGb73ucAh0zBE8G2wYmXCRo+SyYxtXp2YgZq/JaCcMG2RJull7U4UFP5n7bqtCwZ4Mpe1HTW8t75XenF9uU8c5NlChV5LKOhbfvIGcCk0P9+I5KyaXQdKec77Ca8/wc7Zjm5ETP/Lk1hscQr/Y86rhErmAxMmlfWCE7X/eFudhnWeJk875NQqTzHORUPS5luN6x8deFjqJAcgysssUZWnwolGtxW85IjQMACp6DVxqt10VFSyWbVSFty4KjaI+ECUlP9lScFQm8fK6i52s4aRhKWdCK5kcHAICr4QSRSxnIDW8w89Fg7IvIaaqRYN7YKq8LsgOmntQB5PnAMaxT25WKgyrxQWD65pZ8Ye4fnJgeP5gcYmrELfJUrEGaktYg4GYve5+xqW+4p6D5LzdQkpqEm2XoeR9QY2yG19VoOVsZVIBCHQ26vNRxpCokyxGIP5jdkIXpHLKxwPtjwxmZNp+7oQbVW/fh8ShpFGKPkFG3Vy/7hBySfylrpV9YUe7l6WKp3DWA3hJbUDEjLJ9TwprGfEiIlpDcc4K3rlNr6vMT/47HLacBpYO6Ags1WNQLZz+d1iywfgbcQ5AX/DeITeYU8KR8gUv45Tsa77lEcQG4tcZ+Ij+lS09gSC1pCw5qrgrspV72SmFipGvAQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pRLgwIp0mcGPGiNu3JMbag+tGatRKCONCF5TQf7ZEwfxkFTk7bCRBx2FmDKk0xMxyhn+BtkiRQ8HVCQlNyP5N8ZuLGxLHLZQFpKYIbEjnAWv6ROW1zJppu53IzmcIbelXkwthYDVs/Dbj5xt7st5O+1vTVzXLSTFelmKcMFZBkg4x9M6W4l9CNPaEylxV11CssmWGNZpJ7hRdRkwEjfq3pZIsijOPeMzqPIflg5qz2bQotuAC4dXytmqO+CY9Rc08k0566sn/wk6hfRFGc/+jkZQ+bLhP4wMNuPwI7pXVQYTxIPmQGwD4zOmHEZ9XzZqqcUc20+SvfRJGcxXmoC4MoGQ09XC2wQaXljznZ/UwDhlA3aLv3blCnJ22/Od03XAVuNX/qlfDIBTUEvgHXC+hEjbwikQCOoLN8lQ6ux+npLXuN9rTrNsfqrsZoRXRpR7vGED2xpLQBjR34StE9Vo0vaUjH9/92xL0LVYb1MF2Dszv+0+Fb0PaMR6QBNIQeofGOEt0ny4Jnm7dRIoqrL+YieG+qKy3/nlypod9GDsKmMSincww5YUI3p1YmmzMhTyhgqppLcpgHV7RJ3VVcvK0r0hxYy3GGjtvy5GZfIym2bGa2Hg5+Gue0z0gcDwI0WuhxPAh7yVKZAOi6xjw52EnxX8bsrfyQqsAbc1OzIlKua3vAMvbp1ROPs3ktKht3eZNhhFk6EGOjjztxPANgQZI5ikSVe5+JfQ8/fxZ4LztE/Q3LHG93MsfG3DCycFnZBx0VtQon4MpeS+/oQh29t4dbyi0VZIHvYGmxJb3vdtND9aHzoXc5+HETscSFoc1e9EfqzEkfGMVaXIKEQd/cVvpcV7O0bQEJvk7QcTmTvRLMiK2YlrsHpT+buCgEfdxF58elkmIUwMRKiQjoD7gVrMyk/k7LgNE6Zmzc6+ZkD/gyCOp+OX7dbNmLEvo3YOoeZ27p2gPZ3vRRTnRIsAKzLctx3kT6whIZJmj3m8VqXDeSnZvQl1oRueZmM1DYBFen3RajI60UT01BIuJVjH/40hyl4GFIkMEj3+pj2qjVlXvtnJh4fb5ql8llH7Bl1l5cnDVsYf1H/4wPeHrNmfmQBpe+l+NW1ofb4IyZpLndgpNM2Dt/VgLBcHIvWYvy45qXL3hUrdqtuuZLsJu2noZsuHioKeRUPqGajEqLw7orcy80DmCQoQhKBVIojy39I/sbhMDrYhlK4o1NhG2uNPwMMSr7qVfNPRJrvkNZRh0XknovBFAyl/CNawcAKF/XaslOkzxxgfW0NBQzwZi7oJ7jSjbMkbDuxbYbb6Ovg90jdmFN0= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0ff2845b-70ad-4880-e8cb-08da85719bdc X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2022 01:40:22.1747 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR01MB8966 Subject: [FFmpeg-devel] [PATCH 06/11] avcodec/encode, frame_thread_encoder: Unify calling encode callback 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: AgTd4OiuzJD8 The encode-callback (the callback used by the FF_CODEC_CB_TYPE_ENCODE encoders) is currently called in two places: encode_simple_internal() and by the worker threads of frame-threaded encoders. After the call, some packet properties are set based upon the corresponding AVFrame properties and the packet is made refcounted if it isn't already. So there is some code duplication. There was also non-duplicated code in encode_simple_internal() which is executed even when using frame-threading. This included an emms_c() (which is needed for frame-threading, too, if it is needed for the single-threaded case, because there are allocations (via av_packet_make_refcounted()) immediately after returning from the encode-callback). Furthermore, some further properties are only set in encode_simple_internal(): For audio, pts and duration are derived from the corresponding fields of the frame if the encoder does not have the AV_CODEC_CAP_DELAY set. Yet this is wrong for frame-threaded encoders, because frame-threading always introduces delay regardless of whether the underlying codec has said cap. This only worked because there are no frame-threaded audio encoders. This commit fixes the code duplication and the above issue by factoring this code out and reusing it in both places. It would work in case of audio codecs with frame-threading, because now the values are derived from the correct AVFrame. Signed-off-by: Andreas Rheinhardt --- libavcodec/encode.c | 86 ++++++++++++++++--------------- libavcodec/encode.h | 3 ++ libavcodec/frame_thread_encoder.c | 12 ++--- 3 files changed, 50 insertions(+), 51 deletions(-) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 01b59bbf70..f7b13c8ba1 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -172,6 +172,48 @@ int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame) return 0; } +int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet) +{ + const FFCodec *const codec = ffcodec(avctx->codec); + int ret; + + ret = codec->cb.encode(avctx, avpkt, frame, got_packet); + emms_c(); + av_assert0(ret <= 0); + + if (!ret && *got_packet) { + if (avpkt->data) { + ret = av_packet_make_refcounted(avpkt); + if (ret < 0) + goto unref; + // Date returned by encoders must always be ref-counted + av_assert0(avpkt->buf); + } + + if (avctx->codec->type == AVMEDIA_TYPE_VIDEO && + !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) + avpkt->pts = avpkt->dts = frame->pts; + if (frame && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) { + if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) { + if (avpkt->pts == AV_NOPTS_VALUE) + avpkt->pts = frame->pts; + if (!avpkt->duration) + avpkt->duration = ff_samples_to_time_base(avctx, + frame->nb_samples); + } + } + if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) { + avpkt->dts = avpkt->pts; + } + } else { +unref: + av_packet_unref(avpkt); + } + + return ret; +} + static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt) { AVCodecInternal *avci = avctx->internal; @@ -204,58 +246,18 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt) av_assert0(codec->cb_type == FF_CODEC_CB_TYPE_ENCODE); if (CONFIG_FRAME_THREAD_ENCODER && avci->frame_thread_encoder) - /* This might modify frame, but it doesn't matter, because - * the frame properties used below are not used for video - * (due to the delay inherent in frame threaded encoding, it makes - * no sense to use the properties of the current frame anyway). */ + /* This might unref frame. */ ret = ff_thread_video_encode_frame(avctx, avpkt, frame, &got_packet); else { - ret = codec->cb.encode(avctx, avpkt, frame, &got_packet); - if (avctx->codec->type == AVMEDIA_TYPE_VIDEO && !ret && got_packet && - !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) - avpkt->pts = avpkt->dts = frame->pts; - } - - av_assert0(ret <= 0); - - emms_c(); - - if (!ret && got_packet) { - if (avpkt->data) { - ret = av_packet_make_refcounted(avpkt); - if (ret < 0) - goto end; - } - - if (frame && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) { - if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) { - if (avpkt->pts == AV_NOPTS_VALUE) - avpkt->pts = frame->pts; - if (!avpkt->duration) - avpkt->duration = ff_samples_to_time_base(avctx, - frame->nb_samples); - } - } - if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) { - avpkt->dts = avpkt->pts; - } + ret = ff_encode_encode_cb(avctx, avpkt, frame, &got_packet); } if (avci->draining && !got_packet) avci->draining_done = 1; -end: - if (ret < 0 || !got_packet) - av_packet_unref(avpkt); - if (frame) av_frame_unref(frame); - if (got_packet) - // Encoders must always return ref-counted buffers. - // Side-data only packets have no data and can be not ref-counted. - av_assert0(!avpkt->data || avpkt->buf); - return ret; } diff --git a/libavcodec/encode.h b/libavcodec/encode.h index bc77918d8f..10c36435ad 100644 --- a/libavcodec/encode.h +++ b/libavcodec/encode.h @@ -75,4 +75,7 @@ int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size); */ int ff_encode_preinit(AVCodecContext *avctx); +int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet); + #endif /* AVCODEC_ENCODE_H */ diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index b5765b6343..0d8134b258 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -29,6 +29,7 @@ #include "libavutil/thread.h" #include "avcodec.h" #include "codec_internal.h" +#include "encode.h" #include "internal.h" #include "pthread_internal.h" #include "thread.h" @@ -80,7 +81,7 @@ static void * attribute_align_arg worker(void *v){ ThreadContext *c = avctx->internal->frame_thread_encoder; while (!atomic_load(&c->exit)) { - int got_packet = 0, ret; + int ret; AVPacket *pkt; AVFrame *frame; Task *task; @@ -105,14 +106,7 @@ static void * attribute_align_arg worker(void *v){ frame = task->indata; pkt = task->outdata; - ret = ffcodec(avctx->codec)->cb.encode(avctx, pkt, frame, &got_packet); - if(got_packet) { - int ret2 = av_packet_make_refcounted(pkt); - if (ret >= 0 && ret2 < 0) - ret = ret2; - pkt->pts = pkt->dts = frame->pts; - } - task->got_packet = got_packet; + ret = ff_encode_encode_cb(avctx, pkt, frame, &task->got_packet); pthread_mutex_lock(&c->buffer_mutex); av_frame_unref(frame); pthread_mutex_unlock(&c->buffer_mutex);