]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/avf_showwaves.c
lavfi: move color filter to testsrc, factorize
[ffmpeg] / libavfilter / avf_showwaves.c
index 319f832c64fec275c1c229a69965315e58638ed3..96ed2c7ebcd58286ab7b16a83afa95dbc7971c2c 100644 (file)
@@ -20,7 +20,7 @@
 
 /**
  * @file
- * audio to video transmedia filter
+ * audio to video multimedia filter
  */
 
 #include "libavutil/audioconvert.h"
@@ -30,6 +30,7 @@
 #include "formats.h"
 #include "audio.h"
 #include "video.h"
+#include "internal.h"
 
 typedef struct {
     const AVClass *class;
@@ -54,15 +55,9 @@ static const AVOption showwaves_options[] = {
     { 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;
@@ -150,7 +145,7 @@ static int config_output(AVFilterLink *outlink)
     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;
 }
@@ -175,7 +170,7 @@ static int request_frame(AVFilterLink *outlink)
 
     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)
@@ -185,7 +180,7 @@ static int request_frame(AVFilterLink *outlink)
 
 #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];
@@ -201,14 +196,16 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
 
     /* 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);
         }
@@ -227,6 +224,7 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
     }
 
     avfilter_unref_buffer(insamples);
+    return 0;
 }
 
 AVFilter avfilter_avf_showwaves = {