summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-07-18 13:37:24 +0200
committerwm4 <wm4@nowhere>2013-07-18 13:37:24 +0200
commit2134fa4e6b1287b493a6bc65392ec17854a92d5d (patch)
tree1dda934f1197e0b20815b7b93433e09a6188eb44
parentd8659c9aa0ab74a3dabb321f34e93dd7f3890b03 (diff)
downloadmpv-2134fa4e6b1287b493a6bc65392ec17854a92d5d.tar.bz2
mpv-2134fa4e6b1287b493a6bc65392ec17854a92d5d.tar.xz
vf: make sure less important image params are set before/after filters
Image parameters like colorspace, color levels, and chroma location are generally less important, and many filters don't set them correctly. Force them instead in the generic VF code, which is probably better and more convenient over all. So we designate this is a proper solution, instead of a dirty hack.
-rw-r--r--video/filter/vf.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/video/filter/vf.c b/video/filter/vf.c
index 8946aeb801..eaa19bbdb8 100644
--- a/video/filter/vf.c
+++ b/video/filter/vf.c
@@ -128,13 +128,29 @@ int vf_control(struct vf_instance *vf, int cmd, void *arg)
return vf->control(vf, cmd, arg);
}
+static void vf_fix_img_params(struct mp_image *img, struct mp_image_params *p)
+{
+ // Filters must absolutely set these correctly.
+ assert(img->w == p->w && img->h == p->h);
+ assert(img->imgfmt == p->imgfmt);
+ // Too many things don't set this correctly.
+ // If --colormatrix is used, decoder and filter chain disagree too.
+ // In general, it's probably more convenient to force these here,
+ // instead of requiring filters to set these correctly.
+ img->colorspace = p->colorspace;
+ img->levels = p->colorlevels;
+ img->chroma_location = p->chroma_location;
+}
+
// Get a new image for filter output, with size and pixel format according to
// the last vf_config call.
struct mp_image *vf_alloc_out_image(struct vf_instance *vf)
{
- struct mp_image_params *p = &vf->fmt_out.params;
assert(vf->fmt_out.configured);
- return mp_image_pool_get(vf->out_pool, p->imgfmt, p->w, p->h);
+ struct mp_image_params *p = &vf->fmt_out.params;
+ struct mp_image *img = mp_image_pool_get(vf->out_pool, p->imgfmt, p->w, p->h);
+ vf_fix_img_params(img, p);
+ return img;
}
void vf_make_out_image_writeable(struct vf_instance *vf, struct mp_image *img)
@@ -360,16 +376,9 @@ unsigned int vf_match_csp(vf_instance_t **vfp, const unsigned int *list,
void vf_add_output_frame(struct vf_instance *vf, struct mp_image *img)
{
if (img) {
- struct mp_image_params *p = &vf->fmt_out.params;
// vf_vo doesn't have output config
- if (vf->fmt_out.configured) {
- assert(p->imgfmt == img->imgfmt);
- assert(p->w == img->w && p->h == img->h);
- // Too many filters which don't set these correctly
- img->colorspace = p->colorspace;
- img->levels = p->colorlevels;
- img->chroma_location = p->chroma_location;
- }
+ if (vf->fmt_out.configured)
+ vf_fix_img_params(img, &vf->fmt_out.params);
MP_TARRAY_APPEND(vf, vf->out_queued, vf->num_out_queued, img);
}
}
@@ -388,10 +397,8 @@ static struct mp_image *vf_dequeue_output_frame(struct vf_instance *vf)
// Return >= 0 on success, < 0 on failure (even if output frames were produced)
int vf_filter_frame(struct vf_instance *vf, struct mp_image *img)
{
- struct mp_image_params *p = &vf->fmt_in.params;
assert(vf->fmt_in.configured);
- assert(img->w == p->w && img->h == p->h);
- assert(img->imgfmt == p->imgfmt);
+ vf_fix_img_params(img, &vf->fmt_in.params);
if (vf->filter_ext) {
return vf->filter_ext(vf, img);