From patchwork Mon Mar 13 11:15:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?5Y2i54Kv5YGl?= X-Patchwork-Id: 2920 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.50.79 with SMTP id y76csp1304601vsy; Mon, 13 Mar 2017 12:50:57 -0700 (PDT) X-Received: by 10.223.165.74 with SMTP id j10mr27502089wrb.143.1489434657174; Mon, 13 Mar 2017 12:50:57 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o64si1890385wrb.225.2017.03.13.12.50.56; Mon, 13 Mar 2017 12:50:57 -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; 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 20A7A68090C; Mon, 13 Mar 2017 21:50:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f65.google.com (mail-pg0-f65.google.com [74.125.83.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 276AD689962 for ; Mon, 13 Mar 2017 13:22:19 +0200 (EET) Received: by mail-pg0-f65.google.com with SMTP id b5so17793052pgg.1 for ; Mon, 13 Mar 2017 04:22:34 -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=lTMbDCkRfOvAf05P/XMp10EbMKCEHBsuVZzBOT5oSAM=; b=cPVvaUPL/xD+t/0e9ZsJRkQYIbzYLueIQm+K/Bm3q0h1Ju4krgYWQB7+t5SQuW5VTQ q4Fm6xlHB0uZhsj6uInZ4cO00R0ncl6mng6zvBIeKet7elEEDor0l0HqJhjCmALl9p/r sPl2qdpv13rqbvnZe9HLMCuGQ9Y0F8nycJGKBn1F24x6JI/OlEZbzaxzT8fdv3M3/5wU +W9POekQo7kzTWOIS/NK5rWIQE9C09mu80Q67qU1CNo/a7arKAiJE55ZVTPz+aca3d0b yOmCbCWg1x9KZ9YyzkktZwGmqxrgNmFk8e8iQTmoX/xVQejb4D4KpSOk3IifyvBVS2P1 EnKg== 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=lTMbDCkRfOvAf05P/XMp10EbMKCEHBsuVZzBOT5oSAM=; b=TA1umA7l5FHHkAXPkdgxw8z2csfv6rfPHrkaWPWmpqCT9v8U/dof/mLRTksmPRIEX1 lD9qRpYvKvUXgEf+GDyvqu/QXPCxCXh8n02dtrpl5oV8Oc6fhT1884LP9uorAAd51i6L hIsuSDs0stlu94mm25Jtb4/ssbbA9wJRkm9KeGiI9hR6Bnv9dZ7LqO50tJGUdStFDsdf aXdbX0TiHs+W6j2nvoZHRBKv/856dM3Mp88q82+6eCpoKg1djeH1PWLAjFQ3b1UNenqZ 9bPBPj+3iZ/XsOu7DqWcL432jSqCAnlK6t4XxI9TJsdZDXWt3wrQCAyoiqG91jDUpYct qviQ== X-Gm-Message-State: AMke39mFP9TB0nk7rAa8bLJ9t5QOLvJHvPsgK4mHG8tOY25FN6PWLOGKmMyB8MXeIQYIFQ== X-Received: by 10.84.129.132 with SMTP id b4mr46072655plb.54.1489403732587; Mon, 13 Mar 2017 04:15:32 -0700 (PDT) Received: from localhost.localdomain ([216.189.52.178]) by smtp.googlemail.com with ESMTPSA id r67sm32441525pfb.125.2017.03.13.04.15.30 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 13 Mar 2017 04:15:31 -0700 (PDT) From: =?UTF-8?q?=E5=8D=A2=E7=82=AF=E5=81=A5?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Mar 2017 19:15:09 +0800 Message-Id: <20170313111509.5681-1-lujiongjian1005@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) X-Mailman-Approved-At: Mon, 13 Mar 2017 21:50:37 +0200 Subject: [FFmpeg-devel] [PATCH] avformat/http: fix http reconnect 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: =?UTF-8?q?=E5=8D=A2=E7=82=AF=E5=81=A5?= MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- .DS_Store | Bin 0 -> 6148 bytes libavformat/http.c | 56 +++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..96401baa6bd16b8f5e9d811c77f9d75d64bed634 GIT binary patch literal 6148 zcmeHKJ5EC}5S%3uibRu=(pTUHRuoQ<3nWS;8b}ZV>R07l9F5se!PA2#5=}HKt;b&P z*zy!_-vY4J$Ke530$9);arR+qzVAMis_streamed = 1; + s->can_reconnect = 1; s->filesize = UINT64_MAX; s->location = av_strdup(uri); if (!s->location) @@ -1270,11 +1271,42 @@ static int http_buf_read_compressed(URLContext *h, uint8_t *buf, int size) static int64_t http_seek_internal(URLContext *h, int64_t off, int whence, int force_reconnect); +static int http_reconnect(URLContext *h) +{ + int64_t wait_start = 0; + int64_t seek_ret; + HTTPContext *s = h->priv_data; + uint64_t target = h->is_streamed ? 0 : s->off; + int timeout = s->reconnect_timeout * 1000*1000; + + if (!s->can_reconnect) + return -1; + + av_log(h, AV_LOG_INFO, "Will reconnect at %"PRIu64".\n", s->off); + do { + if (ff_check_interrupt(&h->interrupt_callback)) + return AVERROR_EXIT; + seek_ret = http_seek_internal(h, target, SEEK_SET, 1); + usleep(1000*1000); + if (timeout > 0) { + if (!wait_start) + wait_start = av_gettime_relative(); + else if (av_gettime_relative() - wait_start > timeout) { + av_log(h, AV_LOG_ERROR, "Reconnect time out. Failed to reconnect at %"PRIu64".\n", target); + s->can_reconnect = 0; + return AVERROR(ETIMEDOUT); + } + } + }while (seek_ret != target); + + av_log(h, AV_LOG_INFO, "Successful to reconnect at %"PRIu64".\n", target); + return 0; +} + static int http_read_stream(URLContext *h, uint8_t *buf, int size) { HTTPContext *s = h->priv_data; int err, new_location, read_ret; - int64_t seek_ret; if (!s->hd) return AVERROR_EOF; @@ -1292,23 +1324,13 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size) 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) || (read_ret == 0 && s->reconnect_at_eof && (!h->is_streamed || s->reconnect_streamed))) { - uint64_t target = h->is_streamed ? 0 : s->off; + av_log(h, AV_LOG_INFO, "http buffer read error=%s.\n", av_err2str(read_ret)); - 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); - s->reconnect_delay = 1 + 2*s->reconnect_delay; - seek_ret = http_seek_internal(h, target, SEEK_SET, 1); - if (seek_ret != target) { - av_log(h, AV_LOG_ERROR, "Failed to reconnect at %"PRIu64".\n", target); + if (http_reconnect(h) < 0) return read_ret; - } read_ret = http_buf_read(h, buf, size); - } else - s->reconnect_delay = 0; + } return read_ret; }