{
AVFrame *frame = av_frame_alloc();
int channels = av_get_channel_layout_nb_channels(link->channel_layout);
- int buf_size, ret;
+ int ret;
if (!frame)
return NULL;
- buf_size = av_samples_get_buffer_size(NULL, channels, nb_samples,
- link->format, 0);
- if (buf_size < 0)
- goto fail;
-
- frame->buf[0] = av_buffer_alloc(buf_size);
- if (!frame->buf[0])
- goto fail;
-
- frame->nb_samples = nb_samples;
- ret = avcodec_fill_audio_frame(frame, channels, link->format,
- frame->buf[0]->data, buf_size, 0);
- if (ret < 0)
- goto fail;
-
- av_samples_set_silence(frame->extended_data, 0, nb_samples, channels,
- link->format);
-
frame->nb_samples = nb_samples;
frame->format = link->format;
frame->channel_layout = link->channel_layout;
frame->sample_rate = link->sample_rate;
+ ret = av_frame_get_buffer(frame, 0);
+ if (ret < 0) {
+ av_frame_free(&frame);
+ return NULL;
+ }
+
+ av_samples_set_silence(frame->extended_data, 0, nb_samples, channels,
+ link->format);
- return frame;
-fail:
- av_buffer_unref(&frame->buf[0]);
- av_frame_free(&frame);
- return NULL;
+ return frame;
}
AVFrame *ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
return ret;
}
-
-#if FF_API_AVFILTERBUFFER
-AVFilterBufferRef* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data,
- int linesize,int perms,
- int nb_samples,
- enum AVSampleFormat sample_fmt,
- uint64_t channel_layout)
-{
- int planes;
- AVFilterBuffer *samples = av_mallocz(sizeof(*samples));
- AVFilterBufferRef *samplesref = av_mallocz(sizeof(*samplesref));
-
- if (!samples || !samplesref)
- goto fail;
-
- samplesref->buf = samples;
- samplesref->buf->free = ff_avfilter_default_free_buffer;
- if (!(samplesref->audio = av_mallocz(sizeof(*samplesref->audio))))
- goto fail;
-
- samplesref->audio->nb_samples = nb_samples;
- samplesref->audio->channel_layout = channel_layout;
- samplesref->audio->planar = av_sample_fmt_is_planar(sample_fmt);
-
- planes = samplesref->audio->planar ? av_get_channel_layout_nb_channels(channel_layout) : 1;
-
- /* make sure the buffer gets read permission or it's useless for output */
- samplesref->perms = perms | AV_PERM_READ;
-
- samples->refcount = 1;
- samplesref->type = AVMEDIA_TYPE_AUDIO;
- samplesref->format = sample_fmt;
-
- memcpy(samples->data, data,
- FFMIN(FF_ARRAY_ELEMS(samples->data), planes)*sizeof(samples->data[0]));
- memcpy(samplesref->data, samples->data, sizeof(samples->data));
-
- samples->linesize[0] = samplesref->linesize[0] = linesize;
-
- if (planes > FF_ARRAY_ELEMS(samples->data)) {
- samples-> extended_data = av_mallocz(sizeof(*samples->extended_data) *
- planes);
- samplesref->extended_data = av_mallocz(sizeof(*samplesref->extended_data) *
- planes);
-
- if (!samples->extended_data || !samplesref->extended_data)
- goto fail;
-
- memcpy(samples-> extended_data, data, sizeof(*data)*planes);
- memcpy(samplesref->extended_data, data, sizeof(*data)*planes);
- } else {
- samples->extended_data = samples->data;
- samplesref->extended_data = samplesref->data;
- }
-
- samplesref->pts = AV_NOPTS_VALUE;
-
- return samplesref;
-
-fail:
- if (samples && samples->extended_data != samples->data)
- av_freep(&samples->extended_data);
- if (samplesref) {
- av_freep(&samplesref->audio);
- if (samplesref->extended_data != samplesref->data)
- av_freep(&samplesref->extended_data);
- }
- av_freep(&samplesref);
- av_freep(&samples);
- return NULL;
-}
-#endif