Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1624 | giacomo | 1 | /* store.c, picture output routines */ |
2 | |||
3 | /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ |
||
4 | |||
5 | /* |
||
6 | * Disclaimer of Warranty |
||
7 | * |
||
8 | * These software programs are available to the user without any license fee or |
||
9 | * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims |
||
10 | * any and all warranties, whether express, implied, or statuary, including any |
||
11 | * implied warranties or merchantability or of fitness for a particular |
||
12 | * purpose. In no event shall the copyright-holder be liable for any |
||
13 | * incidental, punitive, or consequential damages of any kind whatsoever |
||
14 | * arising from the use of these programs. |
||
15 | * |
||
16 | * This disclaimer of warranty extends to the user of these programs and user's |
||
17 | * customers, employees, agents, transferees, successors, and assigns. |
||
18 | * |
||
19 | * The MPEG Software Simulation Group does not represent or warrant that the |
||
20 | * programs furnished hereunder are free of infringement of any third-party |
||
21 | * patents. |
||
22 | * |
||
23 | * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, |
||
24 | * are subject to royalty fees to patent holders. Many of these patents are |
||
25 | * general enough such that they are unavoidable regardless of implementation |
||
26 | * design. |
||
27 | * |
||
28 | */ |
||
29 | |||
30 | #include <stdlib.h> |
||
31 | |||
32 | #include "drivers/glib.h" |
||
33 | |||
34 | #include "config.h" |
||
35 | #include "global.h" |
||
36 | |||
37 | extern DWORD flbaddr; |
||
38 | |||
39 | static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst)); |
||
40 | static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst)); |
||
41 | |||
42 | __inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b) |
||
43 | { |
||
44 | return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8); |
||
45 | } |
||
46 | |||
47 | void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame)) |
||
48 | { |
||
49 | int i, j; |
||
50 | int y, u, v, r, g, b; |
||
51 | // int rm=0,gm=0,bm=0; |
||
52 | int crv, cbu, cgu, cgv; |
||
53 | unsigned char *py, *pu, *pv; |
||
54 | int height, width, incr; |
||
55 | static unsigned char *u422, *v422, *u444, *v444; |
||
56 | |||
57 | incr = width = Coded_Picture_Width ; |
||
58 | height = Coded_Picture_Height; |
||
59 | |||
60 | if (chroma_format==CHROMA444) |
||
61 | { |
||
62 | u444 = src[1]; |
||
63 | v444 = src[2]; |
||
64 | } |
||
65 | else |
||
66 | { |
||
67 | if (!u444) |
||
68 | { |
||
69 | if (chroma_format==CHROMA420) |
||
70 | { |
||
71 | if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1) |
||
72 | *Coded_Picture_Height))) |
||
73 | Error("malloc failed"); |
||
74 | if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1) |
||
75 | *Coded_Picture_Height))) |
||
76 | Error("malloc failed"); |
||
77 | } |
||
78 | |||
79 | if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width |
||
80 | *Coded_Picture_Height))) |
||
81 | Error("malloc failed"); |
||
82 | |||
83 | if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width |
||
84 | *Coded_Picture_Height))) |
||
85 | Error("malloc failed"); |
||
86 | } |
||
87 | |||
88 | if (chroma_format==CHROMA420) |
||
89 | { |
||
90 | conv420to422(src[1],u422); |
||
91 | conv420to422(src[2],v422); |
||
92 | conv422to444(u422,u444); |
||
93 | conv422to444(v422,v444); |
||
94 | } |
||
95 | else |
||
96 | { |
||
97 | conv422to444(src[1],u444); |
||
98 | conv422to444(src[2],v444); |
||
99 | } |
||
100 | } |
||
101 | |||
102 | /* matrix coefficients */ |
||
103 | crv = Inverse_Table_6_9[matrix_coefficients][0]; |
||
104 | cbu = Inverse_Table_6_9[matrix_coefficients][1]; |
||
105 | cgu = Inverse_Table_6_9[matrix_coefficients][2]; |
||
106 | cgv = Inverse_Table_6_9[matrix_coefficients][3]; |
||
107 | |||
108 | for (i=0; i<height; i++) |
||
109 | { |
||
110 | py = src[0] + incr*i; |
||
111 | pu = u444 + incr*i; |
||
112 | pv = v444 + incr*i; |
||
113 | |||
114 | for (j=0; j<width; j++) |
||
115 | { |
||
116 | u = *pu++ - 128; |
||
117 | v = *pv++ - 128; |
||
118 | y = 76309 * (*py++ - 16); /* (255/219)*65536 */ |
||
119 | |||
120 | r = Clip[(y + crv*v + 32768)>>16]; |
||
121 | g = Clip[(y - cgu*u - cgv*v + 32768)>>16]; |
||
122 | b = Clip[(y + cbu*u + 32786)>>16]; |
||
123 | |||
124 | *(WORD *)(flbaddr+((i+ld->py)*800+(j+ld->px))*2) = down32to16(r,g,b); |
||
125 | |||
126 | } |
||
127 | } |
||
128 | |||
129 | } |
||
130 | |||
131 | /* |
||
132 | void Display_Image(Dithered_Image) |
||
133 | unsigned char *Dithered_Image; |
||
134 | { |
||
135 | / * display dithered image */ |
||
136 | //} |
||
137 | |||
138 | |||
139 | /* horizontal 1:2 interpolation filter */ |
||
140 | static void conv422to444(src,dst) |
||
141 | unsigned char *src,*dst; |
||
142 | { |
||
143 | int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3; |
||
144 | |||
145 | w = Coded_Picture_Width>>1; |
||
146 | |||
147 | if (base.MPEG2_Flag) |
||
148 | { |
||
149 | for (j=0; j<Coded_Picture_Height; j++) |
||
150 | { |
||
151 | for (i=0; i<w; i++) |
||
152 | { |
||
153 | i2 = i<<1; |
||
154 | im2 = (i<2) ? 0 : i-2; |
||
155 | im1 = (i<1) ? 0 : i-1; |
||
156 | ip1 = (i<w-1) ? i+1 : w-1; |
||
157 | ip2 = (i<w-2) ? i+2 : w-1; |
||
158 | ip3 = (i<w-3) ? i+3 : w-1; |
||
159 | |||
160 | /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */ |
||
161 | /* even samples (0 0 256 0 0) */ |
||
162 | dst[i2] = src[i]; |
||
163 | |||
164 | /* odd samples (21 -52 159 159 -52 21) */ |
||
165 | dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3]) |
||
166 | -52*(src[im1]+src[ip2]) |
||
167 | +159*(src[i]+src[ip1])+128)>>8]; |
||
168 | } |
||
169 | src+= w; |
||
170 | dst+= Coded_Picture_Width; |
||
171 | } |
||
172 | } |
||
173 | else |
||
174 | { |
||
175 | for (j=0; j<Coded_Picture_Height; j++) |
||
176 | { |
||
177 | for (i=0; i<w; i++) |
||
178 | { |
||
179 | |||
180 | i2 = i<<1; |
||
181 | im3 = (i<3) ? 0 : i-3; |
||
182 | im2 = (i<2) ? 0 : i-2; |
||
183 | im1 = (i<1) ? 0 : i-1; |
||
184 | ip1 = (i<w-1) ? i+1 : w-1; |
||
185 | ip2 = (i<w-2) ? i+2 : w-1; |
||
186 | ip3 = (i<w-3) ? i+3 : w-1; |
||
187 | |||
188 | /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */ |
||
189 | dst[i2] = Clip[(int)( 5*src[im3] |
||
190 | -21*src[im2] |
||
191 | +70*src[im1] |
||
192 | +228*src[i] |
||
193 | -37*src[ip1] |
||
194 | +11*src[ip2]+128)>>8]; |
||
195 | |||
196 | dst[i2+1] = Clip[(int)( 5*src[ip3] |
||
197 | -21*src[ip2] |
||
198 | +70*src[ip1] |
||
199 | +228*src[i] |
||
200 | -37*src[im1] |
||
201 | +11*src[im2]+128)>>8]; |
||
202 | } |
||
203 | src+= w; |
||
204 | dst+= Coded_Picture_Width; |
||
205 | } |
||
206 | } |
||
207 | } |
||
208 | |||
209 | /* vertical 1:2 interpolation filter */ |
||
210 | static void conv420to422(src,dst) |
||
211 | unsigned char *src,*dst; |
||
212 | { |
||
213 | int w, h, i, j, j2; |
||
214 | int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7; |
||
215 | |||
216 | w = Coded_Picture_Width>>1; |
||
217 | h = Coded_Picture_Height>>1; |
||
218 | |||
219 | if (progressive_frame) |
||
220 | { |
||
221 | /* intra frame */ |
||
222 | for (i=0; i<w; i++) |
||
223 | { |
||
224 | for (j=0; j<h; j++) |
||
225 | { |
||
226 | j2 = j<<1; |
||
227 | jm3 = (j<3) ? 0 : j-3; |
||
228 | jm2 = (j<2) ? 0 : j-2; |
||
229 | jm1 = (j<1) ? 0 : j-1; |
||
230 | jp1 = (j<h-1) ? j+1 : h-1; |
||
231 | jp2 = (j<h-2) ? j+2 : h-1; |
||
232 | jp3 = (j<h-3) ? j+3 : h-1; |
||
233 | |||
234 | /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */ |
||
235 | /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */ |
||
236 | dst[w*j2] = Clip[(int)( 3*src[w*jm3] |
||
237 | -16*src[w*jm2] |
||
238 | +67*src[w*jm1] |
||
239 | +227*src[w*j] |
||
240 | -32*src[w*jp1] |
||
241 | +7*src[w*jp2]+128)>>8]; |
||
242 | |||
243 | dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3] |
||
244 | -16*src[w*jp2] |
||
245 | +67*src[w*jp1] |
||
246 | +227*src[w*j] |
||
247 | -32*src[w*jm1] |
||
248 | +7*src[w*jm2]+128)>>8]; |
||
249 | } |
||
250 | src++; |
||
251 | dst++; |
||
252 | } |
||
253 | } |
||
254 | else |
||
255 | { |
||
256 | /* intra field */ |
||
257 | for (i=0; i<w; i++) |
||
258 | { |
||
259 | for (j=0; j<h; j+=2) |
||
260 | { |
||
261 | j2 = j<<1; |
||
262 | |||
263 | /* top field */ |
||
264 | jm6 = (j<6) ? 0 : j-6; |
||
265 | jm4 = (j<4) ? 0 : j-4; |
||
266 | jm2 = (j<2) ? 0 : j-2; |
||
267 | jp2 = (j<h-2) ? j+2 : h-2; |
||
268 | jp4 = (j<h-4) ? j+4 : h-2; |
||
269 | jp6 = (j<h-6) ? j+6 : h-2; |
||
270 | |||
271 | /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */ |
||
272 | /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */ |
||
273 | dst[w*j2] = Clip[(int)( 1*src[w*jm6] |
||
274 | -7*src[w*jm4] |
||
275 | +30*src[w*jm2] |
||
276 | +248*src[w*j] |
||
277 | -21*src[w*jp2] |
||
278 | +5*src[w*jp4]+128)>>8]; |
||
279 | |||
280 | /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */ |
||
281 | /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */ |
||
282 | dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4] |
||
283 | -35*src[w*jm2] |
||
284 | +194*src[w*j] |
||
285 | +110*src[w*jp2] |
||
286 | -24*src[w*jp4] |
||
287 | +4*src[w*jp6]+128)>>8]; |
||
288 | |||
289 | /* bottom field */ |
||
290 | jm5 = (j<5) ? 1 : j-5; |
||
291 | jm3 = (j<3) ? 1 : j-3; |
||
292 | jm1 = (j<1) ? 1 : j-1; |
||
293 | jp1 = (j<h-1) ? j+1 : h-1; |
||
294 | jp3 = (j<h-3) ? j+3 : h-1; |
||
295 | jp5 = (j<h-5) ? j+5 : h-1; |
||
296 | jp7 = (j<h-7) ? j+7 : h-1; |
||
297 | |||
298 | /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */ |
||
299 | /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */ |
||
300 | dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5] |
||
301 | -35*src[w*jp3] |
||
302 | +194*src[w*jp1] |
||
303 | +110*src[w*jm1] |
||
304 | -24*src[w*jm3] |
||
305 | +4*src[w*jm5]+128)>>8]; |
||
306 | |||
307 | dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7] |
||
308 | -7*src[w*jp5] |
||
309 | +30*src[w*jp3] |
||
310 | +248*src[w*jp1] |
||
311 | -21*src[w*jm1] |
||
312 | +5*src[w*jm3]+128)>>8]; |
||
313 | } |
||
314 | src++; |
||
315 | dst++; |
||
316 | } |
||
317 | } |
||
318 | } |
||
319 |