diff options
Diffstat (limited to 'libavfilter/src_buffer.c')
-rw-r--r-- | libavfilter/src_buffer.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/libavfilter/src_buffer.c b/libavfilter/src_buffer.c new file mode 100644 index 0000000..a997034 --- /dev/null +++ b/libavfilter/src_buffer.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2008 Vitor Sessak + * Copyright (c) 2010 S.N. Hemanth Meenakshisundaram + * Copyright (c) 2011 Mina Nagy Zaki + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * memory buffer source filter + */ + +#include "avfilter.h" +#include "internal.h" +#include "audio.h" +#include "avcodec.h" +#include "buffersrc.h" +#include "asrc_abuffer.h" +#include "libavutil/avstring.h" +#include "libavutil/channel_layout.h" +#include "libavutil/fifo.h" +#include "libavutil/imgutils.h" + +typedef struct { + AVFifoBuffer *fifo; + AVRational time_base; ///< time_base to set in the output link + int eof; + unsigned nb_failed_requests; + + /* Video only */ + AVFilterContext *scale; + int h, w; + enum AVPixelFormat pix_fmt; + AVRational sample_aspect_ratio; + char sws_param[256]; + + /* Audio only */ + // Audio format of incoming buffers + int sample_rate; + unsigned int sample_format; + int64_t channel_layout; + + // Normalization filters + AVFilterContext *aconvert; + AVFilterContext *aresample; +} BufferSourceContext; + +static void buf_free(AVFilterBuffer *ptr) +{ + av_free(ptr); + return; +} + +int av_asrc_buffer_add_audio_buffer_ref(AVFilterContext *ctx, + AVFilterBufferRef *samplesref, + int av_unused flags) +{ + return av_buffersrc_add_ref(ctx, samplesref, AV_BUFFERSRC_FLAG_NO_COPY); +} + +int av_asrc_buffer_add_samples(AVFilterContext *ctx, + uint8_t *data[8], int linesize[8], + int nb_samples, int sample_rate, + int sample_fmt, int64_t channel_layout, int planar, + int64_t pts, int av_unused flags) +{ + AVFilterBufferRef *samplesref; + + if (!channel_layout) + return AVERROR(EINVAL); + samplesref = avfilter_get_audio_buffer_ref_from_arrays( + data, linesize[0], AV_PERM_WRITE, + nb_samples, + sample_fmt, channel_layout); + if (!samplesref) + return AVERROR(ENOMEM); + + samplesref->buf->free = buf_free; + samplesref->pts = pts; + samplesref->audio->sample_rate = sample_rate; + + AV_NOWARN_DEPRECATED( + return av_asrc_buffer_add_audio_buffer_ref(ctx, samplesref, 0); + ) +} + +int av_asrc_buffer_add_buffer(AVFilterContext *ctx, + uint8_t *buf, int buf_size, int sample_rate, + int sample_fmt, int64_t channel_layout, int planar, + int64_t pts, int av_unused flags) +{ + uint8_t *data[8] = {0}; + int linesize[8]; + int nb_channels = av_get_channel_layout_nb_channels(channel_layout), + nb_samples = buf_size / nb_channels / av_get_bytes_per_sample(sample_fmt); + + av_samples_fill_arrays(data, linesize, + buf, nb_channels, nb_samples, + sample_fmt, 16); + + AV_NOWARN_DEPRECATED( + return av_asrc_buffer_add_samples(ctx, + data, linesize, nb_samples, + sample_rate, + sample_fmt, channel_layout, planar, + pts, flags); + ) +} |