From patchwork Tue Mar 27 22:48:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8202 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp5317525jad; Tue, 27 Mar 2018 15:49:42 -0700 (PDT) X-Google-Smtp-Source: AIpwx49tq78khr8jgGoU7ZbruzM34xbH+kcwv37SKpVqUi6dEVLWjyu3/lH8o7tS1A7qrzaMVHfa X-Received: by 10.28.11.207 with SMTP id 198mr755359wml.70.1522190982007; Tue, 27 Mar 2018 15:49:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522190981; cv=none; d=google.com; s=arc-20160816; b=dcKrq9Dajp8oVbKpQiDMsHMmdrh1Hn6457wREBTbaEzCUo01FOi9bU/py86SqRh9Xn wvv+dV9rNvqJE3vxFgsWTCUp5Q/ieaOUBLZYKOVja6w7TL6f8xbTeA9fGkoeH6fs+eGh zvA1XAUQLbrDEDcBduwulC2yNov5SyLk3oiwYhNV6sLMO3cOXIyrBmXWY1TSDbaOGzD2 /opdD7RkL2WAcPve4dThKMQnXljqXm4NDPpONqz/BzUTKwRV8JRKv4umFUun44BzDrXh 5alCe6zdOVg/Vvmk+8TAuNZyJsw6Sjq5GACuMcOL8diV/T8wnGc0Kbm0nmK1PtF3Itaw Bktg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=MeEnLWWqGq+wguC/aKMnDQQrF7UKCzNlmnG/gWqLu1Y=; b=Kw4JVLjnZCmrEojQBZycttNn+5Nd3mhI0iqGKVXfeKEkOy7jtWJjtNJ6jqbT0iVgeT A+aOXkj/I7/PHetuBgJVRQpZyLu/iP20/W9hL8ILaUhYnyLLvwP0+77moE9OmQC3X7us qrp/jMnJRXJB9VZeTph+NdPcLA+XmM0r5Jvrg9yq12sqqJOHHHCYb8yg0vKkqYreYNqj 0ukb1UAuekYDHBq/qMP6HN5JgSl1n47lIrAfhIP0SM1AJgdF5oGlASUxFF+k28ix9wNC WjSbePGZlUQfwpxwlDWzO16vbXt/GcD2aH3f3IUBLgV0VtnHd+pClZKXFGoUsZPagheY iQBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Fl7eHBBK; 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 f28si1735838wrf.393.2018.03.27.15.49.41; Tue, 27 Mar 2018 15:49:41 -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=Fl7eHBBK; 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 56775689AA5; Wed, 28 Mar 2018 01:49:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f196.google.com (mail-qk0-f196.google.com [209.85.220.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 92BAA680A1F for ; Wed, 28 Mar 2018 01:49:16 +0300 (EEST) Received: by mail-qk0-f196.google.com with SMTP id d206so583704qkb.0 for ; Tue, 27 Mar 2018 15:49:34 -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; bh=ZbP80Ou29rW57ZzKm5HDmKpWpdEaH9TamigsJJ3A/hg=; b=Fl7eHBBKmoOqIbwVv6WGOhN0JaVQIOAwPra+U013GKDaNK0pbOuBof7uIcNaOFVJIc xn5AMhT6k7nXTUpDwzAGVn7Ow0xR0PXC8NptUQDypaFnJfi+oEQG7m/gHWLnDS9MzQIr ZdxtBVIdQX0Ni09Pik0MoFv/WbAeKGb3a35lBfsm80Rsj69JfH2QzPLvGORbbTKfGQFB Zvw9nhY1iZxSqQM8kfaLZ4e4zWh5Lvw4xzaCC2etHO0SwARGXK00nno3bzdlWD4e3cuZ xeTEoQUA2LkOvYp6iR6e9URS9/HN4fqlKcQ7oElxyZtO7P6LRGnRGmxQrNmWWRS2gJ53 hLcw== 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; bh=ZbP80Ou29rW57ZzKm5HDmKpWpdEaH9TamigsJJ3A/hg=; b=mVfUxNPlk2Xu4EpnQrL3MAYrPc4E+lXAxS0QIGiyUFoFvZtu01Qy3bAhbY8veqvsEl zvkceJkyeT5TI5EqspQw9gsun3/zaAXiznl67GrEWBaee10/1mQ4+CxrfSjXFcC6jZPi dHd4kej2wK966+nY6ukwGvUhomT2/5Hpxztamm1z0sQGjrTZOOYu0x4tWPqZ6qYT9r6N p6ASYKI/CpZwuzLC5gWR2oohD7FD/2mQQqhvwk/AbSeaoD1Q4Zv8NidGXDn6wvrOHE47 cN/oYMBL4mVj2gLw+fz1vJ9xRMCelvKwDkWLT2c15yxlXldKlWAePNO+WfiOn1th8BkE yuWA== X-Gm-Message-State: AElRT7EgfHucuIfv9puuOFNbaZRN4LkAd3LaVajUPwHOs5IbtaNzINzN VF0SEAwYWls8D73mN6/2aJEsQw== X-Received: by 10.55.128.67 with SMTP id b64mr1980984qkd.78.1522190972880; Tue, 27 Mar 2018 15:49:32 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id 92sm1689885qta.5.2018.03.27.15.49.31 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Mar 2018 15:49:32 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 27 Mar 2018 19:48:18 -0300 Message-Id: <20180327224818.5008-1-jamrial@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180327213826.GM32664@michaelspb> References: <20180327213826.GM32664@michaelspb> Subject: [FFmpeg-devel] [PATCH 1/5 v2] avformat/utils: make AVPacketList helper functions shared 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Based on a patch by Luca Barbato. Signed-off-by: James Almer --- libavformat/internal.h | 38 +++++++++++++++++++++++++++++++++ libavformat/utils.c | 57 +++++++++++++++++++++++++++++--------------------- 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/libavformat/internal.h b/libavformat/internal.h index a020b1b417..9f987436e0 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -731,6 +731,44 @@ int ff_unlock_avformat(void); */ void ff_format_set_url(AVFormatContext *s, char *url); +#define FF_PACKETLIST_FLAG_REF_PACKET (1 << 0) /**< Create a new reference for the packet instead of + transferring the ownership of the existing one to the + list. */ + +/** + * Append an AVPacket to the list. + * + * @param head List head element + * @param tail List tail element + * @param pkt The packet being appended + * @param flags Any combination of FF_PACKETLIST_FLAG_* flags + * @return 0 on success, negative AVERROR value on failure. On failure, + the list is unchanged + */ +int ff_packet_list_put(AVPacketList **head, AVPacketList **tail, + AVPacket *pkt, int flags); + +/** + * Remove the oldest AVPacket in the list and return it. + * + * @note The pkt will be overwritten completely. The caller owns the + * packet and must unref it by itself. + * + * @param head List head element + * @param tail List tail element + * @param pkt Pointer to an initialized AVPacket struct + */ +int ff_packet_list_get(AVPacketList **head, AVPacketList **tail, + AVPacket *pkt); + +/** + * Wipe the list and unref all the packets in it. + * + * @param head List head element + * @param tail List tail element + */ +void ff_packet_list_free(AVPacketList **head, AVPacketList **tail); + #if FF_API_NEXT /** * Register devices in deprecated format linked list. diff --git a/libavformat/utils.c b/libavformat/utils.c index f13c8208b1..d38d4c0bec 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -444,8 +444,9 @@ static int init_input(AVFormatContext *s, const char *filename, s, 0, s->format_probesize); } -static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, - AVPacketList **plast_pktl, int ref) +int ff_packet_list_put(AVPacketList **packet_buffer, + AVPacketList **plast_pktl, + AVPacket *pkt, int flags) { AVPacketList *pktl = av_mallocz(sizeof(AVPacketList)); int ret; @@ -453,12 +454,15 @@ static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, if (!pktl) return AVERROR(ENOMEM); - if (ref) { + if (flags & FF_PACKETLIST_FLAG_REF_PACKET) { if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) { av_free(pktl); return ret; } } else { + // TODO: Adapt callers in this file so the line below can use + // av_packet_move_ref() to effectively move the reference + // to the list. pktl->pkt = *pkt; } @@ -485,9 +489,10 @@ int avformat_queue_attached_pictures(AVFormatContext *s) continue; } - ret = add_to_pktbuf(&s->internal->raw_packet_buffer, - &s->streams[i]->attached_pic, - &s->internal->raw_packet_buffer_end, 1); + ret = ff_packet_list_put(&s->internal->raw_packet_buffer, + &s->internal->raw_packet_buffer_end, + &s->streams[i]->attached_pic, + FF_PACKETLIST_FLAG_REF_PACKET); if (ret < 0) return ret; } @@ -913,8 +918,9 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) if (!pktl && st->request_probe <= 0) return ret; - err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt, - &s->internal->raw_packet_buffer_end, 0); + err = ff_packet_list_put(&s->internal->raw_packet_buffer, + &s->internal->raw_packet_buffer_end, + pkt, 0); if (err) return err; s->internal->raw_packet_buffer_remaining_size -= pkt->size; @@ -1412,7 +1418,7 @@ FF_ENABLE_DEPRECATION_WARNINGS #endif } -static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end) +void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end) { while (*pkt_buf) { AVPacketList *pktl = *pkt_buf; @@ -1504,8 +1510,9 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index) compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts); - ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt, - &s->internal->parse_queue_end, 1); + ret = ff_packet_list_put(&s->internal->parse_queue, + &s->internal->parse_queue_end, + &out_pkt, FF_PACKETLIST_FLAG_REF_PACKET); av_packet_unref(&out_pkt); if (ret < 0) goto fail; @@ -1522,9 +1529,9 @@ fail: return ret; } -static int read_from_packet_buffer(AVPacketList **pkt_buffer, - AVPacketList **pkt_buffer_end, - AVPacket *pkt) +int ff_packet_list_get(AVPacketList **pkt_buffer, + AVPacketList **pkt_buffer_end, + AVPacket *pkt) { AVPacketList *pktl; av_assert0(*pkt_buffer); @@ -1670,7 +1677,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (!got_packet && s->internal->parse_queue) - ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt); + ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt); if (ret >= 0) { AVStream *st = s->streams[pkt->stream_index]; @@ -1749,7 +1756,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) if (!genpts) { ret = s->internal->packet_buffer - ? read_from_packet_buffer(&s->internal->packet_buffer, + ? ff_packet_list_get(&s->internal->packet_buffer, &s->internal->packet_buffer_end, pkt) : read_frame_internal(s, pkt); if (ret < 0) @@ -1798,7 +1805,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) st = s->streams[next_pkt->stream_index]; if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL && next_pkt->dts != AV_NOPTS_VALUE && !eof)) { - ret = read_from_packet_buffer(&s->internal->packet_buffer, + ret = ff_packet_list_get(&s->internal->packet_buffer, &s->internal->packet_buffer_end, pkt); goto return_packet; } @@ -1813,8 +1820,9 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) return ret; } - ret = add_to_pktbuf(&s->internal->packet_buffer, pkt, - &s->internal->packet_buffer_end, 1); + ret = ff_packet_list_put(&s->internal->packet_buffer, + &s->internal->packet_buffer_end, + pkt, FF_PACKETLIST_FLAG_REF_PACKET); av_packet_unref(pkt); if (ret < 0) return ret; @@ -1841,9 +1849,9 @@ static void flush_packet_queue(AVFormatContext *s) { if (!s->internal) return; - free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end); - free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end); - free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end); + ff_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end); + ff_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end); + ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end); s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE; } @@ -3743,8 +3751,9 @@ FF_ENABLE_DEPRECATION_WARNINGS pkt = &pkt1; if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) { - ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt, - &ic->internal->packet_buffer_end, 0); + ret = ff_packet_list_put(&ic->internal->packet_buffer, + &ic->internal->packet_buffer_end, + pkt, 0); if (ret < 0) goto find_stream_info_err; }