annotate libswscale/yuv2rgb_vis.c @ 28615:15e7abed4291

Use the same code to convert fps in float to fraction as used in mencoder, it ensures all the common frame rates work right. If this causes issues, it should be changed in the same way in mencoder.c
author reimar
date Wed, 18 Feb 2009 16:49:12 +0000
parents 75586eb0750d
children b6e1b6af8e99
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"
27001
afcf4c4d2505 Add missing #include, patch by Jan Knutar, jknutar nic fi.
diego
parents: 25750
diff changeset
26 #include "swscale_internal.h"
23805
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
27
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
28 #define YUV2RGB_INIT \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
29 "wr %%g0, 0x10, %%gsr \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
30 "ldd [%5], %%f32 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
31 "ldd [%5+8], %%f34 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
32 "ldd [%5+16], %%f36 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
33 "ldd [%5+24], %%f38 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
34 "ldd [%5+32], %%f40 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
35 "ldd [%5+40], %%f42 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
36 "ldd [%5+48], %%f44 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
37 "ldd [%5+56], %%f46 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
38 "ldd [%5+64], %%f48 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
39 "ldd [%5+72], %%f50 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
40
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
41 #define YUV2RGB_KERNEL \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
42 /* ^^^^ f0=Y f3=u f5=v */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
43 "fmul8x16 %%f3, %%f48, %%f6 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
44 "fmul8x16 %%f19, %%f48, %%f22 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
45 "fmul8x16 %%f5, %%f44, %%f8 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
46 "fmul8x16 %%f21, %%f44, %%f24 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
47 "fmul8x16 %%f0, %%f42, %%f0 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
48 "fmul8x16 %%f16, %%f42, %%f16 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
49 "fmul8x16 %%f3, %%f50, %%f2 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
50 "fmul8x16 %%f19, %%f50, %%f18 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
51 "fmul8x16 %%f5, %%f46, %%f4 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
52 "fmul8x16 %%f21, %%f46, %%f20 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
53 \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
54 "fpsub16 %%f6, %%f34, %%f6 \n\t" /* 1 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
55 "fpsub16 %%f22, %%f34, %%f22 \n\t" /* 1 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
56 "fpsub16 %%f8, %%f38, %%f8 \n\t" /* 3 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
57 "fpsub16 %%f24, %%f38, %%f24 \n\t" /* 3 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
58 "fpsub16 %%f0, %%f32, %%f0 \n\t" /* 0 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
59 "fpsub16 %%f16, %%f32, %%f16 \n\t" /* 0 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
60 "fpsub16 %%f2, %%f36, %%f2 \n\t" /* 2 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
61 "fpsub16 %%f18, %%f36, %%f18 \n\t" /* 2 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
62 "fpsub16 %%f4, %%f40, %%f4 \n\t" /* 4 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
63 "fpsub16 %%f20, %%f40, %%f20 \n\t" /* 4 */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
64 \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
65 "fpadd16 %%f0, %%f8, %%f8 \n\t" /* Gt */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
66 "fpadd16 %%f16, %%f24, %%f24 \n\t" /* Gt */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
67 "fpadd16 %%f0, %%f4, %%f4 \n\t" /* R */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
68 "fpadd16 %%f16, %%f20, %%f20 \n\t" /* R */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
69 "fpadd16 %%f0, %%f6, %%f6 \n\t" /* B */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
70 "fpadd16 %%f16, %%f22, %%f22 \n\t" /* B */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
71 "fpadd16 %%f8, %%f2, %%f2 \n\t" /* G */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
72 "fpadd16 %%f24, %%f18, %%f18 \n\t" /* G */ \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
73 \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
74 "fpack16 %%f4, %%f4 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
75 "fpack16 %%f20, %%f20 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
76 "fpack16 %%f6, %%f6 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
77 "fpack16 %%f22, %%f22 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
78 "fpack16 %%f2, %%f2 \n\t" \
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
79 "fpack16 %%f18, %%f18 \n\t"
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
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
83 static int vis_420P_ARGB32(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
84 int srcSliceH, uint8_t* dst[], int dstStride[]){
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
85 int y, out1, out2, out3, out4, out5, out6;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
86
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
87 for(y=0;y < srcSliceH;++y) {
27744
7b83cbade239 Convert asm keyword into __asm__.
flameeyes
parents: 27001
diff changeset
88 __asm__ volatile (
23805
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
89 YUV2RGB_INIT
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
90 "wr %%g0, 0xd2, %%asi \n\t" /* ASI_FL16_P */
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
91 "1: \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
92 "ldda [%1] %%asi, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
93 "ldda [%1+2] %%asi, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
94 "ldda [%2] %%asi, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
95 "ldda [%2+2] %%asi, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
96 "ld [%0], %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
97 "ld [%0+4], %%f16 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
98 "fpmerge %%f3, %%f3, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
99 "fpmerge %%f19, %%f19, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
100 "fpmerge %%f5, %%f5, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
101 "fpmerge %%f21, %%f21, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
102 YUV2RGB_KERNEL
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
103 "fzero %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
104 "fpmerge %%f4, %%f6, %%f8 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
105 "fpmerge %%f20, %%f22, %%f24 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
106 "fpmerge %%f0, %%f2, %%f10 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
107 "fpmerge %%f0, %%f18, %%f26 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
108 "fpmerge %%f10, %%f8, %%f4 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
109 "fpmerge %%f26, %%f24, %%f20 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
110 "fpmerge %%f11, %%f9, %%f6 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
111 "fpmerge %%f27, %%f25, %%f22 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
112 "std %%f4, [%3] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
113 "std %%f20, [%3+16] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
114 "std %%f6, [%3+8] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
115 "std %%f22, [%3+24] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
116
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
117 "add %0, 8, %0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
118 "add %1, 4, %1 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
119 "add %2, 4, %2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
120 "subcc %4, 8, %4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
121 "bne 1b \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
122 "add %3, 32, %3 \n\t" //delay slot
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
123 : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4), "=r" (out5), "=r" (out6)
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
124 : "0" (src[0]+(y+srcSliceY)*srcStride[0]), "1" (src[1]+((y+srcSliceY)>>1)*srcStride[1]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
125 "2" (src[2]+((y+srcSliceY)>>1)*srcStride[2]), "3" (dst[0]+(y+srcSliceY)*dstStride[0]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
126 "4" (c->dstW),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
127 "5" (c->sparc_coeffs)
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
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
131 return srcSliceH;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
132 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
133
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
134 static int vis_422P_ARGB32(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
135 int srcSliceH, uint8_t* dst[], int dstStride[]){
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
136 int y, out1, out2, out3, out4, out5, out6;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
137
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
138 for(y=0;y < srcSliceH;++y) {
27744
7b83cbade239 Convert asm keyword into __asm__.
flameeyes
parents: 27001
diff changeset
139 __asm__ volatile (
23805
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
140 YUV2RGB_INIT
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
141 "wr %%g0, 0xd2, %%asi \n\t" /* ASI_FL16_P */
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
142 "1: \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
143 "ldda [%1] %%asi, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
144 "ldda [%1+2] %%asi, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
145 "ldda [%2] %%asi, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
146 "ldda [%2+2] %%asi, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
147 "ld [%0], %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
148 "ld [%0+4], %%f16 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
149 "fpmerge %%f3, %%f3, %%f2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
150 "fpmerge %%f19, %%f19, %%f18 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
151 "fpmerge %%f5, %%f5, %%f4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
152 "fpmerge %%f21, %%f21, %%f20 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
153 YUV2RGB_KERNEL
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
154 "fzero %%f0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
155 "fpmerge %%f4, %%f6, %%f8 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
156 "fpmerge %%f20, %%f22, %%f24 \n\t" // r,b,t1
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
157 "fpmerge %%f0, %%f2, %%f10 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
158 "fpmerge %%f0, %%f18, %%f26 \n\t" // 0,g,t2
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
159 "fpmerge %%f10, %%f8, %%f4 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
160 "fpmerge %%f26, %%f24, %%f20 \n\t" // t2,t1,msb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
161 "fpmerge %%f11, %%f9, %%f6 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
162 "fpmerge %%f27, %%f25, %%f22 \n\t" // t2,t1,lsb
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
163 "std %%f4, [%3] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
164 "std %%f20, [%3+16] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
165 "std %%f6, [%3+8] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
166 "std %%f22, [%3+24] \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
167
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
168 "add %0, 8, %0 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
169 "add %1, 4, %1 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
170 "add %2, 4, %2 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
171 "subcc %4, 8, %4 \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
172 "bne 1b \n\t"
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
173 "add %3, 32, %3 \n\t" //delay slot
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
174 : "=r" (out1), "=r" (out2), "=r" (out3), "=r" (out4), "=r" (out5), "=r" (out6)
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
175 : "0" (src[0]+(y+srcSliceY)*srcStride[0]), "1" (src[1]+(y+srcSliceY)*srcStride[1]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
176 "2" (src[2]+(y+srcSliceY)*srcStride[2]), "3" (dst[0]+(y+srcSliceY)*dstStride[0]),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
177 "4" (c->dstW),
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
178 "5" (c->sparc_coeffs)
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
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
182 return srcSliceH;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
183 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
184
28461
75586eb0750d Prefix visible YUV2RGB functions with sws_
kostya
parents: 27744
diff changeset
185 SwsFunc sws_yuv2rgb_init_vis(SwsContext *c) {
23805
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
186 c->sparc_coeffs[5]=c->yCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
187 c->sparc_coeffs[6]=c->vgCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
188 c->sparc_coeffs[7]=c->vrCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
189 c->sparc_coeffs[8]=c->ubCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
190 c->sparc_coeffs[9]=c->ugCoeff;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
191
25750
06bf0eb70a55 Cosmetics: whitespaces
benoit
parents: 23805
diff changeset
192 c->sparc_coeffs[0]=(((int16_t)c->yOffset*(int16_t)c->yCoeff >>11) & 0xffff) * 0x0001000100010001ULL;
23805
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
193 c->sparc_coeffs[1]=(((int16_t)c->uOffset*(int16_t)c->ubCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
194 c->sparc_coeffs[2]=(((int16_t)c->uOffset*(int16_t)c->ugCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
195 c->sparc_coeffs[3]=(((int16_t)c->vOffset*(int16_t)c->vgCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
196 c->sparc_coeffs[4]=(((int16_t)c->vOffset*(int16_t)c->vrCoeff>>11) & 0xffff) * 0x0001000100010001ULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
197
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
198 if (c->dstFormat == PIX_FMT_RGB32 && c->srcFormat == PIX_FMT_YUV422P && (c->dstW & 7)==0) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
199 av_log(c, AV_LOG_INFO, "SPARC VIS accelerated YUV422P -> RGB32\n");
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
200 return vis_422P_ARGB32;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
201 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
202 else if (c->dstFormat == PIX_FMT_RGB32 && c->srcFormat == PIX_FMT_YUV420P && (c->dstW & 7)==0) {
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
203 av_log(c, AV_LOG_INFO, "SPARC VIS accelerated YUV420P -> RGB32\n");
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
204 return vis_420P_ARGB32;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
205 }
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
206 return NULL;
3c6db57870ea UltraSPARC VIS yuv2rgb
benoit
parents:
diff changeset
207 }