• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Stefano Sabatini | stefasab at gmail.com
3  * Copyright (c) S.N. Hemanth Meenakshisundaram | smeenaks at ucsd.edu
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavutil/avassert.h"
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/common.h"
25 
26 #include "audio.h"
27 #include "avfilter.h"
28 #include "internal.h"
29 
30 #define BUFFER_ALIGN 0
31 
32 
ff_null_get_audio_buffer(AVFilterLink * link,int nb_samples)33 AVFrame *ff_null_get_audio_buffer(AVFilterLink *link, int nb_samples)
34 {
35     return ff_get_audio_buffer(link->dst->outputs[0], nb_samples);
36 }
37 
ff_default_get_audio_buffer(AVFilterLink * link,int nb_samples)38 AVFrame *ff_default_get_audio_buffer(AVFilterLink *link, int nb_samples)
39 {
40     AVFrame *frame = NULL;
41     int channels = link->channels;
42 
43     av_assert0(channels == av_get_channel_layout_nb_channels(link->channel_layout) || !av_get_channel_layout_nb_channels(link->channel_layout));
44 
45     if (!link->frame_pool) {
46         link->frame_pool = ff_frame_pool_audio_init(av_buffer_allocz, channels,
47                                                     nb_samples, link->format, BUFFER_ALIGN);
48         if (!link->frame_pool)
49             return NULL;
50     } else {
51         int pool_channels = 0;
52         int pool_nb_samples = 0;
53         int pool_align = 0;
54         enum AVSampleFormat pool_format = AV_SAMPLE_FMT_NONE;
55 
56         if (ff_frame_pool_get_audio_config(link->frame_pool,
57                                            &pool_channels, &pool_nb_samples,
58                                            &pool_format, &pool_align) < 0) {
59             return NULL;
60         }
61 
62         if (pool_channels != channels || pool_nb_samples < nb_samples ||
63             pool_format != link->format || pool_align != BUFFER_ALIGN) {
64 
65             ff_frame_pool_uninit((FFFramePool **)&link->frame_pool);
66             link->frame_pool = ff_frame_pool_audio_init(av_buffer_allocz, channels,
67                                                         nb_samples, link->format, BUFFER_ALIGN);
68             if (!link->frame_pool)
69                 return NULL;
70         }
71     }
72 
73     frame = ff_frame_pool_get(link->frame_pool);
74     if (!frame)
75         return NULL;
76 
77     frame->nb_samples = nb_samples;
78     frame->channel_layout = link->channel_layout;
79     frame->sample_rate = link->sample_rate;
80 
81     av_samples_set_silence(frame->extended_data, 0, nb_samples, channels, link->format);
82 
83     return frame;
84 }
85 
ff_get_audio_buffer(AVFilterLink * link,int nb_samples)86 AVFrame *ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
87 {
88     AVFrame *ret = NULL;
89 
90     if (link->dstpad->get_audio_buffer)
91         ret = link->dstpad->get_audio_buffer(link, nb_samples);
92 
93     if (!ret)
94         ret = ff_default_get_audio_buffer(link, nb_samples);
95 
96     return ret;
97 }
98