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 }