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 | WELSVP_NAMESPACE_BEGIN | 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 | class CSceneChangeDetectorVideo { | 70 | class CSceneChangeDetectorVideo { |
| 59 | public: | 71 | public: |
| 60 | CSceneChangeDetectorVideo (SSceneChangeResult& sParam, int32_t iCpuFlag) : m_sParam (sParam) { | 72 | CSceneChangeDetectorVideo (SSceneChangeResult& sParam, int32_t iCpuFlag) : m_sParam (sParam) { |
| @@ -72,9 +84,27 @@ class CSceneChangeDetectorVideo { · 11 unmodified lines | |||
| 72 | } | 84 | } |
| 73 | virtual ~CSceneChangeDetectorVideo() { | 85 | virtual ~CSceneChangeDetectorVideo() { |
| 74 | } | 86 | } |
| 75 | void operator() (uint8_t* pSrcY, int32_t iSrcStrideY, uint8_t* pRefY, int32_t iRefStrideY, uint8_t*& pStaticBlockIdc) { | 87 | void operator() (SLocalParam& sLocalParam) { |
| 76 | int32_t iSad = m_pfSad (pSrcY, iSrcStrideY, pRefY, iSrcStrideY); | 88 | int32_t iRefRowStride = 0, iCurRowStride = 0; |
| 77 | m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | 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 | protected: | 109 | protected: |
| 80 | SadFuncPtr m_pfSad; | 110 | SadFuncPtr m_pfSad; |
| @@ -88,14 +118,53 @@ class CSceneChangeDetectorScreen : public CSceneChangeDetectorVideo { · 7 unmodified lines | |||
| 88 | } | 118 | } |
| 89 | virtual ~CSceneChangeDetectorScreen() { | 119 | virtual ~CSceneChangeDetectorScreen() { |
| 90 | } | 120 | } |
| 91 | void operator() (uint8_t* pSrcY, int32_t iSrcStrideY, uint8_t* pRefY, int32_t iRefStrideY, uint8_t*& pStaticBlockIdc) { | 121 | void operator() (SLocalParam& sLocalParam) { |
| 92 | int32_t iSad = m_pfSad (pSrcY, iSrcStrideY, pRefY, iSrcStrideY); | 122 | bool bScrollDetectFlag = m_sParam.sScrollResult.bScrollDetectFlag; |
| 93 | if (iSad == 0) { | 123 | int32_t iScrollMvX = m_sParam.sScrollResult.iScrollMvX; |
| 94 | *pStaticBlockIdc ++ = COLLOCATED_STATIC; | 124 | int32_t iScrollMvY = m_sParam.sScrollResult.iScrollMvY; |
| 95 | } else { | 125 | |
| 96 | m_sParam.iFrameComplexity += iSad; | 126 | int32_t iRefRowStride = 0, iCurRowStride = 0; |
| 97 | m_sParam.iMotionBlockNum += iSad > HIGH_MOTION_BLOCK_THRESHOLD; | 127 | uint8_t* pRefY = sLocalParam.pRefY; |
| 98 | *pStaticBlockIdc ++ = NO_STATIC; | 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 | EResult Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) { | 183 | EResult Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) { |
| 115 | EResult eReturn = RET_INVALIDPARAM; | 184 | EResult eReturn = RET_INVALIDPARAM; |
| 116 | int32_t iWidth = pSrcPixMap->sRect.iRectWidth; | 185 | |
| 117 | int32_t iHeight = pSrcPixMap->sRect.iRectHeight; | 186 | m_sLocalParam.iWidth = pSrcPixMap->sRect.iRectWidth; |
| 118 | int32_t iBlock8x8Width = iWidth >> 3; | 187 | m_sLocalParam.iHeight = pSrcPixMap->sRect.iRectHeight; |
| 119 | int32_t iBlock8x8Height = iHeight >> 3; | 188 | m_sLocalParam.iBlock8x8Width = m_sLocalParam.iWidth >> 3; |
| 120 | int32_t iBlock8x8Num = iBlock8x8Width * iBlock8x8Height; | 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 | int32_t iSceneChangeThresholdLarge = WelsStaticCast (int32_t, | 197 | int32_t iSceneChangeThresholdLarge = WelsStaticCast (int32_t, |
| 122 | SCENE_CHANGE_MOTION_RATIO_LARGE * iBlock8x8Num + 0.5f + PESN); | 198 | SCENE_CHANGE_MOTION_RATIO_LARGE * iBlock8x8Num + 0.5f + PESN); |
| 123 | int32_t iSceneChangeThresholdMedium = WelsStaticCast (int32_t, | 199 | int32_t iSceneChangeThresholdMedium = WelsStaticCast (int32_t, |
| 124 | SCENE_CHANGE_MOTION_RATIO_MEDIUM * iBlock8x8Num + 0.5f + PESN); | 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 | m_sSceneChangeParam.iMotionBlockNum = 0; | 202 | m_sSceneChangeParam.iMotionBlockNum = 0; |
| 141 | m_sSceneChangeParam.iFrameComplexity = 0; | 203 | m_sSceneChangeParam.iFrameComplexity = 0; |
| 142 | m_sSceneChangeParam.eSceneChangeIdc = SIMILAR_SCENE; | 204 | m_sSceneChangeParam.eSceneChangeIdc = SIMILAR_SCENE; |
| 143 | 205 | ||
| 144 | for (int32_t j = 0; j < iBlock8x8Height; j ++) { | 206 | m_cDetector (m_sLocalParam); |
| 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 | } | ||
| 157 | 207 | ||
| 158 | if (m_sSceneChangeParam.iMotionBlockNum >= iSceneChangeThresholdLarge) { | 208 | if (m_sSceneChangeParam.iMotionBlockNum >= iSceneChangeThresholdLarge) { |
| 159 | m_sSceneChangeParam.eSceneChangeIdc = LARGE_CHANGED_SCENE; | 209 | m_sSceneChangeParam.eSceneChangeIdc = LARGE_CHANGED_SCENE; |
| @@ -183,6 +233,7 @@ class CSceneChangeDetection : public IStrategy { · 23 unmodified lines | |||
| 183 | } | 233 | } |
| 184 | private: | 234 | private: |
| 185 | SSceneChangeResult m_sSceneChangeParam; | 235 | SSceneChangeResult m_sSceneChangeParam; |
| 236 | SLocalParam m_sLocalParam; | ||
| 186 | T m_cDetector; | 237 | T m_cDetector; |
| 187 | }; | 238 | }; |
| 188 | 239 | ||
| @@ -105,10 +105,6 @@ void CScrollDetection::ScrollDetectionWithoutMask (SPixMap* pSrcPixMap, SPixMap* · 104 unmodified lines | |||
| 105 | iWidth /= 2; | 105 | iWidth /= 2; |
| 106 | iStartX += iWidth / 2; | 106 | iStartX += iWidth / 2; |
| 107 | 107 | ||
| 108 | m_sScrollDetectionParam.iScrollMvX = 0; | ||
| 109 | m_sScrollDetectionParam.iScrollMvY = 0; | ||
| 110 | m_sScrollDetectionParam.bScrollDetectFlag = false; | ||
| 111 | |||
| 112 | ScrollDetectionCore (pSrcPixMap, pRefPixMap, iWidth, iHeight, iStartX, iStartY, m_sScrollDetectionParam); | 108 | ScrollDetectionCore (pSrcPixMap, pRefPixMap, iWidth, iHeight, iStartX, iStartY, m_sScrollDetectionParam); |
| 113 | 109 | ||
| 114 | if (m_sScrollDetectionParam.bScrollDetectFlag && m_sScrollDetectionParam.iScrollMvY) | 110 | if (m_sScrollDetectionParam.bScrollDetectFlag && m_sScrollDetectionParam.iScrollMvY) |