From patchwork Sat Dec 30 17:07:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 7035 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp11807473jad; Sat, 30 Dec 2017 09:07:28 -0800 (PST) X-Google-Smtp-Source: ACJfBouht65d3rd1EvOJEOu//O+/mL7L0P9YFCQa0cThW5RMS66McWXuYsK5VTYNLJIdx0rrLtVT X-Received: by 10.223.195.138 with SMTP id p10mr22169699wrf.74.1514653648542; Sat, 30 Dec 2017 09:07:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514653648; cv=none; d=google.com; s=arc-20160816; b=lO2v7wU15FYFLYTjN4ZOjIUbyOXxe/E2dQVa2Cfr4FHyw1t6C0YVXIWxqobzC30Bra R+U4QlKDJoEuwdVLZv1x1oxT31/5tto+rfZQDQa+IzDrxJJpUgqO4ohYmNC+nz6Rq3HR z1br1NbLVqXoLoP5E2rBp4z6hiiSXR1YuZtwKprMBeneueoUTmsr2XFXgMhpqoErtYrz tn+tgjHwTozOzFrErskcXKHv2BT1zalyTgm2a8f0yqpktyi7nnPZKhw81kj6wmptxmwg XsuEJ1kZqaGR4ldHd7pT+1OG+v9Tk6w1EJDGLiiuis6xuNNILJIgijW9GV7KiBDkzlpN sDOw== 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=G4rQTVdcoOugbJt1yrEbSSURl/Bmf5dgBKQSABsJYGU=; b=wY8s4Baa8jbPpp+smQHSWpRtpXnFs06/Za+ug07unxQhcm/ldlXtCbxHWb0lHEJg2t C1mZqtXg61jqBRLYF/NOft4gRvv5iRMmBTfhSdzx2LSUfYA0KvUM6bvGOgu9k0Jb9Ndq ldOgSF7xMwyur3dBcrzW1AOalrZwShMmJvGUgKJfNqpac+ev9/v0PBjIcur7RiEJ9zU5 K9ZpjDga9ODDcxmJS1kTJHI6J/TgoerRZIrerj9Mp74rD4i7/AgUQ98IAC/eqBeDLxZc RJfyBKUA4P7HqCXP005nyLbHoJy8jjfFsjMQ2y9SEfzpgHaCn0oFDtUJluiGhGI3tNrH lYnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=ny8lVzVl; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v94si23601634wrc.257.2017.12.30.09.07.28; Sat, 30 Dec 2017 09:07:28 -0800 (PST) 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=@googlemail.com header.s=20161025 header.b=ny8lVzVl; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6721C689D99; Sat, 30 Dec 2017 19:07:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CAD4C68043D for ; Sat, 30 Dec 2017 19:07:06 +0200 (EET) Received: by mail-wm0-f49.google.com with SMTP id g75so52755004wme.0 for ; Sat, 30 Dec 2017 09:07:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=rTUy+ySr2X2tZrcOqCWE1SvjvpLXUwny/xpFcoblcdE=; b=ny8lVzVlho8srLiVL1YeE49k1p63ztAlYuaqZmGsTWkzyT03ZrZDYS67pNrdnYJm4w rFZmg+TvGDXGrPVvHV57BfVID64bH5f3hbr22HCvUmpNeHA4G2s2yp9qQRDi4q2DMx4p bRq7VonmE/TMj+ZQzZDcoAQl80ZaNnFCxhPY73owb4FvFY1NxP2oI7GpvjeKl8eX91pu MR6ATp426pZQDU56cUvPB0KwC7N261sCKip1+KasZKJHS7i/5y0RQJXORYNK9ft09wl4 b5JaXtQ11lWNnswha/37KEGMl4i7gbE1bDomGr/v5kUzJTAp997uStTd4v/LNJ0ZG/01 gs+w== 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=rTUy+ySr2X2tZrcOqCWE1SvjvpLXUwny/xpFcoblcdE=; b=s51dQcBKkXLG9+DG6wCfhk004NPp3sOXIrAGI1ooX8BkpeQ3r5pfB5u4Rpi9IvKsek IRy1I8iQbRFt9rGjU+tI2HeBq2Q4swdJu1JoICaLDM+81HRLqDxpAlA66RPMMChlkn2C J5COhXa4uqzqItxjmQyXeK1Ndmo2bguIL08EdgmodPfEm086oZrf/CYdlnb3Z/r0HWBR /Rpcxc4ZNw2LElnE1/WEb8lJGY/kmbDf9NrrfXwCSkJbC6QVe89zZL2AW/GgIpljG38P YREM23uFTnhwnB5RnESc8Uo4Zbh1duquyMY3l5EKplt1XQfudiiU/HlaBwQMlCDGdryV rPFw== X-Gm-Message-State: AKGB3mIa+0bZhcKeRuEufNvoNil0RnOaP5WQVUbjT2cUS8t4YJoTZ+ri Hn+EIAQUoX0ditIh4ZWOUzldSw== X-Received: by 10.80.134.51 with SMTP id o48mr50391028edo.276.1514653641158; Sat, 30 Dec 2017 09:07:21 -0800 (PST) Received: from debian.speedport.ip (p2003006CCD4EDC3038F642B42F0F0C81.dip0.t-ipconnect.de. [2003:6c:cd4e:dc30:38f6:42b4:2f0f:c81]) by smtp.googlemail.com with ESMTPSA id o42sm33855336edo.91.2017.12.30.09.07.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Dec 2017 09:07:20 -0800 (PST) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Sat, 30 Dec 2017 18:07:26 +0100 Message-Id: <20171230170726.10824-1-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.15.1 Subject: [FFmpeg-devel] [PATCH] http: block while waiting for reconnecting 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: wm4 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It makes no sense to return an error after the first reconnect, and then somehow resume the next time it's called. Also make the wait reasonably interruptible. Since there is no mechanism for this in the API, polling is the best we can do. (Some effort could be put into making the wait more accurate, since the av_usleep() will not wait exactly 1000 microseconds, and the error will add up.) (The original code would work if it returned AVERROR(EAGAIN) or so, which would make retry_transfer_wrapper() repeat the read call. But I think having an explicit loop for this is better anyway.) --- libavformat/http.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index a376f1a488..2957648d61 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -1443,25 +1443,29 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size) return http_buf_read_compressed(h, buf, size); #endif /* CONFIG_ZLIB */ read_ret = http_buf_read(h, buf, size); - if ( (read_ret < 0 && s->reconnect && (!h->is_streamed || s->reconnect_streamed) && s->filesize > 0 && s->off < s->filesize) + while ( (read_ret < 0 && s->reconnect && (!h->is_streamed || s->reconnect_streamed) && s->filesize > 0 && s->off < s->filesize) || (read_ret == 0 && s->reconnect_at_eof && (!h->is_streamed || s->reconnect_streamed))) { + unsigned int wait = 0; uint64_t target = h->is_streamed ? 0 : s->off; if (s->reconnect_delay > s->reconnect_delay_max) return AVERROR(EIO); av_log(h, AV_LOG_INFO, "Will reconnect at %"PRIu64" error=%s.\n", s->off, av_err2str(read_ret)); - av_usleep(1000U*1000*s->reconnect_delay); + for (wait = 0; wait < 1000U*s->reconnect_delay; wait++) { + if (ff_check_interrupt(&h->interrupt_callback)) + return AVERROR(EIO); + av_usleep(1000); + } s->reconnect_delay = 1 + 2*s->reconnect_delay; seek_ret = http_seek_internal(h, target, SEEK_SET, 1); - if (seek_ret != target) { + if (seek_ret >= 0 && seek_ret != target) { av_log(h, AV_LOG_ERROR, "Failed to reconnect at %"PRIu64".\n", target); - return read_ret; - } - - read_ret = http_buf_read(h, buf, size); - } else - s->reconnect_delay = 0; + return AVERROR(EIO); + } else + read_ret = http_buf_read(h, buf, size); + } + s->reconnect_delay = 0; return read_ret; }