annotate ffmpeg/libavcodec/sh4/dsputil_sh4.c @ 13:844d341cf643 tip

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