mirror of https://github.com/FFmpeg/FFmpeg.git
Signed-off-by: Paul B Mahol <onemda@gmail.com>pull/118/merge
parent
abaa12263e
commit
160556c9ad
5 changed files with 179 additions and 35 deletions
@ -0,0 +1,40 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Paul B Mahol |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 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 |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser 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 "avfilter.h" |
||||
#include "framesync.h" |
||||
|
||||
typedef struct MaskedMergeContext { |
||||
const AVClass *class; |
||||
int width[4], height[4]; |
||||
int nb_planes; |
||||
int planes; |
||||
int half, depth; |
||||
FFFrameSync fs; |
||||
|
||||
void (*maskedmerge)(const uint8_t *bsrc, const uint8_t *osrc, |
||||
const uint8_t *msrc, uint8_t *dst, |
||||
ptrdiff_t blinesize, ptrdiff_t olinesize, |
||||
ptrdiff_t mlinesize, ptrdiff_t dlinesize, |
||||
int w, int h, |
||||
int half, int shift); |
||||
} MaskedMergeContext; |
||||
|
||||
void ff_maskedmerge_init_x86(MaskedMergeContext *s); |
@ -0,0 +1,73 @@ |
||||
;***************************************************************************** |
||||
;* x86-optimized functions for maskedmerge filter |
||||
;* |
||||
;* Copyright (C) 2015 Paul B Mahol |
||||
;* |
||||
;* This file is part of FFmpeg. |
||||
;* |
||||
;* FFmpeg is free software; you can redistribute it and/or |
||||
;* modify it under the terms of the GNU Lesser General Public |
||||
;* License as published by the Free Software Foundation; either |
||||
;* version 2.1 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 |
||||
;* Lesser General Public License for more details. |
||||
;* |
||||
;* You should have received a copy of the GNU Lesser 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/x86/x86util.asm" |
||||
|
||||
%if ARCH_X86_64 |
||||
SECTION_RODATA |
||||
|
||||
pw_128: times 8 dw 128 |
||||
pw_256: times 8 dw 256 |
||||
|
||||
SECTION .text |
||||
|
||||
INIT_XMM sse2 |
||||
cglobal maskedmerge8, 10, 11, 7, 0, bsrc, osrc, msrc, dst, blinesize, olinesize, mlinesize, dlinesize, w, h |
||||
mova m4, [pw_256] |
||||
mova m5, [pw_128] |
||||
pxor m6, m6 |
||||
add bsrcq, wq |
||||
add osrcq, wq |
||||
add msrcq, wq |
||||
add dstq, wq |
||||
neg wq |
||||
.nextrow: |
||||
mov r10q, wq |
||||
%define x r10q |
||||
|
||||
.loop: |
||||
movh m0, [bsrcq + x] |
||||
movh m1, [osrcq + x] |
||||
movh m3, [msrcq + x] |
||||
mova m2, m4 |
||||
punpcklbw m0, m6 |
||||
punpcklbw m1, m6 |
||||
punpcklbw m3, m6 |
||||
psubw m2, m3 |
||||
pmullw m2, m0 |
||||
pmullw m1, m3 |
||||
paddw m1, m2 |
||||
paddw m1, m5 |
||||
psrlw m1, 8 |
||||
packuswb m1, m1 |
||||
movh [dstq + x], m1 |
||||
add r10q, mmsize / 2 |
||||
jl .loop |
||||
|
||||
add bsrcq, blinesizeq |
||||
add osrcq, olinesizeq |
||||
add msrcq, mlinesizeq |
||||
add dstq, dlinesizeq |
||||
sub hd, 1 |
||||
jg .nextrow |
||||
REP_RET |
||||
%endif |
@ -0,0 +1,40 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Paul B Mahol |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 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 |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser 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/x86/cpu.h" |
||||
#include "libavfilter/maskedmerge.h" |
||||
|
||||
void ff_maskedmerge8_sse2(const uint8_t *bsrc, const uint8_t *osrc, |
||||
const uint8_t *msrc, uint8_t *dst, |
||||
ptrdiff_t blinesize, ptrdiff_t olinesize, |
||||
ptrdiff_t mlinesize, ptrdiff_t dlinesize, |
||||
int w, int h, |
||||
int half, int shift); |
||||
|
||||
av_cold void ff_maskedmerge_init_x86(MaskedMergeContext *s) |
||||
{ |
||||
int cpu_flags = av_get_cpu_flags(); |
||||
|
||||
if (ARCH_X86_64 && EXTERNAL_SSE2(cpu_flags) && s->depth == 8) { |
||||
s->maskedmerge = ff_maskedmerge8_sse2; |
||||
} |
||||
} |
Loading…
Reference in new issue