|
#include "stdafx.h"
|
|
#include "BlobStorage.h"
|
#include <wmmintrin.h>
|
|
#ifdef _DEBUG
|
#define new DEBUG_NEW
|
#endif
|
|
#include "SISAssem.h"
|
#include "AssemParam.h"
|
|
//Assem->Intrinsic Convert(2by2 Vertical DTh)
|
int CSISAssem::ConvFloatVert_BOE_Intrin(BYTE* pImgBuff, short* pConBuff, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, CDefectPair *pDefectdPair, __int64 nPair, __int64 MaxPair, __int64 PairSize
|
, __int64 frameWidth, __int64 iPitch16, __int64 Threshold, __int64 Suppress
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, __int64 i2Pitch16, __int64 bReverseFilter, __int64 ThresholdSlide, int* endLine
|
)
|
{
|
const __int64 ConvNSprShift = 6;
|
const __int64 SprShift = 4;
|
const __int64 ConvShift = 2;
|
const __int64 SprMulti = 16;
|
const __int64 ConvMulti = 4;
|
|
__int64 ix = left;
|
__int64 iy = top;
|
|
__int64 rrBW = frameWidth;
|
__int64 rrNoD = nDefect;
|
CDefectPair* PairAddr = pDefectdPair + nPair;
|
|
__int64 F_Y2Insp;
|
|
__int64 ImgAddr = (__int64)pImgBuff;
|
__int64 ConAddr = __int64(pConBuff + 0x10);
|
__int64 maxPixelD = maxDefect;
|
|
__m128i xxSrc;
|
__m128i xxCmp;
|
|
__m128i xxPeak;
|
__m128i xxPeakEx;
|
__m128i xxSrc1;
|
__m128i xxSrc2;
|
|
__m128i xxCmp1;
|
__int64 rax, rbx, rcx, rdx;
|
|
__m128i xxZero = _mm_setzero_si128();
|
__m128i xxThres = _mm_set1_epi16((short)Threshold * SprMulti);
|
__m128i xxDStart = _mm_set1_epi16((short)Threshold / ConvMulti);
|
__m128i xxDSlide = _mm_set1_epi16((short)ThresholdSlide);
|
__m128i xxSupp = _mm_set1_epi16((short)Suppress * SprMulti * ConvMulti);
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
short sSrc, sRef, sThres, sDiff;
|
__m128i xxZThB, xxZThW, xx0xff = _mm_set1_epi16(-1);
|
__m128i xxDStartB(xxDStart);
|
__m128i xxDSlideB(xxDSlide);
|
|
if(m_Param.s_nBWB_Main > 0)
|
{
|
xxDStartB = _mm_set1_epi16((short)m_Param.s_nBWB_Main);
|
xxDSlideB = _mm_set1_epi16((short)m_Param.s_nBWB_Slide);
|
}
|
else
|
{
|
m_Param.s_nBWB_Main = (int)Threshold;
|
m_Param.s_nBWB_Slide = (int)ThresholdSlide;
|
}
|
// ----------------------------------- //
|
|
__int64 iPitch = iPitch16 / SprMulti;
|
__int64 iPitchHUp = iPitch;
|
__int64 iSpr = iPitch16 & 0xF;
|
if(iSpr >= SprMulti / 2)
|
iPitchHUp++;
|
|
__m128i xxsSPR = _mm_set1_epi16((short)iSpr);
|
__m128i xxfSPR = _mm_set1_epi16((short)SprMulti - (short)iSpr);
|
|
__int64 i2Pitch = i2Pitch16 / SprMulti;
|
__int64 i2Spr = i2Pitch16 & 0xF;
|
|
bottom--;
|
__int64 ConBottom = bottom;
|
|
right = (right - left) / 16 * 16 + left;
|
|
__int64 ImgAddrLeft = ImgAddr + top * rrBW + left;
|
__int64 ConPitch = iPitch * 0x20;
|
__int64 ConPitch2 = i2Pitch * 0x20;
|
__int64 pairTop = top + iPitch;
|
bottom = bottom - iPitch - 1;
|
__int64 pairBottom = bottom - iPitch;
|
|
// -------------- à» Filtering -------------- //
|
CRect rtDeadZone[MAX_DEAD_ZONE_COUNT];
|
CPoint ptDefect;
|
memcpy(rtDeadZone, m_Param.s_RectDeadZone, sizeof(CRect) * MAX_DEAD_ZONE_COUNT);
|
int nDeadZoneCount = 0;
|
for(int i = 0; i < MAX_DEAD_ZONE_COUNT; i++)
|
{
|
if(rtDeadZone[i].IsRectEmpty() == TRUE)
|
{
|
nDeadZoneCount = i;
|
break;
|
}
|
}
|
// ------------------------------------------ //
|
|
__int64 rrImgAddr = ImgAddrLeft;
|
__int64 rrConAddr = ConAddr;
|
|
goto LOOP_X_CHECK;
|
|
LOOP_X_TAIL:
|
goto PAIRING_VERT;
|
|
PAIRING_VERT_RETURN:
|
ImgAddrLeft += 0x10;
|
rrImgAddr = ImgAddrLeft;
|
rrConAddr = ConAddr;
|
iy = top;
|
|
LOOP_X_CHECK:
|
if(ix >= right)
|
goto END_FUNC;
|
|
//LOOP_X_BODY:
|
goto MAKE_CONBUFF_BODY_TAIL_CHECK;
|
|
MAKE_CONBUFF_RETURN:
|
iy = top;
|
rrConAddr = ConAddr;
|
F_Y2Insp = 0;
|
goto LOOP_Y_CHECK;
|
|
LOOP_Y_TAIL:
|
iy++;
|
rrImgAddr += rrBW;
|
rrConAddr += 0x20;
|
|
LOOP_Y_CHECK:
|
if(rrNoD >= maxPixelD)
|
goto PAIRING_VERT;
|
if(iy < bottom)
|
goto LOOP_Y_BODY;
|
ix += 8;
|
if(F_Y2Insp >= 1)
|
goto LOOP_X_TAIL;
|
|
F_Y2Insp = 1;
|
iy = top;
|
rrConAddr = ConAddr + 0x10;
|
goto LOOP_Y_BODY;
|
|
MAKE_CONBUFF_BODY_TAIL_CHECK:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr);
|
xxCmp1 = _mm_loadu_si128((__m128i*)(rrImgAddr + 1));
|
|
_mm_storeu_si128((__m128i*)(rrConAddr), _mm_add_epi16(_mm_unpacklo_epi8(xxSrc1, xxZero), _mm_unpacklo_epi8(xxCmp1, xxZero)));
|
_mm_storeu_si128((__m128i*)(rrConAddr + 0x10), _mm_add_epi16(_mm_unpackhi_epi8(xxSrc1, xxZero), _mm_unpackhi_epi8(xxCmp1, xxZero)));
|
|
rrImgAddr += rrBW;
|
rrConAddr += 0x20;
|
iy++;
|
if(iy <= ConBottom)
|
goto MAKE_CONBUFF_BODY_TAIL_CHECK;
|
goto MAKE_CONBUFF_RETURN;
|
|
LOOP_Y_BODY:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrConAddr);
|
xxSrc2 = _mm_loadu_si128((__m128i*) (rrConAddr + 0x20));
|
xxSrc = _mm_slli_epi16(_mm_add_epi16(xxSrc1, xxSrc2), SprShift);
|
xxSrc = _mm_subs_epu16(xxSrc, _mm_subs_epu16(xxSrc, xxSupp));
|
|
rax = rrConAddr + ConPitch;
|
xxCmp = _mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i*)(rax)), xxfSPR), _mm_slli_epi16(_mm_loadu_si128((__m128i*)(rax + 0x20)), SprShift))
|
, _mm_mullo_epi16(_mm_loadu_si128((__m128i*)(rax + 0x40)), xxsSPR));
|
|
xxCmp = _mm_subs_epu16(xxCmp, _mm_subs_epu16(xxCmp, xxSupp));
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
//¿ø·¡ÄÚµå: xxThres = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16(
|
// _mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlide), 8), xxDStart), ConvNSprShift);
|
xxZThW = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16(
|
_mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlide), 8), xxDStart), ConvNSprShift);
|
xxZThB = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16(
|
_mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlideB), 8), xxDStartB), ConvNSprShift);
|
|
xxThres = _mm_min_epu16(xxZThW, xxZThB);
|
// ----------------------------------- //
|
|
//INSPECT_BLACK:
|
xxPeakEx = _mm_subs_epu16(xxCmp, xxSrc);
|
xxPeak = _mm_cmpgt_epi16(xxPeakEx, xxThres);
|
if(_mm_movemask_epi8(xxPeak) == 0)
|
goto INSPECT_WHITE;
|
rbx = 0;
|
goto DEFECT_00;
|
|
INSPECT_WHITE:
|
xxPeakEx = _mm_subs_epu16(xxSrc, xxCmp);
|
xxPeak = xxPeakEx;
|
xxPeak = _mm_cmpgt_epi16(xxPeak, xxThres);
|
if(_mm_movemask_epi8(xxPeak) == 0)
|
goto LOOP_Y_TAIL;
|
rbx = 1;
|
goto DEFECT_00;
|
|
DEFECT_00:
|
if(_mm_extract_epi16(xxPeak, 0x00) == 0)
|
goto DEFECT_01;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x00);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x00);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x00);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x00);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_01:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x01) == 0)
|
goto DEFECT_02;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x01);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x01);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x01);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x01);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_02:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x02) == 0)
|
goto DEFECT_03;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x02);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x02);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x02);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x02);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_03:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x03) == 0)
|
goto DEFECT_04;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x03);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x03);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x03);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x03);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_04:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x04) == 0)
|
goto DEFECT_05;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x04);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x04);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x04);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x04);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_05:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x05) == 0)
|
goto DEFECT_06;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x05);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x05);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x05);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x05);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_06:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x06) == 0)
|
goto DEFECT_07;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x06);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x06);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x06);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x06);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_07:
|
ix++;
|
if(_mm_extract_epi16(xxPeak, 0x07) == 0)
|
goto DEFECT_END;
|
|
rax = _mm_extract_epi16(xxPeakEx, 0x07);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x07);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x07);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x07);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_END:
|
ix -= 7;
|
if(rbx == 0)
|
goto INSPECT_WHITE;
|
goto LOOP_Y_TAIL;
|
|
PAIRING_VERT:
|
iy = -1;
|
|
LOOP_PAIR_NUM:
|
iy++;
|
if(iy >= rrNoD)
|
goto LOOP_PAIR_NUM_END;
|
|
rax = nPair;
|
if(nPair >= MaxPair)
|
goto END_FUNC;
|
|
if(*(DefectT + iy) >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rbx = iy;
|
rcx = *(DefectY + iy);
|
rax = rcx + iPitchHUp;
|
rrBW = *(DefectX + iy);
|
|
if(rcx > pairBottom)
|
goto PAIR_BOTTOM;
|
|
if(rcx >= pairTop)
|
goto PAIR_CENTER;
|
|
PAIR_TOP:
|
rbx++;
|
if(rbx >= rrNoD)
|
goto PAIR_TOP_UNPAIR;
|
|
rdx = *(DefectY + rbx);
|
if(rdx < rax)
|
goto PAIR_TOP;
|
else if(rdx > rax)
|
goto PAIR_TOP_UNPAIR;
|
|
rcx = *(DefectX + rbx);
|
if(rrBW != rcx)
|
goto PAIR_TOP;
|
|
rrConAddr = *(DefectT + rbx);
|
if(rrConAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrConAddr)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rcx;
|
ptDefect.y = (LONG)rdx;
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGraySrc + rbx));
|
sRef = (int)(*(pGrayCmp + rbx));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + rbx) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
*(DefectT + rbx) = 4;
|
|
PairAddr->s_DefectPos = (DefectPos)1;
|
PairAddr->s_DefectPair = (DefectPair)1;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)rdx;
|
PairAddr->s_DefectType = (DefectType)rrConAddr;
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_TOP_UNPAIR:
|
if(m_Param.m_bUseUnpair == FALSE)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)(rrBW);
|
ptDefect.y = (LONG)(rax - iPitchHUp);
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGraySrc + iy));
|
sRef = (int)(*(pGrayCmp + iy));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + iy) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
PairAddr->s_DefectPos = (DefectPos)1;
|
PairAddr->s_DefectPair = (DefectPair)5;
|
PairAddr->s_nDefectX = (int)ptDefect.x;
|
PairAddr->s_nDefectY = (int)ptDefect.y;
|
PairAddr->s_DefectType = (DefectType)*(DefectT + iy);
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + iy);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_CENTER:
|
rbx++;
|
if(rbx == rrNoD)
|
goto LOOP_PAIR_NUM;
|
|
rdx = *(DefectY + rbx);
|
if(rdx < rax)
|
goto PAIR_CENTER;
|
else if(rdx > rax)
|
goto LOOP_PAIR_NUM;
|
|
rcx = *(DefectX + rbx);
|
if(rrBW != rcx)
|
goto PAIR_CENTER;
|
|
rrConAddr = *(DefectT + rbx);
|
if(rrConAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrConAddr)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rcx;
|
ptDefect.y = (LONG)rdx;
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGraySrc + rbx));
|
sRef = (int)(*(pGrayCmp + rbx));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + rbx) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
*(DefectT + rbx) = 4;
|
|
PairAddr->s_DefectPos = (DefectPos)2;
|
PairAddr->s_DefectPair = (DefectPair)1;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)rdx;
|
PairAddr->s_DefectType = (DefectType)rrConAddr;
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_BOTTOM:
|
if(m_Param.m_bUseUnpair == FALSE)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rrBW;
|
ptDefect.y = (LONG)rax;
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGrayCmp + iy));
|
sRef = (int)(*(pGraySrc + iy));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + iy) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
PairAddr->s_DefectPos = (DefectPos)3;
|
PairAddr->s_DefectPair = (DefectPair)5;
|
PairAddr->s_nDefectX = (int)rrBW;
|
PairAddr->s_nDefectY = (int)rax;
|
rdx = (*(DefectT + iy) + 1) & 1;
|
PairAddr->s_DefectType = (DefectType)rdx;
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + iy);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
LOOP_PAIR_NUM_END:
|
rrNoD = 0;
|
rrBW = frameWidth;
|
goto PAIRING_VERT_RETURN;
|
|
END_FUNC:
|
ix += 0x10;
|
*endLine = (int)ix;
|
|
return (int)nPair;
|
}
|
|
|
//Assem->Intrinsic Convert(2by2 Vertical DTh DPC)
|
int CSISAssem::ConvFloatVTD_BOE_Intrin(BYTE* pImgBuff, short* pConBuff, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, CDefectPair *pDefectdPair, __int64 nPair, __int64 MaxPair, __int64 PairSize
|
, __int64 frameWidth, __int64 iPitch16, __int64 Threshold, __int64 Suppress
|
, short* i2Pitch16, __int64 tilt16, int* PitchBuff, __int64 ThresholdSlide
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, int* endLine
|
)
|
{
|
const __int64 ConvNSprShift = 6;
|
const __int64 SprShift = 4;
|
const __int64 ConvShift = 2;
|
const __int64 SprMulti = 16;
|
const __int64 ConvMulti = 4;
|
|
__int64 ix = left;
|
__int64 iy = top;
|
|
__int64 rrNoD = nDefect;
|
CDefectPair* PairAddr = pDefectdPair + nPair;
|
|
__int64 F_Y2Insp;
|
|
__int64 ImgAddr = (__int64)pImgBuff;
|
__int64 ConAddr = __int64(pConBuff + 0x10);
|
__int64 ConAddr2 = __int64(i2Pitch16 + 0x10);
|
__int64 maxPixelD = maxDefect;
|
__int64 iPitchLast = 0;
|
|
__m128i xxTemp;
|
__m128i xxSrc;
|
__m128i xxCmp;
|
|
__m128i xxPeak;
|
__m128i xxPeakAbs;
|
__m128i xxSrc1;
|
__m128i xxCmp1;
|
|
__m128i xxfSprT;
|
__m128i xxsSprT;
|
|
__int64 rax, rbx, rcx, rdx;
|
|
__m128i xxZero = _mm_setzero_si128();
|
__m128i xxThres = _mm_set1_epi16((short)Threshold * SprMulti);
|
__m128i xxDStart = _mm_set1_epi16((short)Threshold / ConvMulti);
|
__m128i xxDSlide = _mm_set1_epi16((short)ThresholdSlide);
|
__m128i xxSupp = _mm_set1_epi16((short)Suppress * SprMulti * ConvMulti);
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
short sSrc, sRef, sThres, sDiff;
|
__m128i xxZThB, xxZThW, xx0xff = _mm_set1_epi16(-1);
|
__m128i xxDStartB(xxDStart);
|
__m128i xxDSlideB(xxDSlide);
|
|
if(m_Param.s_nBWB_Main > 0)
|
{
|
xxDStartB = _mm_set1_epi16((short)m_Param.s_nBWB_Main);
|
xxDSlideB = _mm_set1_epi16((short)m_Param.s_nBWB_Slide);
|
}
|
else
|
{
|
m_Param.s_nBWB_Main = (int)Threshold;
|
m_Param.s_nBWB_Slide = (int)ThresholdSlide;
|
}
|
// ----------------------------------- //
|
|
rcx = tilt16;
|
rcx &= 0x0f;
|
|
xxsSprT = _mm_set1_epi16((short)rcx);
|
|
rax = SprMulti;
|
rax -= rcx;
|
xxfSprT = _mm_set1_epi16((short)rax);
|
|
tilt16 /= 16;
|
|
__int64 iPitch = iPitch16 / SprMulti;
|
__int64 iPitchHUp = iPitch;
|
__int64 iSpr = iPitch16 & 0xF;
|
if(iSpr >= SprMulti / 2)
|
iPitchHUp++;
|
|
__m128i xxsSPR = _mm_set1_epi16((short)iSpr);
|
__m128i xxfSPR = _mm_set1_epi16((short)SprMulti - (short)iSpr);
|
|
bottom--;
|
__int64 ConBottom = bottom;
|
|
right = (right - left) / 16 * 16 + left;
|
|
__int64 ImgAddrLeft = ImgAddr + top * frameWidth + left;
|
__int64 ConPitch = iPitch * 0x20;
|
|
// -------------- à» Filtering -------------- //
|
CRect rtDeadZone[MAX_DEAD_ZONE_COUNT];
|
CPoint ptDefect;
|
memcpy(rtDeadZone, m_Param.s_RectDeadZone, sizeof(CRect) * MAX_DEAD_ZONE_COUNT);
|
int nDeadZoneCount = 0;
|
for(int i = 0; i < MAX_DEAD_ZONE_COUNT; i++)
|
{
|
if(rtDeadZone[i].IsRectEmpty() == TRUE)
|
{
|
nDeadZoneCount = i;
|
break;
|
}
|
}
|
// ------------------------------------------ //
|
|
__int64 pairTop = top + iPitch;
|
bottom = bottom - iPitch - 1;
|
__int64 pairBottom = bottom - iPitch;
|
|
__int64 rrImgAddr = ImgAddrLeft;
|
__int64 rrConAddr = ConAddr;
|
__int64 rrConAddr2 = ConAddr2;
|
|
goto LOOP_X_CHECK;
|
|
LOOP_X_TAIL:
|
goto PAIRING_VERT;
|
|
PAIRING_VERT_RETURN:
|
ImgAddrLeft += 0x10;
|
rrImgAddr = ImgAddrLeft;
|
rrConAddr = ConAddr;
|
rrConAddr2 = ConAddr2;
|
iy = top;
|
|
LOOP_X_CHECK:
|
if(ix >= right)
|
goto END_FUNC;
|
|
//LOOP_X_BODY:
|
iy = top;
|
rrImgAddr = ImgAddrLeft;
|
rrConAddr = ConAddr;
|
rrConAddr2 = ConAddr2;
|
goto MAKE_CONBUFF_BODY_TAIL_CHECK;
|
|
MAKE_CONBUFF_RETURN:
|
iy = top;
|
rrImgAddr = ImgAddrLeft;
|
rrConAddr = ConAddr;
|
rrConAddr2 = ConAddr2;
|
goto MAKE_CONBUFF2_HEAD;
|
|
MAKE_CONBUFF2_RETURN:
|
iy = top;
|
rrImgAddr = ImgAddrLeft;
|
rrConAddr = ConAddr;
|
rrConAddr2 = ConAddr2;
|
F_Y2Insp = 0;
|
goto LOOP_Y_CHECK;
|
|
DPC_READ:
|
if(PitchBuff == NULL)
|
goto DPC_READ_RETURN;
|
|
rax = *(PitchBuff + iy / 16);
|
if(rax == iPitchLast)
|
goto DPC_READ_RETURN;
|
|
iPitchLast = rax;
|
rbx = rax;
|
rbx &= 0x0f;
|
rax /= 16;
|
rax *= 32;
|
ConPitch = rax;
|
xxsSPR = _mm_set1_epi16((short)rbx);
|
|
rdx = SprMulti;
|
rdx -= rbx;
|
xxfSPR = _mm_set1_epi16((short)rdx);
|
goto DPC_READ_RETURN;
|
|
LOOP_Y_TAIL:
|
iy++;
|
rrImgAddr += frameWidth;
|
rrConAddr += 0x20;
|
rrConAddr2 += 0x20;
|
|
LOOP_Y_CHECK:
|
if(rrNoD >= maxPixelD)
|
goto PAIRING_VERT;
|
if(iy < bottom)
|
goto LOOP_Y_BODY;
|
ix += 8;
|
if(F_Y2Insp >= 1)
|
goto LOOP_X_TAIL;
|
|
F_Y2Insp = 1;
|
iy = top;
|
rrConAddr = ConAddr;
|
rrConAddr += 0x10;
|
rrConAddr2 = ConAddr2;
|
rrConAddr2 += 0x10;
|
goto LOOP_Y_BODY;
|
|
MAKE_CONBUFF_BODY_TAIL_CHECK:
|
xxSrc = _mm_loadu_si128((__m128i*) rrImgAddr);
|
xxSrc1 = xxSrc;
|
xxSrc = _mm_unpacklo_epi8(xxSrc, xxZero);
|
xxSrc1 = _mm_unpackhi_epi8(xxSrc1, xxZero);
|
|
xxCmp = _mm_loadu_si128((__m128i*)(rrImgAddr + 1));
|
xxCmp1 = xxCmp;
|
xxCmp = _mm_unpacklo_epi8(xxCmp, xxZero);
|
xxCmp1 = _mm_unpackhi_epi8(xxCmp1, xxZero);
|
|
xxSrc = _mm_add_epi16(xxSrc, xxCmp);
|
xxSrc1 = _mm_add_epi16(xxSrc1, xxCmp1);
|
|
_mm_storeu_si128((__m128i*)(rrConAddr), xxSrc);
|
_mm_storeu_si128((__m128i*)(rrConAddr + 0x10), xxSrc1);
|
|
rrImgAddr += frameWidth;
|
rrConAddr += 0x20;
|
iy++;
|
if(iy <= ConBottom)
|
goto MAKE_CONBUFF_BODY_TAIL_CHECK;
|
goto MAKE_CONBUFF_RETURN;
|
|
MAKE_CONBUFF2_HEAD:
|
rax = rrImgAddr;
|
rax += tilt16;
|
rrConAddr2 = ConAddr2;
|
|
MAKE_CONBUFF2_BODY:
|
xxSrc = _mm_loadu_si128((__m128i*) rax);
|
xxSrc1 = xxSrc;
|
xxSrc = _mm_unpacklo_epi8(xxSrc, xxZero);
|
xxSrc1 = _mm_unpackhi_epi8(xxSrc1, xxZero);
|
xxSrc = _mm_mullo_epi16(xxSrc, xxfSprT);
|
xxSrc1 = _mm_mullo_epi16(xxSrc1, xxfSprT);
|
|
xxCmp = _mm_loadu_si128((__m128i*)(rax + 2));
|
xxCmp1 = xxCmp;
|
xxCmp = _mm_unpacklo_epi8(xxCmp, xxZero);
|
xxCmp1 = _mm_unpackhi_epi8(xxCmp1, xxZero);
|
xxCmp = _mm_mullo_epi16(xxCmp, xxsSprT);
|
xxCmp1 = _mm_mullo_epi16(xxCmp1, xxsSprT);
|
|
xxSrc = _mm_add_epi16(xxSrc, xxCmp);
|
xxSrc1 = _mm_add_epi16(xxSrc1, xxCmp1);
|
|
xxSrc = _mm_srli_epi16(xxSrc, SprShift);
|
xxSrc1 = _mm_srli_epi16(xxSrc1, SprShift);
|
|
xxCmp = _mm_loadu_si128((__m128i*)(rax + 1));
|
xxCmp1 = xxCmp;
|
xxCmp = _mm_unpacklo_epi8(xxCmp, xxZero);
|
xxCmp1 = _mm_unpackhi_epi8(xxCmp1, xxZero);
|
|
xxSrc = _mm_add_epi16(xxSrc, xxCmp);
|
xxSrc1 = _mm_add_epi16(xxSrc1, xxCmp1);
|
|
_mm_storeu_si128((__m128i*)(rrConAddr2), xxSrc);
|
_mm_storeu_si128((__m128i*)(rrConAddr2 + 0x10), xxSrc1);
|
|
rax += frameWidth;
|
rrConAddr2 += 0x20;
|
|
iy++;
|
if(iy <= ConBottom)
|
goto MAKE_CONBUFF2_BODY;
|
goto MAKE_CONBUFF2_RETURN;
|
|
LOOP_Y_BODY:
|
goto DPC_READ;
|
|
DPC_READ_RETURN:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrConAddr);
|
xxTemp = _mm_loadu_si128((__m128i*) (rrConAddr + 0x20));
|
xxSrc = xxSrc1;
|
xxSrc = _mm_add_epi16(xxSrc, xxTemp);
|
xxSrc = _mm_slli_epi16(xxSrc, SprShift);
|
xxTemp = xxSrc;
|
xxTemp = _mm_subs_epu16(xxTemp, xxSupp);
|
xxSrc = _mm_subs_epu16(xxSrc, xxTemp);
|
|
rax = rrConAddr2 + ConPitch;
|
xxCmp1 = _mm_loadu_si128((__m128i*)(rax));
|
xxCmp = xxCmp1;
|
xxCmp = _mm_mullo_epi16(xxCmp, xxfSPR);
|
|
xxCmp1 = _mm_loadu_si128((__m128i*)(rax + 0x20));
|
xxTemp = xxCmp1;
|
xxTemp = _mm_slli_epi16(xxTemp, SprShift);
|
xxCmp = _mm_add_epi16(xxCmp, xxTemp);
|
|
xxTemp = _mm_loadu_si128((__m128i*)(rax + 0x40));
|
xxTemp = _mm_mullo_epi16(xxTemp, xxsSPR);
|
xxCmp = _mm_add_epi16(xxCmp, xxTemp);
|
|
xxTemp = xxCmp;
|
xxTemp = _mm_subs_epu16(xxTemp, xxSupp);
|
xxCmp = _mm_subs_epu16(xxCmp, xxTemp);
|
|
xxThres = xxSrc;
|
xxThres = _mm_max_epi16(xxThres, xxCmp);
|
xxThres = _mm_srli_epi16(xxThres, ConvNSprShift);
|
xxThres = _mm_mullo_epi16(xxThres, xxDSlide);
|
xxThres = _mm_srli_epi16(xxThres, 8);
|
xxThres = _mm_add_epi16(xxThres, xxDStart);
|
xxThres = _mm_slli_epi16(xxThres, ConvNSprShift);
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
/*¿ø·¡ÄÚµå:
|
xxThres = xxSrc;
|
xxThres = _mm_max_epi16(xxThres, xxCmp);
|
xxThres = _mm_srli_epi16(xxThres, ConvNSprShift);
|
xxThres = _mm_mullo_epi16(xxThres, xxDSlide);
|
xxThres = _mm_srli_epi16(xxThres, 8);
|
xxThres = _mm_add_epi16(xxThres, xxDStart);
|
xxThres = _mm_slli_epi16(xxThres, ConvNSprShift);
|
*/
|
xxZThW = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16(
|
_mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlide), 8), xxDStart), ConvNSprShift);
|
xxZThB = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16(
|
_mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlideB), 8), xxDStartB), ConvNSprShift);
|
|
xxThres = _mm_min_epu16(xxZThW, xxZThB);
|
// ----------------------------------- //
|
|
//INSPECT_BLACK:
|
xxPeakAbs = xxCmp;
|
xxPeakAbs = _mm_subs_epu16(xxPeakAbs, xxSrc);
|
xxPeak = xxPeakAbs;
|
xxPeak = _mm_cmpgt_epi16(xxPeak, xxThres);
|
rax = _mm_movemask_epi8(xxPeak);
|
if(rax == 0)
|
goto INSPECT_WHITE;
|
rbx = 0;
|
goto DEFECT_00;
|
|
INSPECT_WHITE:
|
xxPeakAbs = xxSrc;
|
xxPeakAbs = _mm_subs_epu16(xxPeakAbs, xxCmp);
|
xxPeak = xxPeakAbs;
|
xxPeak = _mm_cmpgt_epi16(xxPeak, xxThres);
|
rax = _mm_movemask_epi8(xxPeak);
|
if(rax == 0)
|
goto LOOP_Y_TAIL;
|
rbx = 1;
|
goto DEFECT_00;
|
|
DEFECT_00:
|
rax = _mm_extract_epi16(xxPeak, 0x00);
|
if(rax == 0)
|
goto DEFECT_01;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x00);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x00);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x00);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x00);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_01:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x01);
|
if(rax == 0)
|
goto DEFECT_02;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x01);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x01);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x01);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x01);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_02:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x02);
|
if(rax == 0)
|
goto DEFECT_03;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x02);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x02);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x02);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x02);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_03:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x03);
|
if(rax == 0)
|
goto DEFECT_04;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x03);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x03);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x03);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x03);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_04:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x04);
|
if(rax == 0)
|
goto DEFECT_05;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x04);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x04);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x04);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x04);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_05:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x05);
|
if(rax == 0)
|
goto DEFECT_06;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x05);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x05);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x05);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x05);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_06:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x06);
|
if(rax == 0)
|
goto DEFECT_07;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x06);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x06);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x06);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x06);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_07:
|
ix++;
|
rax = _mm_extract_epi16(xxPeak, 0x07);
|
if(rax == 0)
|
goto DEFECT_END;
|
|
rax = _mm_extract_epi16(xxPeakAbs, 0x07);
|
rax = rax >> ConvNSprShift;
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
*(DefectT + rrNoD) = (int)rbx;
|
*(DefectValue + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxSrc, 0x07);
|
*(pGraySrc + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxCmp, 0x07);
|
*(pGrayCmp + rrNoD) = (int)rax;
|
|
rax = _mm_extract_epi16(xxThres, 0x07);
|
*(pZoneTh + rrNoD) = (int)rax;
|
|
rrNoD++;
|
|
DEFECT_END:
|
ix -= 7;
|
if(rbx == 0)
|
goto INSPECT_WHITE;
|
goto LOOP_Y_TAIL;
|
|
PAIRING_VERT:
|
iy = -1;
|
|
LOOP_PAIR_NUM:
|
iy++;
|
if(iy >= rrNoD)
|
goto LOOP_PAIR_NUM_END;
|
|
rax = nPair;
|
if(rax >= MaxPair)
|
goto END_FUNC;
|
|
if(*(DefectT + iy) >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rbx = iy;
|
rcx = *(DefectY + iy);
|
rax = rcx + iPitchHUp;
|
rrConAddr2 = *(DefectX + iy);
|
|
if(rcx > pairBottom)
|
goto PAIR_BOTTOM;
|
|
if(rcx >= pairTop)
|
goto PAIR_CENTER;
|
|
PAIR_TOP:
|
rbx++;
|
if(rbx >= rrNoD)
|
goto PAIR_TOP_UNPAIR;
|
|
rdx = *(DefectY + rbx);
|
if(rdx < rax)
|
goto PAIR_TOP;
|
else if(rdx > rax)
|
goto PAIR_TOP_UNPAIR;
|
|
rcx = *(DefectX + rbx);
|
if(rrConAddr2 != rcx)
|
goto PAIR_TOP;
|
|
rrConAddr = *(DefectT + rbx);
|
if(rrConAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrConAddr)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rcx;
|
ptDefect.y = (LONG)rdx;
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGraySrc + rbx));
|
sRef = (int)(*(pGrayCmp + rbx));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + rbx) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
*(DefectT + rbx) = 4;
|
|
PairAddr->s_DefectPos = (DefectPos)1;
|
PairAddr->s_DefectPair = (DefectPair)1;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)rdx;
|
PairAddr->s_DefectType = (DefectType)rrConAddr;
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_TOP_UNPAIR:
|
if(m_Param.m_bUseUnpair == FALSE)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)(rrConAddr2);
|
ptDefect.y = (LONG)(rax - iPitchHUp);
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGraySrc + iy));
|
sRef = (int)(*(pGrayCmp + iy));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + iy) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
PairAddr->s_DefectPos = (DefectPos)1;
|
PairAddr->s_DefectPair = (DefectPair)5;
|
PairAddr->s_nDefectX = (int)ptDefect.x;
|
PairAddr->s_nDefectY = (int)ptDefect.y;
|
PairAddr->s_DefectType = (DefectType)*(DefectT + iy);
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + iy);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_CENTER:
|
rbx++;
|
if(rbx == rrNoD)
|
goto LOOP_PAIR_NUM;
|
|
rdx = *(DefectY + rbx);
|
if(rdx < rax)
|
goto PAIR_CENTER;
|
else if(rdx > rax)
|
goto LOOP_PAIR_NUM;
|
|
rcx = *(DefectX + rbx);
|
if(rrConAddr2 != rcx)
|
goto PAIR_CENTER;
|
|
rrConAddr = *(DefectT + rbx);
|
if(rrConAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrConAddr)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rcx;
|
ptDefect.y = (LONG)rdx;
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGraySrc + rbx));
|
sRef = (int)(*(pGrayCmp + rbx));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + rbx) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
*(DefectT + rbx) = 4;
|
|
PairAddr->s_DefectPos = (DefectPos)2;
|
PairAddr->s_DefectPair = (DefectPair)1;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)rdx;
|
PairAddr->s_DefectType = (DefectType)rrConAddr;
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_BOTTOM:
|
if(m_Param.m_bUseUnpair == FALSE)
|
goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rrConAddr2;
|
ptDefect.y = (LONG)rax;
|
for(int i = 0; i < nDeadZoneCount; i++)
|
{
|
if(rtDeadZone[i].PtInRect(ptDefect) )
|
goto LOOP_PAIR_NUM;
|
}
|
// ------------------------------------------ //
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
sSrc = (int)(*(pGrayCmp + iy));
|
sRef = (int)(*(pGraySrc + iy));
|
|
if(sSrc > sRef)
|
sThres = (short)(sSrc * ThresholdSlide / 256 + Threshold / 4) * 64;
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64;
|
|
*(pZoneTh + iy) = sThres;
|
|
sDiff = abs(sSrc - sRef);
|
if(sDiff <= sThres)
|
goto LOOP_PAIR_NUM;
|
// ----------------------------------- //
|
|
PairAddr->s_DefectPos = (DefectPos)3;
|
PairAddr->s_DefectPair = (DefectPair)5;
|
PairAddr->s_nDefectX = (int)rrConAddr2;
|
PairAddr->s_nDefectY = (int)rax;
|
rdx = (*(DefectT + iy) + 1) & 1;
|
PairAddr->s_DefectType = (DefectType)rdx;
|
PairAddr->s_fDefectPeak = (int)*(DefectValue + iy);
|
PairAddr->s_nGraySrc = (int)(sSrc / 64);
|
PairAddr->s_nGrayRef = (int)(sRef / 64);
|
PairAddr->s_nThresold = (int)(sThres / 64);
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
LOOP_PAIR_NUM_END:
|
rrNoD = 0;
|
goto PAIRING_VERT_RETURN;
|
|
END_FUNC:
|
ix += 0x10;
|
*endLine = (int)ix;
|
|
return (int)nPair;
|
}
|