diff options
author | Rudolf Polzer <divverent@xonotic.org> | 2012-08-23 12:32:13 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-08-23 13:13:53 +0200 |
commit | 2adc81f0a2459a565437009ff6f4ace1dca3d46c (patch) | |
tree | 4fb92807ad61980fac5230d670af374aaaa9d082 /libmpcodecs/vf_dlopen.h | |
parent | 2e6450c7cc88f1e39034ac111e9b54a421bca661 (diff) | |
download | mpv-2adc81f0a2459a565437009ff6f4ace1dca3d46c.tar.bz2 mpv-2adc81f0a2459a565437009ff6f4ace1dca3d46c.tar.xz |
vf_dlopen: add a generic filter to load external filters
Usage: -vf dlopen=filename.so:args...
Examples of such filters are provided in TOOLS/vf_dlopen/
Diffstat (limited to 'libmpcodecs/vf_dlopen.h')
-rw-r--r-- | libmpcodecs/vf_dlopen.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/libmpcodecs/vf_dlopen.h b/libmpcodecs/vf_dlopen.h new file mode 100644 index 0000000000..962605ca28 --- /dev/null +++ b/libmpcodecs/vf_dlopen.h @@ -0,0 +1,88 @@ +#ifndef VF_DLOPEN_H +#define VF_DLOPEN_H + +// when doing a two-way compatible change, don't change these +// when doing a backwards compatible change, bump minor version +// when doing an incompatible change, bump major version and zero minor version +#define VF_DLOPEN_MAJOR_VERSION 1 +#define VF_DLOPEN_MINOR_VERSION 0 + +#if VF_DLOPEN_MINOR_VERSION > 0 +# define VF_DLOPEN_CHECK_VERSION(ctx) \ + do { \ + if (ctx->major_version != VF_DLOPEN_MAJOR_VERSION || \ + ctx->minor_version < VF_DLOPEN_MINOR_VERSION) \ + return -1; \ + } while (0) +#else +// workaround for "comparison is always false" warning +# define VF_DLOPEN_CHECK_VERSION(ctx) \ + do { \ + if (ctx->major_version != VF_DLOPEN_MAJOR_VERSION) \ + return -1; \ + } while (0) +#endif + +// valid pixel format names: +// "yv12": planar YUV, U and V planes have an xshift and yshift of 1 +// "rgb24": packed RGB24 +struct vf_dlopen_formatpair { + const char *from; // (LATER) can also be a name of a format class + const char *to; // if NULL, this means identical format as source +}; + +#define FILTER_MAX_OUTCNT 16 + +struct vf_dlopen_picdata { + unsigned int planes; + unsigned char *plane[4]; + signed int planestride[4]; + unsigned int planewidth[4]; + unsigned int planeheight[4]; + unsigned int planexshift[4]; + unsigned int planeyshift[4]; + double pts; +}; + +struct vf_dlopen_context { + unsigned short major_version; + unsigned short minor_version; + + void *priv; + + struct vf_dlopen_formatpair *format_mapping; + // {NULL, NULL} terminated list of supported format pairs + // if NULL, anything goes + + int (*config)(struct vf_dlopen_context *ctx); // -1 = error + // image config is put into the in_* members before calling this + // fills in the out_* members (which are preinitialized for an identity vf_dlopen_context) + + int (*put_image)(struct vf_dlopen_context *ctx); // returns number of images written, or negative on error + // before this is called, inpic_* and outpic_* are filled + + void (*uninit)(struct vf_dlopen_context *ctx); + + unsigned int in_width; + unsigned int in_height; + unsigned int in_d_width; + unsigned int in_d_height; + const char *in_fmt; + unsigned int out_width; + unsigned int out_height; + unsigned int out_d_width; + unsigned int out_d_height; + const char *out_fmt; + unsigned int out_cnt; + + struct vf_dlopen_picdata inpic; + char *inpic_qscale; + unsigned int inpic_qscalestride; + unsigned int inpic_qscaleshift; + + struct vf_dlopen_picdata outpic[FILTER_MAX_OUTCNT]; +}; +typedef int (vf_dlopen_getcontext_func)(struct vf_dlopen_context *ctx, int argc, const char **argv); // negative on error +vf_dlopen_getcontext_func vf_dlopen_getcontext; + +#endif |