comparison mjpeg.c @ 3225:a0d2d5053c9d libavcodec

optimizations by arpi
author michael
date Wed, 29 Mar 2006 01:59:24 +0000
parents 072dbc669253
children e3ddc57c2d6e
comparison
equal deleted inserted replaced
3224:28aaf0a0135e 3225:a0d2d5053c9d
1244 return 0; 1244 return 0;
1245 } 1245 }
1246 1246
1247 /* decode block and dequantize */ 1247 /* decode block and dequantize */
1248 static int decode_block(MJpegDecodeContext *s, DCTELEM *block, 1248 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1249 int component, int dc_index, int ac_index, int quant_index) 1249 int component, int dc_index, int ac_index, int16_t *quant_matrix)
1250 { 1250 {
1251 int code, i, j, level, val; 1251 int code, i, j, level, val;
1252 VLC *ac_vlc; 1252 VLC *ac_vlc;
1253 int16_t *quant_matrix;
1254 1253
1255 /* DC coef */ 1254 /* DC coef */
1256 val = mjpeg_decode_dc(s, dc_index); 1255 val = mjpeg_decode_dc(s, dc_index);
1257 if (val == 0xffff) { 1256 if (val == 0xffff) {
1258 dprintf("error dc\n"); 1257 dprintf("error dc\n");
1259 return -1; 1258 return -1;
1260 } 1259 }
1261 quant_matrix = s->quant_matrixes[quant_index];
1262 val = val * quant_matrix[0] + s->last_dc[component]; 1260 val = val * quant_matrix[0] + s->last_dc[component];
1263 s->last_dc[component] = val; 1261 s->last_dc[component] = val;
1264 block[0] = val; 1262 block[0] = val;
1265 /* AC coefs */ 1263 /* AC coefs */
1266 ac_vlc = &s->vlcs[1][ac_index]; 1264 ac_vlc = &s->vlcs[1][ac_index];
1267 i = 1; 1265 i = 1;
1266 OPEN_READER(re, &s->gb)
1268 for(;;) { 1267 for(;;) {
1269 code = get_vlc2(&s->gb, s->vlcs[1][ac_index].table, 9, 2); 1268 UPDATE_CACHE(re, &s->gb);
1269 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
1270 1270
1271 if (code < 0) { 1271 if (code < 0) {
1272 dprintf("error ac\n"); 1272 dprintf("error ac\n");
1273 return -1; 1273 return -1;
1274 } 1274 }
1276 if (code == 0) 1276 if (code == 0)
1277 break; 1277 break;
1278 if (code == 0xf0) { 1278 if (code == 0xf0) {
1279 i += 16; 1279 i += 16;
1280 } else { 1280 } else {
1281 level = get_xbits(&s->gb, code & 0xf);
1282 i += code >> 4; 1281 i += code >> 4;
1282 code &= 0xf;
1283
1284 UPDATE_CACHE(re, &s->gb)
1285
1286 if ((int32_t)GET_CACHE(re,&s->gb)<0) { //MSB=1
1287 level = NEG_USR32( GET_CACHE(re,&s->gb),code);
1288 } else {
1289 level = - NEG_USR32(~GET_CACHE(re,&s->gb),code);
1290 }
1291
1292 SKIP_BITS(re, &s->gb, code)
1293
1283 if (i >= 64) { 1294 if (i >= 64) {
1284 dprintf("error count: %d\n", i); 1295 dprintf("error count: %d\n", i);
1285 return -1; 1296 return -1;
1286 } 1297 }
1287 j = s->scantable.permutated[i]; 1298 j = s->scantable.permutated[i];
1289 i++; 1300 i++;
1290 if (i >= 64) 1301 if (i >= 64)
1291 break; 1302 break;
1292 } 1303 }
1293 } 1304 }
1305 CLOSE_READER(re, &s->gb)
1306
1294 return 0; 1307 return 0;
1295 } 1308 }
1296 1309
1297 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){ 1310 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1298 int i, mb_x, mb_y; 1311 int i, mb_x, mb_y;
1465 y = 0; 1478 y = 0;
1466 for(j=0;j<n;j++) { 1479 for(j=0;j<n;j++) {
1467 memset(s->block, 0, sizeof(s->block)); 1480 memset(s->block, 0, sizeof(s->block));
1468 if (decode_block(s, s->block, i, 1481 if (decode_block(s, s->block, i,
1469 s->dc_index[i], s->ac_index[i], 1482 s->dc_index[i], s->ac_index[i],
1470 s->quant_index[c]) < 0) { 1483 s->quant_matrixes[ s->quant_index[c] ]) < 0) {
1471 dprintf("error y=%d x=%d\n", mb_y, mb_x); 1484 dprintf("error y=%d x=%d\n", mb_y, mb_x);
1472 return -1; 1485 return -1;
1473 } 1486 }
1474 // dprintf("mb: %d %d processed\n", mb_y, mb_x); 1487 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
1475 ptr = s->picture.data[c] + 1488 ptr = s->picture.data[c] +