*/
#include "libavutil/audio_fifo.h"
+#include "libavutil/audioconvert.h"
#include "libavutil/avassert.h"
#include "libavutil/opt.h"
#include "avfilter.h"
#include "audio.h"
+#include "internal.h"
#include "formats.h"
typedef struct {
#define OFFSET(x) offsetof(ASNSContext, x)
-static const AVOption asns_options[] = {
+static const AVOption asetnsamples_options[] = {
{ "pad", "pad last frame with zeros", OFFSET(pad), AV_OPT_TYPE_INT, {.dbl=1}, 0, 1 },
{ "p", "pad last frame with zeros", OFFSET(pad), AV_OPT_TYPE_INT, {.dbl=1}, 0, 1 },
{ "nb_out_samples", "set the number of per-frame output samples", OFFSET(nb_out_samples), AV_OPT_TYPE_INT, {.dbl=1024}, 1, INT_MAX },
{ NULL }
};
-static const AVClass asns_class = {
- .class_name = "asetnsamples",
- .item_name = av_default_item_name,
- .option = asns_options,
- .version = LIBAVUTIL_VERSION_INT,
- .category = AV_CLASS_CATEGORY_FILTER,
-};
+AVFILTER_DEFINE_CLASS(asetnsamples);
-static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
+static av_cold int init(AVFilterContext *ctx, const char *args)
{
ASNSContext *asns = ctx->priv;
int err;
- asns->class = &asns_class;
+ asns->class = &asetnsamples_class;
av_opt_set_defaults(asns);
- if ((err = av_set_options_string(asns, args, "=", ":")) < 0) {
- av_log(ctx, AV_LOG_ERROR, "Error parsing options string: '%s'\n", args);
+ if ((err = av_set_options_string(asns, args, "=", ":")) < 0)
return err;
- }
asns->next_out_pts = AV_NOPTS_VALUE;
- av_log(ctx, AV_LOG_INFO, "nb_out_samples:%d pad:%d\n", asns->nb_out_samples, asns->pad);
+ av_log(ctx, AV_LOG_VERBOSE, "nb_out_samples:%d pad:%d\n", asns->nb_out_samples, asns->pad);
return 0;
}
return nb_out_samples;
}
-static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
+static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
{
AVFilterContext *ctx = inlink->dst;
ASNSContext *asns = ctx->priv;
if (ret < 0) {
av_log(ctx, AV_LOG_ERROR,
"Stretching audio fifo failed, discarded %d samples\n", nb_samples);
- return;
+ return -1;
}
}
av_audio_fifo_write(asns->fifo, (void **)insamples->extended_data, nb_samples);
asns->next_out_pts = insamples->pts;
avfilter_unref_buffer(insamples);
- if (av_audio_fifo_size(asns->fifo) >= asns->nb_out_samples)
+ while (av_audio_fifo_size(asns->fifo) >= asns->nb_out_samples)
push_samples(outlink);
+ return 0;
}
static int request_frame(AVFilterLink *outlink)
asns->req_fullfilled = 0;
do {
- ret = avfilter_request_frame(inlink);
+ ret = ff_request_frame(inlink);
} while (!asns->req_fullfilled && ret >= 0);
if (ret == AVERROR_EOF)