mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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>
This commit is contained in:
parent
56abad0ee4
commit
23a76b71de
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user