From e207c24b32a457859ab6e3a5b1f5f9eaeea36ed1 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 16 Apr 2015 22:42:31 +0200 Subject: vf_mirror: replace internal implementation with libavfilter Currently, libavfilter's equivalent vf_hflip is probably not faster or anything, but there's still no reason to keep the internal code. --- video/filter/vf_mirror.c | 89 +++--------------------------------------------- 1 file changed, 4 insertions(+), 85 deletions(-) diff --git a/video/filter/vf_mirror.c b/video/filter/vf_mirror.c index d92f320235..342c6abd2a 100644 --- a/video/filter/vf_mirror.c +++ b/video/filter/vf_mirror.c @@ -15,93 +15,14 @@ * with mpv. If not, see . */ -#include -#include -#include -#include +#include -#include "config.h" -#include "common/msg.h" - -#include "video/img_format.h" -#include "video/mp_image.h" #include "vf.h" +#include "vf_lavfi.h" -static int config(struct vf_instance *vf, int width, int height, - int d_width, int d_height, - unsigned int flags, unsigned int fmt) -{ - struct mp_imgfmt_desc desc = mp_imgfmt_get_desc(fmt); - int a_w = MP_ALIGN_DOWN(width, desc.align_x); - vf_rescale_dsize(&d_width, &d_height, width, height, a_w, height); - return vf_next_config(vf, a_w, height, d_width, d_height, flags, fmt); -} - -static inline void mirror_4_m(uint8_t *dst, uint8_t *src, int p, - int c0, int c1, int c2, int c3) -{ - for (int x = 0; x < p; x++) { - dst[x * 4 + 0] = src[(p - x - 1) * 4 + c0]; - dst[x * 4 + 1] = src[(p - x - 1) * 4 + c1]; - dst[x * 4 + 2] = src[(p - x - 1) * 4 + c2]; - dst[x * 4 + 3] = src[(p - x - 1) * 4 + c3]; - } -} - -static inline void mirror(uint8_t *dst, uint8_t *src, int bp, int w) -{ - for (int x = 0; x < w; x++) - memcpy(dst + x * bp, src + (w - x - 1) * bp, bp); -} - -static struct mp_image *filter(struct vf_instance *vf, struct mp_image *mpi) +static int vf_open(vf_instance_t *vf) { - mp_image_t *dmpi = vf_alloc_out_image(vf); - if (!dmpi) - return NULL; - mp_image_copy_attributes(dmpi, mpi); - - for (int p = 0; p < mpi->num_planes; p++) { - int plane_h = mp_image_plane_h(mpi, p); - for (int y = 0; y < plane_h; y++) { - void *p_src = mpi->planes[p] + mpi->stride[p] * y; - void *p_dst = dmpi->planes[p] + dmpi->stride[p] * y; - int w = mp_image_plane_w(dmpi, p); - if (mpi->imgfmt == IMGFMT_YUYV) { - mirror_4_m(p_dst, p_src, w / 2, 2, 1, 0, 3); - } else if (mpi->imgfmt == IMGFMT_UYVY) { - mirror_4_m(p_dst, p_src, w / 2, 0, 3, 2, 1); - } else { - // make the compiler unroll the memcpy in mirror() - switch (mpi->fmt.bytes[p]) { - case 1: mirror(p_dst, p_src, 1, w); break; - case 2: mirror(p_dst, p_src, 2, w); break; - case 3: mirror(p_dst, p_src, 3, w); break; - case 4: mirror(p_dst, p_src, 4, w); break; - default: - mirror(p_dst, p_src, mpi->fmt.bytes[p], w); - } - } - } - } - - talloc_free(mpi); - return dmpi; -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - struct mp_imgfmt_desc desc = mp_imgfmt_get_desc(fmt); - if (!(desc.flags & MP_IMGFLAG_BYTE_ALIGNED)) - return 0; - return vf_next_query_format(vf, fmt); -} - -static int vf_open(vf_instance_t *vf){ - vf->config=config; - vf->filter=filter; - vf->query_format=query_format; - return 1; + return vf_lw_set_graph(vf, NULL, NULL, "hflip") >= 0; } const vf_info_t vf_info_mirror = { @@ -109,5 +30,3 @@ const vf_info_t vf_info_mirror = { .name = "mirror", .open = vf_open, }; - -//===========================================================================// -- cgit v1.2.3