/**
* @file
- * audio to video transmedia filter
+ * audio to video multimedia filter
*/
#include "libavutil/audioconvert.h"
#include "formats.h"
#include "audio.h"
#include "video.h"
+#include "internal.h"
typedef struct {
const AVClass *class;
{ NULL },
};
-static const AVClass showwaves_class = {
- .class_name = "showwaves",
- .item_name = av_default_item_name,
- .option = showwaves_options,
- .version = LIBAVUTIL_VERSION_INT,
- .category = AV_CLASS_CATEGORY_FILTER,
-};
+AVFILTER_DEFINE_CLASS(showwaves);
-static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
+static av_cold int init(AVFilterContext *ctx, const char *args)
{
ShowWavesContext *showwaves = ctx->priv;
int err;
outlink->frame_rate = av_div_q((AVRational){inlink->sample_rate,showwaves->n},
(AVRational){showwaves->w,1});
- av_log(ctx, AV_LOG_INFO, "s:%dx%d r:%f n:%d\n",
+ av_log(ctx, AV_LOG_VERBOSE, "s:%dx%d r:%f n:%d\n",
showwaves->w, showwaves->h, av_q2d(outlink->frame_rate), showwaves->n);
return 0;
}
showwaves->req_fullfilled = 0;
do {
- ret = avfilter_request_frame(inlink);
+ ret = ff_request_frame(inlink);
} while (!showwaves->req_fullfilled && ret >= 0);
if (ret == AVERROR_EOF && showwaves->outpicref)
#define MAX_INT16 ((1<<15) -1)
-static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
+static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
{
AVFilterContext *ctx = inlink->dst;
AVFilterLink *outlink = ctx->outputs[0];
/* draw data in the buffer */
for (i = 0; i < nb_samples; i++) {
- if (showwaves->buf_idx == 0) {
+ if (showwaves->buf_idx == 0 && showwaves->sample_count_mod == 0) {
showwaves->outpicref = outpicref =
ff_get_video_buffer(outlink, AV_PERM_WRITE|AV_PERM_ALIGN,
outlink->w, outlink->h);
outpicref->video->w = outlink->w;
outpicref->video->h = outlink->h;
- outpicref->pts = insamples->pts;
- outlink->out_buf = outpicref;
+ outpicref->pts = insamples->pts +
+ av_rescale_q((p - (int16_t *)insamples->data[0]) / nb_channels,
+ (AVRational){ 1, inlink->sample_rate },
+ outlink->time_base);
linesize = outpicref->linesize[0];
memset(outpicref->data[0], 0, showwaves->h*linesize);
}
}
avfilter_unref_buffer(insamples);
+ return 0;
}
AVFilter avfilter_avf_showwaves = {