From patchwork Mon Oct 16 09:14:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Kucera X-Patchwork-Id: 5586 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp3495905jah; Mon, 16 Oct 2017 02:23:04 -0700 (PDT) X-Received: by 10.28.180.2 with SMTP id d2mr284707wmf.118.1508145783871; Mon, 16 Oct 2017 02:23:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508145783; cv=none; d=google.com; s=arc-20160816; b=KRMWd0pNkvVXD4/S02hhGrDr30qcijHa4ncJys/XT4JsJjRXUplS69mIwYlf7uGDbN meRC8vHa/hwW0ETekPW0JLCyVhgILdvnt/65vE6Q4bTbkaXY0ou8vhBakalHvM3t3pDn 4iQ75vgGQIQ7nk/XYqPotQOC8+8Sx/IpAz6BVO006dVW2bM7A3woE8LEQ9nWgl0UlYVH +BktGpaezj3hY/BqlFEiy4glxk+gpruqEvAA+4wyUaonSabAOR7apaft6lNgyT6LP4tF h4aLpba6Bq2ZlyebZcpJ++fjcrFDtJyftpUMmdmkpOhdCHaXHmvn84Di+WXkWESJjyZy wJOA== 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:dkim-signature :delivered-to:arc-authentication-results; bh=NXMvYgkYuHUdHz2LwYfy723Fs35bTQWUfOuQ0qY/q3o=; b=OvWdtxQAwiWVVz66IR5iQkdTPhhj47DBGZmOV3Pd1ixhT5D/5A8TE86xDn/Rniusvv uevlvHlRlxIUJ9cK1WmM0T/EiitD2G8dIrPwgNXXCpDejrrB3bfdARVsHv9JBE4YcS8U c/QEDK0PSWNWxfRohAY8zB5ZlldoYABYzTM1482Neq8ntyxDIeGa/BeDBr0jS6tU+siM 7kSwKt4uL8mf+e9xjidGw70Pq5K12Ldx7RuDIyidc2pEMWp5GTJASg+4pSpWuyuYXfQE MPEOIIlj7yk1LzIiQxIbhf44pPSfON3rUC5GlFP+0NPEbjkqFHRTDFrMdPYDi+P8leKq 2QOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=WZbG6ykY; 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=NONE 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 b30si5818193wrb.228.2017.10.16.02.23.03; Mon, 16 Oct 2017 02:23:03 -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=WZbG6ykY; 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=NONE 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 C43F8689D07; Mon, 16 Oct 2017 12:22:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D0970689A6B for ; Mon, 16 Oct 2017 12:22:51 +0300 (EEST) Received: by mail-wm0-f67.google.com with SMTP id l10so6836025wmg.1 for ; Mon, 16 Oct 2017 02:22:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=g4T18RTxNsg6EkMcUW/znyKLAF1HSbv+q2Bav8wKlLc=; b=WZbG6ykYfA/hrDP0UeosPEeevGVRoSXh05xAl6JhsVchI71P6qW6LSiATA1Q8oFIh6 dSfMH3h0h8N5l486IyoNY8og2+f7kjRT0oVmmVX+LZVkhCm1tGLqMQtqCUKnNJhsnOsc n1tSfHJX2Y9VDaq8772Pai11qUbIRkBXW+Sihwy5bQ+5PeF4Re5H74XPr9pYkvm1sk2e v1VI6R6q9WjUm42lHVu8OcQPLE5OUSMEvu2yNfnL6ifnkmKRM+QG0MT/eDZtgwVQvdh+ Ynqk6nBZN+6pKT5i+6YPlquypYywVp4z1Z/zXhsxv4aQFL46+mfhUSDEC/6my/SGFyIZ hgrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=g4T18RTxNsg6EkMcUW/znyKLAF1HSbv+q2Bav8wKlLc=; b=hIKnsWHV6fIHn5jDYwXkO1PrSCv7w3OKzOeR7oUl+p4U/JBfC0boSbAvnSck5vpn0x cJaYlzIsiT7faBUuzpOXlAwjr+A645cz8uPpK0lM6KdWLL4paec2uwLeMQKEHNKvkWIP +2xzM+ndnSvG8MvDXZA7OT5RxF7a11ToyckpHNCfQsb4u6ZC0M29mcbQfWrwtp03FnwE 5Hs1lwou/WLVPPZ0gCmrcNN+KSCl8l0kgD7vLiVdGd6VBEPcqjpEDsWZyVUPR3XjvcW7 /61jCzPsHQNnWkiBckmcG3/070Q4LGbXJLoD07omMqmPYqErAJ6xKr9/wTJdzyrMxYuH BGuA== X-Gm-Message-State: AMCzsaUblW3pS11pAoi08k2ZFMNQf4UetJPas7Z1U4xffbu8iZ6swYSD rwqgcoHtRIy9Zd7cCVbPmyhxQA== X-Google-Smtp-Source: AOwi7QCek757u+vxmMiTRlbBB6zBmU8Ip5qOUlZhm+sHP2ZUEbcxfUh17+GaC1lHPtF27p0nxKqPRg== X-Received: by 10.223.134.14 with SMTP id 14mr7507420wrv.148.1508145294612; Mon, 16 Oct 2017 02:14:54 -0700 (PDT) Received: from speedy.danman.eu (mail.danman.eu. [185.98.208.20]) by smtp.gmail.com with ESMTPSA id v9sm4250515wre.12.2017.10.16.02.14.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Oct 2017 02:14:54 -0700 (PDT) From: Daniel Kucera To: ffmpeg-devel@ffmpeg.org Date: Mon, 16 Oct 2017 11:14:49 +0200 Message-Id: <20171016091449.9220-1-daniel.kucera@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] libavformat: not treat 0 as EOF 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: Daniel Kucera MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" transfer_func variable passed to retry_transfer_wrapper are h->prot->url_read and h->prot->url_write functions. These need to return EOF or other error properly. In case of returning >= 0, url_read/url_write is retried until error is returned. Signed-off-by: Daniel Kucera --- libavformat/avio.c | 6 ++++-- libavformat/aviobuf.c | 20 ++++++++++++-------- libavformat/cache.c | 4 ++-- libavformat/concat.c | 9 +++++---- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/libavformat/avio.c b/libavformat/avio.c index 64248e098b..d3004c007f 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -391,8 +391,10 @@ static inline int retry_transfer_wrapper(URLContext *h, uint8_t *buf, } av_usleep(1000); } - } else if (ret < 1) - return (ret < 0 && ret != AVERROR_EOF) ? ret : len; + } else if (ret == AVERROR_EOF) + return (len > 0) ? len : AVERROR_EOF; + else if (ret < 0) + return ret; if (ret) { fast_retries = FFMAX(fast_retries, 2); wait_since = 0; diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 636cb46161..0d4eb051e1 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -572,13 +572,14 @@ static void fill_buffer(AVIOContext *s) if (s->read_packet) len = s->read_packet(s->opaque, dst, len); else - len = 0; - if (len <= 0) { + len = AVERROR_EOF; + if (len == AVERROR_EOF) { /* do not modify buffer if EOF reached so that a seek back can be done without rereading data */ s->eof_reached = 1; - if (len < 0) - s->error = len; + } else if (len < 0) { + s->eof_reached = 1; + s->error= len; } else { s->pos += len; s->buf_ptr = dst; @@ -646,13 +647,16 @@ int avio_read(AVIOContext *s, unsigned char *buf, int size) // bypass the buffer and read data directly into buf if(s->read_packet) len = s->read_packet(s->opaque, buf, size); - - if (len <= 0) { + else + len = AVERROR_EOF; + if (len == AVERROR_EOF) { /* do not modify buffer if EOF reached so that a seek back can be done without rereading data */ s->eof_reached = 1; - if(len<0) - s->error= len; + break; + } else if (len < 0) { + s->eof_reached = 1; + s->error= len; break; } else { s->pos += len; diff --git a/libavformat/cache.c b/libavformat/cache.c index 6aabca2e78..66bbbf54c9 100644 --- a/libavformat/cache.c +++ b/libavformat/cache.c @@ -201,7 +201,7 @@ static int cache_read(URLContext *h, unsigned char *buf, int size) } r = ffurl_read(c->inner, buf, size); - if (r == 0 && size>0) { + if (r == AVERROR_EOF && size>0) { c->is_true_eof = 1; av_assert0(c->end >= c->logical_pos); } @@ -263,7 +263,7 @@ resolve_eof: if (whence == SEEK_SET) size = FFMIN(sizeof(tmp), pos - c->logical_pos); ret = cache_read(h, tmp, size); - if (ret == 0 && whence == SEEK_END) { + if (ret == AVERROR_EOF && whence == SEEK_END) { av_assert0(c->is_true_eof); goto resolve_eof; } diff --git a/libavformat/concat.c b/libavformat/concat.c index 46b520fe80..36dbc3c5a7 100644 --- a/libavformat/concat.c +++ b/libavformat/concat.c @@ -135,19 +135,20 @@ static int concat_read(URLContext *h, unsigned char *buf, int size) while (size > 0) { result = ffurl_read(nodes[i].uc, buf, size); - if (result < 0) - return total ? total : result; - if (!result) { + if (result == AVERROR_EOF) { if (i + 1 == data->length || ffurl_seek(nodes[++i].uc, 0, SEEK_SET) < 0) break; + result = 0; } + if (result < 0) + return total ? total : result; total += result; buf += result; size -= result; } data->current = i; - return total; + return total ? total : result; } static int64_t concat_seek(URLContext *h, int64_t pos, int whence)