|
|
1.1 root 1:
2: /********************************************************************
3: * *
4: * THIS FILE IS PART OF THE 'ZYWRLE' VNC CODEC SOURCE CODE. *
5: * *
6: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
7: * GOVERNED BY A FOLLOWING BSD-STYLE SOURCE LICENSE. *
8: * PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
9: * *
10: * THE 'ZYWRLE' VNC CODEC SOURCE CODE IS (C) COPYRIGHT 2006 *
11: * BY Hitachi Systems & Services, Ltd. *
1.1.1.2 ! root 12: * (Noriaki Yamazaki, Research & Development Center) *
1.1 root 13: * *
14: * *
15: ********************************************************************
16: Redistribution and use in source and binary forms, with or without
17: modification, are permitted provided that the following conditions
18: are met:
19:
20: - Redistributions of source code must retain the above copyright
21: notice, this list of conditions and the following disclaimer.
22:
23: - Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26:
27: - Neither the name of the Hitachi Systems & Services, Ltd. nor
28: the names of its contributors may be used to endorse or promote
29: products derived from this software without specific prior written
30: permission.
31:
32: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33: ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
35: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION
36: OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
42: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43: ********************************************************************/
44:
45: /* Change Log:
46: V0.02 : 2008/02/04 : Fix mis encode/decode when width != scanline
47: (Thanks Johannes Schindelin, author of LibVNC
48: Server/Client)
49: V0.01 : 2007/02/06 : Initial release
50: */
51:
52: /*
53: [References]
54: PLHarr:
55: Senecal, J. G., P. Lindstrom, M. A. Duchaineau, and K. I. Joy,
56: "An Improved N-Bit to N-Bit Reversible Haar-Like Transform,"
57: Pacific Graphics 2004, October 2004, pp. 371-380.
58: EZW:
59: Shapiro, JM: Embedded Image Coding Using Zerotrees of Wavelet Coefficients,
60: IEEE Trans. Signal. Process., Vol.41, pp.3445-3462 (1993).
61: */
62:
63:
64: /* Template Macro stuffs. */
65: #undef ZYWRLE_ANALYZE
66: #undef ZYWRLE_SYNTHESIZE
67:
68: #define ZYWRLE_SUFFIX ZRLE_CONCAT2(ZRLE_BPP,ZRLE_ENDIAN_SUFFIX)
69:
70: #define ZYWRLE_ANALYZE ZRLE_CONCAT2(zywrle_analyze_, ZYWRLE_SUFFIX)
71: #define ZYWRLE_SYNTHESIZE ZRLE_CONCAT2(zywrle_synthesize_,ZYWRLE_SUFFIX)
72:
73: #define ZYWRLE_RGBYUV ZRLE_CONCAT2(zywrle_rgbyuv_, ZYWRLE_SUFFIX)
74: #define ZYWRLE_YUVRGB ZRLE_CONCAT2(zywrle_yuvrgb_, ZYWRLE_SUFFIX)
75: #define ZYWRLE_YMASK ZRLE_CONCAT2(ZYWRLE_YMASK, ZRLE_BPP)
76: #define ZYWRLE_UVMASK ZRLE_CONCAT2(ZYWRLE_UVMASK, ZRLE_BPP)
77: #define ZYWRLE_LOAD_PIXEL ZRLE_CONCAT2(ZYWRLE_LOAD_PIXEL, ZRLE_BPP)
78: #define ZYWRLE_SAVE_PIXEL ZRLE_CONCAT2(ZYWRLE_SAVE_PIXEL, ZRLE_BPP)
79:
80: /* Packing/Unpacking pixel stuffs.
81: Endian conversion stuffs. */
82: #undef S_0
83: #undef S_1
84: #undef L_0
85: #undef L_1
86: #undef L_2
87:
88: #if ZYWRLE_ENDIAN == ENDIAN_BIG
89: # define S_0 1
90: # define S_1 0
91: # define L_0 3
92: # define L_1 2
93: # define L_2 1
94: #else
95: # define S_0 0
96: # define S_1 1
97: # define L_0 0
98: # define L_1 1
99: # define L_2 2
100: #endif
101:
102: #define ZYWRLE_QUANTIZE
103: #include "vnc-enc-zywrle.h"
104:
105: #ifndef ZRLE_COMPACT_PIXEL
106: static inline void ZYWRLE_RGBYUV(int *buf, ZRLE_PIXEL *data,
107: int width, int height, int scanline)
108: {
109: int r, g, b;
110: int y, u, v;
111: int *line;
112: int *end;
113:
114: end = buf + height * width;
115: while (buf < end) {
116: line = buf + width;
117: while (buf < line) {
118: ZYWRLE_LOAD_PIXEL(data, r, g, b);
119: ZYWRLE_RGBYUV_(r, g, b, y, u, v, ZYWRLE_YMASK, ZYWRLE_UVMASK);
120: ZYWRLE_SAVE_COEFF(buf, v, y, u);
121: buf++;
122: data++;
123: }
124: data += scanline - width;
125: }
126: }
127:
128: static ZRLE_PIXEL *ZYWRLE_ANALYZE(ZRLE_PIXEL *dst, ZRLE_PIXEL *src,
129: int w, int h, int scanline, int level,
130: int *buf) {
131: int l;
132: int uw = w;
133: int uh = h;
134: int *top;
135: int *end;
136: int *line;
137: ZRLE_PIXEL *p;
138: int r, g, b;
139: int s;
140: int *ph;
141:
142: zywrle_calc_size(&w, &h, level);
143:
144: if (w == 0 || h == 0) {
145: return NULL;
146: }
147: uw -= w;
148: uh -= h;
149:
150: p = dst;
151: ZYWRLE_LOAD_UNALIGN(src,*(ZRLE_PIXEL*)top = *p;);
152: ZYWRLE_RGBYUV(buf, src, w, h, scanline);
153: wavelet(buf, w, h, level);
154: for (l = 0; l < level; l++) {
155: ZYWRLE_PACK_COEFF(buf, dst, 3, w, h, scanline, l);
156: ZYWRLE_PACK_COEFF(buf, dst, 2, w, h, scanline, l);
157: ZYWRLE_PACK_COEFF(buf, dst, 1, w, h, scanline, l);
158: if (l == level - 1) {
159: ZYWRLE_PACK_COEFF(buf, dst, 0, w, h, scanline, l);
160: }
161: }
162: ZYWRLE_SAVE_UNALIGN(dst,*dst = *(ZRLE_PIXEL*)top;);
163: return dst;
164: }
165: #endif /* ZRLE_COMPACT_PIXEL */
166:
167: #undef ZYWRLE_RGBYUV
168: #undef ZYWRLE_YUVRGB
169: #undef ZYWRLE_LOAD_PIXEL
170: #undef ZYWRLE_SAVE_PIXEL
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.