blob: 1b0ea63b66325b35fee040bbd4f26dd3023ec62a [file] [log] [blame]
Sjoerd Mullender6b517fd1993-03-16 12:25:30 +00001#include "yuv.h"
2
3void
4yuv_sv411_to_cl422dc(int invert, void *data, void *yuv, int width, int height)
5{
6 struct yuv411 *in = data;
7 struct yuv422 *out_even = yuv;
8 struct yuv422 *out_odd = out_even + width / 2;
9 int i, j; /* counters */
10
11 for (i = height / 2; i--; ) {
12 for (j = width / 4; j--; ) {
13 YUV422_Y0(*out_even) = YUV411_Y00(*in);
14 YUV422_U0(*out_even) = YUV411_U00(*in);
15 YUV422_V0(*out_even) = YUV411_V00(*in);
16 YUV422_Y1(*out_even) = YUV411_Y01(*in);
17 out_even++;
18 YUV422_Y0(*out_even) = YUV411_Y02(*in);
19 YUV422_U0(*out_even) = YUV411_U02(*in);
20 YUV422_V0(*out_even) = YUV411_V02(*in);
21 YUV422_Y1(*out_even) = YUV411_Y03(*in);
22 out_even++;
23 YUV422_Y0(*out_odd) = YUV411_Y10(*in);
24 YUV422_U0(*out_odd) = YUV411_U10(*in);
25 YUV422_V0(*out_odd) = YUV411_V10(*in);
26 YUV422_Y1(*out_odd) = YUV411_Y11(*in);
27 out_odd++;
28 YUV422_Y0(*out_odd) = YUV411_Y12(*in);
29 YUV422_U0(*out_odd) = YUV411_U12(*in);
30 YUV422_V0(*out_odd) = YUV411_V12(*in);
31 YUV422_Y1(*out_odd) = YUV411_Y13(*in);
32 out_odd++;
33 in++;
34 }
35 out_even += width / 2;
36 out_odd += width / 2;
37 }
38}
39
40void
41yuv_sv411_to_cl422dc_quartersize(int invert, void *data, void *yuv,
42 int width, int height)
43{
44 int w4 = width / 4; /* quarter of width is used often */
45 struct yuv411 *in_even = data;
46 struct yuv411 *in_odd = in_even + w4;
47 struct yuv422 *out_even = yuv;
48 struct yuv422 *out_odd = out_even + w4;
49 int i, j; /* counters */
50 int u, v; /* U and V values */
51
52 for (i = height / 4; i--; ) {
53 for (j = w4; j--; ) {
54 u = YUV411_U00(*in_even);
55 v = YUV411_V00(*in_even);
56
57 YUV422_Y0(*out_even) = YUV411_Y00(*in_even);
58 YUV422_U0(*out_even) = u;
59 YUV422_V0(*out_even) = v;
60 YUV422_Y1(*out_even) = YUV411_Y02(*in_even);
61
62 YUV422_Y0(*out_odd) = YUV411_Y10(*in_odd);
63 YUV422_U0(*out_odd) = u;
64 YUV422_V0(*out_odd) = v;
65 YUV422_Y1(*out_odd) = YUV411_Y12(*in_odd);
66
67 in_even++;
68 in_odd++;
69 out_even++;
70 out_odd++;
71 }
72 in_even += w4;
73 in_odd += w4;
74 out_even += w4;
75 out_odd += w4;
76 }
77}
78
79void
80yuv_sv411_to_cl422dc_sixteenthsize(int invert, void *data, void *yuv,
81 int width, int height)
82{
83 int w4_3 = 3 * width / 4; /* three quarters of width is used often */
84 int w8 = width / 8; /* and so is one eighth */
85 struct yuv411 *in_even = data;
86 struct yuv411 *in_odd = in_even + width / 2;
87 struct yuv422 *out_even = yuv;
88 struct yuv422 *out_odd = out_even + w8;
89 int i, j; /* counters */
90 int u, v; /* U and V values */
91
92 for (i = height / 8; i--; ) {
93 for (j = w8; j--; ) {
94 u = YUV411_U00(in_even[0]);
95 v = YUV411_V00(in_even[0]);
96
97 YUV422_Y0(*out_even) = YUV411_Y00(in_even[0]);
98 YUV422_U0(*out_even) = u;
99 YUV422_V0(*out_even) = v;
100 YUV422_Y1(*out_even) = YUV411_Y00(in_even[1]);
101
102 YUV422_Y0(*out_odd) = YUV411_Y00(in_odd[0]);
103 YUV422_U0(*out_odd) = u;
104 YUV422_V0(*out_odd) = v;
105 YUV422_Y1(*out_odd) = YUV411_Y00(in_even[1]);
106
107 in_even += 2;
108 in_odd += 2;
109 out_even++;
110 out_odd++;
111 }
112 in_even += w4_3;
113 in_odd += w4_3;
114 out_even += w8;
115 out_odd += w8;
116 }
117}