[FFmpeg-cvslog] avfilter/af_ladspa: fix pts compensation if number of samples per frame is lower than latency
Paul B Mahol
git at videolan.org
Thu Apr 7 10:38:13 EEST 2022
ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Thu Apr 7 09:35:57 2022 +0200| [55d414829c601ec5482be61aa327c22f0f602fe1] | committer: Paul B Mahol
avfilter/af_ladspa: fix pts compensation if number of samples per frame is lower than latency
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=55d414829c601ec5482be61aa327c22f0f602fe1
---
libavfilter/af_ladspa.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/libavfilter/af_ladspa.c b/libavfilter/af_ladspa.c
index bf51b372ff..1c3ede2ee2 100644
--- a/libavfilter/af_ladspa.c
+++ b/libavfilter/af_ladspa.c
@@ -29,11 +29,17 @@
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
+#include "libavutil/fifo.h"
#include "libavutil/opt.h"
#include "audio.h"
#include "avfilter.h"
#include "internal.h"
+typedef struct MetaItem {
+ int64_t pts;
+ int nb_samples;
+} MetaItem;
+
typedef struct LADSPAContext {
const AVClass *class;
char *dl_name;
@@ -69,6 +75,8 @@ typedef struct LADSPAContext {
int in_trim;
int out_pad;
int latency;
+
+ AVFifo *fifo;
} LADSPAContext;
#define OFFSET(x) offsetof(LADSPAContext, x)
@@ -169,6 +177,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
int64_t out_duration;
int64_t in_duration;
int64_t in_pts;
+ MetaItem meta;
av_assert0(in->ch_layout.nb_channels == (s->nb_inputs * s->nb_handles));
@@ -210,8 +219,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
for (i = 0; i < s->nb_outputcontrols; i++)
print_ctl_info(ctx, AV_LOG_VERBOSE, s, i, s->ocmap, s->octlv, 1);
- in_duration = av_rescale_q(in->nb_samples, inlink->time_base, av_make_q(1, in->sample_rate));
- in_pts = in->pts;
+ meta = (MetaItem){ in->pts, in->nb_samples };
+ av_fifo_write(s->fifo, &meta, 1);
+
if (out != in)
av_frame_free(&in);
@@ -235,9 +245,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
out->nb_samples = new_out_samples;
}
+ av_fifo_read(s->fifo, &meta, 1);
+
out_duration = av_rescale_q(out->nb_samples, inlink->time_base, av_make_q(1, out->sample_rate));
+ in_duration = av_rescale_q(meta.nb_samples, inlink->time_base, av_make_q(1, out->sample_rate));
+ in_pts = meta.pts;
+
if (s->next_out_pts != AV_NOPTS_VALUE && out->pts != s->next_out_pts &&
- s->next_in_pts != AV_NOPTS_VALUE && out->pts == s->next_in_pts) {
+ s->next_in_pts != AV_NOPTS_VALUE && in_pts == s->next_in_pts) {
out->pts = s->next_out_pts;
} else {
out->pts = in_pts;
@@ -676,6 +691,10 @@ static av_cold int init(AVFilterContext *ctx)
s->next_out_pts = AV_NOPTS_VALUE;
s->next_in_pts = AV_NOPTS_VALUE;
+ s->fifo = av_fifo_alloc2(8, sizeof(MetaItem), AV_FIFO_FLAG_AUTO_GROW);
+ if (!s->fifo)
+ return AVERROR(ENOMEM);
+
return 0;
}
@@ -775,6 +794,8 @@ static av_cold void uninit(AVFilterContext *ctx)
av_freep(&s->octlv);
av_freep(&s->handles);
av_freep(&s->ctl_needs_value);
+
+ av_fifo_freep2(&s->fifo);
}
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
More information about the ffmpeg-cvslog
mailing list