Showing the changes to codec/processing/src (2 of 5 files). Show all
Unified · Split
| @@ -55,6 +55,18 @@ · 54 unmodified lines | ||
| 55 | 55 | |
| 56 | 56 | WELSVP_NAMESPACE_BEGIN |
| 57 | 57 | |
| 58 | +typedef struct { | |
| 59 | + int32_t iWidth; | |
| 60 | + int32_t iHeight; | |
| 61 | + int32_t iBlock8x8Width; | |
| 62 | + int32_t iBlock8x8Height; | |
| 63 | + uint8_t* pRefY; | |
| 64 | + uint8_t* pCurY; | |
| 65 | + int32_t iRefStride; | |
| 66 | + int32_t iCurStride; | |
| 67 | + uint8_t* pStaticBlockIdc; | |
| 68 | +} SLocalParam; | |
| 69 | + | |
| 58 | 70 | class CSceneChangeDetectorVideo { |
| 59 | 71 | public: |
| 60 | 72 | CSceneChangeDetectorVideo (SSceneChangeResult& sParam, int32_t iCpuFlag) : m_sParam (sParam) { |
| @@ -72,9 +84,27 @@ class CSceneChangeDetectorVideo { · 11 unmodified lines | ||
| 72 | 84 | } |
| 73 | 85 | virtual ~CSceneChangeDetectorVideo() { |
| 74 | 86 | } |
| 75 | − void operator() (uint8_t* pSrcY, int32_t iSrcStrideY, uint8_t* pRefY, int32_t iRefStrideY, uint8_t*& pStaticBlockIdc) { | |
| 76 | − int32_t iSad = m_pfSad (pSrcY, iSrcStrideY, pRefY, iSrcStrideY); | |
| 77 | − m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | |
| 87 | + void operator() (SLocalParam& sLocalParam) { | |
| 88 | + int32_t iRefRowStride = 0, iCurRowStride = 0; | |
| 89 | + uint8_t* pRefY = sLocalParam.pRefY; | |
| 90 | + uint8_t* pCurY = sLocalParam.pCurY; | |
| 91 | + uint8_t* pRefTmp = NULL, *pCurTmp = NULL; | |
| 92 | + | |
| 93 | + iRefRowStride = sLocalParam.iRefStride << 3; | |
| 94 | + iCurRowStride = sLocalParam.iCurStride << 3; | |
| 95 | + | |
| 96 | + for (int32_t j = 0; j < sLocalParam.iBlock8x8Height; j++) { | |
| 97 | + pRefTmp = pRefY; | |
| 98 | + pCurTmp = pCurY; | |
| 99 | + for (int32_t i = 0; i < sLocalParam.iBlock8x8Width; i++) { | |
| 100 | + int32_t iSad = m_pfSad (pCurTmp, sLocalParam.iCurStride, pRefTmp, sLocalParam.iRefStride); | |
| 101 | + m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | |
| 102 | + pRefTmp += 8; | |
| 103 | + pCurTmp += 8; | |
| 104 | + } | |
| 105 | + pRefY += iRefRowStride; | |
| 106 | + pCurY += iCurRowStride; | |
| 107 | + } | |
| 78 | 108 | } |
| 79 | 109 | protected: |
| 80 | 110 | SadFuncPtr m_pfSad; |
| @@ -88,14 +118,53 @@ class CSceneChangeDetectorScreen : public CSceneChangeDetectorVideo { · 7 unmodified lines | ||
| 88 | 118 | } |
| 89 | 119 | virtual ~CSceneChangeDetectorScreen() { |
| 90 | 120 | } |
| 91 | − void operator() (uint8_t* pSrcY, int32_t iSrcStrideY, uint8_t* pRefY, int32_t iRefStrideY, uint8_t*& pStaticBlockIdc) { | |
| 92 | − int32_t iSad = m_pfSad (pSrcY, iSrcStrideY, pRefY, iSrcStrideY); | |
| 93 | − if (iSad == 0) { | |
| 94 | − *pStaticBlockIdc ++ = COLLOCATED_STATIC; | |
| 95 | − } else { | |
| 96 | − m_sParam.iFrameComplexity += iSad; | |
| 97 | − m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | |
| 98 | − *pStaticBlockIdc ++ = NO_STATIC; | |
| 121 | + void operator() (SLocalParam& sLocalParam) { | |
| 122 | + bool bScrollDetectFlag = m_sParam.sScrollResult.bScrollDetectFlag; | |
| 123 | + int32_t iScrollMvX = m_sParam.sScrollResult.iScrollMvX; | |
| 124 | + int32_t iScrollMvY = m_sParam.sScrollResult.iScrollMvY; | |
| 125 | + | |
| 126 | + int32_t iRefRowStride = 0, iCurRowStride = 0; | |
| 127 | + uint8_t* pRefY = sLocalParam.pRefY; | |
| 128 | + uint8_t* pCurY = sLocalParam.pCurY; | |
| 129 | + uint8_t* pRefTmp = NULL, *pCurTmp = NULL; | |
| 130 | + int32_t iWidth = sLocalParam.iWidth; | |
| 131 | + int32_t iHeight = sLocalParam.iHeight; | |
| 132 | + | |
| 133 | + iRefRowStride = sLocalParam.iRefStride << 3; | |
| 134 | + iCurRowStride = sLocalParam.iCurStride << 3; | |
| 135 | + | |
| 136 | + for (int32_t j = 0; j < sLocalParam.iBlock8x8Height; j++) { | |
| 137 | + pRefTmp = pRefY; | |
| 138 | + pCurTmp = pCurY; | |
| 139 | + for (int32_t i = 0; i < sLocalParam.iBlock8x8Width; i++) { | |
| 140 | + int32_t iBlockPointX = i << 3; | |
| 141 | + int32_t iBlockPointY = j << 3; | |
| 142 | + uint8_t uiBlockIdcTmp = NO_STATIC; | |
| 143 | + int32_t iSad = m_pfSad (pCurTmp, sLocalParam.iCurStride, pRefTmp, sLocalParam.iRefStride); | |
| 144 | + if (iSad == 0) { | |
| 145 | + uiBlockIdcTmp = COLLOCATED_STATIC; | |
| 146 | + } else if (bScrollDetectFlag && (!iScrollMvX || !iScrollMvY) && (iBlockPointX + iScrollMvX >= 0) | |
| 147 | + && (iBlockPointX + iScrollMvX <= iWidth - 8) && | |
| 148 | + (iBlockPointY + iScrollMvY >= 0) && (iBlockPointY + iScrollMvY <= iHeight - 8)) { | |
| 149 | + uint8_t* pRefTmpScroll = pRefTmp + iScrollMvY * sLocalParam.iRefStride + iScrollMvX; | |
| 150 | + int32_t iSadScroll = m_pfSad (pCurTmp, sLocalParam.iCurStride, pRefTmpScroll, sLocalParam.iRefStride); | |
| 151 | + | |
| 152 | + if (iSadScroll == 0) { | |
| 153 | + uiBlockIdcTmp = SCROLLED_STATIC; | |
| 154 | + } else { | |
| 155 | + m_sParam.iFrameComplexity += iSad; | |
| 156 | + m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | |
| 157 | + } | |
| 158 | + } else { | |
| 159 | + m_sParam.iFrameComplexity += iSad; | |
| 160 | + m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | |
| 161 | + } | |
| 162 | + * (sLocalParam.pStaticBlockIdc) ++ = uiBlockIdcTmp; | |
| 163 | + pRefTmp += 8; | |
| 164 | + pCurTmp += 8; | |
| 165 | + } | |
| 166 | + pRefY += iRefRowStride; | |
| 167 | + pCurY += iCurRowStride; | |
| 99 | 168 | } |
| 100 | 169 | } |
| 101 | 170 | }; |
| @@ -113,47 +182,28 @@ class CSceneChangeDetection : public IStrategy { · 11 unmodified lines | ||
| 113 | 182 | |
| 114 | 183 | EResult Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) { |
| 115 | 184 | EResult eReturn = RET_INVALIDPARAM; |
| 116 | − int32_t iWidth = pSrcPixMap->sRect.iRectWidth; | |
| 117 | − int32_t iHeight = pSrcPixMap->sRect.iRectHeight; | |
| 118 | − int32_t iBlock8x8Width = iWidth >> 3; | |
| 119 | − int32_t iBlock8x8Height = iHeight >> 3; | |
| 120 | − int32_t iBlock8x8Num = iBlock8x8Width * iBlock8x8Height; | |
| 185 | + | |
| 186 | + m_sLocalParam.iWidth = pSrcPixMap->sRect.iRectWidth; | |
| 187 | + m_sLocalParam.iHeight = pSrcPixMap->sRect.iRectHeight; | |
| 188 | + m_sLocalParam.iBlock8x8Width = m_sLocalParam.iWidth >> 3; | |
| 189 | + m_sLocalParam.iBlock8x8Height = m_sLocalParam.iHeight >> 3; | |
| 190 | + m_sLocalParam.pRefY = (uint8_t*)pRefPixMap->pPixel[0]; | |
| 191 | + m_sLocalParam.pCurY = (uint8_t*)pSrcPixMap->pPixel[0]; | |
| 192 | + m_sLocalParam.iRefStride = pRefPixMap->iStride[0]; | |
| 193 | + m_sLocalParam.iCurStride = pSrcPixMap->iStride[0]; | |
| 194 | + m_sLocalParam.pStaticBlockIdc = m_sSceneChangeParam.pStaticBlockIdc; | |
| 195 | + | |
| 196 | + int32_t iBlock8x8Num = m_sLocalParam.iBlock8x8Width * m_sLocalParam.iBlock8x8Height; | |
| 121 | 197 | int32_t iSceneChangeThresholdLarge = WelsStaticCast (int32_t, |
| 122 | 198 | SCENE_CHANGE_MOTION_RATIO_LARGE * iBlock8x8Num + 0.5f + PESN); |
| 123 | 199 | int32_t iSceneChangeThresholdMedium = WelsStaticCast (int32_t, |
| 124 | 200 | SCENE_CHANGE_MOTION_RATIO_MEDIUM * iBlock8x8Num + 0.5f + PESN); |
| 125 | − uint8_t* pRefY = NULL, *pCurY = NULL; | |
| 126 | − int32_t iRefStride = 0, iCurStride = 0; | |
| 127 | − int32_t iRefRowStride = 0, iCurRowStride = 0; | |
| 128 | − uint8_t* pRefTmp = NULL, *pCurTmp = NULL; | |
| 129 | − uint8_t* pStaticBlockIdc = m_sSceneChangeParam.pStaticBlockIdc; | |
| 130 | − | |
| 131 | − pRefY = (uint8_t*)pRefPixMap->pPixel[0]; | |
| 132 | − pCurY = (uint8_t*)pSrcPixMap->pPixel[0]; | |
| 133 | − | |
| 134 | − iRefStride = pRefPixMap->iStride[0]; | |
| 135 | − iCurStride = pSrcPixMap->iStride[0]; | |
| 136 | − | |
| 137 | − iRefRowStride = pRefPixMap->iStride[0] << 3; | |
| 138 | − iCurRowStride = pSrcPixMap->iStride[0] << 3; | |
| 139 | 201 | |
| 140 | 202 | m_sSceneChangeParam.iMotionBlockNum = 0; |
| 141 | 203 | m_sSceneChangeParam.iFrameComplexity = 0; |
| 142 | 204 | m_sSceneChangeParam.eSceneChangeIdc = SIMILAR_SCENE; |
| 143 | 205 | |
| 144 | − for (int32_t j = 0; j < iBlock8x8Height; j ++) { | |
| 145 | − pRefTmp = pRefY; | |
| 146 | − pCurTmp = pCurY; | |
| 147 | − | |
| 148 | − for (int32_t i = 0; i < iBlock8x8Width; i++) { | |
| 149 | − m_cDetector (pRefTmp, iRefStride, pCurTmp, iCurStride, pStaticBlockIdc); | |
| 150 | − pRefTmp += 8; | |
| 151 | − pCurTmp += 8; | |
| 152 | − } | |
| 153 | − | |
| 154 | − pRefY += iRefRowStride; | |
| 155 | − pCurY += iCurRowStride; | |
| 156 | − } | |
| 206 | + m_cDetector (m_sLocalParam); | |
| 157 | 207 | |
| 158 | 208 | if (m_sSceneChangeParam.iMotionBlockNum >= iSceneChangeThresholdLarge) { |
| 159 | 209 | m_sSceneChangeParam.eSceneChangeIdc = LARGE_CHANGED_SCENE; |
| @@ -183,6 +233,7 @@ class CSceneChangeDetection : public IStrategy { · 23 unmodified lines | ||
| 183 | 233 | } |
| 184 | 234 | private: |
| 185 | 235 | SSceneChangeResult m_sSceneChangeParam; |
| 236 | + SLocalParam m_sLocalParam; | |
| 186 | 237 | T m_cDetector; |
| 187 | 238 | }; |
| 188 | 239 | |
| @@ -105,10 +105,6 @@ void CScrollDetection::ScrollDetectionWithoutMask (SPixMap* pSrcPixMap, SPixMap* · 104 unmodified lines | ||
| 105 | 105 | iWidth /= 2; |
| 106 | 106 | iStartX += iWidth / 2; |
| 107 | 107 | |
| 108 | − m_sScrollDetectionParam.iScrollMvX = 0; | |
| 109 | − m_sScrollDetectionParam.iScrollMvY = 0; | |
| 110 | − m_sScrollDetectionParam.bScrollDetectFlag = false; | |
| 111 | − | |
| 112 | 108 | ScrollDetectionCore (pSrcPixMap, pRefPixMap, iWidth, iHeight, iStartX, iStartY, m_sScrollDetectionParam); |
| 113 | 109 | |
| 114 | 110 | if (m_sScrollDetectionParam.bScrollDetectFlag && m_sScrollDetectionParam.iScrollMvY) |