summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavfilter/vf_fps.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index 051d278f54..824e7a128d 100644
--- a/libavfilter/vf_fps.c
+++ b/libavfilter/vf_fps.c
@@ -34,6 +34,7 @@
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "avfilter.h"
+#include "ccfifo.h"
#include "filters.h"
#include "internal.h"
@@ -85,6 +86,7 @@ typedef struct FPSContext {
AVFrame *frames[2]; ///< buffered frames
int frames_count; ///< number of buffered frames
+ AVCCFifo *cc_fifo; ///< closed captions
int64_t next_pts; ///< pts of the next frame to output
@@ -165,6 +167,7 @@ static av_cold void uninit(AVFilterContext *ctx)
frame = shift_frame(ctx, s);
av_frame_free(&frame);
}
+ ff_ccfifo_freep(&s->cc_fifo);
av_log(ctx, AV_LOG_VERBOSE, "%d frames in, %d frames out; %d frames dropped, "
"%d frames duplicated.\n", s->frames_in, s->frames_out, s->drop, s->dup);
@@ -210,6 +213,11 @@ static int config_props(AVFilterLink* outlink)
s->in_pts_off, s->out_pts_off, s->start_time);
}
+ if (!(s->cc_fifo = ff_ccfifo_alloc(outlink->frame_rate, ctx))) {
+ av_log(ctx, AV_LOG_ERROR, "Failure to setup CC FIFO queue\n");
+ return AVERROR(ENOMEM);
+ }
+
av_log(ctx, AV_LOG_VERBOSE, "fps=%d/%d\n", outlink->frame_rate.num, outlink->frame_rate.den);
return 0;
@@ -242,6 +250,7 @@ static int read_frame(AVFilterContext *ctx, FPSContext *s, AVFilterLink *inlink,
av_log(ctx, AV_LOG_DEBUG, "Read frame with in pts %"PRId64", out pts %"PRId64"\n",
in_pts, frame->pts);
+ ff_ccfifo_extract(s->cc_fifo, frame);
s->frames[s->frames_count++] = frame;
s->frames_in++;
@@ -289,7 +298,7 @@ static int write_frame(AVFilterContext *ctx, FPSContext *s, AVFilterLink *outlin
if (!frame)
return AVERROR(ENOMEM);
// Make sure Closed Captions will not be duplicated
- av_frame_remove_side_data(s->frames[0], AV_FRAME_DATA_A53_CC);
+ ff_ccfifo_inject(s->cc_fifo, frame);
frame->pts = s->next_pts++;
frame->duration = 1;