diff options
Diffstat (limited to 'packages/mplayer/files/mru-neon-h264idctadd.diff')
-rw-r--r-- | packages/mplayer/files/mru-neon-h264idctadd.diff | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/packages/mplayer/files/mru-neon-h264idctadd.diff b/packages/mplayer/files/mru-neon-h264idctadd.diff new file mode 100644 index 0000000000..0f0931fbff --- /dev/null +++ b/packages/mplayer/files/mru-neon-h264idctadd.diff @@ -0,0 +1,123 @@ +From: Mans Rullgard <mans@mansr.com> +Date: Sun, 24 Aug 2008 21:27:49 +0000 (+0100) +Subject: ARM: NEON optimised h264_idct_add +X-Git-Url: http://git.mansr.com/?p=ffmpeg.mru;a=commitdiff_plain;h=ebfab90234268bb35600a06e9982ca1358ea43f3 + +ARM: NEON optimised h264_idct_add +--- + +diff --git a/libavcodec/Makefile b/libavcodec/Makefile +index 36ba158..053e752 100644 +--- a/libavcodec/Makefile ++++ b/libavcodec/Makefile +@@ -438,6 +438,7 @@ OBJS-$(HAVE_NEON) += armv4l/dsputil_neon.o \ + ASM_OBJS-$(HAVE_NEON) += armv4l/dsputil_neon_s.o \ + armv4l/simple_idct_neon.o \ + armv4l/h264dsp_neon.o \ ++ armv4l/h264idct_neon.o \ + + OBJS-$(HAVE_VIS) += sparc/dsputil_vis.o \ + sparc/simple_idct_vis.o \ +diff --git a/libavcodec/armv4l/dsputil_neon.c b/libavcodec/armv4l/dsputil_neon.c +index a932aa9..74f9b4d 100644 +--- a/libavcodec/armv4l/dsputil_neon.c ++++ b/libavcodec/armv4l/dsputil_neon.c +@@ -88,6 +88,8 @@ void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha, + void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha, + int beta, int8_t *tc0); + ++void ff_h264_idct_add_neon(uint8_t *dst, DCTELEM *block, int stride); ++ + void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + { + c->put_pixels_tab[0][0] = ff_put_pixels16_neon; +@@ -152,4 +154,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + c->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_neon; + c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon; + c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon; ++ ++ c->h264_idct_add = ff_h264_idct_add_neon; + } +diff --git a/libavcodec/armv4l/h264idct_neon.S b/libavcodec/armv4l/h264idct_neon.S +new file mode 100644 +index 0000000..8f456f3 +--- /dev/null ++++ b/libavcodec/armv4l/h264idct_neon.S +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2008 Mans Rullgard <mans@mansr.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 ++ */ ++ ++ .fpu neon ++ ++ .text ++ ++ .global ff_h264_idct_add_neon ++ .func ff_h264_idct_add_neon ++ff_h264_idct_add_neon: ++ mov r3, #(1<<5) ++ vmov.i16 d16, #0 ++ vmov.16 d16[0], r3 ++ vld1.64 {d0-d3}, [r1,:128] ++ vadd.i16 d0, d0, d16 ++ ++ vswp d1, d2 ++ vadd.i16 d4, d0, d1 ++ vshr.s16 q8, q1, #1 ++ vsub.i16 d5, d0, d1 ++ vadd.i16 d6, d2, d17 ++ vsub.i16 d7, d16, d3 ++ vadd.i16 q0, q2, q3 ++ vsub.i16 q1, q2, q3 ++ ++ vtrn.16 d0, d1 ++ vtrn.16 d3, d2 ++ vtrn.32 d0, d3 ++ vtrn.32 d1, d2 ++ ++ vadd.i16 d4, d0, d3 ++ vld1.32 {d18[0]}, [r0,:32], r2 ++ vswp d1, d3 ++ vshr.s16 q8, q1, #1 ++ vld1.32 {d19[1]}, [r0,:32], r2 ++ vsub.i16 d5, d0, d1 ++ vld1.32 {d18[1]}, [r0,:32], r2 ++ vadd.i16 d6, d16, d3 ++ vld1.32 {d19[0]}, [r0,:32], r2 ++ vsub.i16 d7, d2, d17 ++ sub r0, r0, r2, lsl #2 ++ vadd.i16 q0, q2, q3 ++ vsub.i16 q1, q2, q3 ++ ++ vshr.s16 q0, q0, #6 ++ vshr.s16 q1, q1, #6 ++ ++ vaddw.u8 q0, q0, d18 ++ vaddw.u8 q1, q1, d19 ++ ++ vqmovun.s16 d0, q0 ++ vqmovun.s16 d1, q1 ++ ++ vst1.32 {d0[0]}, [r0,:32], r2 ++ vst1.32 {d1[1]}, [r0,:32], r2 ++ vst1.32 {d0[1]}, [r0,:32], r2 ++ vst1.32 {d1[0]}, [r0,:32], r2 ++ ++ bx lr ++ .endfunc |