annotate ffmpeg/libavresample/x86/dither.asm @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 ;******************************************************************************
yading@11 2 ;* x86 optimized dithering format conversion
yading@11 3 ;* Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
yading@11 4 ;*
yading@11 5 ;* This file is part of FFmpeg.
yading@11 6 ;*
yading@11 7 ;* FFmpeg is free software; you can redistribute it and/or
yading@11 8 ;* modify it under the terms of the GNU Lesser General Public
yading@11 9 ;* License as published by the Free Software Foundation; either
yading@11 10 ;* version 2.1 of the License, or (at your option) any later version.
yading@11 11 ;*
yading@11 12 ;* FFmpeg is distributed in the hope that it will be useful,
yading@11 13 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 ;* Lesser General Public License for more details.
yading@11 16 ;*
yading@11 17 ;* You should have received a copy of the GNU Lesser General Public
yading@11 18 ;* License along with FFmpeg; if not, write to the Free Software
yading@11 19 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 ;******************************************************************************
yading@11 21
yading@11 22 %include "libavutil/x86/x86util.asm"
yading@11 23
yading@11 24 SECTION_RODATA 32
yading@11 25
yading@11 26 ; 1.0f / (2.0f * INT32_MAX)
yading@11 27 pf_dither_scale: times 8 dd 2.32830643762e-10
yading@11 28
yading@11 29 pf_s16_scale: times 4 dd 32753.0
yading@11 30
yading@11 31 SECTION_TEXT
yading@11 32
yading@11 33 ;------------------------------------------------------------------------------
yading@11 34 ; void ff_quantize(int16_t *dst, float *src, float *dither, int len);
yading@11 35 ;------------------------------------------------------------------------------
yading@11 36
yading@11 37 INIT_XMM sse2
yading@11 38 cglobal quantize, 4,4,3, dst, src, dither, len
yading@11 39 lea lenq, [2*lend]
yading@11 40 add dstq, lenq
yading@11 41 lea srcq, [srcq+2*lenq]
yading@11 42 lea ditherq, [ditherq+2*lenq]
yading@11 43 neg lenq
yading@11 44 mova m2, [pf_s16_scale]
yading@11 45 .loop:
yading@11 46 mulps m0, m2, [srcq+2*lenq]
yading@11 47 mulps m1, m2, [srcq+2*lenq+mmsize]
yading@11 48 addps m0, [ditherq+2*lenq]
yading@11 49 addps m1, [ditherq+2*lenq+mmsize]
yading@11 50 cvtps2dq m0, m0
yading@11 51 cvtps2dq m1, m1
yading@11 52 packssdw m0, m1
yading@11 53 mova [dstq+lenq], m0
yading@11 54 add lenq, mmsize
yading@11 55 jl .loop
yading@11 56 REP_RET
yading@11 57
yading@11 58 ;------------------------------------------------------------------------------
yading@11 59 ; void ff_dither_int_to_float_rectangular(float *dst, int *src, int len)
yading@11 60 ;------------------------------------------------------------------------------
yading@11 61
yading@11 62 %macro DITHER_INT_TO_FLOAT_RECTANGULAR 0
yading@11 63 cglobal dither_int_to_float_rectangular, 3,3,3, dst, src, len
yading@11 64 lea lenq, [4*lend]
yading@11 65 add srcq, lenq
yading@11 66 add dstq, lenq
yading@11 67 neg lenq
yading@11 68 mova m0, [pf_dither_scale]
yading@11 69 .loop:
yading@11 70 cvtdq2ps m1, [srcq+lenq]
yading@11 71 cvtdq2ps m2, [srcq+lenq+mmsize]
yading@11 72 mulps m1, m1, m0
yading@11 73 mulps m2, m2, m0
yading@11 74 mova [dstq+lenq], m1
yading@11 75 mova [dstq+lenq+mmsize], m2
yading@11 76 add lenq, 2*mmsize
yading@11 77 jl .loop
yading@11 78 REP_RET
yading@11 79 %endmacro
yading@11 80
yading@11 81 INIT_XMM sse2
yading@11 82 DITHER_INT_TO_FLOAT_RECTANGULAR
yading@11 83 INIT_YMM avx
yading@11 84 DITHER_INT_TO_FLOAT_RECTANGULAR
yading@11 85
yading@11 86 ;------------------------------------------------------------------------------
yading@11 87 ; void ff_dither_int_to_float_triangular(float *dst, int *src0, int len)
yading@11 88 ;------------------------------------------------------------------------------
yading@11 89
yading@11 90 %macro DITHER_INT_TO_FLOAT_TRIANGULAR 0
yading@11 91 cglobal dither_int_to_float_triangular, 3,4,5, dst, src0, len, src1
yading@11 92 lea lenq, [4*lend]
yading@11 93 lea src1q, [src0q+2*lenq]
yading@11 94 add src0q, lenq
yading@11 95 add dstq, lenq
yading@11 96 neg lenq
yading@11 97 mova m0, [pf_dither_scale]
yading@11 98 .loop:
yading@11 99 cvtdq2ps m1, [src0q+lenq]
yading@11 100 cvtdq2ps m2, [src0q+lenq+mmsize]
yading@11 101 cvtdq2ps m3, [src1q+lenq]
yading@11 102 cvtdq2ps m4, [src1q+lenq+mmsize]
yading@11 103 addps m1, m1, m3
yading@11 104 addps m2, m2, m4
yading@11 105 mulps m1, m1, m0
yading@11 106 mulps m2, m2, m0
yading@11 107 mova [dstq+lenq], m1
yading@11 108 mova [dstq+lenq+mmsize], m2
yading@11 109 add lenq, 2*mmsize
yading@11 110 jl .loop
yading@11 111 REP_RET
yading@11 112 %endmacro
yading@11 113
yading@11 114 INIT_XMM sse2
yading@11 115 DITHER_INT_TO_FLOAT_TRIANGULAR
yading@11 116 INIT_YMM avx
yading@11 117 DITHER_INT_TO_FLOAT_TRIANGULAR