History

enable Scroll detection into workflow

lyao2 committed 12 years ago

Commit bd7c04f1 parent 3d599055 files · +123 −66Browse files

Showing the changes to codec/processing/src (2 of 5 files). Show all

Unified · Split

2 files
  1. codec/processing/src/scenechangedetection/SceneChangeDetection.h +94 −43
  2. codec/processing/src/scrolldetection/ScrollDetection.cpp +0 −4
codec/processing/src/scenechangedetection/SceneChangeDetection.h+94−43
@@ -55,6 +55,18 @@ · 54 unmodified lines
55 55
56WELSVP_NAMESPACE_BEGIN56WELSVP_NAMESPACE_BEGIN
57 57
58typedef 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
58class CSceneChangeDetectorVideo {70class 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
codec/processing/src/scrolldetection/ScrollDetection.cpp+0−4
@@ -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)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t