Mercurial > libavcodec.hg
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] + |