/* * Compression: void *ptr is a struct of AvgDCT to be filled with the * calculations preformed on the AvgDCTScalled array in the closure. */ void applyCompToAvgDCTScaled(int col, int row, A2 toBeFilled, void* ptr, void* cl) { (void) toBeFilled; struct Closure* mycl = cl; struct AvgDCTScaled* toBeSet = ptr; struct AvgDCT* original = mycl->methods->at(mycl->array, col, row); toBeSet->pb = Arith40_index_of_chroma(original->pb); toBeSet->pr = Arith40_index_of_chroma(original->pr); toBeSet->a = (unsigned)(original->a * 511); toBeSet->b = convertToScaledInt(original->b); toBeSet->c = convertToScaledInt(original->c); toBeSet->d = convertToScaledInt(original->d); }
*/ static bitWord initialize_bitWord(UArray_T block) { bitWord word = malloc(sizeof(*word)); word = set_chroma_index(block, word); word = cosine_transform(block, word); return word; } static bitWord set_chroma_index(UArray_T block, bitWord word) { Average average = {.Pba = 0.0, .Pra = 0.0}; average = find_average(block, average); unsigned Pba_chroma = Arith40_index_of_chroma(average.Pba); unsigned Pra_chroma = Arith40_index_of_chroma(average.Pra); word->Pba = Pba_chroma; word->Pra = Pra_chroma; return word; } static Average find_average(UArray_T block, Average average) { for (int i = 0; i < UArray_length(block); i++) { CV temp = (CV)UArray_at(block, i); (average.Pba) += temp->Pb; (average.Pra) += temp->Pr; }
/* Takes the average chroma value (Pb or Pr) and returns the quantized * representation of the given value */ unsigned getIndex(float x) { return Arith40_index_of_chroma(x); }