|
#include "stdafx.h"
|
|
#include "BlobStorage.h"
|
#include <wmmintrin.h>
|
|
#ifdef _DEBUG
|
#define new DEBUG_NEW
|
#endif
|
|
#include "SISAssem.h"
|
#include "AssemParam.h"
|
|
int CSISAssem::ConvPixelVertS_Intrin(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, __int64 frameWidth, __int64 iPitch16, __int64 fSPR, __int64 sSPR
|
, short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable
|
, CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize
|
, __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter
|
, __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, short* pConBuff
|
, int* endLine, __int64 ExTh
|
)
|
{
|
const __int64 SprShift = 4;
|
const __int64 SprMulti = 16;
|
|
__m128i xxTemp;
|
|
__m128i xxZTh;
|
|
__m128i xxSrc1;
|
__m128i xxSrc2;
|
|
__m128i xxCmp1;
|
__m128i xxCmp2;
|
__m128i xxCmp3;
|
|
__m128i xxPeakS;
|
__m128i xxPeakAbs;
|
|
__m128i xxfSpr;
|
__m128i xxsSpr;
|
|
__m128i xxDStart;
|
__m128i xxDSlide;
|
|
__int64 rax, rbx, rcx, rdx;
|
|
__int64 ImgAddrOri = (__int64)pImgBuff;
|
__int64 ConAddr = (__int64)pConBuff;
|
__int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair;
|
|
__m128i xxSupp = _mm_set1_epi16((short)ThresholdSuppress);
|
|
xxDStart = _mm_set1_epi16((short)Threshold);
|
xxDSlide = _mm_set1_epi16((short)ThresholdSlide);
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
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 = iPitch16;
|
rcx &= 0x0f;
|
xxsSpr = _mm_set1_epi16((short)rcx);
|
|
rax = SprMulti;
|
rax -= rcx;
|
xxfSpr = _mm_set1_epi16((short)rax);
|
|
__int64 iPitch = iPitch16 / SprMulti;
|
__int64 iPitchHUp = iPitch;
|
if(rcx >= SprMulti / 2)
|
iPitchHUp++;
|
|
bottom--;
|
__int64 ConBottom = bottom - iPitch - 1;
|
__int64 pairBottom = ConBottom - 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 pairTop = top + iPitch;
|
__int64 ConvPitch = iPitch * 0x20;
|
|
__int64 ix = left;
|
__int64 iy = top;
|
|
right = (right - left) / 16 * 16 + left;
|
|
__m128i xxZero = _mm_setzero_si128();
|
|
CDefectPair* PairAddr = pDefectdPair + nPair;
|
|
//LOOP_1:
|
goto LOOP_1_CHECK;
|
|
LOOP_1_TAIL:
|
goto PAIRING_VERT;
|
|
_return_PAIRING_VERT:
|
ix += 0x10;
|
|
LOOP_1_CHECK:
|
if(ix >= right)
|
goto END_FUNC;
|
|
//LOOP_1_BODY:
|
iy = top;
|
rrImgAddr = ImgAddrOri + frameWidth * iy + ix;
|
goto MAKE_CONBUFF_HEAD;
|
|
_return_MAKE_CONBUFF:
|
iy = top;
|
rrImgAddr = ConAddr;
|
//LOOP_2:
|
goto LOOP_2_CHECK;
|
|
LOOP_2_TAIL:
|
iy++;
|
rrImgAddr += 0x20;
|
|
LOOP_2_CHECK:
|
if(iy >= ConBottom)
|
goto LOOP_1_TAIL;
|
|
//LOOP_2_BODY:
|
goto XMM_MAKE;
|
_return_XMM_MAKE:
|
goto XMM_COMPARE;
|
_return_XMM_COMPARE:
|
goto LOOP_2_TAIL;
|
|
MAKE_CONBUFF_HEAD:
|
rax = ConAddr;
|
|
MAKE_CONBUFF:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr);
|
_mm_storeu_si128((__m128i*)rax, _mm_unpacklo_epi8(xxSrc1, xxZero));
|
_mm_storeu_si128((__m128i*)(rax + 0x10), _mm_unpackhi_epi8(xxSrc1, xxZero));
|
rrImgAddr += frameWidth;
|
rax += 0x20;
|
iy++;
|
if(iy <= bottom)
|
goto MAKE_CONBUFF;
|
goto _return_MAKE_CONBUFF;
|
|
XMM_MAKE:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr);
|
xxSrc2 = _mm_loadu_si128((__m128i*) (rrImgAddr + 0x10));
|
|
rax = rrImgAddr + ConvPitch;
|
|
xxCmp1 = _mm_loadu_si128((__m128i*) rax);
|
xxCmp2 = _mm_loadu_si128((__m128i*) (rax + 0x10));
|
xxCmp3 = _mm_loadu_si128((__m128i*) (rax + 0x20));
|
xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x30));
|
|
xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxCmp3, xxsSpr)), SprShift);
|
xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift);
|
goto _return_XMM_MAKE;
|
|
XMM_COMPARE:
|
c8Pixel = 0;
|
xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp);
|
xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp);
|
goto _XMM_COMPARE_8PIXEL;
|
|
_return_XMM_COMPARE_8PIXEL:
|
if(rrNoD >= maxDefect)
|
goto PAIRING_VERT;
|
|
c8Pixel++;
|
if(c8Pixel == 2)
|
goto XMM_COMPARE_END;
|
|
xxSrc1 = _mm_min_epu16(xxSrc2, xxSupp);
|
xxCmp1 = _mm_min_epu16(xxCmp2, xxSupp);
|
|
_XMM_COMPARE_8PIXEL:
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
//¿ø·¡ÄÚµå: xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart);
|
xxZThW = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart);
|
xxZThB = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlideB), 8), xxDStartB);
|
|
xxZTh = _mm_min_epu16(xxZThW, xxZThB);
|
// ----------------------------------- //
|
|
//Â÷À̰ªÀ» ±¸Çϰí
|
xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1);
|
xxPeakAbs = _mm_abs_epi16(xxPeakS);
|
xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh);
|
if(_mm_movemask_epi8(xxTemp) != 0)
|
goto DEFECT_00;
|
|
ix += 8;
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
XMM_COMPARE_END:
|
ix -= 0x10;
|
goto _return_XMM_COMPARE;
|
|
|
DEFECT_00:
|
if(_mm_extract_epi16(xxTemp, 0x00) == 0)
|
goto DEFECT_01;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x00);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00);
|
if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_01:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x01) == 0)
|
goto DEFECT_02;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x01);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01);
|
if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_02:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x02) == 0)
|
goto DEFECT_03;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x02);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02);
|
if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_03:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x03) == 0)
|
goto DEFECT_04;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x03);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03);
|
if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_04:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x04) == 0)
|
goto DEFECT_05;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x04);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04);
|
if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_05:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x05) == 0)
|
goto DEFECT_06;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x05);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05);
|
if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_06:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x06) == 0)
|
goto DEFECT_07;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x06);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06);
|
if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_07:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x07) == 0)
|
goto DEFECT_08;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x07);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07);
|
if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_08:
|
ix++;
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
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;
|
rrImgAddr = *(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(rrImgAddr != rcx)
|
goto PAIR_TOP;
|
|
rrImgAddr = *(DefectT + rbx);
|
if(rrImgAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrImgAddr)
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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)rrImgAddr;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc);
|
PairAddr->s_nGrayRef = (int)(sRef);
|
PairAddr->s_nZone = (int)(*(pZoneID + rbx));
|
PairAddr->s_nThresold = (int)(sThres);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_TOP_UNPAIR:
|
if(bUseUnpair != 1)
|
goto LOOP_PAIR_NUM;
|
|
//rcx = (__int64)*(DefectValue + iy);
|
//if(rcx <= ExTh)
|
// goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)(rrImgAddr);
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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);
|
PairAddr->s_nGrayRef = (int)(sRef);
|
PairAddr->s_nZone = (int)(*(pZoneID + iy));
|
PairAddr->s_nThresold = (int)(sThres);
|
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(rrImgAddr != rcx)
|
goto PAIR_CENTER;
|
|
rrImgAddr = *(DefectT + rbx);
|
if(rrImgAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrImgAddr)
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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)rrImgAddr;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc);
|
PairAddr->s_nGrayRef = (int)(sRef);
|
PairAddr->s_nZone = (int)(*(pZoneID + rbx));
|
PairAddr->s_nThresold = (int)(sThres);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_BOTTOM:
|
if(bUseUnpair != 1)
|
goto LOOP_PAIR_NUM;
|
|
//rcx = (__int64)*(DefectValue + iy);
|
//if(rcx <= ExTh)
|
// goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rrImgAddr;
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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)rrImgAddr;
|
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;
|
PairAddr->s_nGrayRef = (int)sRef;
|
PairAddr->s_nZone = (int)(*(pZoneID + iy));
|
PairAddr->s_nThresold = (int)sThres;
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
LOOP_PAIR_NUM_END:
|
rrNoD = 0;
|
goto _return_PAIRING_VERT;
|
|
END_FUNC:
|
ix += 0x10;
|
*endLine = (int)ix;
|
|
return (int)nPair;
|
}
|
|
int CSISAssem::ConvPixelVTDS_Intrin(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, __int64 frameWidth, __int64 iPitch16, int* piPitch16, __int64 sSPR
|
, short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable
|
, CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize
|
, __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter
|
, __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, short* pConBuff
|
, int* endLine, __int64 ExTh
|
)
|
{
|
const __int64 SprShift = 4;
|
const __int64 SprMulti = 16;
|
|
__m128i xxTemp;
|
|
__m128i xxZTh;
|
|
__m128i xxSrc1;
|
__m128i xxSrc2;
|
|
__m128i xxCmp1;
|
__m128i xxCmp2;
|
__m128i xxCmp3;
|
|
__m128i xxPeakS;
|
__m128i xxPeakAbs;
|
|
__m128i xxfSpr;
|
__m128i xxsSpr;
|
|
__m128i xxDStart;
|
__m128i xxDSlide;
|
|
__int64 rax, rbx, rcx, rdx;
|
|
|
__int64 ImgAddrOri = (__int64)pImgBuff;
|
__int64 ConAddr = (__int64)pConBuff;
|
__int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair, _piPitch16, cDpc;
|
|
__m128i xxSupp = _mm_set1_epi16((short)ThresholdSuppress);
|
|
xxDStart = _mm_set1_epi16((short)Threshold);
|
xxDSlide = _mm_set1_epi16((short)ThresholdSlide);
|
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
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 = iPitch16;
|
rcx &= 0x0f;
|
xxsSpr = _mm_set1_epi16((short)rcx);
|
|
rax = SprMulti;
|
rax -= rcx;
|
xxfSpr = _mm_set1_epi16((short)rax);
|
|
__int64 iPitch = iPitch16 / SprMulti;
|
__int64 iPitchHUp = iPitch;
|
if(rcx >= SprMulti / 2)
|
iPitchHUp++;
|
|
bottom--;
|
__int64 ConBottom = bottom - iPitch - 1;
|
__int64 pairBottom = ConBottom - 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 pairTop = top + iPitch;
|
__int64 ConvPitch = iPitch * 0x20;
|
|
__int64 ix = left;
|
__int64 iy = top;
|
|
right = (right - left) / 16 * 16 + left;
|
|
__m128i xxZero = _mm_setzero_si128();
|
|
CDefectPair* PairAddr = pDefectdPair + nPair;
|
|
//LOOP_1:
|
goto LOOP_1_CHECK;
|
|
LOOP_1_TAIL:
|
goto PAIRING_VERT;
|
|
_return_PAIRING_VERT:
|
ix += 0x10;
|
|
LOOP_1_CHECK:
|
if(ix >= right)
|
goto END_FUNC;
|
|
//LOOP_1_BODY:
|
iy = top;
|
rrImgAddr = ImgAddrOri + frameWidth * iy + ix;
|
|
_piPitch16 = 0;
|
if(piPitch16 == NULL)
|
goto DPC_PASS;
|
|
rax = iy;
|
rax /= 16;
|
rax *= 4;
|
rax += __int64(piPitch16);
|
_piPitch16 = rax;
|
|
DPC_PASS:
|
goto MAKE_CONBUFF_HEAD;
|
|
_return_MAKE_CONBUFF:
|
iy = top;
|
rrImgAddr = ConAddr;
|
//LOOP_2:
|
cDpc = 0x10;
|
goto LOOP_2_CHECK;
|
|
LOOP_2_TAIL:
|
iy++;
|
rrImgAddr += 0x20;
|
|
LOOP_2_CHECK:
|
if(iy >= ConBottom)
|
goto LOOP_1_TAIL;
|
|
//LOOP_2_BODY:
|
if(_piPitch16 == 0)
|
goto XMM_MAKE;
|
goto DPC_MAKE;
|
_return_DPC_MAKE:
|
cDpc++;
|
goto XMM_MAKE;
|
_return_XMM_MAKE:
|
goto XMM_COMPARE;
|
_return_XMM_COMPARE:
|
goto LOOP_2_TAIL;
|
|
MAKE_CONBUFF_HEAD:
|
rax = ConAddr;
|
|
MAKE_CONBUFF:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr);
|
_mm_storeu_si128((__m128i*)rax, _mm_unpacklo_epi8(xxSrc1, xxZero));
|
_mm_storeu_si128((__m128i*)(rax + 0x10), _mm_unpackhi_epi8(xxSrc1, xxZero));
|
rrImgAddr += frameWidth;
|
rax += 0x20;
|
iy++;
|
if(iy <= bottom)
|
goto MAKE_CONBUFF;
|
goto _return_MAKE_CONBUFF;
|
|
DPC_MAKE: // verticla Àº 16¹ø¿¡ Çѹø¾¿¸¸ ·ÎµùÇÑ´Ù. cDpc Ä«¿îÆ®, µ¿ÀÏ Pitch ÆÇ´ÜÈÄ Pass ±â´É
|
if(cDpc != 0x10) //cmp cDpc, 010h
|
goto _return_DPC_MAKE; //jne _return_DPC_MAKE
|
cDpc = 0; //mov cDpc, 0
|
rax = _piPitch16; //mov rax, piPitch16
|
rax = *(int*)(rax); //movsxd rax, dword ptr[rax]
|
_piPitch16 +=4; //add piPitch16, 4
|
|
if(iPitch16 == rax) //cmp iPitch16, rax
|
goto _return_DPC_MAKE; //je _return_DPC_MAKE
|
|
iPitch16 = rax; //mov iPitch16, rax
|
rcx = rax; //mov rcx, rax
|
rcx &= 0x0f; //and rcx, 0fh
|
|
rax /= 16; //shr rax, SprShift
|
iPitch = rax; //mov iPitch, rax
|
|
rax *= 32; //sal rax, 5
|
ConvPitch = rax; //mov ConPitch, rax
|
|
|
rdx = 0x10; //mov rdx, 010h
|
rdx -= rcx; //sub rdx, rcx
|
|
xxsSpr = _mm_set1_epi16((short)rcx);
|
xxfSpr = _mm_set1_epi16((short)rdx);
|
|
goto _return_DPC_MAKE;
|
|
XMM_MAKE:
|
xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr);
|
xxSrc2 = _mm_loadu_si128((__m128i*) (rrImgAddr + 0x10));
|
|
rax = rrImgAddr + ConvPitch;
|
|
xxCmp1 = _mm_loadu_si128((__m128i*) rax);
|
xxCmp2 = _mm_loadu_si128((__m128i*) (rax + 0x10));
|
xxCmp3 = _mm_loadu_si128((__m128i*) (rax + 0x20));
|
xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x30));
|
|
xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxCmp3, xxsSpr)), SprShift);
|
xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift);
|
goto _return_XMM_MAKE;
|
|
XMM_COMPARE:
|
c8Pixel = 0;
|
xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp);
|
xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp);
|
goto _XMM_COMPARE_8PIXEL;
|
|
_return_XMM_COMPARE_8PIXEL:
|
if(rrNoD >= maxDefect)
|
goto PAIRING_VERT;
|
|
c8Pixel++;
|
if(c8Pixel == 2)
|
goto XMM_COMPARE_END;
|
|
xxSrc1 = _mm_min_epu16(xxSrc2, xxSupp);
|
xxCmp1 = _mm_min_epu16(xxCmp2, xxSupp);
|
|
_XMM_COMPARE_8PIXEL:
|
// ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- //
|
//¿ø·¡ÄÚµå: xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart);
|
xxZThW = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart);
|
xxZThB = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlideB), 8), xxDStartB);
|
|
xxZTh = _mm_min_epu16(xxZThW, xxZThB);
|
// ----------------------------------- //
|
|
//Â÷À̰ªÀ» ±¸Çϰí
|
xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1);
|
xxPeakAbs = _mm_abs_epi16(xxPeakS);
|
xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh);
|
if(_mm_movemask_epi8(xxTemp) != 0)
|
goto DEFECT_00;
|
|
ix += 8;
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
XMM_COMPARE_END:
|
ix -= 0x10;
|
goto _return_XMM_COMPARE;
|
|
|
DEFECT_00:
|
if(_mm_extract_epi16(xxTemp, 0x00) == 0)
|
goto DEFECT_01;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x00);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00);
|
if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_01:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x01) == 0)
|
goto DEFECT_02;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x01);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01);
|
if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_02:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x02) == 0)
|
goto DEFECT_03;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x02);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02);
|
if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_03:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x03) == 0)
|
goto DEFECT_04;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x03);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03);
|
if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_04:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x04) == 0)
|
goto DEFECT_05;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x04);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04);
|
if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_05:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x05) == 0)
|
goto DEFECT_06;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x05);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05);
|
if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_06:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x06) == 0)
|
goto DEFECT_07;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x06);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06);
|
if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_07:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x07) == 0)
|
goto DEFECT_08;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZero, 0x07);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07);
|
if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_08:
|
ix++;
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
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;
|
rrImgAddr = *(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(rrImgAddr != rcx)
|
goto PAIR_TOP;
|
|
rrImgAddr = *(DefectT + rbx);
|
if(rrImgAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrImgAddr)
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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)rrImgAddr;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc);
|
PairAddr->s_nGrayRef = (int)(sRef);
|
PairAddr->s_nZone = (int)(*(pZoneID + rbx));
|
PairAddr->s_nThresold = (int)(sThres);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_TOP_UNPAIR:
|
if(bUseUnpair != 1)
|
goto LOOP_PAIR_NUM;
|
|
//rcx = (__int64)*(DefectValue + iy);
|
//if(rcx <= ExTh)
|
// goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)(rrImgAddr);
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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);
|
PairAddr->s_nGrayRef = (int)(sRef);
|
PairAddr->s_nZone = (int)(*(pZoneID + iy));
|
PairAddr->s_nThresold = (int)(sThres);
|
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(rrImgAddr != rcx)
|
goto PAIR_CENTER;
|
|
rrImgAddr = *(DefectT + rbx);
|
if(rrImgAddr >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rax = (__int64)*(DefectT + iy);
|
if(rax == rrImgAddr)
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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)rrImgAddr;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(sSrc);
|
PairAddr->s_nGrayRef = (int)(sRef);
|
PairAddr->s_nZone = (int)(*(pZoneID + rbx));
|
PairAddr->s_nThresold = (int)(sThres);
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_BOTTOM:
|
if(bUseUnpair != 1)
|
goto LOOP_PAIR_NUM;
|
|
//rcx = (__int64)*(DefectValue + iy);
|
//if(rcx <= ExTh)
|
// goto LOOP_PAIR_NUM;
|
|
// -------------- à» Filtering -------------- //
|
ptDefect.x = (LONG)rrImgAddr;
|
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);
|
else
|
sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main);
|
|
*(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)rrImgAddr;
|
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;
|
PairAddr->s_nGrayRef = (int)sRef;
|
PairAddr->s_nZone = (int)(*(pZoneID + iy));
|
PairAddr->s_nThresold = (int)sThres;
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
LOOP_PAIR_NUM_END:
|
rrNoD = 0;
|
goto _return_PAIRING_VERT;
|
|
END_FUNC:
|
ix += 0x10;
|
*endLine = (int)ix;
|
|
return (int)nPair;
|
}
|
|
int CSISAssem::ConvPixel_Intrin(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, __int64 frameWidth, __int64 iPitch, __int64 fSPR, __int64 sSPR
|
, short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable
|
, CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize
|
, __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter
|
, __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, int* endLine
|
)
|
{
|
const __int64 SprShift = 4;
|
const __int64 SprMulti = 16;
|
|
__m128i xxTemp;
|
|
__m128i xxZTh;
|
__m128i xxZId;
|
|
__m128i xxSrc1;
|
__m128i xxSrc2;
|
|
__m128i xxCmp1;
|
__m128i xxCmp2;
|
__m128i xxCmp3;
|
|
__m128i xxPeakS;
|
__m128i xxPeakAbs;
|
|
__m128i xxfSpr;
|
__m128i xxsSpr;
|
|
__m128i xxDStart;
|
__m128i xxDSlide;
|
|
__int64 rax, rbx, rcx, rdx;
|
|
__int64 ImgAddrOri = (__int64)pImgBuff;
|
__int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair;
|
|
__m128i xxSupp = _mm_set1_epi16((short)ThresholdSuppress);
|
|
xxDStart = _mm_set1_epi16((short)Threshold);
|
xxDSlide = _mm_set1_epi16((short)ThresholdSlide);
|
|
xxZId = _mm_setzero_si128();
|
|
rcx = iPitch;
|
rcx &= 0x0f;
|
xxsSpr = _mm_set1_epi16((short)rcx);
|
|
rax = SprMulti;
|
rax -= rcx;
|
xxfSpr = _mm_set1_epi16((short)rax);
|
|
iPitch = iPitch / SprMulti;
|
__int64 iPitchHUp = iPitch;
|
if(rcx >= SprMulti / 2)
|
iPitchHUp++;
|
|
right = (right - left - iPitch) / 16 * 16 + left;
|
|
__int64 pairRight = right - iPitch;
|
__int64 pairLeft = left + iPitch;
|
|
__int64 ix = left;
|
__int64 iy = top;
|
|
__m128i xxZero = _mm_setzero_si128();
|
|
CDefectPair* PairAddr = pDefectdPair + nPair;
|
|
//LOOP_1:
|
goto LOOP_1_CHECK;
|
|
LOOP_1_TAIL:
|
goto PAIRING;
|
|
_return_PAIRING:
|
iy++;
|
|
LOOP_1_CHECK:
|
if(iy >= bottom)
|
goto END_FUNC;
|
|
//LOOP_1_BODY:
|
ix = left;
|
rrImgAddr = ImgAddrOri + frameWidth * iy + ix;
|
|
//LOOP_2:
|
goto LOOP_2_CHECK;
|
|
LOOP_2_TAIL:
|
rrImgAddr += 0x10;
|
|
LOOP_2_CHECK:
|
if(ix >= right)
|
goto LOOP_1_TAIL;
|
|
//LOOP_2_BODY:
|
goto XMM_MAKE;
|
_return_XMM_MAKE:
|
goto XMM_COMPARE;
|
_return_XMM_COMPARE:
|
goto LOOP_2_TAIL;
|
|
|
XMM_MAKE:
|
xxSrc2 = _mm_loadu_si128((__m128i*) rrImgAddr);
|
xxSrc1 = _mm_unpacklo_epi8(xxSrc2, xxZero);
|
xxSrc2 = _mm_unpackhi_epi8(xxSrc2, xxZero);
|
|
rax = rrImgAddr + iPitch;
|
|
xxCmp2 = _mm_loadu_si128((__m128i*) rax);
|
xxCmp1 = _mm_unpacklo_epi8(xxCmp2, xxZero);
|
xxCmp2 = _mm_unpackhi_epi8(xxCmp2, xxZero);
|
|
xxCmp1 = _mm_mullo_epi16(xxCmp1, xxfSpr);
|
xxCmp2 = _mm_mullo_epi16(xxCmp2, xxfSpr);
|
|
xxCmp3 = _mm_loadu_si128((__m128i*) (rax + 1));
|
|
xxTemp = xxCmp3;
|
xxTemp = _mm_unpacklo_epi8(xxTemp, xxZero);
|
xxTemp = _mm_mullo_epi16(xxTemp, xxsSpr);
|
xxCmp1 = _mm_add_epi16(xxCmp1, xxTemp);
|
|
xxTemp = xxCmp3;
|
xxTemp = _mm_unpackhi_epi8(xxTemp, xxZero);
|
xxTemp = _mm_mullo_epi16(xxTemp, xxsSpr);
|
xxCmp2 = _mm_add_epi16(xxCmp2, xxTemp);
|
|
|
xxCmp1 = _mm_srli_epi16(xxCmp1, SprShift);
|
xxCmp2 = _mm_srli_epi16(xxCmp2, SprShift);
|
goto _return_XMM_MAKE;
|
|
XMM_COMPARE:
|
c8Pixel = 0;
|
goto _XMM_COMPARE_8PIXEL;
|
|
_return_XMM_COMPARE_8PIXEL:
|
if(rrNoD >= maxDefect)
|
goto PAIRING;
|
|
ix++;
|
|
c8Pixel++;
|
if(c8Pixel == 2)
|
goto _return_XMM_COMPARE;
|
|
xxSrc1 = xxSrc2;
|
xxCmp1 = xxCmp2;
|
|
_XMM_COMPARE_8PIXEL:
|
xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp);
|
xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp);
|
|
xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart);
|
xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1);
|
xxPeakAbs = _mm_abs_epi16(xxPeakS);
|
xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh);
|
if(_mm_movemask_epi8(xxTemp) != 0)
|
goto DEFECT_00;
|
|
ix += 7;
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
DEFECT_00:
|
if(_mm_extract_epi16(xxTemp, 0x00) == 0)
|
goto DEFECT_01;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x00);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00);
|
if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_01:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x01) == 0)
|
goto DEFECT_02;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x01);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01);
|
if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_02:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x02) == 0)
|
goto DEFECT_03;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x02);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02);
|
if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_03:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x03) == 0)
|
goto DEFECT_04;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x03);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03);
|
if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_04:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x04) == 0)
|
goto DEFECT_05;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x04);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04);
|
if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_05:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x05) == 0)
|
goto DEFECT_06;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x05);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05);
|
if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_06:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x06) == 0)
|
goto DEFECT_07;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x06);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06);
|
if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
DEFECT_07:
|
ix++;
|
if(_mm_extract_epi16(xxTemp, 0x07) == 0)
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
*(DefectX + rrNoD) = (int)ix;
|
*(DefectY + rrNoD) = (int)iy;
|
|
*(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07);
|
*(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07);
|
*(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x07);
|
*(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07);
|
if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0)
|
*(DefectT + rrNoD) = 1;
|
else
|
*(DefectT + rrNoD) = 0;
|
|
rrNoD++;
|
|
goto _return_XMM_COMPARE_8PIXEL;
|
|
PAIRING:
|
ix = -1;
|
|
LOOP_PAIR_NUM:
|
ix++;
|
if(ix >= rrNoD)
|
goto LOOP_PAIR_NUM_END;
|
|
rax = nPair;
|
if(rax >= MaxPair)
|
goto END_FUNC;
|
|
if(*(DefectT + ix) >= 3)
|
goto LOOP_PAIR_NUM;
|
|
rbx = ix;
|
rdx = *(DefectX + ix);
|
rcx = rdx;
|
rcx = rcx + iPitchHUp;
|
|
if(rdx < pairLeft)
|
goto PAIR_LEFT;
|
|
if(rdx <= pairRight)
|
goto PAIR_CENTER;
|
|
//PAIR_RIGHT:
|
if(bUseUnpair == 0)
|
goto LOOP_PAIR_NUM;
|
|
//rcx = (__int64)*(DefectValue + iy);
|
//if(rcx <= ExTh)
|
// goto LOOP_PAIR_NUM;
|
|
PairAddr->s_DefectPos = (DefectPos)3;
|
PairAddr->s_DefectPair = (DefectPair)5;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)(*(DefectY + ix));
|
rcx = (*(DefectT + ix) + 1) & 1;
|
PairAddr->s_DefectType = (DefectType)rcx;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + iy);
|
PairAddr->s_nGraySrc = (int)(*(pGrayCmp + ix));
|
PairAddr->s_nGrayRef = (int)(*(pGraySrc + ix));
|
PairAddr->s_nZone = (int)(*(pZoneID + ix));
|
PairAddr->s_nThresold = (int)(*(pZoneTh + ix));
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_LEFT:
|
rbx++;
|
if(rbx >= rrNoD)
|
goto PAIR_LEFT_UNPAIR;
|
|
rax = *(DefectX + rbx);
|
if(rax < rcx)
|
goto PAIR_LEFT;
|
else if(rax > rcx)
|
goto PAIR_LEFT_UNPAIR;
|
|
rdx = *(DefectT + rbx);
|
if(rdx >= 3)
|
goto PAIR_LEFT;
|
|
rax = (__int64)*(DefectT + ix);
|
if(rax == rdx)
|
goto PAIR_LEFT;
|
|
*(DefectT + rbx) = 4;
|
|
PairAddr->s_DefectPos = (DefectPos)1;
|
PairAddr->s_DefectPair = (DefectPair)1;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)(*(DefectY + rbx));
|
PairAddr->s_DefectType = (DefectType)rdx;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(*(pGraySrc + rbx));
|
PairAddr->s_nGrayRef = (int)(*(pGrayCmp + rbx));
|
PairAddr->s_nZone = (int)(*(pZoneID + rbx));
|
PairAddr->s_nThresold = (int)(*(pZoneTh + rbx));
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_LEFT_UNPAIR:
|
if(bUseUnpair == 0)
|
goto LOOP_PAIR_NUM;
|
|
//rcx = (__int64)*(DefectValue + iy);
|
//if(rcx <= ExTh)
|
// goto LOOP_PAIR_NUM;
|
|
PairAddr->s_DefectPos = (DefectPos)1;
|
PairAddr->s_DefectPair = (DefectPair)5;
|
PairAddr->s_nDefectX = (int)(*(DefectX + ix));
|
PairAddr->s_nDefectY = (int)(*(DefectY + ix));
|
PairAddr->s_DefectType = (DefectType)*(DefectT + ix);
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + iy);
|
PairAddr->s_nGraySrc = (int)(*(pGraySrc + ix));
|
PairAddr->s_nGrayRef = (int)(*(pGrayCmp + ix));
|
PairAddr->s_nZone = (int)(*(pZoneID + ix));
|
PairAddr->s_nThresold = (int)(*(pZoneTh + ix));
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
|
PAIR_CENTER:
|
rbx++;
|
if(rbx >= rrNoD)
|
goto LOOP_PAIR_NUM;
|
|
rax = *(DefectX + rbx);
|
if(rax < rcx)
|
goto PAIR_CENTER;
|
else if(rax > rcx)
|
goto PAIR_CENTER_UNPAIR;
|
|
rdx = *(DefectT + rbx);
|
if(rdx >= 3)
|
goto PAIR_CENTER;
|
|
rax = (__int64)*(DefectT + ix);
|
if(rax == rdx)
|
goto PAIR_CENTER;
|
|
*(DefectT + rbx) = 4;
|
|
PairAddr->s_DefectPos = (DefectPos)2;
|
PairAddr->s_DefectPair = (DefectPair)1;
|
PairAddr->s_nDefectX = (int)rcx;
|
PairAddr->s_nDefectY = (int)(*(DefectY + rbx));
|
PairAddr->s_DefectType = (DefectType)rdx;
|
//PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx);
|
PairAddr->s_nGraySrc = (int)(*(pGraySrc + rbx));
|
PairAddr->s_nGrayRef = (int)(*(pGrayCmp + rbx));
|
PairAddr->s_nZone = (int)(*(pZoneID + rbx));
|
PairAddr->s_nThresold = (int)(*(pZoneTh + rbx));
|
|
PairAddr++;
|
nPair++;
|
goto LOOP_PAIR_NUM;
|
PAIR_CENTER_UNPAIR:
|
goto LOOP_PAIR_NUM;
|
|
LOOP_PAIR_NUM_END:
|
rrNoD = 0;
|
goto _return_PAIRING;
|
|
END_FUNC:
|
iy ++;
|
*endLine = (int)iy;
|
|
return (int)nPair;
|
}
|
|
int CSISAssem::ConvPixel_Intrin_Twice(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, __int64 frameWidth, __int64 iPitch, __int64 fSPR, __int64 sSPR
|
, short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable
|
, CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize
|
, __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter
|
, __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, int* endLine
|
, __int64 iPitch2, __int64 Threshold2, __int64 ThresholdSlide2)
|
{
|
//°Å´ë °áÇÔÀ» °ËÃâÇϱâ À§ÇØ ÀåÁÖ±â·Î Çѹø´õ ºñ±³ÇÑ´Ù.
|
__int64 nPair1 = ConvPixel_Intrin(pImgBuff, Threshold, maxDefect, nDefect
|
, left, right, top, bottom
|
, DefectX, DefectY, DefectT, DefectValue
|
, pGraySrc, pGrayCmp, pZoneID, pZoneTh
|
, frameWidth, iPitch, fSPR, sSPR
|
, ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable
|
, pDefectdPair, StartPair, MaxPair, PairSize
|
, dxPattern, dyPattern, yZoneByte, bReverseFilter
|
, ThresholdSlide, ThresholdSuppress, bUseUnpair, endLine
|
);
|
|
__int64 nPair2 = ConvPixel_Intrin(pImgBuff, Threshold2, maxDefect, nDefect
|
, left, right, top, bottom
|
, DefectX, DefectY, DefectT, DefectValue
|
, pGraySrc, pGrayCmp, pZoneID, pZoneTh
|
, frameWidth, iPitch2, fSPR, sSPR
|
, ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable
|
, pDefectdPair, nPair1, MaxPair, PairSize
|
, dxPattern, dyPattern, yZoneByte, bReverseFilter
|
, ThresholdSlide2, ThresholdSuppress, bUseUnpair, endLine
|
);
|
|
//Æä¾î¸µµÈ °áÇÔÁß °°Àº ÁÂÇ¥ÀÇ Pair ´Â Áö¿î´Ù.
|
__int64 iPair1, iPair2;
|
CDefectPair *pPair1, *pPair2;
|
|
for(iPair1= StartPair; iPair1 < nPair1; iPair1++)
|
{
|
pPair1= pDefectdPair+ iPair1;
|
if(pPair1->s_DefectType == DEFTYPE_DELETE)
|
continue;
|
|
for(iPair2= nPair1; iPair2 < nPair2; iPair2++)
|
{
|
pPair2= pDefectdPair+ iPair2;
|
if(pPair2->s_DefectType == DEFTYPE_DELETE)
|
continue;
|
|
if(pPair1->s_nDefectY < pPair2->s_nDefectY - 1)
|
break;
|
|
if(pPair1->s_nDefectX < pPair2->s_nDefectX - 1)
|
continue;
|
|
if(abs(pPair1->s_nDefectX - pPair2->s_nDefectX) < 2
|
&& abs(pPair1->s_nDefectY - pPair2->s_nDefectY) < 2)
|
pPair2->s_DefectType = DEFTYPE_DELETE;
|
}
|
}
|
|
int oldBlob = m_nBlob;
|
m_nPair = (int)nPair1;
|
CBlobStorage::BlobDefect();
|
CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel);
|
CBlobStorage::ShadowFilter(oldBlob, m_Param.GetRealConvPitch());
|
|
int nThres = m_Param.s_nThreshold;
|
int nDThSlide = m_Param.s_nDThSlide;
|
double dPitchConvReal = m_Param.s_dPitchConvReal;
|
double dPitchScanReal = m_Param.s_dPitchScanReal;
|
|
m_Param.s_nThreshold = m_Param.s_n2ndThres;
|
m_Param.s_nDThSlide = m_Param.s_n2ndThresSlide;
|
m_Param.s_dPitchConvReal = m_Param.s_d2ndPitch;
|
m_Param.s_dPitchScanReal = m_Param.s_d2ndPitch;
|
|
oldBlob = m_nBlob;
|
m_nPair = (int)nPair2;
|
CBlobStorage::BlobDefect();
|
CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel);
|
CBlobStorage::ShadowFilter(oldBlob, m_Param.GetRealConvPitch());
|
|
m_Param.s_nThreshold = nThres;
|
m_Param.s_nDThSlide = nDThSlide;
|
m_Param.s_dPitchConvReal = dPitchConvReal;
|
m_Param.s_dPitchScanReal = dPitchScanReal;
|
|
return (int)nPair2;
|
}
|
|
int CSISAssem::ConvPixelVertS_Intrin_Twice(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect
|
, __int64 left, __int64 right, __int64 top, __int64 bottom
|
, int* DefectX, int* DefectY, short* DefectT, short* DefectValue
|
, int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh
|
, __int64 frameWidth, __int64 iPitch16, __int64 fSPR, __int64 sSPR
|
, short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable
|
, CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize
|
, __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter
|
, __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, short* pConBuff
|
, int* endLine, __int64 ExTh, __int64 iPitch2, __int64 Threshold2
|
, __int64 ThresholdSlide2
|
)
|
{
|
//°Å´ë °áÇÔÀ» °ËÃâÇϱâ À§ÇØ ÀåÁÖ±â·Î Çѹø´õ ºñ±³ÇÑ´Ù.
|
__int64 nPair1 = ConvPixelVertS_Intrin(pImgBuff, Threshold, maxDefect, nDefect
|
, left, right, top, bottom
|
, DefectX, DefectY, DefectT, DefectValue
|
, pGraySrc, pGrayCmp, pZoneID, pZoneTh
|
, frameWidth, iPitch16, fSPR, sSPR
|
, ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable
|
, pDefectdPair, StartPair, MaxPair, PairSize
|
, dxPattern, dyPattern, yZoneByte, bReverseFilter
|
, ThresholdSlide, ThresholdSuppress, bUseUnpair, pConBuff
|
, endLine, ExTh);
|
|
__int64 nPair2 = ConvPixelVertS_Intrin(pImgBuff, Threshold2, maxDefect, nDefect
|
, left, right, top, bottom
|
, DefectX, DefectY, DefectT, DefectValue
|
, pGraySrc, pGrayCmp, pZoneID, pZoneTh
|
, frameWidth, iPitch2, fSPR, sSPR
|
, ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable
|
, pDefectdPair, nPair1, MaxPair, PairSize
|
, dxPattern, dyPattern, yZoneByte, bReverseFilter
|
, ThresholdSlide2, ThresholdSuppress, bUseUnpair, pConBuff
|
, endLine, ExTh);
|
|
//Æä¾î¸µµÈ °áÇÔÁß °°Àº ÁÂÇ¥ÀÇ Pair ´Â Áö¿î´Ù.
|
__int64 iPair1, iPair2;
|
CDefectPair *pPair1, *pPair2;
|
|
for(iPair1= StartPair; iPair1 < nPair1; iPair1++)
|
{
|
pPair1= pDefectdPair+ iPair1;
|
if(pPair1->s_DefectType == DEFTYPE_DELETE)
|
continue;
|
|
for(iPair2= nPair1; iPair2 < nPair2; iPair2++)
|
{
|
pPair2= pDefectdPair+ iPair2;
|
if(pPair2->s_DefectType == DEFTYPE_DELETE)
|
continue;
|
|
if(pPair1->s_nDefectX < pPair2->s_nDefectX - 1)
|
break;
|
|
if(pPair1->s_nDefectY < pPair2->s_nDefectY - 1)
|
continue;
|
|
if(abs(pPair1->s_nDefectX - pPair2->s_nDefectX) < 2
|
&& abs(pPair1->s_nDefectY - pPair2->s_nDefectY) < 2)
|
pPair2->s_DefectType = DEFTYPE_DELETE;
|
}
|
}
|
|
int oldBlob = m_nBlob;
|
m_nPair = (int)nPair1;
|
CBlobStorage::BlobDefectVert();
|
CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel);
|
CBlobStorage::ShadowFilterVert(oldBlob, m_Param.GetRealScanPitch());
|
|
int nThres = m_Param.s_nThreshold;
|
int nDThSlide = m_Param.s_nDThSlide;
|
double dPitchConvReal = m_Param.s_dPitchConvReal;
|
double dPitchScanReal = m_Param.s_dPitchScanReal;
|
|
m_Param.s_nThreshold = m_Param.s_n2ndThres;
|
m_Param.s_nDThSlide = m_Param.s_n2ndThresSlide;
|
m_Param.s_dPitchConvReal = m_Param.s_d2ndPitch;
|
m_Param.s_dPitchScanReal = m_Param.s_d2ndPitch;
|
|
oldBlob = m_nBlob;
|
m_nPair = (int)nPair2;
|
CBlobStorage::BlobDefectVert();
|
CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel);
|
CBlobStorage::ShadowFilterVert(oldBlob, m_Param.GetRealScanPitch());
|
|
m_Param.s_nThreshold = nThres;
|
m_Param.s_nDThSlide = nDThSlide;
|
m_Param.s_dPitchConvReal = dPitchConvReal;
|
m_Param.s_dPitchScanReal = dPitchScanReal;
|
|
return (int)nPair2;
|
}
|