From patchwork Fri Dec 4 15:37:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 24344 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 0234744BD24 for ; Fri, 4 Dec 2020 18:02:28 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C8CFB689B6E; Fri, 4 Dec 2020 18:02:28 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f67.google.com (mail-qv1-f67.google.com [209.85.219.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 36C4E689B6E for ; Fri, 4 Dec 2020 18:02:22 +0200 (EET) Received: by mail-qv1-f67.google.com with SMTP id q7so2961917qvt.12 for ; Fri, 04 Dec 2020 08:02:22 -0800 (PST) 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=lNpBOP5gxHUiKOrL4TBMFSNEw7THyb1pU2WA6A/bp0U=; b=R0w+a/kt1l/E3zTt7XrDd+euavwSS7uzlQo6y1a+Beq7OqAddhKC5G7moHIu7oIGTy e3WrLDsP9ZndX92W0Pr4RMKlgriP7U+rq6bHMiPhVZamPPZTFKpWBNDnj7OHYIogXdVf ydCe8/bz/070ylitSapMISbgW4I1tTXKXm/InaPxvxs07VPlvBJdMWKkSVlg4Y/+aDi9 OQatuPn+iyy+SaJr/Zb7dsQGAkJzYFvQ1jmS3aZ8k8TIKcrY5/Y5SXp5nHWbwY0nACq5 slLU/CKSjPa9zv3TzyYUmd9XIh0ibXkL30N12hE9/+t/sZGwza13hse9meqPONjdHsv2 RVvA== 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=lNpBOP5gxHUiKOrL4TBMFSNEw7THyb1pU2WA6A/bp0U=; b=G68AwwoMkBBi3OTtpBN3RA7jqltMWti09TBSFIhPCarRTEdFTwKhL9anYh+W9ESky4 lqP7ugKbgzmEcYVlWBfKzCzJ9uUz8thexbWG61LS7nb28Br96fv9BfCFUZGaxZwGiQZc GHcYDyrUx2dMksg5EKs9xmWuFZYA4Q+ooZSSzh5ih0edKkFAc+z8BaxnPogv0M1WusDG DOHRm4muxEPGiHv0WxPdPSPwHLmCXp1s8YI1/jQnSAgOAapfAe7Y+C1LEKn82HZEKGQP uObW8syYVjWlJ15w7ze6TEHxp1WOhmmhaK/ssa9eLl9x67CER+3zq5gdsSgELRO6k3lE 9mIQ== X-Gm-Message-State: AOAM532zYaiZwARaQIYprywxzcKdIhWPw1z6k9bDYm9YiXkHFsSg2v2M sC4yCeRxCwCkOO1Kc8houfGJedhZQZYIHQ== X-Google-Smtp-Source: ABdhPJzM8A/qZjdcK9hHZcJstQIRyqfyd6O9VgDSvDgSL9L2nXvifefDTgmDjS/6mVlfqCR7Mn5/Jw== X-Received: by 2002:a0c:ba86:: with SMTP id x6mr5809428qvf.21.1607096275920; Fri, 04 Dec 2020 07:37:55 -0800 (PST) Received: from localhost.localdomain ([181.23.80.53]) by smtp.gmail.com with ESMTPSA id h16sm5493546qko.135.2020.12.04.07.37.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Dec 2020 07:37:55 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 4 Dec 2020 12:37:29 -0300 Message-Id: <20201204153729.12783-1-jamrial@gmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/decode: port last_pkt_props to AVFifoBuffer 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" Signed-off-by: James Almer --- The idea of making avpriv_packet_list_* public was not liked, and it was suggested to just use AVFifoBuffer instead. After this, the avpriv_packet_list_* functions can be made local to libavformat again. libavcodec/decode.c | 41 +++++++++++++++++++++++++++++------------ libavcodec/internal.h | 4 ++-- libavcodec/utils.c | 11 ++++++----- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 5a1849f944..0550637029 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -145,22 +145,40 @@ fail2: #define IS_EMPTY(pkt) (!(pkt)->data) +static int copy_packet_props(void *_src, void *_dst, int size) +{ + AVPacket *src = _src, *dst = _dst; + int ret; + + av_init_packet(dst); + ret = av_packet_copy_props(dst, src); + if (ret < 0) + return ret; + + dst->size = src->size; // HACK: Needed for ff_decode_frame_props(). + dst->data = (void*)1; // HACK: Needed for IS_EMPTY(). + + return sizeof(*dst); +} + static int extract_packet_props(AVCodecInternal *avci, AVPacket *pkt) { int ret = 0; - ret = avpriv_packet_list_put(&avci->pkt_props, &avci->pkt_props_tail, pkt, - av_packet_copy_props, 0); + if (av_fifo_space(avci->pkt_props) < sizeof(*pkt)) { + ret = av_fifo_grow(avci->pkt_props, sizeof(*pkt)); + if (ret < 0) + return ret; + } + + ret = av_fifo_generic_write(avci->pkt_props, pkt, sizeof(*pkt), copy_packet_props); if (ret < 0) return ret; - avci->pkt_props_tail->pkt.size = pkt->size; // HACK: Needed for ff_decode_frame_props(). - avci->pkt_props_tail->pkt.data = (void*)1; // HACK: Needed for IS_EMPTY(). + av_assert0(ret == sizeof(*pkt)); if (IS_EMPTY(avci->last_pkt_props)) { - ret = avpriv_packet_list_get(&avci->pkt_props, - &avci->pkt_props_tail, - avci->last_pkt_props); - av_assert0(ret != AVERROR(EAGAIN)); + ret = av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props, + sizeof(*avci->last_pkt_props), NULL); } return ret; } @@ -1721,10 +1739,9 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) { AV_PKT_DATA_S12M_TIMECODE, AV_FRAME_DATA_S12M_TIMECODE }, }; - if (IS_EMPTY(pkt)) - avpriv_packet_list_get(&avctx->internal->pkt_props, - &avctx->internal->pkt_props_tail, - pkt); + if (IS_EMPTY(pkt) && av_fifo_size(avctx->internal->pkt_props) >= sizeof(*pkt)) + av_fifo_generic_read(avctx->internal->pkt_props, + pkt, sizeof(*pkt), NULL); if (pkt) { frame->pts = pkt->pts; diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 17defb9b50..8a51bca2df 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -28,6 +28,7 @@ #include "libavutil/buffer.h" #include "libavutil/channel_layout.h" +#include "libavutil/fifo.h" #include "libavutil/mathematics.h" #include "libavutil/pixfmt.h" #include "avcodec.h" @@ -145,8 +146,7 @@ typedef struct AVCodecInternal { * for decoding. */ AVPacket *last_pkt_props; - AVPacketList *pkt_props; - AVPacketList *pkt_props_tail; + AVFifoBuffer *pkt_props; /** * temporary buffer used for encoders to store their bitstream diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 45295dd3ce..c81cc972dc 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -593,10 +593,12 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code avci->es.in_frame = av_frame_alloc(); avci->ds.in_pkt = av_packet_alloc(); avci->last_pkt_props = av_packet_alloc(); + avci->pkt_props = av_fifo_alloc(sizeof(AVPacket)); if (!avci->compat_decode_frame || !avci->compat_encode_packet || !avci->buffer_frame || !avci->buffer_pkt || !avci->es.in_frame || !avci->ds.in_pkt || - !avci->to_free || !avci->last_pkt_props) { + !avci->to_free || !avci->last_pkt_props || + !avci->pkt_props) { ret = AVERROR(ENOMEM); goto free_and_end; } @@ -1076,6 +1078,7 @@ FF_ENABLE_DEPRECATION_WARNINGS av_packet_free(&avci->compat_encode_packet); av_packet_free(&avci->buffer_pkt); av_packet_free(&avci->last_pkt_props); + av_fifo_freep(&avci->pkt_props); av_packet_free(&avci->ds.in_pkt); av_frame_free(&avci->es.in_frame); @@ -1116,8 +1119,7 @@ void avcodec_flush_buffers(AVCodecContext *avctx) av_packet_unref(avci->buffer_pkt); av_packet_unref(avci->last_pkt_props); - avpriv_packet_list_free(&avci->pkt_props, - &avci->pkt_props_tail); + av_fifo_reset(avci->pkt_props); av_frame_unref(avci->es.in_frame); av_packet_unref(avci->ds.in_pkt); @@ -1180,8 +1182,7 @@ av_cold int avcodec_close(AVCodecContext *avctx) av_packet_free(&avctx->internal->compat_encode_packet); av_packet_free(&avctx->internal->buffer_pkt); av_packet_free(&avctx->internal->last_pkt_props); - avpriv_packet_list_free(&avctx->internal->pkt_props, - &avctx->internal->pkt_props_tail); + av_fifo_freep(&avctx->internal->pkt_props); av_packet_free(&avctx->internal->ds.in_pkt); av_frame_free(&avctx->internal->es.in_frame);