void code_patch_group_header(LLBitPack &bitpack, LLGroupHeader *gopp) { #ifdef LL_BIG_ENDIAN U8 *stride = (U8 *)&gopp->stride; bitpack.bitPack(&(stride[1]), 8); bitpack.bitPack(&(stride[0]), 8); #else bitpack.bitPack((U8 *)&gopp->stride, 16); #endif bitpack.bitPack((U8 *)&gopp->patch_size, 8); bitpack.bitPack((U8 *)&gopp->layer_type, 8); gPatchSize = gopp->patch_size; }
void code_patch_header(LLBitPack &bitpack, LLPatchHeader *ph, S32 *patch) { S32 i, j, temp, patch_size = gPatchSize, wbits = (ph->quant_wbits & 0xf) + 2; U32 max_wbits = wbits + 5, min_wbits = wbits>>1; wbits = min_wbits; for (i = 0; i < (int) patch_size*patch_size; i++) { temp = patch[i]; if (temp) { if (temp < 0) temp *= -1; for (j = max_wbits; j > (int) min_wbits; j--) { if (temp & (1<<j)) { if (j > wbits) wbits = j; break; } } } } wbits += 1; ph->quant_wbits &= 0xf0; if ( (wbits > 17) ||(wbits < 2)) { llerrs << "Bits needed per word in code_patch_header out of legal range. Adjust compression quatization." << llendl; } ph->quant_wbits |= (wbits - 2); bitpack.bitPack((U8 *)&ph->quant_wbits, 8); #ifdef LL_BIG_ENDIAN U8 *offset = (U8 *)&ph->dc_offset; bitpack.bitPack(&(offset[3]), 8); bitpack.bitPack(&(offset[2]), 8); bitpack.bitPack(&(offset[1]), 8); bitpack.bitPack(&(offset[0]), 8); #else bitpack.bitPack((U8 *)&ph->dc_offset, 32); #endif #ifdef LL_BIG_ENDIAN U8 *range = (U8 *)&ph->range; bitpack.bitPack(&(range[1]), 8); bitpack.bitPack(&(range[0]), 8); #else bitpack.bitPack((U8 *)&ph->range, 16); #endif #ifdef LL_BIG_ENDIAN U8 *ids = (U8 *)&ph->patchids; bitpack.bitPack(&(ids[1]), 8); bitpack.bitPack(&(ids[0]), 2); #else bitpack.bitPack((U8 *)&ph->patchids, 10); #endif gWordBits = wbits; }
void code_patch(LLBitPack &bitpack, S32 *patch, S32 postquant) { S32 i, j, patch_size = gPatchSize, wbits = gWordBits; S32 temp; BOOL b_eob; if ( (postquant > patch_size*patch_size) ||(postquant < 0)) { llerrs << "Bad postquant in code_patch!" << llendl; } if (postquant) patch[patch_size*patch_size - postquant] = 0; for (i = 0; i < patch_size*patch_size; i++) { b_eob = FALSE; temp = patch[i]; if (!temp) { b_eob = TRUE; for (j = i; j < patch_size*patch_size - postquant; j++) { if (patch[j]) { b_eob = FALSE; break; } } if (b_eob) { bitpack.bitPack((U8 *)&ZERO_EOB, 2); return; } else { bitpack.bitPack((U8 *)&ZERO_CODE, 1); } } else { if (temp < 0) { temp *= -1; if (temp > (1<<wbits)) { temp = (1<<wbits); // printf("patch quatization exceeding allowable bits!"); } bitpack.bitPack((U8 *)&NEGATIVE_VALUE, 3); bitpack.bitPack((U8 *)&temp, wbits); } else { if (temp > (1<<wbits)) { temp = (1<<wbits); // printf("patch quatization exceeding allowable bits!"); } bitpack.bitPack((U8 *)&POSITIVE_VALUE, 3); bitpack.bitPack((U8 *)&temp, wbits); } } } }
void code_end_of_data(LLBitPack &bitpack) { bitpack.bitPack((U8 *)&END_OF_PATCHES, 8); }