[FFmpeg-devel] [PATCH] lavfi: Port mp=pp7 to libavfilter

Michael Niedermayer michael at niedermayer.cc
Sat Dec 27 15:45:50 CET 2014


On Sat, Dec 27, 2014 at 06:07:53PM +0530, arwa arif wrote:
[...]
> +#define OFFSET(x) offsetof(PP7Context, x)
> +#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
> +static const AVOption pp7_options[] = {
> +    { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 64, FLAGS },
> +    { "mode", "set thresholding mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_MEDIUM}, 0, 2, FLAGS, "mode" },
> +        { "hard",   "hard thresholding",   0, AV_OPT_TYPE_CONST, {.i64 = MODE_HARD},   INT_MIN, INT_MAX, FLAGS, "mode" },
> +        { "soft",   "soft thresholding",   0, AV_OPT_TYPE_CONST, {.i64 = MODE_SOFT},   INT_MIN, INT_MAX, FLAGS, "mode" },
> +        { "medium", "medium thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_MEDIUM}, INT_MIN, INT_MAX, FLAGS, "mode" },
> +    { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, FLAGS },
> +    { NULL }
> +};
> +
> +AVFILTER_DEFINE_CLASS(pp7);
> +

> +#if HAVE_MMX_INLINE
> +DECLARE_ALIGNED(8, static const uint8_t, dither)[8][8] = {

dither is used outside HAVE_MMX_INLINE code, it thus cannot be
under HAVE_MMX_INLINE or build would break on non-x86 platforms


    > +    {  0,  48,  12,  60,   3,  51,  15,  63, },
> +    { 32,  16,  44,  28,  35,  19,  47,  31, },
> +    {  8,  56,   4,  52,  11,  59,   7,  55, },
> +    { 40,  24,  36,  20,  43,  27,  39,  23, },
> +    {  2,  50,  14,  62,   1,  49,  13,  61, },
> +    { 34,  18,  46,  30,  33,  17,  45,  29, },
> +    { 10,  58,   6,  54,   9,  57,   5,  53, },
> +    { 42,  26,  38,  22,  41,  25,  37,  21, },
> +};
> +#endif


[...]
> diff --git a/libavfilter/x86/vf_pp7.c b/libavfilter/x86/vf_pp7.c
> new file mode 100644
> index 0000000..fe33d7f
> --- /dev/null
> +++ b/libavfilter/x86/vf_pp7.c
> @@ -0,0 +1,68 @@
> +/*
> + * Copyright (c) 2005 Michael Niedermayer <michaelni at gmx.at>
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "libavutil/attributes.h"
> +#include "libavutil/cpu.h"
> +#include "libavutil/mem.h"
> +#include "libavutil/x86/asm.h"
> +#include "libavfilter/vf_pp7.h"
> +
> +static void dctB_mmx(int16_t *dst, int16_t *src)
> +{
> +    __asm__ volatile (
> +        "movq  (%0), %%mm0      \n\t"
> +        "movq  1*4*2(%0), %%mm1 \n\t"
> +        "paddw 6*4*2(%0), %%mm0 \n\t"
> +        "paddw 5*4*2(%0), %%mm1 \n\t"
> +        "movq  2*4*2(%0), %%mm2 \n\t"
> +        "movq  3*4*2(%0), %%mm3 \n\t"
> +        "paddw 4*4*2(%0), %%mm2 \n\t"
> +        "paddw %%mm3, %%mm3     \n\t" //s
> +        "movq %%mm3, %%mm4      \n\t" //s
> +        "psubw %%mm0, %%mm3     \n\t" //s-s0
> +        "paddw %%mm0, %%mm4     \n\t" //s+s0
> +        "movq %%mm2, %%mm0      \n\t" //s2
> +        "psubw %%mm1, %%mm2     \n\t" //s2-s1
> +        "paddw %%mm1, %%mm0     \n\t" //s2+s1
> +        "movq %%mm4, %%mm1      \n\t" //s0'
> +        "psubw %%mm0, %%mm4     \n\t" //s0'-s'
> +        "paddw %%mm0, %%mm1     \n\t" //s0'+s'
> +        "movq %%mm3, %%mm0      \n\t" //s3'
> +        "psubw %%mm2, %%mm3     \n\t"
> +        "psubw %%mm2, %%mm3     \n\t"
> +        "paddw %%mm0, %%mm2     \n\t"
> +        "paddw %%mm0, %%mm2     \n\t"
> +        "movq %%mm1, (%1)       \n\t"
> +        "movq %%mm4, 2*4*2(%1)  \n\t"
> +        "movq %%mm2, 1*4*2(%1)  \n\t"
> +        "movq %%mm3, 3*4*2(%1)  \n\t"
> +        :: "r" (src), "r"(dst)
> +    );
> +}
> +
> +av_cold void ff_pp7_init_x86(PP7Context *p)
> +{

> +#if HAVE_MMX_INLINE
> +    int cpu_flags = av_get_cpu_flags();
> +
> +    if (HAVE_MMX_INLINE && cpu_flags & AV_CPU_FLAG_MMX)
> +        p->dctB = dctB_mmx;
> +#endif

the 2 HAVE_MMX_INLINE are redundant relative to each other

also the actual asm should possibly be under HAVE_MMX_INLINE as well

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I do not agree with what you have to say, but I'll defend to the death your
right to say it. -- Voltaire
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141227/1cd6b638/attachment.asc>


More information about the ffmpeg-devel mailing list