diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-05-20 00:22:48 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-05-20 00:22:51 +0200 |
commit | 6218831844fa5a517eda857adee7960aa0a9c033 (patch) | |
tree | ef558092b7894d7f51b14af46203f17ddea49bb6 /libavformat | |
parent | ab6228316a595ecc1ee462a34a4f19e1ffeb9062 (diff) | |
parent | b9419b58826effc3d9afabd1a2e50d66391fbdbf (diff) | |
download | ffmpeg-6218831844fa5a517eda857adee7960aa0a9c033.tar.gz |
Merge remote-tracking branch 'lukaszmluki/master'
* lukaszmluki/master:
lavf/ftp: favour EPSV over PASV command
lavf/audiointerleave: return more meaningful error codes
lavf/audiointerleave: check for allocation failure
lavf/audiointerleave: use av_fifo_alloc_array
lavf/dvenc: use av_fifo_alloc_array
lavc/flac_parser: use av_fifo_alloc_array
lavc/frame_thread_encoder: use av_fifo_alloc_array
lavfi/vf_fps: use av_fifo_alloc_array
lavfi/buffersink: use av_fifo_alloc_array
ffmpeg: use av_fifo_alloc_array
lavd/jack_audio: use av_fifo_alloc_array
lavu/fifo: add av_fifo_alloc_array function
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/audiointerleave.c | 11 | ||||
-rw-r--r-- | libavformat/dvenc.c | 2 | ||||
-rw-r--r-- | libavformat/ftp.c | 51 |
3 files changed, 54 insertions, 10 deletions
diff --git a/libavformat/audiointerleave.c b/libavformat/audiointerleave.c index 6d24ff5c7f..7f580b970d 100644 --- a/libavformat/audiointerleave.c +++ b/libavformat/audiointerleave.c @@ -45,11 +45,11 @@ int ff_audio_interleave_init(AVFormatContext *s, int i; if (!samples_per_frame) - return -1; + return AVERROR(EINVAL); if (!time_base.num) { av_log(s, AV_LOG_ERROR, "timebase not set for audio interleave\n"); - return -1; + return AVERROR(EINVAL); } for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; @@ -60,14 +60,15 @@ int ff_audio_interleave_init(AVFormatContext *s, av_get_bits_per_sample(st->codec->codec_id)) / 8; if (!aic->sample_size) { av_log(s, AV_LOG_ERROR, "could not compute sample size\n"); - return -1; + return AVERROR(EINVAL); } aic->samples_per_frame = samples_per_frame; aic->samples = aic->samples_per_frame; aic->time_base = time_base; aic->fifo_size = 100* *aic->samples; - aic->fifo= av_fifo_alloc(100 * *aic->samples); + if (!(aic->fifo= av_fifo_alloc_array(100, *aic->samples))) + return AVERROR(ENOMEM); } } @@ -113,7 +114,7 @@ int ff_audio_rechunk_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt unsigned new_size = av_fifo_size(aic->fifo) + pkt->size; if (new_size > aic->fifo_size) { if (av_fifo_realloc2(aic->fifo, new_size) < 0) - return -1; + return AVERROR(ENOMEM); aic->fifo_size = new_size; } av_fifo_generic_write(aic->fifo, pkt->data, pkt->size, NULL); diff --git a/libavformat/dvenc.c b/libavformat/dvenc.c index defcf2a16e..bd484d96e8 100644 --- a/libavformat/dvenc.c +++ b/libavformat/dvenc.c @@ -331,7 +331,7 @@ static DVMuxContext* dv_init_mux(AVFormatContext* s) c->start_time = ff_iso8601_to_unix_time(t->value); for (i=0; i < c->n_ast; i++) { - if (c->ast[i] && !(c->audio_data[i]=av_fifo_alloc(100*MAX_AUDIO_FRAME_SIZE))) { + if (c->ast[i] && !(c->audio_data[i]=av_fifo_alloc_array(100, MAX_AUDIO_FRAME_SIZE))) { while (i > 0) { i--; av_fifo_freep(&c->audio_data[i]); diff --git a/libavformat/ftp.c b/libavformat/ftp.c index dae8aa086d..60011650b5 100644 --- a/libavformat/ftp.c +++ b/libavformat/ftp.c @@ -227,6 +227,48 @@ static int ftp_auth(FTPContext *s) return 0; } +static int ftp_passive_mode_epsv(FTPContext *s) +{ + char *res = NULL, *start = NULL, *end = NULL; + int i; + static const char d = '|'; + static const char *command = "EPSV\r\n"; + static const int epsv_codes[] = {229, 500, 501, 0}; /* 500, 501 are incorrect codes */ + + if (ftp_send_command(s, command, epsv_codes, &res) != 229 || !res) + goto fail; + + for (i = 0; res[i]; ++i) { + if (res[i] == '(') { + start = res + i + 1; + } else if (res[i] == ')') { + end = res + i; + break; + } + } + if (!start || !end) + goto fail; + + *end = '\0'; + if (strlen(start) < 5) + goto fail; + if (start[0] != d || start[1] != d || start[2] != d || end[-1] != d) + goto fail; + start += 3; + end[-1] = '\0'; + + s->server_data_port = atoi(start); + av_dlog(s, "Server data port: %d\n", s->server_data_port); + + av_free(res); + return 0; + + fail: + av_free(res); + s->server_data_port = -1; + return AVERROR(ENOSYS); +} + static int ftp_passive_mode(FTPContext *s) { char *res = NULL, *start = NULL, *end = NULL; @@ -270,8 +312,6 @@ static int ftp_passive_mode(FTPContext *s) fail: av_free(res); s->server_data_port = -1; - av_log(s, AV_LOG_ERROR, "Set passive mode failed\n" - "Your FTP server may use IPv6 which is not supported yet.\n"); return AVERROR(EIO); } @@ -439,8 +479,11 @@ static int ftp_connect_data_connection(URLContext *h) if (!s->conn_data) { /* Enter passive mode */ - if ((err = ftp_passive_mode(s)) < 0) - return err; + if (ftp_passive_mode_epsv(s) < 0) { + /* Use PASV as fallback */ + if ((err = ftp_passive_mode(s)) < 0) + return err; + } /* Open data connection */ ff_url_join(buf, sizeof(buf), "tcp", NULL, s->hostname, s->server_data_port, NULL); if (s->rw_timeout != -1) { |