From patchwork Sun May 17 14:07:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 19722 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1DF6C449795 for ; Sun, 17 May 2020 17:34:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E3E57680D13; Sun, 17 May 2020 17:34:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6162A6809BF for ; Sun, 17 May 2020 17:33:58 +0300 (EEST) Received: by mail-qk1-f193.google.com with SMTP id n14so7591495qke.8 for ; Sun, 17 May 2020 07:33:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=/HmsQ9j8I1pB4J1i1MRxIaSIiwcaKyhltvHx628jvOg=; b=ZWBcWYUFB7sLaO7EEiKgPLYjuG+hJamZFvrG2RicdGEVz5CD543bK3BQsuejjQ5n7F gxdMZf7XANWhihGkBywEAmF6A1te4ZbxSpdcM1fY55eDw2zjeG7FKFkRo5Bw0PBn9dbz A+H1f1tn+5qY4yEWNyLlPQpm/AFkp1EffpASTQJIQK9xUdblVWcN59kzFrff/K+sg+Ud MmzyegHXMNCA9w43ZS5b0SIObgxZfb3WmZ0f0Py+pS/69vaT0+HFn9mnOSf7LXQ+BfOD iLeJssW/f6NH3K7TACLouSVQzmAMAXJr26N7Q7L54GPwpygcHpPVsTtpfFoDVlTNf/fx 071g== 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:mime-version :content-transfer-encoding; bh=/HmsQ9j8I1pB4J1i1MRxIaSIiwcaKyhltvHx628jvOg=; b=KYfnsuCMNvyK0KWpU07X4n5ZTzZkkasHXt3H8X7ubqHgc03kqySrXdESbpswLDRDY8 ks4A5iKZuU4+S3nu/iw14q85ADylVSnGMHtRngUni3KMBnrQDfiRrYAj+olb7CtRnYdY sd0HNBLBe9id/H4zNNZ2yyofIds1rrghTFG9uKR1zd/PRf7S+YF9cSnr4UpHv/v4AXja Dr3YbwnGI3COmxcCuFOerCck/YSu5sCKdJjclp2/bWeny0Ar5jboF7wsMw+aQgS3yfvP CE9PxxVDJtF0lprGZsmkcIX6B0/dlsKbcH36BK+P/KQeiM26c+FmEuYLrzjqPpE/9Ulr bsbA== X-Gm-Message-State: AOAM530KeQ0e0gDyr2ZxXSFGGXeAGNEPLkEX2GgKtyzFsT0OMk/KWSpn vLgczFobeWkCPyDa0GreQ/VLtt33 X-Google-Smtp-Source: ABdhPJzRH76CfyEYHfxOJDZON+R4cK7qyagU8ZcMFE6lkrQZ0EPdF8y8AaYV/cS8A4x8c/kVSg64CQ== X-Received: by 2002:ac8:5653:: with SMTP id 19mr11903008qtt.252.1589724461109; Sun, 17 May 2020 07:07:41 -0700 (PDT) Received: from localhost.localdomain ([191.83.209.22]) by smtp.gmail.com with ESMTPSA id 124sm5949548qkl.76.2020.05.17.07.07.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 May 2020 07:07:40 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sun, 17 May 2020 11:07:17 -0300 Message-Id: <20200517140717.1953-1-jamrial@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/frame_thread_encoder: remove usage of avcodec_encode_video2() X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" Call the encoder's internal AVCodec.encode2() function instead. Signed-off-by: James Almer --- libavcodec/encode.c | 20 ++++++++++++-------- libavcodec/frame_thread_encoder.c | 14 ++++++++------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 9ed2cf0f59..1358f33ea5 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -277,14 +277,12 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, return AVERROR(ENOSYS); } - if(CONFIG_FRAME_THREAD_ENCODER && - avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME)) - return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr); - if ((avctx->flags&AV_CODEC_FLAG_PASS1) && avctx->stats_out) avctx->stats_out[0] = '\0'; - if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) { + if (!frame && + !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY || + (avctx->internal->frame_thread_encoder && avctx->active_thread_type & FF_THREAD_FRAME))) { av_packet_unref(avpkt); return 0; } @@ -299,7 +297,15 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, av_assert0(avctx->codec->encode2); - ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr); + + if (CONFIG_FRAME_THREAD_ENCODER && + avctx->internal->frame_thread_encoder && avctx->active_thread_type & FF_THREAD_FRAME) + ret = ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr); + else { + ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr); + if (!ret && *got_packet_ptr && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) + avpkt->pts = avpkt->dts = frame->pts; + } av_assert0(ret <= 0); emms_c(); @@ -326,8 +332,6 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, if (!ret) { if (!*got_packet_ptr) avpkt->size = 0; - else if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) - avpkt->pts = avpkt->dts = frame->pts; if (needs_realloc && avpkt->data) { ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE); diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 949bc69f81..cea0ea2af3 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -66,7 +66,7 @@ static void * attribute_align_arg worker(void *v){ AVPacket *pkt = NULL; while (!atomic_load(&c->exit)) { - int got_packet, ret; + int got_packet = 0, ret; AVFrame *frame; Task task; @@ -86,19 +86,21 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_unlock(&c->task_fifo_mutex); frame = task.indata; - ret = avcodec_encode_video2(avctx, pkt, frame, &got_packet); - pthread_mutex_lock(&c->buffer_mutex); - av_frame_unref(frame); - pthread_mutex_unlock(&c->buffer_mutex); - av_frame_free(&frame); + ret = avctx->codec->encode2(avctx, pkt, frame, &got_packet); if(got_packet) { int ret2 = av_packet_make_refcounted(pkt); if (ret >= 0 && ret2 < 0) ret = ret2; + if (!ret) + pkt->pts = pkt->dts = frame->pts; } else { pkt->data = NULL; pkt->size = 0; } + pthread_mutex_lock(&c->buffer_mutex); + av_frame_unref(frame); + pthread_mutex_unlock(&c->buffer_mutex); + av_frame_free(&frame); pthread_mutex_lock(&c->finished_task_mutex); c->finished_tasks[task.index].outdata = pkt; pkt = NULL; c->finished_tasks[task.index].return_code = ret;