annotate libswscale/yuv2rgb_vis.c @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents 3c6db57870ea
children 06bf0eb70a55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23805
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
1 /*
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
2 * VIS optimized software YUV to RGB converter
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
3 * Copyright (c) 2007 Denes Balatoni <dbalatoni@programozo.hu>
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
4 *
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
5 * This file is part of FFmpeg.
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
6 *
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
11 *
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
15 * Lesser General Public License for more details.
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
16 *
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
20 */
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
21
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
22 #include <inttypes.h>
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
23 #include <stdlib.h>
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
24
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
25 #include "swscale.h"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
26
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
27 #define YUV2RGB_INIT \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
28 "wr %%g0, 0x10, %%gsr \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
29 "ldd [%5], %%f32 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
30 "ldd [%5+8], %%f34 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
31 "ldd [%5+16], %%f36 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
32 "ldd [%5+24], %%f38 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
33 "ldd [%5+32], %%f40 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
34 "ldd [%5+40], %%f42 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
35 "ldd [%5+48], %%f44 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
36 "ldd [%5+56], %%f46 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
37 "ldd [%5+64], %%f48 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
38 "ldd [%5+72], %%f50 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
39
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
40 #define YUV2RGB_KERNEL \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
41 /* ^^^^ f0=Y f3=u f5=v */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
42 "fmul8x16 %%f3, %%f48, %%f6 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
43 "fmul8x16 %%f19, %%f48, %%f22 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
44 "fmul8x16 %%f5, %%f44, %%f8 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
45 "fmul8x16 %%f21, %%f44, %%f24 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
46 "fmul8x16 %%f0, %%f42, %%f0 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
47 "fmul8x16 %%f16, %%f42, %%f16 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
48 "fmul8x16 %%f3, %%f50, %%f2 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
49 "fmul8x16 %%f19, %%f50, %%f18 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
50 "fmul8x16 %%f5, %%f46, %%f4 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
51 "fmul8x16 %%f21, %%f46, %%f20 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
52 \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
53 "fpsub16 %%f6, %%f34, %%f6 \n\t" /* 1 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
54 "fpsub16 %%f22, %%f34, %%f22 \n\t" /* 1 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
55 "fpsub16 %%f8, %%f38, %%f8 \n\t" /* 3 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
56 "fpsub16 %%f24, %%f38, %%f24 \n\t" /* 3 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
57 "fpsub16 %%f0, %%f32, %%f0 \n\t" /* 0 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
58 "fpsub16 %%f16, %%f32, %%f16 \n\t" /* 0 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
59 "fpsub16 %%f2, %%f36, %%f2 \n\t" /* 2 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
60 "fpsub16 %%f18, %%f36, %%f18 \n\t" /* 2 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
61 "fpsub16 %%f4, %%f40, %%f4 \n\t" /* 4 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
62 "fpsub16 %%f20, %%f40, %%f20 \n\t" /* 4 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
63 \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
64 "fpadd16 %%f0, %%f8, %%f8 \n\t" /* Gt */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
65 "fpadd16 %%f16, %%f24, %%f24 \n\t" /* Gt */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
66 "fpadd16 %%f0, %%f4, %%f4 \n\t" /* R */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
67 "fpadd16 %%f16, %%f20, %%f20 \n\t" /* R */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
68 "fpadd16 %%f0, %%f6, %%f6 \n\t" /* B */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
69 "fpadd16 %%f16, %%f22, %%f22 \n\t" /* B */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
70 "fpadd16 %%f8, %%f2, %%f2 \n\t" /* G */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
71 "fpadd16 %%f24, %%f18, %%f18 \n\t" /* G */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
72 \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
73 "fpack16 %%f4, %%f4 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
74 "fpack16 %%f20, %%f20 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
75 "fpack16 %%f6, %%f6 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
76 "fpack16 %%f22, %%f22 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
77 "fpack16 %%f2, %%f2 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
78 "fpack16 %%f18, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
79
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
80
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
81
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
82 static int vis_420P_ARGB32(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
83 int srcSliceH, uint8_t* dst[], int dstStride[]){
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
84 int y, out1, out2, out3, out4, out5, out6;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
85
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
86 for(y=0;y < srcSliceH;++y) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
87 asm volatile (
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
88 YUV2RGB_INIT
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
89 "wr %%g0, 0xd2, %%asi \n\t" /* ASI_FL16_P */
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
90 "1: \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
91 "ldda [%1] %%asi, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
92 "ldda [%1+2] %%asi, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
93 "ldda [%2] %%asi, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
94 "ldda [%2+2] %%asi, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
95 "ld [%0], %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
96 "ld [%0+4], %%f16 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
97 "fpmerge %%f3, %%f3, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
98 "fpmerge %%f19, %%f19, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
99 "fpmerge %%f5, %%f5, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
100 "fpmerge %%f21, %%f21, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
101 YUV2RGB_KERNEL
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
102 "fzero %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
103 "fpmerge %%f4, %%f6, %%f8 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
104 "fpmerge %%f20, %%f22, %%f24 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
105 "fpmerge %%f0, %%f2, %%f10 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
106 "fpmerge %%f0, %%f18, %%f26 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
107 "fpmerge %%f10, %%f8, %%f4 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
108 "fpmerge %%f26, %%f24, %%f20 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
109 "fpmerge %%f11, %%f9, %%f6 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
110 "fpmerge %%f27, %%f25, %%f22 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
111 "std %%f4, [%3] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
112 "std %%f20, [%3+16] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
113 "std %%f6, [%3+8] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
114 "std %%f22, [%3+24] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
115
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
116 "add %0, 8, %0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
117 "add %1, 4, %1 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
118 "add %2, 4, %2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
119 "subcc %4, 8, %4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
120 "bne 1b \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
121 "add %3, 32, %3 \n\t" //delay slot
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
122 : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4), "=r" (out5), "=r" (out6)
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
123 : "0" (src[0]+(y+srcSliceY)*srcStride[0]), "1" (src[1]+((y+srcSliceY)>>1)*srcStride[1]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
124 "2" (src[2]+((y+srcSliceY)>>1)*srcStride[2]), "3" (dst[0]+(y+srcSliceY)*dstStride[0]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
125 "4" (c->dstW),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
126 "5" (c->sparc_coeffs)
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
127 );
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
128 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
129
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
130 return srcSliceH;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
131 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
132
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
133 static int vis_422P_ARGB32(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
134 int srcSliceH, uint8_t* dst[], int dstStride[]){
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
135 int y, out1, out2, out3, out4, out5, out6;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
136
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
137 for(y=0;y < srcSliceH;++y) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
138 asm volatile (
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
139 YUV2RGB_INIT
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
140 "wr %%g0, 0xd2, %%asi \n\t" /* ASI_FL16_P */
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
141 "1: \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
142 "ldda [%1] %%asi, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
143 "ldda [%1+2] %%asi, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
144 "ldda [%2] %%asi, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
145 "ldda [%2+2] %%asi, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
146 "ld [%0], %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
147 "ld [%0+4], %%f16 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
148 "fpmerge %%f3, %%f3, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
149 "fpmerge %%f19, %%f19, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
150 "fpmerge %%f5, %%f5, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
151 "fpmerge %%f21, %%f21, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
152 YUV2RGB_KERNEL
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
153 "fzero %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
154 "fpmerge %%f4, %%f6, %%f8 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
155 "fpmerge %%f20, %%f22, %%f24 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
156 "fpmerge %%f0, %%f2, %%f10 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
157 "fpmerge %%f0, %%f18, %%f26 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
158 "fpmerge %%f10, %%f8, %%f4 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
159 "fpmerge %%f26, %%f24, %%f20 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
160 "fpmerge %%f11, %%f9, %%f6 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
161 "fpmerge %%f27, %%f25, %%f22 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
162 "std %%f4, [%3] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
163 "std %%f20, [%3+16] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
164 "std %%f6, [%3+8] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
165 "std %%f22, [%3+24] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
166
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
167 "add %0, 8, %0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
168 "add %1, 4, %1 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
169 "add %2, 4, %2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
170 "subcc %4, 8, %4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
171 "bne 1b \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
172 "add %3, 32, %3 \n\t" //delay slot
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
173 : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4), "=r" (out5), "=r" (out6)
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
174 : "0" (src[0]+(y+srcSliceY)*srcStride[0]), "1" (src[1]+(y+srcSliceY)*srcStride[1]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
175 "2" (src[2]+(y+srcSliceY)*srcStride[2]), "3" (dst[0]+(y+srcSliceY)*dstStride[0]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
176 "4" (c->dstW),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
177 "5" (c->sparc_coeffs)
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
178 );
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
179 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
180
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
181 return srcSliceH;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
182 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
183
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
184 SwsFunc yuv2rgb_init_vis(SwsContext *c) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
185 c->sparc_coeffs[5]=c->yCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
186 c->sparc_coeffs[6]=c->vgCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
187 c->sparc_coeffs[7]=c->vrCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
188 c->sparc_coeffs[8]=c->ubCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
189 c->sparc_coeffs[9]=c->ugCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
190
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
191 c->sparc_coeffs[0]=(((int16_t)c->yOffset*(int16_t)c->yCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
192 c->sparc_coeffs[1]=(((int16_t)c->uOffset*(int16_t)c->ubCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
193 c->sparc_coeffs[2]=(((int16_t)c->uOffset*(int16_t)c->ugCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
194 c->sparc_coeffs[3]=(((int16_t)c->vOffset*(int16_t)c->vgCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
195 c->sparc_coeffs[4]=(((int16_t)c->vOffset*(int16_t)c->vrCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
196
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
197 if (c->dstFormat == PIX_FMT_RGB32 && c->srcFormat == PIX_FMT_YUV422P && (c->dstW & 7)==0) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
198 av_log(c, AV_LOG_INFO, "SPARC VIS accelerated YUV422P -> RGB32\n");
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
199 return vis_422P_ARGB32;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
200 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
201 else if (c->dstFormat == PIX_FMT_RGB32 && c->srcFormat == PIX_FMT_YUV420P && (c->dstW & 7)==0) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
202 av_log(c, AV_LOG_INFO, "SPARC VIS accelerated YUV420P -> RGB32\n");
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
203 return vis_420P_ARGB32;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
204 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
205 return NULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
206 }