Mercurial > libavcodec.hg
comparison tscc.c @ 3121:99cbff5f8038 libavcodec
make TSCC endian-safe, PPC testing courtesy of Diego B.
author | melanson |
---|---|
date | Sun, 12 Feb 2006 16:56:06 +0000 |
parents | 0b546eab515d |
children | 9b75ab171fa9 |
comparison
equal
deleted
inserted
replaced
3120:1d184d61e714 | 3121:99cbff5f8038 |
---|---|
75 static int decode_rle(CamtasiaContext *c, unsigned int srcsize) | 75 static int decode_rle(CamtasiaContext *c, unsigned int srcsize) |
76 { | 76 { |
77 unsigned char *src = c->decomp_buf; | 77 unsigned char *src = c->decomp_buf; |
78 unsigned char *output, *output_end; | 78 unsigned char *output, *output_end; |
79 int p1, p2, line=c->height, pos=0, i; | 79 int p1, p2, line=c->height, pos=0, i; |
80 uint16_t pix16; | |
81 uint32_t pix32; | |
80 | 82 |
81 output = c->pic.data[0] + (c->height - 1) * c->pic.linesize[0]; | 83 output = c->pic.data[0] + (c->height - 1) * c->pic.linesize[0]; |
82 output_end = c->pic.data[0] + (c->height) * c->pic.linesize[0]; | 84 output_end = c->pic.data[0] + (c->height) * c->pic.linesize[0]; |
83 while(src < c->decomp_buf + srcsize) { | 85 while(src < c->decomp_buf + srcsize) { |
84 p1 = *src++; | 86 p1 = *src++; |
105 // Copy data | 107 // Copy data |
106 if (output + p2 * (c->bpp / 8) > output_end) { | 108 if (output + p2 * (c->bpp / 8) > output_end) { |
107 src += p2 * (c->bpp / 8); | 109 src += p2 * (c->bpp / 8); |
108 continue; | 110 continue; |
109 } | 111 } |
110 for(i = 0; i < p2 * (c->bpp / 8); i++) { | 112 if ((c->bpp == 8) || (c->bpp == 24)) { |
111 *output++ = *src++; | 113 for(i = 0; i < p2 * (c->bpp / 8); i++) { |
112 } | 114 *output++ = *src++; |
113 // RLE8 copy is actually padded - and runs are not! | 115 } |
114 if(c->bpp == 8 && (p2 & 1)) { | 116 // RLE8 copy is actually padded - and runs are not! |
115 src++; | 117 if(c->bpp == 8 && (p2 & 1)) { |
118 src++; | |
119 } | |
120 } else if (c->bpp == 16) { | |
121 for(i = 0; i < p2; i++) { | |
122 pix16 = LE_16(src); | |
123 src += 2; | |
124 *(uint16_t*)output = pix16; | |
125 output += 2; | |
126 } | |
127 } else if (c->bpp == 32) { | |
128 for(i = 0; i < p2; i++) { | |
129 pix32 = LE_32(src); | |
130 src += 4; | |
131 *(uint32_t*)output = pix32; | |
132 output += 4; | |
133 } | |
116 } | 134 } |
117 pos += p2; | 135 pos += p2; |
118 } else { //Run of pixels | 136 } else { //Run of pixels |
119 int pix[4]; //original pixel | 137 int pix[4]; //original pixel |
120 switch(c->bpp){ | 138 switch(c->bpp){ |
121 case 8: pix[0] = *src++; | 139 case 8: pix[0] = *src++; |
122 break; | 140 break; |
123 case 16: pix[0] = *src++; | 141 case 16: pix16 = LE_16(src); |
124 pix[1] = *src++; | 142 src += 2; |
143 *(uint16_t*)pix = pix16; | |
125 break; | 144 break; |
126 case 24: pix[0] = *src++; | 145 case 24: pix[0] = *src++; |
127 pix[1] = *src++; | 146 pix[1] = *src++; |
128 pix[2] = *src++; | 147 pix[2] = *src++; |
129 break; | 148 break; |
130 case 32: pix[0] = *src++; | 149 case 32: pix32 = LE_32(src); |
131 pix[1] = *src++; | 150 src += 4; |
132 pix[2] = *src++; | 151 *(uint32_t*)pix = pix32; |
133 pix[3] = *src++; | |
134 break; | 152 break; |
135 } | 153 } |
136 if (output + p1 * (c->bpp / 8) > output_end) | 154 if (output + p1 * (c->bpp / 8) > output_end) |
137 continue; | 155 continue; |
138 for(i = 0; i < p1; i++) { | 156 for(i = 0; i < p1; i++) { |
139 switch(c->bpp){ | 157 switch(c->bpp){ |
140 case 8: *output++ = pix[0]; | 158 case 8: *output++ = pix[0]; |
141 break; | 159 break; |
142 case 16: *output++ = pix[0]; | 160 case 16: *(uint16_t*)output = pix16; |
143 *output++ = pix[1]; | 161 output += 2; |
144 break; | 162 break; |
145 case 24: *output++ = pix[0]; | 163 case 24: *output++ = pix[0]; |
146 *output++ = pix[1]; | 164 *output++ = pix[1]; |
147 *output++ = pix[2]; | 165 *output++ = pix[2]; |
148 break; | 166 break; |
149 case 32: *output++ = pix[0]; | 167 case 32: *(uint32_t*)output = pix32; |
150 *output++ = pix[1]; | 168 output += 4; |
151 *output++ = pix[2]; | |
152 *output++ = pix[3]; | |
153 break; | 169 break; |
154 } | 170 } |
155 } | 171 } |
156 pos += p1; | 172 pos += p1; |
157 } | 173 } |