SH4 has been end-of-lifed and no more test machines are available.tags/n2.3
| @@ -2460,7 +2460,9 @@ typedef struct AVCodecContext { | |||
| #define FF_IDCT_SIMPLEMMX 3 | |||
| #define FF_IDCT_ARM 7 | |||
| #define FF_IDCT_ALTIVEC 8 | |||
| #if FF_API_ARCH_SH4 | |||
| #define FF_IDCT_SH4 9 | |||
| #endif | |||
| #define FF_IDCT_SIMPLEARM 10 | |||
| #define FF_IDCT_IPP 13 | |||
| #define FF_IDCT_XVIDMMX 14 | |||
| @@ -2653,8 +2653,6 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) | |||
| ff_dsputil_init_bfin(c, avctx); | |||
| if (ARCH_PPC) | |||
| ff_dsputil_init_ppc(c, avctx); | |||
| if (ARCH_SH4) | |||
| ff_dsputil_init_sh4(c, avctx); | |||
| if (HAVE_VIS) | |||
| ff_dsputil_init_vis(c, avctx); | |||
| if (ARCH_X86) | |||
| @@ -300,7 +300,6 @@ void ff_set_cmp(DSPContext* c, me_cmp_func *cmp, int type); | |||
| void ff_dsputil_init_arm(DSPContext* c, AVCodecContext *avctx); | |||
| void ff_dsputil_init_bfin(DSPContext* c, AVCodecContext *avctx); | |||
| void ff_dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx); | |||
| void ff_dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx); | |||
| void ff_dsputil_init_vis(DSPContext* c, AVCodecContext *avctx); | |||
| void ff_dsputil_init_x86(DSPContext* c, AVCodecContext *avctx); | |||
| @@ -189,7 +189,9 @@ static const AVOption avcodec_options[] = { | |||
| {"simplemmx", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEMMX }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| {"arm", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ARM }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| {"altivec", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ALTIVEC }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| #if FF_API_ARCH_SH4 | |||
| {"sh4", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SH4 }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| #endif | |||
| {"simplearm", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARM }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| {"simplearmv5te", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV5TE }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| {"simplearmv6", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV6 }, INT_MIN, INT_MAX, V|E|D, "idct"}, | |||
| @@ -1,2 +0,0 @@ | |||
| OBJS += sh4/dsputil_sh4.o \ | |||
| sh4/idct_sh4.o \ | |||
| @@ -1,107 +0,0 @@ | |||
| /* | |||
| * sh4 dsputil | |||
| * | |||
| * Copyright (c) 2003 BERO <bero@geocities.co.jp> | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav 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. | |||
| * | |||
| * Libav 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 Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include "libavutil/attributes.h" | |||
| #include "libavcodec/avcodec.h" | |||
| #include "libavcodec/dsputil.h" | |||
| #include "dsputil_sh4.h" | |||
| #include "sh4.h" | |||
| static void memzero_align8(void *dst,size_t size) | |||
| { | |||
| int fpscr; | |||
| fp_single_enter(fpscr); | |||
| dst = (char *)dst + size; | |||
| size /= 32; | |||
| __asm__ volatile ( | |||
| " fldi0 fr0\n" | |||
| " fldi0 fr1\n" | |||
| " fschg\n" // double | |||
| "1: \n" \ | |||
| " dt %1\n" | |||
| " fmov dr0,@-%0\n" | |||
| " fmov dr0,@-%0\n" | |||
| " fmov dr0,@-%0\n" | |||
| " bf.s 1b\n" | |||
| " fmov dr0,@-%0\n" | |||
| " fschg" //back to single | |||
| : "+r"(dst),"+r"(size) :: "memory" ); | |||
| fp_single_leave(fpscr); | |||
| } | |||
| static void clear_blocks_sh4(int16_t *blocks) | |||
| { | |||
| memzero_align8(blocks,sizeof(int16_t)*6*64); | |||
| } | |||
| static void idct_put(uint8_t *dest, int line_size, int16_t *block) | |||
| { | |||
| int i; | |||
| const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; | |||
| ff_idct_sh4(block); | |||
| for(i=0;i<8;i++) { | |||
| dest[0] = cm[block[0]]; | |||
| dest[1] = cm[block[1]]; | |||
| dest[2] = cm[block[2]]; | |||
| dest[3] = cm[block[3]]; | |||
| dest[4] = cm[block[4]]; | |||
| dest[5] = cm[block[5]]; | |||
| dest[6] = cm[block[6]]; | |||
| dest[7] = cm[block[7]]; | |||
| dest+=line_size; | |||
| block+=8; | |||
| } | |||
| } | |||
| static void idct_add(uint8_t *dest, int line_size, int16_t *block) | |||
| { | |||
| int i; | |||
| const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; | |||
| ff_idct_sh4(block); | |||
| for(i=0;i<8;i++) { | |||
| dest[0] = cm[dest[0]+block[0]]; | |||
| dest[1] = cm[dest[1]+block[1]]; | |||
| dest[2] = cm[dest[2]+block[2]]; | |||
| dest[3] = cm[dest[3]+block[3]]; | |||
| dest[4] = cm[dest[4]+block[4]]; | |||
| dest[5] = cm[dest[5]+block[5]]; | |||
| dest[6] = cm[dest[6]+block[6]]; | |||
| dest[7] = cm[dest[7]+block[7]]; | |||
| dest+=line_size; | |||
| block+=8; | |||
| } | |||
| } | |||
| av_cold void ff_dsputil_init_sh4(DSPContext *c, AVCodecContext *avctx) | |||
| { | |||
| const int idct_algo= avctx->idct_algo; | |||
| const int high_bit_depth = avctx->bits_per_raw_sample > 8; | |||
| if (!high_bit_depth) | |||
| c->clear_blocks = clear_blocks_sh4; | |||
| if (avctx->bits_per_raw_sample <= 8 && | |||
| (idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_SH4)) { | |||
| c->idct_put = idct_put; | |||
| c->idct_add = idct_add; | |||
| c->idct = ff_idct_sh4; | |||
| c->idct_permutation_type= FF_NO_IDCT_PERM; | |||
| } | |||
| } | |||
| @@ -1,27 +0,0 @@ | |||
| /* | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav 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. | |||
| * | |||
| * Libav 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 Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef AVCODEC_SH4_DSPUTIL_SH4_H | |||
| #define AVCODEC_SH4_DSPUTIL_SH4_H | |||
| #include "libavcodec/avcodec.h" | |||
| #include "libavcodec/dsputil.h" | |||
| void ff_idct_sh4(int16_t *block); | |||
| #endif /* AVCODEC_SH4_DSPUTIL_SH4_H */ | |||
| @@ -1,210 +0,0 @@ | |||
| /* | |||
| * idct for sh4 | |||
| * | |||
| * Copyright (c) 2001-2003 BERO <bero@geocities.co.jp> | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav 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. | |||
| * | |||
| * Libav 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 Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include "dsputil_sh4.h" | |||
| #include "sh4.h" | |||
| #define c1 1.38703984532214752434 /* sqrt(2)*cos(1*pi/16) */ | |||
| #define c2 1.30656296487637657577 /* sqrt(2)*cos(2*pi/16) */ | |||
| #define c3 1.17587560241935884520 /* sqrt(2)*cos(3*pi/16) */ | |||
| #define c4 1.00000000000000000000 /* sqrt(2)*cos(4*pi/16) */ | |||
| #define c5 0.78569495838710234903 /* sqrt(2)*cos(5*pi/16) */ | |||
| #define c6 0.54119610014619712324 /* sqrt(2)*cos(6*pi/16) */ | |||
| #define c7 0.27589937928294311353 /* sqrt(2)*cos(7*pi/16) */ | |||
| static const float even_table[] __attribute__ ((aligned(8))) = { | |||
| c4, c4, c4, c4, | |||
| c2, c6,-c6,-c2, | |||
| c4,-c4,-c4, c4, | |||
| c6,-c2, c2,-c6 | |||
| }; | |||
| static const float odd_table[] __attribute__ ((aligned(8))) = { | |||
| c1, c3, c5, c7, | |||
| c3,-c7,-c1,-c5, | |||
| c5,-c1, c7, c3, | |||
| c7,-c5, c3,-c1 | |||
| }; | |||
| #undef c1 | |||
| #undef c2 | |||
| #undef c3 | |||
| #undef c4 | |||
| #undef c5 | |||
| #undef c6 | |||
| #undef c7 | |||
| #define load_matrix(table) \ | |||
| do { \ | |||
| const float *t = table; \ | |||
| __asm__ volatile( \ | |||
| " fschg\n" \ | |||
| " fmov @%0+,xd0\n" \ | |||
| " fmov @%0+,xd2\n" \ | |||
| " fmov @%0+,xd4\n" \ | |||
| " fmov @%0+,xd6\n" \ | |||
| " fmov @%0+,xd8\n" \ | |||
| " fmov @%0+,xd10\n" \ | |||
| " fmov @%0+,xd12\n" \ | |||
| " fmov @%0+,xd14\n" \ | |||
| " fschg\n" \ | |||
| : "+r"(t) \ | |||
| ); \ | |||
| } while (0) | |||
| #define ftrv() \ | |||
| __asm__ volatile("ftrv xmtrx,fv0" \ | |||
| : "+f"(fr0),"+f"(fr1),"+f"(fr2),"+f"(fr3)); | |||
| #define DEFREG \ | |||
| register float fr0 __asm__("fr0"); \ | |||
| register float fr1 __asm__("fr1"); \ | |||
| register float fr2 __asm__("fr2"); \ | |||
| register float fr3 __asm__("fr3") | |||
| #define DESCALE(x,n) (x)*(1.0f/(1<<(n))) | |||
| /* this code work worse on gcc cvs. 3.2.3 work fine */ | |||
| //optimized | |||
| void ff_idct_sh4(int16_t *block) | |||
| { | |||
| DEFREG; | |||
| int i; | |||
| float tblock[8*8],*fblock; | |||
| int ofs1,ofs2,ofs3; | |||
| int fpscr; | |||
| fp_single_enter(fpscr); | |||
| /* row */ | |||
| /* even part */ | |||
| load_matrix(even_table); | |||
| fblock = tblock+4; | |||
| i = 8; | |||
| do { | |||
| fr0 = block[0]; | |||
| fr1 = block[2]; | |||
| fr2 = block[4]; | |||
| fr3 = block[6]; | |||
| block+=8; | |||
| ftrv(); | |||
| *--fblock = fr3; | |||
| *--fblock = fr2; | |||
| *--fblock = fr1; | |||
| *--fblock = fr0; | |||
| fblock+=8+4; | |||
| } while(--i); | |||
| block-=8*8; | |||
| fblock-=8*8+4; | |||
| load_matrix(odd_table); | |||
| i = 8; | |||
| do { | |||
| float t0,t1,t2,t3; | |||
| fr0 = block[1]; | |||
| fr1 = block[3]; | |||
| fr2 = block[5]; | |||
| fr3 = block[7]; | |||
| block+=8; | |||
| ftrv(); | |||
| t0 = *fblock++; | |||
| t1 = *fblock++; | |||
| t2 = *fblock++; | |||
| t3 = *fblock++; | |||
| fblock+=4; | |||
| *--fblock = t0 - fr0; | |||
| *--fblock = t1 - fr1; | |||
| *--fblock = t2 - fr2; | |||
| *--fblock = t3 - fr3; | |||
| *--fblock = t3 + fr3; | |||
| *--fblock = t2 + fr2; | |||
| *--fblock = t1 + fr1; | |||
| *--fblock = t0 + fr0; | |||
| fblock+=8; | |||
| } while(--i); | |||
| block-=8*8; | |||
| fblock-=8*8; | |||
| /* col */ | |||
| /* even part */ | |||
| load_matrix(even_table); | |||
| ofs1 = sizeof(float)*2*8; | |||
| ofs2 = sizeof(float)*4*8; | |||
| ofs3 = sizeof(float)*6*8; | |||
| i = 8; | |||
| #define OA(fblock,ofs) *(float*)((char*)fblock + ofs) | |||
| do { | |||
| fr0 = OA(fblock, 0); | |||
| fr1 = OA(fblock,ofs1); | |||
| fr2 = OA(fblock,ofs2); | |||
| fr3 = OA(fblock,ofs3); | |||
| ftrv(); | |||
| OA(fblock,0 ) = fr0; | |||
| OA(fblock,ofs1) = fr1; | |||
| OA(fblock,ofs2) = fr2; | |||
| OA(fblock,ofs3) = fr3; | |||
| fblock++; | |||
| } while(--i); | |||
| fblock-=8; | |||
| load_matrix(odd_table); | |||
| i=8; | |||
| do { | |||
| float t0,t1,t2,t3; | |||
| t0 = OA(fblock, 0); /* [8*0] */ | |||
| t1 = OA(fblock,ofs1); /* [8*2] */ | |||
| t2 = OA(fblock,ofs2); /* [8*4] */ | |||
| t3 = OA(fblock,ofs3); /* [8*6] */ | |||
| fblock+=8; | |||
| fr0 = OA(fblock, 0); /* [8*1] */ | |||
| fr1 = OA(fblock,ofs1); /* [8*3] */ | |||
| fr2 = OA(fblock,ofs2); /* [8*5] */ | |||
| fr3 = OA(fblock,ofs3); /* [8*7] */ | |||
| fblock+=-8+1; | |||
| ftrv(); | |||
| block[8*0] = DESCALE(t0 + fr0,3); | |||
| block[8*7] = DESCALE(t0 - fr0,3); | |||
| block[8*1] = DESCALE(t1 + fr1,3); | |||
| block[8*6] = DESCALE(t1 - fr1,3); | |||
| block[8*2] = DESCALE(t2 + fr2,3); | |||
| block[8*5] = DESCALE(t2 - fr2,3); | |||
| block[8*3] = DESCALE(t3 + fr3,3); | |||
| block[8*4] = DESCALE(t3 - fr3,3); | |||
| block++; | |||
| } while(--i); | |||
| fp_single_leave(fpscr); | |||
| } | |||
| @@ -1,44 +0,0 @@ | |||
| /* | |||
| * Copyright (c) 2008 Mans Rullgard <mans@mansr.com> | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav 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. | |||
| * | |||
| * Libav 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 Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef AVCODEC_SH4_SH4_H | |||
| #define AVCODEC_SH4_SH4_H | |||
| #ifdef __SH4__ | |||
| # define fp_single_enter(fpscr) \ | |||
| do { \ | |||
| __asm__ volatile ("sts fpscr, %0 \n\t" \ | |||
| "and %1, %0 \n\t" \ | |||
| "lds %0, fpscr \n\t" \ | |||
| : "=&r"(fpscr) : "r"(~(1<<19))); \ | |||
| } while (0) | |||
| # define fp_single_leave(fpscr) \ | |||
| do { \ | |||
| __asm__ volatile ("or %1, %0 \n\t" \ | |||
| "lds %0, fpscr \n\t" \ | |||
| : "+r"(fpscr) : "r"(1<<19)); \ | |||
| } while (0) | |||
| #else | |||
| # define fp_single_enter(fpscr) ((void)fpscr) | |||
| # define fp_single_leave(fpscr) | |||
| #endif | |||
| #endif /* AVCODEC_SH4_SH4_H */ | |||
| @@ -123,5 +123,8 @@ | |||
| #ifndef FF_API_EMU_EDGE | |||
| #define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 56) | |||
| #endif | |||
| #ifndef FF_API_ARCH_SH4 | |||
| #define FF_API_ARCH_SH4 (LIBAVCODEC_VERSION_MAJOR < 56) | |||
| #endif | |||
| #endif /* AVCODEC_VERSION_H */ | |||