// Interpolate and convert sRaw data. void Cr2Decoder::sRawInterpolate() { vector<TiffIFD*> data = mRootIFD->getIFDsWithTag((TiffTag)0x4001); if (data.empty()) ThrowRDE("CR2 sRaw: Unable to locate WB info."); const ushort16 *wb_data = data[0]->getEntry((TiffTag)0x4001)->getShortArray(); // Offset to sRaw coefficients used to reconstruct uncorrected RGB data. wb_data = &wb_data[4+(126+22)/2]; sraw_coeffs[0] = wb_data[0]; sraw_coeffs[1] = (wb_data[1] + wb_data[2] + 1) >> 1; sraw_coeffs[2] = wb_data[3]; /* Determine sRaw coefficients */ bool isOldSraw = hints.find("sraw_40d") != hints.end(); bool isNewSraw = hints.find("sraw_new") != hints.end(); if (mRaw->subsampling.y == 1 && mRaw->subsampling.x == 2) { if (isOldSraw) interpolate_422_old(mRaw->dim.x / 2, mRaw->dim.y , 0, mRaw->dim.y); else if (isNewSraw) interpolate_422_new(mRaw->dim.x / 2, mRaw->dim.y , 0, mRaw->dim.y); else interpolate_422(mRaw->dim.x / 2, mRaw->dim.y , 0, mRaw->dim.y); } else { if (isNewSraw) interpolate_420_new(mRaw->dim.x / 2, mRaw->dim.y / 2 , 0 , mRaw->dim.y / 2); else interpolate_420(mRaw->dim.x / 2, mRaw->dim.y / 2 , 0 , mRaw->dim.y / 2); } }
// Interpolate and convert sRaw data. void Cr2Decoder::sRawInterpolate() { vector<TiffIFD*> data = mRootIFD->getIFDsWithTag((TiffTag)0x4001); if (data.empty()) ThrowRDE("CR2 sRaw: Unable to locate WB info."); const ushort16 *wb_data = data[0]->getEntry((TiffTag)0x4001)->getShortArray(); // Offset to sRaw coefficients used to reconstruct uncorrected RGB data. wb_data = &wb_data[4+(126+22)/2]; sraw_coeffs[0] = wb_data[0]; sraw_coeffs[1] = (wb_data[1] + wb_data[2] + 1) >> 1; sraw_coeffs[2] = wb_data[3]; // Check if sRaw2 is using old coefficients data = mRootIFD->getIFDsWithTag(MODEL); if (data.empty()) ThrowRDE("CR2 sRaw Decoder: Model name not found"); string model = data[0]->getEntry(MODEL)->getString(); bool isOldSraw = (model.compare("Canon EOS 40D") == 0); if (mRaw->subsampling.y == 1 && mRaw->subsampling.x == 2) { if (isOldSraw) interpolate_422_old(mRaw->dim.x / 2, mRaw->dim.y , 0, mRaw->dim.y); else interpolate_422(mRaw->dim.x / 2, mRaw->dim.y , 0, mRaw->dim.y); } else { interpolate_420(mRaw->dim.x / 2, mRaw->dim.y / 2 , 0 , mRaw->dim.y / 2); } }