From patchwork Sun Jun 4 13:35:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 3831 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp962626vsk; Sun, 4 Jun 2017 06:35:23 -0700 (PDT) X-Received: by 10.28.168.13 with SMTP id r13mr1887354wme.0.1496583323361; Sun, 04 Jun 2017 06:35:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496583323; cv=none; d=google.com; s=arc-20160816; b=NfT9VvuExjNHNmPuiLNBttanz75M2CdZlZobwXSYu1AvpRQP0cvVyFOwUbdVq+dftN KPnSUinxAxARzhqkdev7W6bP1/mpWKNmbdDyGnCvv/zeitHQVqWIPjwzDsDsRX2nbaLk DooLhuMxEGUkAykz3J18nZUCJqqbzsCAaJDLhdd9vlAEv8FWeRuF2KGzGgfqzpsFALSV 1SjLkRw4crDxtnZyyrFnjRfG5woUx9PTXwXaWi6ROBArqK4I4Flq3zcj/AB3PvfalzUV tLntR8DVXlwXFCFSbX/2uTojIofNImNJ5V9zRzHwe9imxVS3z12uN7KG43cfcEQuDpqC xp2A== 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:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to :arc-authentication-results; bh=DK+50vCkbJGaVPHivNuAO6xHaGWGURAHSNEe7xnoMMY=; b=RjdyGnJPqBYPrE9IW6pKL+mJaWYkJF3v+1rzKlpvAsqvGJdpjlOmsrAn/bWlMaHmwZ T05REEItlY7K6/ImsFRBelib1sYTuSL8MoS3Wquem54Q5pr7mlmxjXe6jrjymbTKiOfu cKED2Lu4unDBA4rX4sukM7+hW37yqZfqi4OeL/jwXO8OqHIlDNJkZ2iqKJqdJSq9rGzV CxsGLMLxIpN06cnOYLu5jTrin5T1ye4vekgQgEfmtG9RNZQ6BKcRmntx20XXP3nGP4gp yPBcI8Q1ZpAhDjZh1dapmzmmu3Qnvs1K+5o3RSYzSxzfmh08OOpVu5xq3SD0GNzqZ7xO KOPQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o83si8840161wmo.57.2017.06.04.06.35.22; Sun, 04 Jun 2017 06:35:23 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3989E689D92; Sun, 4 Jun 2017 16:35:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6D5AD689B03 for ; Sun, 4 Jun 2017 16:35:06 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id AE7D61031B6; Sun, 4 Jun 2017 15:35:12 +0200 (CEST) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id jdQvm8uEJClt; Sun, 4 Jun 2017 15:35:11 +0200 (CEST) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 0ECD4102CC9; Sun, 4 Jun 2017 15:35:11 +0200 (CEST) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Sun, 4 Jun 2017 15:35:05 +0200 Message-Id: <20170604133507.20614-1-cus@passwd.hu> X-Mailer: git-send-email 2.12.0 Subject: [FFmpeg-devel] [PATCH 1/3] avformat/aviobuf: fix flushing buffers after seeking backwards 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 Cc: Marton Balint MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" In the past, aviobuf only flushed buffers until the current buffer position, even if more data was written to it previously, and a backward seek was used to reposition the IO context. From now, aviobuf will keep track of the written data, so no explicit seek will be required till the end of the buffer before flushing. This fixes at least one regression, fate-vsynth3-flv was broken if flush_packets option was set to false, an explicit seek was removed in 4e3cc4bdd8acedbcc703607ed0efbb64bb5c3cc4. Signed-off-by: Marton Balint --- libavformat/avio.h | 33 ++++++++++++++++++--------------- libavformat/aviobuf.c | 19 +++++++++++++------ libavformat/version.h | 4 ++-- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/libavformat/avio.h b/libavformat/avio.h index 525eb7129e..99709d5180 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -168,8 +168,9 @@ typedef struct AVIOContext { const AVClass *av_class; /* - * The following shows the relationship between buffer, buf_ptr, buf_end, buf_size, - * and pos, when reading and when writing (since AVIOContext is used for both): + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): * ********************************************************************************** * READING @@ -196,21 +197,22 @@ typedef struct AVIOContext { * WRITING ********************************************************************************** * - * | buffer_size | - * |-------------------------------| - * | | + * | buffer_size | + * |--------------------------------------| + * | | * - * buffer buf_ptr buf_end - * +-------------------+-----------+ - * |/ / / / / / / / / /| | - * write buffer: | / to be flushed / | | - * |/ / / / / / / / / /| | - * +-------------------+-----------+ + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ * - * pos - * +--------------------------+-----------------------------------+ - * output file: | | | - * +--------------------------+-----------------------------------+ + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ * */ unsigned char *buffer; /**< Start of the buffer. */ @@ -329,6 +331,7 @@ typedef struct AVIOContext { int (*short_seek_get)(void *opaque); int64_t written; + unsigned char *buf_ptr_max; /**< Maximum reached position in the write buffer, used for flushing already written data */ } AVIOContext; /** diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 1667e9f08b..7d1b385253 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -91,6 +91,7 @@ int ffio_init_context(AVIOContext *s, s->orig_buffer_size = s->buffer_size = buffer_size; s->buf_ptr = buffer; + s->buf_ptr_max = buffer; s->opaque = opaque; s->direct = 0; @@ -171,15 +172,15 @@ static void writeout(AVIOContext *s, const uint8_t *data, int len) static void flush_buffer(AVIOContext *s) { - if (s->write_flag && s->buf_ptr > s->buffer) { - writeout(s, s->buffer, s->buf_ptr - s->buffer); + if (s->write_flag && s->buf_ptr_max > s->buffer) { + writeout(s, s->buffer, s->buf_ptr_max - s->buffer); if (s->update_checksum) { s->checksum = s->update_checksum(s->checksum, s->checksum_ptr, - s->buf_ptr - s->checksum_ptr); + s->buf_ptr_max - s->checksum_ptr); s->checksum_ptr = s->buffer; } } - s->buf_ptr = s->buffer; + s->buf_ptr = s->buf_ptr_max = s->buffer; if (!s->write_flag) s->buf_end = s->buffer; } @@ -188,6 +189,7 @@ void avio_w8(AVIOContext *s, int b) { av_assert2(b>=-128 && b<=255); *s->buf_ptr++ = b; + s->buf_ptr_max = FFMAX(s->buf_ptr, s->buf_ptr_max); if (s->buf_ptr >= s->buf_end) flush_buffer(s); } @@ -198,6 +200,7 @@ void ffio_fill(AVIOContext *s, int b, int count) int len = FFMIN(s->buf_end - s->buf_ptr, count); memset(s->buf_ptr, b, len); s->buf_ptr += len; + s->buf_ptr_max = FFMAX(s->buf_ptr, s->buf_ptr_max); if (s->buf_ptr >= s->buf_end) flush_buffer(s); @@ -217,6 +220,7 @@ void avio_write(AVIOContext *s, const unsigned char *buf, int size) int len = FFMIN(s->buf_end - s->buf_ptr, size); memcpy(s->buf_ptr, buf, len); s->buf_ptr += len; + s->buf_ptr_max = FFMAX(s->buf_ptr, s->buf_ptr_max); if (s->buf_ptr >= s->buf_end) flush_buffer(s); @@ -228,8 +232,11 @@ void avio_write(AVIOContext *s, const unsigned char *buf, int size) void avio_flush(AVIOContext *s) { + int seekback = s->write_flag ? s->buf_ptr - s->buf_ptr_max : 0; flush_buffer(s); s->must_flush = 0; + if (seekback) + avio_seek(s, seekback, SEEK_CUR); } int64_t avio_seek(AVIOContext *s, int64_t offset, int whence) @@ -308,7 +315,7 @@ int64_t avio_seek(AVIOContext *s, int64_t offset, int whence) s->seek_count ++; if (!s->write_flag) s->buf_end = s->buffer; - s->buf_ptr = s->buffer; + s->buf_ptr = s->buf_ptr_max = s->buffer; s->pos = offset; } s->eof_reached = 0; @@ -994,7 +1001,7 @@ int ffio_set_buf_size(AVIOContext *s, int buf_size) s->buffer = buffer; s->orig_buffer_size = s->buffer_size = buf_size; - s->buf_ptr = buffer; + s->buf_ptr = s->buf_ptr_max = buffer; url_resetbuf(s, s->write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ); return 0; } diff --git a/libavformat/version.h b/libavformat/version.h index 411fd6613d..b00a8b0333 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 57 -#define LIBAVFORMAT_VERSION_MINOR 72 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 73 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \