summaryrefslogtreecommitdiffstats
path: root/filters
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-04-19 17:42:14 +0200
committerwm4 <wm4@nowhere>2018-04-19 23:22:48 +0200
commitff24285eb15676dc7519b858be01a1def155e847 (patch)
treeda962345d8d33108c0b096c3aaeec6cbc41fe25c /filters
parente7e06a47a0b5626c3abe81f3627d10ed58d92d3b (diff)
downloadmpv-ff24285eb15676dc7519b858be01a1def155e847.tar.bz2
mpv-ff24285eb15676dc7519b858be01a1def155e847.tar.xz
video: pass through container fps to filters
This means vf_vapoursynth doesn't need a hack to work around the filter code, and libavfilter filters now actually get the frame_rate field on input pads set. The libavfilter doxygen says the frame_rate field is only to be set if the frame rate is known to be constant, and uses the word "must" (which probably means they really mean it?) - but ffmpeg.c sets the field to mere guesses anyway, and it looks like this normally won't lead to problems.
Diffstat (limited to 'filters')
-rw-r--r--filters/f_decoder_wrapper.c1
-rw-r--r--filters/f_lavfi.c9
-rw-r--r--filters/f_output_chain.c7
-rw-r--r--filters/filter.h1
4 files changed, 9 insertions, 9 deletions
diff --git a/filters/f_decoder_wrapper.c b/filters/f_decoder_wrapper.c
index 16b9cd06df..2ad145b5cb 100644
--- a/filters/f_decoder_wrapper.c
+++ b/filters/f_decoder_wrapper.c
@@ -358,6 +358,7 @@ static void process_video_frame(struct priv *p, struct mp_image *mpi)
fix_image_params(p, &mpi->params);
mpi->params = p->fixed_format;
+ mpi->nominal_fps = p->public.fps;
mpi->pts = pts;
p->pts = pts;
diff --git a/filters/f_lavfi.c b/filters/f_lavfi.c
index 1b41c93aac..2c01eaf59c 100644
--- a/filters/f_lavfi.c
+++ b/filters/f_lavfi.c
@@ -340,7 +340,8 @@ static bool is_vformat_ok(struct mp_image *a, struct mp_image *b)
{
return a->imgfmt == b->imgfmt &&
a->w == b->w && a->h && b->h &&
- a->params.p_w == b->params.p_w && a->params.p_h == b->params.p_h;
+ a->params.p_w == b->params.p_w && a->params.p_h == b->params.p_h &&
+ a->nominal_fps == b->nominal_fps;
}
static bool is_format_ok(struct mp_frame a, struct mp_frame b)
{
@@ -483,6 +484,7 @@ static bool init_pads(struct lavfi *c)
params->sample_aspect_ratio.num = fmt->params.p_w;
params->sample_aspect_ratio.den = fmt->params.p_h;
params->hw_frames_ctx = fmt->hwctx;
+ params->frame_rate = av_d2q(fmt->nominal_fps, 1000000);
filter_name = "buffer";
} else {
assert(0);
@@ -680,6 +682,11 @@ static bool read_output_pads(struct lavfi *c)
mp_aframe_set_pts(aframe, c->in_pts +
(c->in_pts != MP_NOPTS_VALUE ? (out_time - in_time) : 0));
}
+ if (frame.type == MP_FRAME_VIDEO) {
+ struct mp_image *vframe = frame.data;
+ vframe->nominal_fps =
+ av_q2d(av_buffersink_get_frame_rate(pad->buffer));
+ }
av_frame_unref(c->tmp_frame);
if (frame.type) {
mp_pin_in_write(pad->pin, frame);
diff --git a/filters/f_output_chain.c b/filters/f_output_chain.c
index e986614e9d..cd577a6ca2 100644
--- a/filters/f_output_chain.c
+++ b/filters/f_output_chain.c
@@ -357,12 +357,6 @@ static double get_display_fps(struct mp_stream_info *i)
return res;
}
-static double get_container_fps(struct mp_stream_info *i)
-{
- struct chain *p = i->priv;
- return p->public.container_fps;
-}
-
void mp_output_chain_set_vo(struct mp_output_chain *c, struct vo *vo)
{
struct chain *p = c->f->priv;
@@ -650,7 +644,6 @@ static void create_video_things(struct chain *p)
p->stream_info.priv = p;
p->stream_info.get_display_fps = get_display_fps;
- p->stream_info.get_container_fps = get_container_fps;
p->f->stream_info = &p->stream_info;
diff --git a/filters/filter.h b/filters/filter.h
index e63b812a79..33177444c2 100644
--- a/filters/filter.h
+++ b/filters/filter.h
@@ -382,7 +382,6 @@ struct mp_stream_info {
void *priv; // for use by whoever implements the callbacks
double (*get_display_fps)(struct mp_stream_info *i);
- double (*get_container_fps)(struct mp_stream_info *i);
struct mp_hwdec_devices *hwdec_devs;
struct osd_state *osd;