ffmpeg / libavcodec / sh4 / dsputil_sh4.c @ 8dbe5856
History | View | Annotate | Download (3.31 KB)
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 "libavcodec/avcodec.h" |
24 |
#include "libavcodec/dsputil.h" |
25 |
#include "dsputil_sh4.h" |
26 |
#include "sh4.h" |
27 |
|
28 |
static void memzero_align8(void *dst,size_t size) |
29 |
{ |
30 |
int fpscr;
|
31 |
fp_single_enter(fpscr); |
32 |
dst = (char *)dst + size;
|
33 |
size /= 32;
|
34 |
__asm__ volatile (
|
35 |
" fldi0 fr0\n"
|
36 |
" fldi0 fr1\n"
|
37 |
" fschg\n" // double |
38 |
"1: \n" \
|
39 |
" dt %1\n"
|
40 |
" fmov dr0,@-%0\n"
|
41 |
" fmov dr0,@-%0\n"
|
42 |
" fmov dr0,@-%0\n"
|
43 |
" bf.s 1b\n"
|
44 |
" fmov dr0,@-%0\n"
|
45 |
" fschg" //back to single |
46 |
: "+r"(dst),"+r"(size) :: "memory" ); |
47 |
fp_single_leave(fpscr); |
48 |
} |
49 |
|
50 |
static void clear_blocks_sh4(DCTELEM *blocks) |
51 |
{ |
52 |
memzero_align8(blocks,sizeof(DCTELEM)*6*64); |
53 |
} |
54 |
|
55 |
static void idct_put(uint8_t *dest, int line_size, DCTELEM *block) |
56 |
{ |
57 |
int i;
|
58 |
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; |
59 |
idct_sh4(block); |
60 |
for(i=0;i<8;i++) { |
61 |
dest[0] = cm[block[0]]; |
62 |
dest[1] = cm[block[1]]; |
63 |
dest[2] = cm[block[2]]; |
64 |
dest[3] = cm[block[3]]; |
65 |
dest[4] = cm[block[4]]; |
66 |
dest[5] = cm[block[5]]; |
67 |
dest[6] = cm[block[6]]; |
68 |
dest[7] = cm[block[7]]; |
69 |
dest+=line_size; |
70 |
block+=8;
|
71 |
} |
72 |
} |
73 |
static void idct_add(uint8_t *dest, int line_size, DCTELEM *block) |
74 |
{ |
75 |
int i;
|
76 |
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; |
77 |
idct_sh4(block); |
78 |
for(i=0;i<8;i++) { |
79 |
dest[0] = cm[dest[0]+block[0]]; |
80 |
dest[1] = cm[dest[1]+block[1]]; |
81 |
dest[2] = cm[dest[2]+block[2]]; |
82 |
dest[3] = cm[dest[3]+block[3]]; |
83 |
dest[4] = cm[dest[4]+block[4]]; |
84 |
dest[5] = cm[dest[5]+block[5]]; |
85 |
dest[6] = cm[dest[6]+block[6]]; |
86 |
dest[7] = cm[dest[7]+block[7]]; |
87 |
dest+=line_size; |
88 |
block+=8;
|
89 |
} |
90 |
} |
91 |
|
92 |
void dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx)
|
93 |
{ |
94 |
const int idct_algo= avctx->idct_algo; |
95 |
const int h264_high_depth = avctx->codec_id == CODEC_ID_H264 && avctx->bits_per_raw_sample > 8; |
96 |
dsputil_init_align(c,avctx); |
97 |
|
98 |
if (!h264_high_depth)
|
99 |
c->clear_blocks = clear_blocks_sh4; |
100 |
if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_SH4){
|
101 |
c->idct_put = idct_put; |
102 |
c->idct_add = idct_add; |
103 |
c->idct = idct_sh4; |
104 |
c->idct_permutation_type= FF_NO_IDCT_PERM; |
105 |
} |
106 |
} |