# HG changeset patch # User tmmm # Date 1050759009 0 # Node ID cae31b22b14e7c953078d4d9581231b7f948c6f9 # Parent d9cbc8ef5a338dac775e3cfdf4d912b2d1b30bdc code redundancy reduction, courtesy of suxen_drol -at- hotmail.com diff -r d9cbc8ef5a33 -r cae31b22b14e indeo3.c --- a/indeo3.c Fri Apr 18 12:50:00 2003 +0000 +++ b/indeo3.c Sat Apr 19 13:30:09 2003 +0000 @@ -255,6 +255,48 @@ /* ---------------------------------------------------------------------- */ +#define LV1_CHECK(buf1,rle_v3,lv1,lp2) \ + if((lv1 & 0x80) != 0) { \ + if(rle_v3 != 0) \ + rle_v3 = 0; \ + else { \ + rle_v3 = 1; \ + buf1 -= 2; \ + } \ + } \ + lp2 = 4; + + +#define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) \ + if(rle_v3 == 0) { \ + rle_v2 = *buf1; \ + rle_v1 = 1; \ + if(rle_v2 > 32) { \ + rle_v2 -= 32; \ + rle_v1 = 0; \ + } \ + rle_v3 = 1; \ + } \ + buf1--; + + +#define LP2_CHECK(buf1,rle_v3,lp2) \ + if(lp2 == 0 && rle_v3 != 0) \ + rle_v3 = 0; \ + else { \ + buf1--; \ + rle_v3 = 1; \ + } + + +#define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) \ + rle_v2--; \ + if(rle_v2 == 0) { \ + rle_v3 = 0; \ + buf1 += 2; \ + } \ + lp2 = 4; + static void iv_Decode_Chunk(Indeo3DecodeContext *s, unsigned char *cur, unsigned char *ref, int width, int height, unsigned char *buf1, long fflags2, unsigned char *hdr, @@ -268,7 +310,7 @@ unsigned long *cur_lp, *ref_lp, *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2]; unsigned short *correction_type_sp[2]; - ustr_t xustr[20], *ptr_ustr; + ustr_t strip_tbl[20], *strip; int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width, rle_v1, rle_v2, rle_v3; @@ -280,22 +322,22 @@ for(j = -1; j < 8; j++) width_tbl[j] = i * j; - ptr_ustr = xustr; + strip = strip_tbl; for(region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160); - ptr_ustr->ypos = ptr_ustr->xpos = 0; - for(ptr_ustr->width = min_width_160; width > ptr_ustr->width; ptr_ustr->width *= 2); - ptr_ustr->height = height; - ptr_ustr->split_direction = 0; - ptr_ustr->split_flag = 0; - ptr_ustr->usl7 = 0; + strip->ypos = strip->xpos = 0; + for(strip->width = min_width_160; width > strip->width; strip->width *= 2); + strip->height = height; + strip->split_direction = 0; + strip->split_flag = 0; + strip->usl7 = 0; bit_pos = 0; rle_v1 = rle_v2 = rle_v3 = 0; - while(ptr_ustr >= xustr) { + while(strip >= strip_tbl) { if(bit_pos <= 0) { bit_pos = 8; bit_buf = *buf1++; @@ -305,44 +347,44 @@ cmd = (bit_buf >> bit_pos) & 0x03; if(cmd == 0) { - ptr_ustr++; - memcpy(ptr_ustr, ptr_ustr-1, sizeof(ustr_t)); - ptr_ustr->split_flag = 1; - ptr_ustr->split_direction = 0; - ptr_ustr->height = (ptr_ustr->height > 8 ? ((ptr_ustr->height+8)>>4)<<3 : 4); + strip++; + memcpy(strip, strip-1, sizeof(ustr_t)); + strip->split_flag = 1; + strip->split_direction = 0; + strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4); continue; } else if(cmd == 1) { - ptr_ustr++; - memcpy(ptr_ustr, ptr_ustr-1, sizeof(ustr_t)); - ptr_ustr->split_flag = 1; - ptr_ustr->split_direction = 1; - ptr_ustr->width = (ptr_ustr->width > 8 ? ((ptr_ustr->width+8)>>4)<<3 : 4); + strip++; + memcpy(strip, strip-1, sizeof(ustr_t)); + strip->split_flag = 1; + strip->split_direction = 1; + strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4); continue; } else if(cmd == 2) { - if(ptr_ustr->usl7 == 0) { - ptr_ustr->usl7 = 1; + if(strip->usl7 == 0) { + strip->usl7 = 1; ref_vectors = NULL; continue; } } else if(cmd == 3) { - if(ptr_ustr->usl7 == 0) { - ptr_ustr->usl7 = 1; + if(strip->usl7 == 0) { + strip->usl7 = 1; ref_vectors = buf2 + (*buf1 * 2); buf1++; continue; } } - cur_frm_pos = cur + width * ptr_ustr->ypos + ptr_ustr->xpos; + cur_frm_pos = cur + width * strip->ypos + strip->xpos; - if((blks_width = ptr_ustr->width) < 0) + if((blks_width = strip->width) < 0) blks_width += 3; blks_width >>= 2; - blks_height = ptr_ustr->height; + blks_height = strip->height; if(ref_vectors != NULL) { - ref_frm_pos = ref + (ref_vectors[0] + ptr_ustr->ypos) * width + - ref_vectors[1] + ptr_ustr->xpos; + ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width + + ref_vectors[1] + strip->xpos; } else ref_frm_pos = cur_frm_pos - width_tbl[4]; @@ -428,40 +470,21 @@ break; case 8: if(lp2 == 0) { - if(rle_v3 == 0) { - rle_v2 = *buf1; - rle_v1 = 1; - if(rle_v2 > 32) { - rle_v2 -= 32; - rle_v1 = 0; - } - rle_v3 = 1; - } - buf1--; + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) if(rle_v1 == 1 || ref_vectors != NULL) { for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) cur_lp[j] = ref_lp[j]; } - rle_v2--; - if(rle_v2 == 0) { - rle_v3 = 0; - buf1 += 2; - } - lp2 = 4; + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) break; } else { rle_v1 = 1; rle_v2 = *buf1 - 1; } case 5: - if(lp2 == 0 && rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } + LP2_CHECK(buf1,rle_v3,lp2) case 4: for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1]) cur_lp[j] = ref_lp[j]; @@ -491,15 +514,7 @@ for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) cur_lp[j] = lv; - if((lv1 & 0x80) != 0) { - if(rle_v3 != 0) - rle_v3 = 0; - else { - rle_v3 = 1; - buf1 -= 2; - } - } - lp2 = 4; + LV1_CHECK(buf1,rle_v3,lv1,lp2) break; default: return; @@ -532,7 +547,7 @@ switch(correction_type_sp[lp2 & 0x01][k]) { case 0: cur_lp[width_tbl[1]] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; - if(lp2 > 0 || flag1 == 0 || ptr_ustr->ypos != 0) + if(lp2 > 0 || flag1 == 0 || strip->ypos != 0) cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; else cur_lp[0] = ((*ref_lp >> 1) + correction_lp[lp2 & 0x01][k]) << 1; @@ -544,7 +559,7 @@ ((((unsigned short *)ref_lp)[0] >> 1) + correction_lp[lp2 & 0x01][*buf1++]) << 1; ((unsigned short *)cur_lp)[width_tbl[2]+1] = ((((unsigned short *)ref_lp)[1] >> 1) + correction_lp[lp2 & 0x01][k]) << 1; - if(lp2 > 0 || flag1 == 0 || ptr_ustr->ypos != 0) + if(lp2 > 0 || flag1 == 0 || strip->ypos != 0) cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; else cur_lp[0] = cur_lp[width_tbl[1]]; @@ -583,40 +598,21 @@ case 8: if(lp2 == 0) { - if(rle_v3 == 0) { - rle_v2 = *buf1; - rle_v1 = 1; - if(rle_v2 > 32) { - rle_v2 -= 32; - rle_v1 = 0; - } - rle_v3 = 1; - } - buf1--; + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) if(rle_v1 == 1) { for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) cur_lp[j] = ref_lp[j]; } - rle_v2--; - if(rle_v2 == 0) { - rle_v3 = 0; - buf1 += 2; - } - lp2 = 4; + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) break; } else { rle_v2 = (*buf1) - 1; rle_v1 = 1; } case 5: - if(lp2 == 0 && rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } + LP2_CHECK(buf1,rle_v3,lp2) case 4: for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) cur_lp[j] = *ref_lp; @@ -633,15 +629,7 @@ for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) cur_lp[j] = lv; - if((lv1 & 0x80) != 0) { - if(rle_v3 != 0) - rle_v3 = 0; - else { - rle_v3 = 1; - buf1 -= 2; - } - } - lp2 = 4; + LV1_CHECK(buf1,rle_v3,lv1,lp2) break; default: @@ -680,7 +668,7 @@ case 0: cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1; - if(lp2 > 0 || ptr_ustr->ypos != 0 || flag1 == 0) { + if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) { cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; } else { @@ -693,7 +681,7 @@ case 1: cur_lp[width_tbl[1]] = ((lv1 >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1++]) << 1; cur_lp[width_tbl[1]+1] = ((lv2 >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1; - if(lp2 > 0 || ptr_ustr->ypos != 0 || flag1 == 0) { + if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) { cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; } else { @@ -743,16 +731,7 @@ case 8: if(lp2 == 0) { - if(rle_v3 == 0) { - rle_v2 = *buf1; - rle_v1 = 1; - if(rle_v2 > 32) { - rle_v2 -= 32; - rle_v1 = 0; - } - rle_v3 = 1; - } - buf1--; + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) if(rle_v1 == 1) { if(flag1 != 0) { for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { @@ -768,24 +747,14 @@ } } } - rle_v2--; - if(rle_v2 == 0) { - rle_v3 = 0; - buf1 += 2; - } - lp2 = 4; + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) break; } else { rle_v1 = 1; rle_v2 = (*buf1) - 1; } case 5: - if(lp2 == 0 && rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } + LP2_CHECK(buf1,rle_v3,lp2) case 4: if(lp2 == 0 && flag1 != 0) { for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { @@ -827,15 +796,7 @@ lv += (lv << 16); for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) cur_lp[j] = lv; - if((lv1 & 0x80) != 0) { - if(rle_v3 != 0) - rle_v3 = 0; - else { - rle_v3 = 1; - buf1 -= 2; - } - } - lp2 = 4; + LV1_CHECK(buf1,rle_v3,lv1,lp2) break; default: @@ -900,26 +861,12 @@ case 8: if(lp2 == 0) { - if(rle_v3 == 0) { - rle_v2 = *buf1; - rle_v1 = 1; - if(rle_v2 > 32) { - rle_v2 -= 32; - rle_v1 = 0; - } - rle_v3 = 1; - } - buf1--; + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { ((unsigned long *)cur_frm_pos)[j] = ((unsigned long *)ref_frm_pos)[j]; ((unsigned long *)cur_frm_pos)[j+1] = ((unsigned long *)ref_frm_pos)[j+1]; } - rle_v2--; - if(rle_v2 == 0) { - rle_v3 = 0; - buf1 += 2; - } - lp2 = 4; + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) break; } else { rle_v1 = 1; @@ -927,12 +874,7 @@ } case 5: case 7: - if(lp2 == 0 && rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } + LP2_CHECK(buf1,rle_v3,lp2) case 6: case 4: for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { @@ -950,15 +892,7 @@ lv += (lv << 16); for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) ((unsigned long *)cur_frm_pos)[j] = ((unsigned long *)cur_frm_pos)[j+1] = lv; - if((lv1 & 0x80) != 0) { - if(rle_v3 != 0) - rle_v3 = 0; - else { - rle_v3 = 1; - buf1 -= 2; - } - } - lp2 = 4; + LV1_CHECK(buf1,rle_v3,lv1,lp2) break; default: @@ -1022,26 +956,12 @@ case 8: if(lp2 == 0) { - if(rle_v3 == 0) { - rle_v2 = *buf1; - rle_v1 = 1; - if(rle_v2 > 32) { - rle_v2 -= 32; - rle_v1 = 0; - } - rle_v3 = 1; - } - buf1--; + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) cur_lp[j] = ref_lp[j]; - rle_v2--; - if(rle_v2 == 0) { - rle_v3 = 0; - buf1 += 2; - } - lp2 = 4; + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) break; } else { rle_v1 = 1; @@ -1049,12 +969,7 @@ } case 5: case 7: - if(lp2 == 0 && rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } + LP2_CHECK(buf1,rle_v3,lp2) case 4: case 6: for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) @@ -1070,15 +985,7 @@ lv += (lv << 16); for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) cur_lp[j] = lv; - if((lv1 & 0x80) != 0) { - if(rle_v3 != 0) - rle_v3 = 0; - else { - rle_v3 = 1; - buf1 -= 2; - } - } - lp2 = 4; + LV1_CHECK(buf1,rle_v3,lv1,lp2) break; default: @@ -1100,22 +1007,22 @@ } } - if(ptr_ustr < xustr) + if(strip < strip_tbl) return; - for( ; ptr_ustr >= xustr; ptr_ustr--) { - if(ptr_ustr->split_flag != 0) { - ptr_ustr->split_flag = 0; - ptr_ustr->usl7 = (ptr_ustr-1)->usl7; + for( ; strip >= strip_tbl; strip--) { + if(strip->split_flag != 0) { + strip->split_flag = 0; + strip->usl7 = (strip-1)->usl7; - if(ptr_ustr->split_direction) { - ptr_ustr->xpos += ptr_ustr->width; - ptr_ustr->width = (ptr_ustr-1)->width - ptr_ustr->width; - if(region_160_width <= ptr_ustr->xpos && width < ptr_ustr->width + ptr_ustr->xpos) - ptr_ustr->width = width - ptr_ustr->xpos; + if(strip->split_direction) { + strip->xpos += strip->width; + strip->width = (strip-1)->width - strip->width; + if(region_160_width <= strip->xpos && width < strip->width + strip->xpos) + strip->width = width - strip->xpos; } else { - ptr_ustr->ypos += ptr_ustr->height; - ptr_ustr->height = (ptr_ustr-1)->height - ptr_ustr->height; + strip->ypos += strip->height; + strip->height = (strip-1)->height - strip->height; } break; }