mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-03 05:10:03 +02:00
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>
This commit is contained in:
commit
6218831844
@ -15,6 +15,9 @@ libavutil: 2012-10-22
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2014-05-xx - xxxxxxx - lavu 52.86.100 - fifo.h
|
||||
Add av_fifo_alloc_array() function.
|
||||
|
||||
2014-05-xx - xxxxxxx - lavu 53.15.0 - frame.h, display.h
|
||||
Add AV_FRAME_DATA_DISPLAYMATRIX for exporting frame-level
|
||||
spatial rendering on video frames for proper display.
|
||||
|
2
ffmpeg.c
2
ffmpeg.c
@ -3180,7 +3180,7 @@ static int init_input_threads(void)
|
||||
for (i = 0; i < nb_input_files; i++) {
|
||||
InputFile *f = input_files[i];
|
||||
|
||||
if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
|
||||
if (!(f->fifo = av_fifo_alloc_array(8, sizeof(AVPacket))))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
if (f->ctx->pb ? !f->ctx->pb->seekable :
|
||||
|
@ -707,7 +707,7 @@ static av_cold int flac_parse_init(AVCodecParserContext *c)
|
||||
fpc->pc = c;
|
||||
/* There will generally be FLAC_MIN_HEADERS buffered in the fifo before
|
||||
it drains. This is allocated early to avoid slow reallocation. */
|
||||
fpc->fifo_buf = av_fifo_alloc(FLAC_AVG_FRAME_SIZE * (FLAC_MIN_HEADERS + 3));
|
||||
fpc->fifo_buf = av_fifo_alloc_array(FLAC_MIN_HEADERS + 3, FLAC_AVG_FRAME_SIZE);
|
||||
if (!fpc->fifo_buf)
|
||||
return AVERROR(ENOMEM);
|
||||
return 0;
|
||||
|
@ -168,7 +168,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){
|
||||
|
||||
c->parent_avctx = avctx;
|
||||
|
||||
c->task_fifo = av_fifo_alloc(sizeof(Task) * BUFFER_SIZE);
|
||||
c->task_fifo = av_fifo_alloc_array(BUFFER_SIZE, sizeof(Task));
|
||||
if(!c->task_fifo)
|
||||
goto fail;
|
||||
|
||||
|
@ -194,9 +194,9 @@ static int start_jack(AVFormatContext *context)
|
||||
}
|
||||
|
||||
/* Create FIFO buffers */
|
||||
self->filled_pkts = av_fifo_alloc(FIFO_PACKETS_NUM * sizeof(AVPacket));
|
||||
self->filled_pkts = av_fifo_alloc_array(FIFO_PACKETS_NUM, sizeof(AVPacket));
|
||||
/* New packets FIFO with one extra packet for safety against underruns */
|
||||
self->new_pkts = av_fifo_alloc((FIFO_PACKETS_NUM + 1) * sizeof(AVPacket));
|
||||
self->new_pkts = av_fifo_alloc_array((FIFO_PACKETS_NUM + 1), sizeof(AVPacket));
|
||||
if ((test = supply_new_packets(self, context))) {
|
||||
jack_client_close(self->client);
|
||||
return test;
|
||||
|
@ -246,7 +246,7 @@ static av_cold int common_init(AVFilterContext *ctx)
|
||||
{
|
||||
BufferSinkContext *buf = ctx->priv;
|
||||
|
||||
buf->fifo = av_fifo_alloc(FIFO_INIT_SIZE*sizeof(AVFilterBufferRef *));
|
||||
buf->fifo = av_fifo_alloc_array(FIFO_INIT_SIZE, sizeof(AVFilterBufferRef *));
|
||||
if (!buf->fifo) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Failed to allocate fifo\n");
|
||||
return AVERROR(ENOMEM);
|
||||
|
@ -79,7 +79,7 @@ static av_cold int init(AVFilterContext *ctx)
|
||||
{
|
||||
FPSContext *s = ctx->priv;
|
||||
|
||||
if (!(s->fifo = av_fifo_alloc(2*sizeof(AVFrame*))))
|
||||
if (!(s->fifo = av_fifo_alloc_array(2, sizeof(AVFrame*))))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
s->first_pts = AV_NOPTS_VALUE;
|
||||
|
@ -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);
|
||||
|
@ -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]);
|
||||
|
@ -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) {
|
||||
|
@ -24,19 +24,34 @@
|
||||
#include "common.h"
|
||||
#include "fifo.h"
|
||||
|
||||
AVFifoBuffer *av_fifo_alloc(unsigned int size)
|
||||
static AVFifoBuffer *fifo_alloc_common(void *buffer, size_t size)
|
||||
{
|
||||
AVFifoBuffer *f = av_mallocz(sizeof(AVFifoBuffer));
|
||||
if (!f)
|
||||
AVFifoBuffer *f;
|
||||
if (!buffer)
|
||||
return NULL;
|
||||
f->buffer = av_malloc(size);
|
||||
f = av_mallocz(sizeof(AVFifoBuffer));
|
||||
if (!f) {
|
||||
av_free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
f->buffer = buffer;
|
||||
f->end = f->buffer + size;
|
||||
av_fifo_reset(f);
|
||||
if (!f->buffer)
|
||||
av_freep(&f);
|
||||
return f;
|
||||
}
|
||||
|
||||
AVFifoBuffer *av_fifo_alloc(unsigned int size)
|
||||
{
|
||||
void *buffer = av_malloc(size);
|
||||
return fifo_alloc_common(buffer, size);
|
||||
}
|
||||
|
||||
AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size)
|
||||
{
|
||||
void *buffer = av_malloc_array(nmemb, size);
|
||||
return fifo_alloc_common(buffer, nmemb * size);
|
||||
}
|
||||
|
||||
void av_fifo_free(AVFifoBuffer *f)
|
||||
{
|
||||
if (f) {
|
||||
|
@ -41,6 +41,14 @@ typedef struct AVFifoBuffer {
|
||||
*/
|
||||
AVFifoBuffer *av_fifo_alloc(unsigned int size);
|
||||
|
||||
/**
|
||||
* Initialize an AVFifoBuffer.
|
||||
* @param nmemb number of elements
|
||||
* @param size size of the single element
|
||||
* @return AVFifoBuffer or NULL in case of memory allocation failure
|
||||
*/
|
||||
AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size);
|
||||
|
||||
/**
|
||||
* Free an AVFifoBuffer.
|
||||
* @param f AVFifoBuffer to free
|
||||
|
@ -56,7 +56,7 @@
|
||||
*/
|
||||
|
||||
#define LIBAVUTIL_VERSION_MAJOR 52
|
||||
#define LIBAVUTIL_VERSION_MINOR 85
|
||||
#define LIBAVUTIL_VERSION_MINOR 86
|
||||
#define LIBAVUTIL_VERSION_MICRO 100
|
||||
|
||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||
|
Loading…
Reference in New Issue
Block a user