From f8ab732ac3cc635dde06c195fe48905116fe9eee Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 30 Jul 2014 22:44:35 +0200 Subject: video/filter: add vf_buffer Mostly useful for debugging. --- video/filter/vf.c | 2 ++ video/filter/vf_buffer.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 video/filter/vf_buffer.c (limited to 'video') diff --git a/video/filter/vf.c b/video/filter/vf.c index 785fb9b908..e76d30ea23 100644 --- a/video/filter/vf.c +++ b/video/filter/vf.c @@ -72,6 +72,7 @@ extern const vf_info_t vf_info_lavfi; extern const vf_info_t vf_info_vaapi; extern const vf_info_t vf_info_vapoursynth; extern const vf_info_t vf_info_vdpaupp; +extern const vf_info_t vf_info_buffer; // list of available filters: static const vf_info_t *const filter_list[] = { @@ -109,6 +110,7 @@ static const vf_info_t *const filter_list[] = { &vf_info_sub, &vf_info_yadif, &vf_info_stereo3d, + &vf_info_buffer, #if HAVE_DLOPEN &vf_info_dlopen, #endif diff --git a/video/filter/vf_buffer.c b/video/filter/vf_buffer.c new file mode 100644 index 0000000000..2a7e458637 --- /dev/null +++ b/video/filter/vf_buffer.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include + +#include "talloc.h" + +#include "options/m_option.h" + +#include "video/img_format.h" +#include "video/mp_image.h" + +#include "vf.h" + +#define MAX_Q 100 + +struct vf_priv_s { + struct mp_image *queued[MAX_Q]; + int num_queued; + int cfg_num; +}; + +static void flush(struct vf_instance *vf) +{ + for (int n = 0; n < vf->priv->num_queued; n++) + mp_image_unrefp(&vf->priv->queued[n]); + vf->priv->num_queued = 0; +} + +static int config(struct vf_instance *vf, + int width, int height, int d_width, int d_height, + unsigned int flags, unsigned int outfmt) +{ + flush(vf); + return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); +} + +static int filter_ext(struct vf_instance *vf, struct mp_image *mpi) +{ + struct vf_priv_s *p = vf->priv; + if (mpi) { + if (p->num_queued == p->cfg_num) { + vf_add_output_frame(vf, p->queued[p->num_queued - 1]); + p->num_queued--; + } + p->num_queued++; + for (int n = p->num_queued - 1; n > 0; n--) + p->queued[n] = p->queued[n - 1]; + p->queued[0] = mpi; + } else { + // EOF + while (p->num_queued) { + vf_add_output_frame(vf, p->queued[p->num_queued - 1]); + p->num_queued--; + } + } + return 0; +} + +static int control(vf_instance_t *vf, int request, void *data) +{ + if (request == VFCTRL_SEEK_RESET) { + flush(vf); + return CONTROL_OK; + } + return CONTROL_UNKNOWN; +} + +static void uninit(vf_instance_t *vf) +{ + flush(vf); +} + +static int vf_open(vf_instance_t *vf) +{ + vf->config = config; + vf->filter_ext = filter_ext; + vf->control = control; + vf->uninit = uninit; + return 1; +} + +#define OPT_BASE_STRUCT struct vf_priv_s +const vf_info_t vf_info_buffer = { + .description = "buffer a number of frames", + .name = "buffer", + .open = vf_open, + .priv_size = sizeof(struct vf_priv_s), + .options = (const struct m_option[]){ + OPT_INTRANGE("num", cfg_num, 0, 1, MAX_Q, OPTDEF_INT(2)), + {0} + }, +}; -- cgit v1.2.3