From patchwork Sat Oct 14 17:27:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Kucera X-Patchwork-Id: 5564 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp1979040jah; Sat, 14 Oct 2017 10:27:49 -0700 (PDT) X-Received: by 10.223.162.152 with SMTP id s24mr4604032wra.173.1508002069645; Sat, 14 Oct 2017 10:27:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508002069; cv=none; d=google.com; s=arc-20160816; b=J/Is6/sVahfU0ZHYxmfRVkEdnYg21/77jpPCnXvQ+2OBq4pabxX1GIcjqj7as0LIAK 9Ou5OECSJ1FP9h/6rIQEZ7J3G+NNsk/1uFwjbTs6POqIR7f+qYUIDP7u7RaF7le/Jhlu 4+b8nO3KqmKP3XbOoP0NRsxoiG0V3ykK+3xWMmcbmAz2lMdGHiNKnOaxnCtCBacjvd7o reZmofiVBB6mfavAkBYF+sUdNoJcJQKba7/NFSb0/U9mYK9CKocWEsdxZy3oSngcdKrC Rjd7egRw/HIiO2XcMCSzdO919RuFpDqUFL2tLRpck7g+mF+zA2D2mSa8EVP28o9wLpHO /t1w== 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=jNx1rbnerFxqD1AE4L4bbTm8AW0cNFHclqi8UNqtFfo=; b=fPbJ0QvtNLcozIsNYHBUQwfcH8ms0alQV2EMr54cHYW1AnNukwJORuB5xLMBUVy1W0 fRSdTfkOCsiQf5hIjUkIJW92RD4br4PD+QFabh1+wvPqbhrt9eyryC/JOUjzU6B9Maxk p8qxAFbtxd1jB/v+UYzdxy0JF+PS3CMK0FIi+pwgGEiuaNvivnvZGa09r3i4dvFrH+7L Ba5+Zzo5mwF8CiOIomrSmcHlOv0d0mJXlXkCciW3j0NfFT0vx8mKxidrdwTkwGCKjw0g yQWyeRV6MP82A9KLM0koEX7mhweYo89gkGbaBkvfm4xdbhpHfaA7Rr+B/o/s5wRiGZNo bUuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=hTeSzK6M; 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 e204si2785288wma.128.2017.10.14.10.27.49; Sat, 14 Oct 2017 10:27:49 -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=hTeSzK6M; 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 932DD68A17E; Sat, 14 Oct 2017 20:27:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F17D868A0D4 for ; Sat, 14 Oct 2017 20:27:37 +0300 (EEST) Received: by mail-wm0-f68.google.com with SMTP id q132so26829507wmd.2 for ; Sat, 14 Oct 2017 10:27:41 -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=09qYAXpZUXzg7kvQBYz1yjvHTaroGT71UTwJ+Mp1Cwo=; b=hTeSzK6MrVqQwsgc1Pqd0uqvJFSaBVOa0q2wn0ptbm2B+Xu3t408Vh5mQOXqqVsacA /81R22ds166fNBUdtIRZh2Ztpr9C09MJheXmLoi3GhpT8nIzDAgKtw+H1VWF6vtZsEkD +DI0UE6hD6yHCdB/noioZ6FA/PL4OtfZ/596VNBXRwTarErPZgZbKnWnDaMMb/zYWH1y lWXZlWjTJbacql/PYXg+8orj6damA/4tBPZlwcOCYM70ueL8tfNlvSdoNeWcccLW/xI/ JTySSqh5jtwW9+2Oojv7nCm36Py4SkgWbjcxzF2dTO7wkb6MZXkI7mry+BolJRblbDxJ 0dVA== 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=09qYAXpZUXzg7kvQBYz1yjvHTaroGT71UTwJ+Mp1Cwo=; b=I8rzDqCOwfQoE0bsOldEQtYIQvIBFWlrMu0yC2o9+gawyW5womoI766qFINKG2UrNO e9AsHeV131keMY90BUdFLyjVE3BEJo3NB/9mhd0REid4F2TMZDmbreoOq8MCV9wLhEiY GBj4u48qGSL+K7l7sbaLkmbwJTz6mJJ9P98xTvcL7znP4xVxgskieiLEhF8HY+pxbyHs 6KI3afUCMFrAgsYVNnNyk5IX7599WAs2LDie/SOTnRSSfsm7qAJBLaV173sluzR6ExoE fhNbOC/up0VazxW25kM4FcF7KchsVJZHZlSkoiCrVVI1pSYte+L0YiKuHrPaOcEayGzN Jd/A== X-Gm-Message-State: AMCzsaXHIpEHxtVmBCJL2xWiZAXKWDDAhCDkQqaNjOPEOJuYBJMw1zzn qwGryoZ1b8vQhkWIZOt7j5JR4A== X-Google-Smtp-Source: ABhQp+SAK+eLVzCsvXLNJhSO2BSVN0Bg8z1OsWs+jQ1DK+86jZuZ3ByNO/53Av3wwlmqMJFAXjRGUQ== X-Received: by 10.28.157.139 with SMTP id g133mr3782662wme.102.1508002060959; Sat, 14 Oct 2017 10:27:40 -0700 (PDT) Received: from speedy.danman.eu (mail.danman.eu. [185.98.208.20]) by smtp.gmail.com with ESMTPSA id k141sm5070017wmg.15.2017.10.14.10.27.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 14 Oct 2017 10:27:40 -0700 (PDT) From: Daniel Kucera To: ffmpeg-devel@ffmpeg.org Date: Sat, 14 Oct 2017 19:27:34 +0200 Message-Id: <20171014172734.17488-1-daniel.kucera@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] libavformat/cache: don't treat 0 as EOF libavformat/aviobuf: don't treat 0 as EOF libavformat/avio: retry_transfer_wrapper: don't 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 ++-- 3 files changed, 18 insertions(+), 12 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; }