aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukasz Marek <lukasz.m.luki@gmail.com>2013-06-02 01:41:03 +0200
committerLukasz Marek <lukasz.m.luki@gmail.com>2013-06-08 03:54:55 +0200
commit23a76b71deead18fb75fc1f5af7281940778afb5 (patch)
tree91df494c3181f9a51dbe07d32aefe9d17c905604
parent56abad0ee4a34789f8bc00ba236c7f6be982ce26 (diff)
downloadffmpeg-23a76b71deead18fb75fc1f5af7281940778afb5.tar.gz
ftp: reconnect on tcp read error
This commit reconnect both connections and retries before ftp_read returns an error. Practical use case: resume after lock screen on iOS devices. Signed-off-by: Lukasz Marek <lukasz.m.luki@gmail.com>
-rw-r--r--libavformat/ftp.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/libavformat/ftp.c b/libavformat/ftp.c
index faa82dd30d..e818b8b757 100644
--- a/libavformat/ftp.c
+++ b/libavformat/ftp.c
@@ -499,8 +499,10 @@ static int ftp_abort(URLContext *h)
{
int err;
ftp_close_both_connections(h->priv_data);
- if ((err = ftp_connect_control_connection(h)) < 0)
+ if ((err = ftp_connect_control_connection(h)) < 0) {
+ av_log(h, AV_LOG_ERROR, "Reconnect failed.\n");
return err;
+ }
return 0;
}
@@ -602,10 +604,14 @@ static int ftp_read(URLContext *h, unsigned char *buf, int size)
av_dlog(h, "ftp protocol read %d bytes\n", size);
retry:
if (s->state == DISCONNECTED) {
+ if (s->position >= s->filesize)
+ return 0;
if ((err = ftp_connect_data_connection(h)) < 0)
return err;
}
if (s->state == READY) {
+ if (s->position >= s->filesize)
+ return 0;
if ((err = ftp_retrieve(s)) < 0)
return err;
}
@@ -618,15 +624,12 @@ static int ftp_read(URLContext *h, unsigned char *buf, int size)
return AVERROR(EIO);
}
}
- if (!read && s->position < s->filesize && !h->is_streamed) {
+ if (read <= 0 && s->position < s->filesize && !h->is_streamed) {
/* Server closed connection. Probably due to inactivity */
- /* TODO: Consider retry before reconnect */
int64_t pos = s->position;
av_log(h, AV_LOG_INFO, "Reconnect to FTP server.\n");
- if ((err = ftp_abort(h)) < 0) {
- av_log(h, AV_LOG_ERROR, "Reconnect failed.\n");
+ if ((err = ftp_abort(h)) < 0)
return err;
- }
if ((err = ftp_seek(h, pos, SEEK_SET)) < 0) {
av_log(h, AV_LOG_ERROR, "Position cannot be restored.\n");
return err;