in pdq/cpp/hashing/pdqhashing.cpp [178:284]
bool pdqDihedralHash256esFromFloatLuma(
float* fullBuffer1, // numRows x numCols, row-major
float* fullBuffer2, // numRows x numCols, row-major
int numRows,
int numCols,
float buffer64x64[64][64],
float buffer16x64[16][64],
float buffer16x16[16][16],
float buffer16x16Aux[16][16],
Hash256* hashptrOriginal,
Hash256* hashptrRotate90,
Hash256* hashptrRotate180,
Hash256* hashptrRotate270,
Hash256* hashptrFlipX,
Hash256* hashptrFlipY,
Hash256* hashptrFlipPlus1,
Hash256* hashptrFlipMinus1,
int& quality) {
if (numRows < MIN_HASHABLE_DIM || numCols < MIN_HASHABLE_DIM) {
if (hashptrOriginal != nullptr) {
hashptrOriginal->clear();
}
if (hashptrRotate90 != nullptr) {
hashptrRotate90->clear();
}
if (hashptrRotate180 != nullptr) {
hashptrRotate180->clear();
}
if (hashptrRotate270 != nullptr) {
hashptrRotate270->clear();
}
if (hashptrFlipX != nullptr) {
hashptrFlipX->clear();
}
if (hashptrFlipY != nullptr) {
hashptrFlipY->clear();
}
if (hashptrFlipPlus1 != nullptr) {
hashptrFlipPlus1->clear();
}
if (hashptrFlipMinus1 != nullptr) {
hashptrFlipMinus1->clear();
}
quality = 0;
return true;
}
// Downsample (blur and decimate)
int windowSizeAlongRows =
facebook::pdq::downscaling::computeJaroszFilterWindowSize(numCols, 64);
int windowSizeAlongCols =
facebook::pdq::downscaling::computeJaroszFilterWindowSize(numRows, 64);
facebook::pdq::downscaling::jaroszFilterFloat(
fullBuffer1,
fullBuffer2,
numRows,
numCols,
windowSizeAlongRows,
windowSizeAlongCols,
PDQ_NUM_JAROSZ_XY_PASSES);
facebook::pdq::downscaling::decimateFloat(
fullBuffer1, numRows, numCols, &buffer64x64[0][0], 64, 64);
// Quality metric. Reuse the 64x64 image-domain downsample
// since we already have it.
quality = pdqImageDomainQualityMetric(buffer64x64);
// 2D DCT
dct64To16(buffer64x64, buffer16x64, buffer16x16);
// Output bits
if (hashptrOriginal != nullptr) {
pdqBuffer16x16ToBits(buffer16x16, hashptrOriginal);
}
if (hashptrRotate90 != nullptr) {
dct16OriginalToRotate90(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrRotate90);
}
if (hashptrRotate180 != nullptr) {
dct16OriginalToRotate180(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrRotate180);
}
if (hashptrRotate270 != nullptr) {
dct16OriginalToRotate270(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrRotate270);
}
if (hashptrFlipX != nullptr) {
dct16OriginalToFlipX(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrFlipX);
}
if (hashptrFlipY != nullptr) {
dct16OriginalToFlipY(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrFlipY);
}
if (hashptrFlipPlus1 != nullptr) {
dct16OriginalToFlipPlus1(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrFlipPlus1);
}
if (hashptrFlipMinus1 != nullptr) {
dct16OriginalToFlipMinus1(buffer16x16, buffer16x16Aux);
pdqBuffer16x16ToBits(buffer16x16Aux, hashptrFlipMinus1);
}
return true;
}