123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- ;******************************************************************************
- ;* Copyright (c) 2012 Loren Merritt
- ;*
- ;* 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"
- SECTION .text
- %macro LOWPASS 3 ; prevsample, cursample, lut
- sub %1q, %2q
- %if lut_bits != 8
- sar %1q, 8-lut_bits
- %endif
- movsx %1q, word [%3q+%1q*2]
- add %1q, %2q
- %endmacro
- %macro LOAD 3 ; dstreg, x, bitdepth
- %if %3 == 8
- movzx %1, byte [srcq+%2]
- %else
- movzx %1, word [srcq+(%2)*2]
- %endif
- %if %3 != 16
- shl %1, 16-%3
- add %1, (1<<(15-%3))-1
- %endif
- %endmacro
- %macro HQDN3D_ROW 1 ; bitdepth
- %if ARCH_X86_64
- cglobal hqdn3d_row_%1_x86, 7,10,0, src, dst, lineant, frameant, width, spatial, temporal, pixelant, t0, t1
- %else
- cglobal hqdn3d_row_%1_x86, 7,7,0, src, dst, lineant, frameant, width, spatial, temporal
- %endif
- %assign bytedepth (%1+7)>>3
- %assign lut_bits 4+4*(%1/16)
- dec widthq
- lea srcq, [srcq+widthq*bytedepth]
- lea dstq, [dstq+widthq*bytedepth]
- lea frameantq, [frameantq+widthq*2]
- lea lineantq, [lineantq+widthq*2]
- neg widthq
- %define xq widthq
- %if ARCH_X86_32
- mov dstmp, dstq
- mov srcmp, srcq
- mov frameantmp, frameantq
- mov lineantmp, lineantq
- %define dstq r0
- %define frameantq r0
- %define lineantq r0
- %define pixelantq r1
- %define pixelantd r1d
- DECLARE_REG_TMP 2,3
- %endif
- LOAD pixelantd, xq, %1
- ALIGN 16
- .loop:
- movifnidn srcq, srcmp
- LOAD t0d, xq+1, %1 ; skip on the last iteration to avoid overread
- .loop2:
- movifnidn lineantq, lineantmp
- movzx t1d, word [lineantq+xq*2]
- LOWPASS t1, pixelant, spatial
- mov [lineantq+xq*2], t1w
- LOWPASS pixelant, t0, spatial
- movifnidn frameantq, frameantmp
- movzx t0d, word [frameantq+xq*2]
- LOWPASS t0, t1, temporal
- mov [frameantq+xq*2], t0w
- movifnidn dstq, dstmp
- %if %1 != 16
- shr t0d, 16-%1 ; could eliminate this by storing from t0h, but only with some contraints on register allocation
- %endif
- %if %1 == 8
- mov [dstq+xq], t0b
- %else
- mov [dstq+xq*2], t0w
- %endif
- inc xq
- jl .loop
- je .loop2
- REP_RET
- %endmacro ; HQDN3D_ROW
- HQDN3D_ROW 8
- HQDN3D_ROW 9
- HQDN3D_ROW 10
- HQDN3D_ROW 16
|