Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  *  sh4 dsputil
  3.  *
  4.  * Copyright (c) 2003 BERO <bero@geocities.co.jp>
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include "libavutil/attributes.h"
  24. #include "libavcodec/avcodec.h"
  25. #include "libavcodec/dsputil.h"
  26. #include "dsputil_sh4.h"
  27. #include "sh4.h"
  28.  
  29. static void memzero_align8(void *dst,size_t size)
  30. {
  31.         int fpscr;
  32.         fp_single_enter(fpscr);
  33.         dst = (char *)dst + size;
  34.         size /= 32;
  35.         __asm__ volatile (
  36.         " fldi0 fr0\n"
  37.         " fldi0 fr1\n"
  38.         " fschg\n"  // double
  39.         "1: \n" \
  40.         " dt %1\n"
  41.         " fmov  dr0,@-%0\n"
  42.         " fmov  dr0,@-%0\n"
  43.         " fmov  dr0,@-%0\n"
  44.         " bf.s 1b\n"
  45.         " fmov  dr0,@-%0\n"
  46.         " fschg" //back to single
  47.         : "+r"(dst),"+r"(size) :: "memory" );
  48.         fp_single_leave(fpscr);
  49. }
  50.  
  51. static void clear_blocks_sh4(int16_t *blocks)
  52. {
  53.         memzero_align8(blocks,sizeof(int16_t)*6*64);
  54. }
  55.  
  56. static void idct_put(uint8_t *dest, int line_size, int16_t *block)
  57. {
  58.         int i;
  59.         const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
  60.         ff_idct_sh4(block);
  61.         for(i=0;i<8;i++) {
  62.                 dest[0] = cm[block[0]];
  63.                 dest[1] = cm[block[1]];
  64.                 dest[2] = cm[block[2]];
  65.                 dest[3] = cm[block[3]];
  66.                 dest[4] = cm[block[4]];
  67.                 dest[5] = cm[block[5]];
  68.                 dest[6] = cm[block[6]];
  69.                 dest[7] = cm[block[7]];
  70.                 dest+=line_size;
  71.                 block+=8;
  72.         }
  73. }
  74. static void idct_add(uint8_t *dest, int line_size, int16_t *block)
  75. {
  76.         int i;
  77.         const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
  78.         ff_idct_sh4(block);
  79.         for(i=0;i<8;i++) {
  80.                 dest[0] = cm[dest[0]+block[0]];
  81.                 dest[1] = cm[dest[1]+block[1]];
  82.                 dest[2] = cm[dest[2]+block[2]];
  83.                 dest[3] = cm[dest[3]+block[3]];
  84.                 dest[4] = cm[dest[4]+block[4]];
  85.                 dest[5] = cm[dest[5]+block[5]];
  86.                 dest[6] = cm[dest[6]+block[6]];
  87.                 dest[7] = cm[dest[7]+block[7]];
  88.                 dest+=line_size;
  89.                 block+=8;
  90.         }
  91. }
  92.  
  93. av_cold void ff_dsputil_init_sh4(DSPContext *c, AVCodecContext *avctx)
  94. {
  95.         const int idct_algo= avctx->idct_algo;
  96.         const int high_bit_depth = avctx->bits_per_raw_sample > 8;
  97.  
  98.         if (!high_bit_depth)
  99.         c->clear_blocks = clear_blocks_sh4;
  100.         if (avctx->bits_per_raw_sample <= 8 &&
  101.             (idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_SH4)) {
  102.                 c->idct_put = idct_put;
  103.                 c->idct_add = idct_add;
  104.                 c->idct     = ff_idct_sh4;
  105.                 c->idct_permutation_type= FF_NO_IDCT_PERM;
  106.         }
  107. }
  108.