Mercurial > mplayer.hg
annotate qtrpza.c @ 5460:acf7acfa7acc
Fix I420 handling, though still don't know why divx4 codec queries for I420 not YUY2!
author | atmos4 |
---|---|
date | Mon, 01 Apr 2002 18:16:27 +0000 |
parents | b3d18d070ec1 |
children |
rev | line source |
---|---|
4615
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
1 /* |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
2 * |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
3 * Apple Video (rpza) QuickTime Decoder for Mplayer |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
4 * (c) 2002 Roberto Togni |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
5 * |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
6 * Fourcc: rpza, azpr |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
7 * |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
8 * Some code comes from qtsmc.c by Mike Melanson |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
9 * |
4647
b3d18d070ec1
fixed the last few SMC bugs, thanks to Roberto Togni's bug hunting
melanson
parents:
4615
diff
changeset
|
10 * A description of the decoding algorithm can be found here: |
b3d18d070ec1
fixed the last few SMC bugs, thanks to Roberto Togni's bug hunting
melanson
parents:
4615
diff
changeset
|
11 * http://www.pcisys.net/~melanson/codecs/ |
4615
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
12 */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
13 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
14 #include "config.h" |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
15 #include "bswap.h" |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
16 #include "mp_msg.h" |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
17 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
18 #define BE_16(x) (be2me_16(*(unsigned short *)(x))) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
19 #define BE_32(x) (be2me_32(*(unsigned int *)(x))) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
20 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
21 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
22 #define ADVANCE_BLOCK() \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
23 { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
24 pixel_ptr += block_x_inc; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
25 if (pixel_ptr >= (width * bytes_per_pixel)) \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
26 { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
27 pixel_ptr = 0; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
28 row_ptr += block_y_inc * 4; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
29 } \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
30 total_blocks--; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
31 if (total_blocks < 0) \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
32 { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
33 mp_msg(MSGT_DECVIDEO, MSGL_WARN, "block counter just went negative (this should not happen)\n"); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
34 return; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
35 } \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
36 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
37 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
38 #define PAINT_CURRENT_PIXEL(r, g, b, color) \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
39 { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
40 if (bytes_per_pixel == 2) { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
41 (*(unsigned short*)(&decoded[block_ptr])) = color & 0x7fff; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
42 block_ptr += 2; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
43 } else { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
44 decoded[block_ptr++] = (b); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
45 decoded[block_ptr++] = (g); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
46 decoded[block_ptr++] = (r); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
47 if (bytes_per_pixel == 4) /* 32bpp */ \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
48 block_ptr++; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
49 } \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
50 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
51 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
52 #define COLOR_FIX(col_out, col_in) (col_out) = ((col_in) << 3) | ((col_in) >> 2) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
53 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
54 #define COLOR_TO_RGB(r, g, b, color) \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
55 { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
56 if (bytes_per_pixel != 2) { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
57 unsigned short tmp; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
58 tmp = (color >> 10) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
59 COLOR_FIX (r, tmp); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
60 tmp = (color >> 5) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
61 COLOR_FIX (g, tmp); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
62 tmp = color & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
63 COLOR_FIX (b, tmp); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
64 } \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
65 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
66 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
67 #define COLORAB_TO_RGB4(rgb4, color4, colorA, colorB) \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
68 { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
69 unsigned short ta, tb, tt; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
70 if (bytes_per_pixel != 2) { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
71 ta = (colorA >> 10) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
72 tb = (colorB >> 10) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
73 COLOR_FIX (rgb4[3][0], ta); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
74 COLOR_FIX (rgb4[0][0], tb); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
75 tt = (11 * ta + 21 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
76 COLOR_FIX (rgb4[1][0], tt); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
77 tt = (21 * ta + 11 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
78 COLOR_FIX (rgb4[2][0], tt); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
79 ta = (colorA >> 5) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
80 tb = (colorB >> 5) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
81 COLOR_FIX (rgb4[3][1], ta); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
82 COLOR_FIX (rgb4[0][1], tb); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
83 tt = (11 * ta + 21 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
84 COLOR_FIX (rgb4[1][1], tt); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
85 tt = (21 * ta + 11 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
86 COLOR_FIX (rgb4[2][1], tt); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
87 ta = colorA & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
88 tb = colorB & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
89 COLOR_FIX (rgb4[3][2], ta); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
90 COLOR_FIX (rgb4[0][2], tb); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
91 tt = (11 * ta + 21 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
92 COLOR_FIX (rgb4[1][2], tt); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
93 tt = (21 * ta + 11 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
94 COLOR_FIX (rgb4[2][2], tt); \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
95 } else { \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
96 color4[3] = colorA; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
97 color4[0] = colorB; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
98 ta = (colorA >> 10) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
99 tb = (colorB >> 10) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
100 color4[1] = ((11 * ta + 21 * tb) << 5) & 0x7c00; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
101 color4[2] = ((21 * ta + 11 * tb) << 5) & 0x7c00; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
102 ta = (colorA >> 5) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
103 tb = (colorB >> 5) & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
104 color4[1] |= (11 * ta + 21 * tb) & 0x3e0; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
105 color4[2] |= (21 * ta + 11 * tb) & 0x3e0; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
106 ta = colorA & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
107 tb = colorB & 0x1f; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
108 color4[1] |= (11 * ta + 21 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
109 color4[2] |= (21 * ta + 11 * tb) >> 5; \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
110 } \ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
111 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
112 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
113 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
114 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
115 /* |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
116 * rpza frame decoder |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
117 * |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
118 * Input values: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
119 * |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
120 * *encoded: buffer of encoded data (chunk) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
121 * encoded_size: length of encoded buffer |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
122 * *decoded: buffer where decoded data is written (image buffer) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
123 * width: width of decoded frame in pixels |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
124 * height: height of decoded frame in pixels |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
125 * bytes_per_pixel: bytes/pixel in output image (color depth) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
126 * |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
127 */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
128 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
129 void qt_decode_rpza(char *encoded, int encoded_size, char *decoded, int width, |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
130 int height, int bytes_per_pixel) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
131 { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
132 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
133 int i; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
134 int stream_ptr = 0; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
135 int chunk_size; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
136 unsigned char opcode; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
137 int n_blocks; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
138 unsigned short colorA, colorB; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
139 unsigned char r, g, b; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
140 unsigned char rgb4[4][3]; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
141 unsigned short color4[4]; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
142 unsigned char index, idx; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
143 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
144 int row_ptr = 0; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
145 int pixel_ptr = 0; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
146 int pixel_x, pixel_y; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
147 int row_inc = bytes_per_pixel * (width - 4); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
148 int max_height = row_inc * height; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
149 int block_x_inc = bytes_per_pixel * 4; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
150 int block_y_inc = bytes_per_pixel * width; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
151 int block_ptr; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
152 int total_blocks; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
153 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
154 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
155 /* First byte is always 0xe1. Warn if it's different */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
156 if ((unsigned char)encoded[stream_ptr] != 0xe1) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
157 mp_msg(MSGT_DECVIDEO, MSGL_WARN, |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
158 "First chunk byte is 0x%02x instead of 0x1e\n", |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
159 (unsigned char)encoded[stream_ptr]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
160 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
161 /* Get chunk size, ingnoring first byte */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
162 chunk_size = BE_32(&encoded[stream_ptr]) & 0x00FFFFFF; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
163 stream_ptr += 4; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
164 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
165 /* If length mismatch use size from MOV file and try to decode anyway */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
166 if (chunk_size != encoded_size) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
167 mp_msg(MSGT_DECVIDEO, MSGL_WARN, "MOV chunk size != encoded chunk size; using MOV chunk size\n"); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
168 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
169 chunk_size = encoded_size; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
170 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
171 /* Number of 4x4 blocks in frame. */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
172 total_blocks = (width * height) / (4 * 4); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
173 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
174 /* Process chunk data */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
175 while (stream_ptr < chunk_size) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
176 opcode = encoded[stream_ptr++]; /* Get opcode */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
177 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
178 n_blocks = (opcode & 0x1f) +1; /* Extract block counter from opcode */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
179 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
180 /* If opcode MSbit is 0, we need more data to decide what to do */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
181 if ((opcode & 0x80) == 0) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
182 colorA = (opcode << 8) | ((unsigned char)encoded[stream_ptr++]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
183 opcode = 0; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
184 if ((encoded[stream_ptr] & 0x80) != 0) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
185 /* Must behave as opcode 110xxxxx, using colorA computed above.*/ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
186 /* Use fake opcode 0x20 to enter switch block at the right place */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
187 opcode = 0x20; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
188 n_blocks = 1; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
189 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
190 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
191 switch (opcode & 0xe0) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
192 /* Skip blocks */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
193 case 0x80: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
194 while (n_blocks--) |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
195 ADVANCE_BLOCK(); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
196 break; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
197 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
198 /* Fill blocks with one color */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
199 case 0xa0: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
200 colorA = BE_16 (&encoded[stream_ptr]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
201 stream_ptr += 2; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
202 COLOR_TO_RGB (r, g, b, colorA); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
203 while (n_blocks--) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
204 block_ptr = row_ptr + pixel_ptr; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
205 for (pixel_y = 0; pixel_y < 4; pixel_y++) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
206 for (pixel_x = 0; pixel_x < 4; pixel_x++){ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
207 PAINT_CURRENT_PIXEL(r, g, b, colorA); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
208 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
209 block_ptr += row_inc; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
210 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
211 ADVANCE_BLOCK(); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
212 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
213 break; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
214 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
215 /* Fill blocks with 4 colors */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
216 case 0xc0: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
217 colorA = BE_16 (&encoded[stream_ptr]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
218 stream_ptr += 2; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
219 case 0x20: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
220 colorB = BE_16 (&encoded[stream_ptr]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
221 stream_ptr += 2; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
222 COLORAB_TO_RGB4 (rgb4, color4, colorA, colorB); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
223 while (n_blocks--) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
224 block_ptr = row_ptr + pixel_ptr; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
225 for (pixel_y = 0; pixel_y < 4; pixel_y++) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
226 index = encoded[stream_ptr++]; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
227 for (pixel_x = 0; pixel_x < 4; pixel_x++){ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
228 idx = (index >> (2 * (3 - pixel_x))) & 0x03; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
229 PAINT_CURRENT_PIXEL(rgb4[idx][0], rgb4[idx][1], rgb4[idx][2], color4[idx]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
230 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
231 block_ptr += row_inc; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
232 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
233 ADVANCE_BLOCK(); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
234 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
235 break; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
236 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
237 /* Fill block with 16 colors */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
238 case 0x00: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
239 block_ptr = row_ptr + pixel_ptr; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
240 for (pixel_y = 0; pixel_y < 4; pixel_y++) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
241 for (pixel_x = 0; pixel_x < 4; pixel_x++){ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
242 /* We already have color of upper left pixel */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
243 if ((pixel_y != 0) || (pixel_x !=0)) { |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
244 colorA = BE_16 (&encoded[stream_ptr]); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
245 stream_ptr += 2; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
246 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
247 COLOR_TO_RGB (r, g, b, colorA); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
248 PAINT_CURRENT_PIXEL(r, g, b, colorA); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
249 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
250 block_ptr += row_inc; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
251 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
252 ADVANCE_BLOCK(); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
253 break; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
254 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
255 /* Unknown opcode */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
256 default: |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
257 mp_msg(MSGT_DECVIDEO, MSGL_HINT, "Unknown opcode %d in rpza chunk." |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
258 " Skip remaining %lu bytes of chunk data.\n", opcode, |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
259 chunk_size - stream_ptr); |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
260 return; |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
261 } /* Opcode switch */ |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
262 |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
263 } |
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
diff
changeset
|
264 } |