From bb1f153a88f7334256f26d805b9d8f57b7cb66a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=99=93=E5=8B=87?= Date: Tue, 2 Jun 2015 11:32:31 +0800 Subject: [PATCH] avcodec: loongson3 optimized h264chroma put and avg with mmi Signed-off-by: Michael Niedermayer --- libavcodec/h264chroma.c | 2 + libavcodec/h264chroma.h | 1 + libavcodec/mips/Makefile | 2 + libavcodec/mips/h264chroma_init_mips.c | 42 ++ libavcodec/mips/h264chroma_mips.h | 35 ++ libavcodec/mips/h264chroma_mmi.c | 582 +++++++++++++++++++++++++ 6 files changed, 664 insertions(+) create mode 100644 libavcodec/mips/h264chroma_init_mips.c create mode 100644 libavcodec/mips/h264chroma_mips.h create mode 100644 libavcodec/mips/h264chroma_mmi.c diff --git a/libavcodec/h264chroma.c b/libavcodec/h264chroma.c index 5b3e13bdac..c2f1f30f5a 100644 --- a/libavcodec/h264chroma.c +++ b/libavcodec/h264chroma.c @@ -54,4 +54,6 @@ av_cold void ff_h264chroma_init(H264ChromaContext *c, int bit_depth) ff_h264chroma_init_ppc(c, bit_depth); if (ARCH_X86) ff_h264chroma_init_x86(c, bit_depth); + if (ARCH_MIPS) + ff_h264chroma_init_mips(c, bit_depth); } diff --git a/libavcodec/h264chroma.h b/libavcodec/h264chroma.h index d4b8a0eb0e..e0f45ad13b 100644 --- a/libavcodec/h264chroma.h +++ b/libavcodec/h264chroma.h @@ -34,5 +34,6 @@ void ff_h264chroma_init_aarch64(H264ChromaContext *c, int bit_depth); void ff_h264chroma_init_arm(H264ChromaContext *c, int bit_depth); void ff_h264chroma_init_ppc(H264ChromaContext *c, int bit_depth); void ff_h264chroma_init_x86(H264ChromaContext *c, int bit_depth); +void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth); #endif /* AVCODEC_H264CHROMA_H */ diff --git a/libavcodec/mips/Makefile b/libavcodec/mips/Makefile index 610ff1ae46..5999fa7888 100644 --- a/libavcodec/mips/Makefile +++ b/libavcodec/mips/Makefile @@ -20,8 +20,10 @@ MIPSDSPR1-OBJS-$(CONFIG_AAC_ENCODER) += mips/aaccoder_mips.o MIPSFPU-OBJS-$(CONFIG_AAC_ENCODER) += mips/iirfilter_mips.o OBJS-$(CONFIG_HEVC_DECODER) += mips/hevcdsp_init_mips.o OBJS-$(CONFIG_H264DSP) += mips/h264dsp_init_mips.o +OBJS-$(CONFIG_H264CHROMA) += mips/h264chroma_init_mips.o MSA-OBJS-$(CONFIG_HEVC_DECODER) += mips/hevcdsp_msa.o \ mips/hevc_mc_uni_msa.o \ mips/hevc_mc_bi_msa.o MSA-OBJS-$(CONFIG_H264DSP) += mips/h264dsp_msa.o LOONGSON3-OBJS-$(CONFIG_H264DSP) += mips/h264dsp_mmi.o +LOONGSON3-OBJS-$(CONFIG_H264CHROMA) += mips/h264chroma_mmi.o diff --git a/libavcodec/mips/h264chroma_init_mips.c b/libavcodec/mips/h264chroma_init_mips.c new file mode 100644 index 0000000000..4c10da7488 --- /dev/null +++ b/libavcodec/mips/h264chroma_init_mips.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015 Zhou Xiaoyong + * + * 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 "h264chroma_mips.h" + +#if HAVE_LOONGSON3 +static av_cold void h264chroma_init_mmi(H264ChromaContext *c, int bit_depth) +{ + int high_bit_depth = bit_depth > 8; + + if (!high_bit_depth) { + c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_mmi; + c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_mmi; + c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_mmi; + c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_mmi; + } +} +#endif /* HAVE_LOONGSON3 */ + +av_cold void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth) +{ +#if HAVE_LOONGSON3 + h264chroma_init_mmi(c, bit_depth); +#endif /* HAVE_LOONGSON3 */ +} diff --git a/libavcodec/mips/h264chroma_mips.h b/libavcodec/mips/h264chroma_mips.h new file mode 100644 index 0000000000..314e8a3894 --- /dev/null +++ b/libavcodec/mips/h264chroma_mips.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 Zhou Xiaoyong + * + * 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 + */ + +#ifndef H264_CHROMA_MIPS_H +#define H264_CHROMA_MIPS_H + +#include "libavcodec/h264.h" + +void ff_put_h264_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, int stride, + int h, int x, int y); +void ff_avg_h264_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, int stride, + int h, int x, int y); +void ff_put_h264_chroma_mc4_mmi(uint8_t *dst, uint8_t *src, int stride, + int h, int x, int y); +void ff_avg_h264_chroma_mc4_mmi(uint8_t *dst, uint8_t *src, int stride, + int h, int x, int y); + +#endif /* H264_CHROMA_MIPS_H */ diff --git a/libavcodec/mips/h264chroma_mmi.c b/libavcodec/mips/h264chroma_mmi.c new file mode 100644 index 0000000000..ef294762b3 --- /dev/null +++ b/libavcodec/mips/h264chroma_mmi.c @@ -0,0 +1,582 @@ +/* + * Loongson SIMD optimized h264chroma + * + * Copyright (c) 2015 Loongson Technology Corporation Limited + * Copyright (c) 2015 Zhou Xiaoyong + * Zhang Shuangshuang + * + * 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 "h264chroma_mips.h" + +void ff_put_h264_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, int stride, + int h, int x, int y) +{ + const int A = (8 - x) * (8 - y); + const int B = x * (8 - y); + const int C = (8 - x) * y; + const int D = x * y; + const int E = B + C; + int i; + + av_assert2(x<8 && y<8 && x>=0 && y>=0); + + if (D) { + for (i=0; i=0 && y>=0); + + if (D) { + for (i=0; i=0 && y>=0); + + if (D) { + for (i=0; i=0 && y>=0); + + if (D) { + for (i=0; i