mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-27 09:52:17 +00:00
f33f728470
Vanilla clang supports altmacro since clang 5.0, and thus doesn't require gas-preprocessor for building the arm assembly any longer. However, the built-in assembler doesn't support .dn directives. This readds checks that were removed in d7320ca3ed10f0d, when the last usage of .dn directives within libav were removed. Alternatively, the assembly could be rewritten to not use the .dn directive, making it available to clang users. Signed-off-by: Martin Storsjö <martin@martin.st>
84 lines
2.2 KiB
ArmAsm
84 lines
2.2 KiB
ArmAsm
/*
|
|
* Copyright (C) 2013 Xiaolei Yu <dreifachstein@gmail.com>
|
|
*
|
|
* 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 "config.h"
|
|
#if HAVE_AS_DN_DIRECTIVE
|
|
#include "rgb2yuv_neon_common.S"
|
|
|
|
/* downsampled R16G16B16 x8 */
|
|
alias_qw r16x8, q7
|
|
alias_qw g16x8, q8
|
|
alias_qw b16x8, q9
|
|
|
|
alias n16x16_l, q11
|
|
alias n16x16_h, q12
|
|
|
|
alias y16x16_l, q13
|
|
alias y16x16_h, q14
|
|
|
|
alias_qw y8x16, q15
|
|
|
|
.macro init src
|
|
vld3.i32 {q13_l, q14_l, q15_l}, [\src]!
|
|
vld3.i32 {q13_h[0], q14_h[0], q15_h[0]}, [\src]
|
|
vrshrn.i32 CO_R, q13, #7
|
|
vrshrn.i32 CO_G, q14, #7
|
|
vrshrn.i32 CO_B, q15, #7
|
|
|
|
vmov.u8 BIAS_Y, #16
|
|
vmov.u8 BIAS_U, #128
|
|
.endm
|
|
|
|
|
|
.macro compute_y_16x1_step action, s8x16, coeff
|
|
vmovl.u8 n16x16_l, \s8x16\()_l
|
|
vmovl.u8 n16x16_h, \s8x16\()_h
|
|
|
|
\action y16x16_l, n16x16_l, \coeff
|
|
\action y16x16_h, n16x16_h, \coeff
|
|
.endm
|
|
|
|
.macro compute_y_16x1
|
|
compute_y_16x1_step vmul, r8x16, CO_RY
|
|
compute_y_16x1_step vmla, g8x16, CO_GY
|
|
compute_y_16x1_step vmla, b8x16, CO_BY
|
|
|
|
vrshrn.i16 y8x16_l, y16x16_l, #8
|
|
vrshrn.i16 y8x16_h, y16x16_h, #8
|
|
|
|
vadd.u8 y8x16, y8x16, BIAS_Y
|
|
.endm
|
|
|
|
alias c16x8, q15
|
|
alias_qw c8x8x2, q10
|
|
|
|
|
|
.macro compute_chroma_8x1 c, C
|
|
vmul c16x8, r16x8, CO_R\C
|
|
vmla c16x8, g16x8, CO_G\C
|
|
vmla c16x8, b16x8, CO_B\C
|
|
|
|
vrshrn.i16 \c\()8x8, c16x8, #8
|
|
vadd.u8 \c\()8x8, \c\()8x8, BIAS_\C
|
|
.endm
|
|
|
|
loop_420sp rgbx, nv12, init, kernel_420_16x2, 16
|
|
#endif
|