bool pdqDihedralHash256esFromFloatLuma()

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;
}