History

Squashed commit of the following:

commit a83d75aed2fae9e0ae877642fbbd8e82b6bacca6 Author: lyao2 <lyao2@LYAO2-WS01.cisco.com> Date: Fri Apr 4 15:40:54 2014 +0800 check makefile commit 097bd858ef46b6febda098253cc0d48e2eb0c95c Author: lyao2 <lyao2@LYAO2-WS01.cisco.com> Date: Fri Apr 4 09:43:24 2014 +0800 add mask flag commit 34e86276000bac158abdfb839b1a5aaebac1e235 add scroll detection files

lyao2 committed 12 years ago

Commit 7cbc76d1 parent dcd38808 files · +489 −0Browse files

Showing the changes to codec/processing/src/scrolldetection/ScrollDetectionFuncs.cpp (1 of 8 files). Show all

Unified · Split

codec/processing/src/scrolldetection/ScrollDetectionFuncs.cpp+202−0
@@ -0,0 +1,202 @@
1/*!
2 * \copy
3 * Copyright (c) 2013, Cisco Systems
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 */
32
33#include "ScrollDetection.h"
34#include "ScrollDetectionFuncs.h"
35
36WELSVP_NAMESPACE_BEGIN
37
38int32_t CheckLine(uint8_t* pData, int32_t iWidth){
39 int32_t iQualified = 0;
40 int32_t iColorMap[8] = {0};
41 int32_t iChangedTimes = 0;
42 int32_t iColorCounts = 0;
43
44 RECORD_COLOR(pData[0], iColorMap);
45
46 for (int32_t i=1; i<iWidth; i++){
47 RECORD_COLOR(pData[i], iColorMap);
48 iChangedTimes += (pData[i] != pData[i-1]);
49 }
50 for (int32_t i=0; i<8; i++)
51 for (int32_t j=0; j<32; j++)
52 iColorCounts += ((iColorMap[i] >> j)&1);
53
54 switch(iColorCounts){
55 case 1:
56 iQualified = 0;
57 break;
58 case 2:
59 case 3:
60 iQualified = (iChangedTimes > 3);
61 break;
62 default:
63 iQualified = 1;
64 break;
65 }
66 return iQualified;
67}
68
69int32_t SelectTestLine(uint8_t* pY, int32_t iWidth, int32_t iHeight, int32_t iPicHeight,
70 int32_t iStride, int32_t iOffsetX, int32_t iOffsetY){
71 const int32_t kiHalfHeight = iHeight >> 1;
72 const int32_t kiMidPos = iOffsetY + kiHalfHeight;
73 int32_t TestPos = kiMidPos;
74 int32_t iOffsetAbs;
75 uint8_t* pTmp;
76
77 for (iOffsetAbs = 0; iOffsetAbs < kiHalfHeight; iOffsetAbs++){
78 TestPos = kiMidPos + iOffsetAbs;
79 if (TestPos < iPicHeight){
80 pTmp = pY + TestPos * iStride + iOffsetX;
81 if (CheckLine(pTmp, iWidth)) break;
82 }
83 TestPos = kiMidPos - iOffsetAbs;
84 if(TestPos >=0){
85 pTmp = pY + TestPos * iStride + iOffsetX;
86 if (CheckLine(pTmp, iWidth)) break;
87 }
88 }
89 if (iOffsetAbs == kiHalfHeight)
90 TestPos = -1;
91 return TestPos;
92}
93
94/*
95 * compare pixel line between previous and current one
96 * return: 0 for totally equal, otherwise 1
97 */
98int32_t CompareLine(uint8_t *pYSrc, uint8_t *pYRef, const int32_t kiWidth)
99{
100 int32_t iCmp = 1;
101
102 if ( *((int32_t*)pYSrc) != *((int32_t*)pYRef)) return 1;
103 if ( *((int32_t*)(pYSrc + 4)) != *((int32_t*)(pYRef + 4))) return 1;
104 if ( *((int32_t*)(pYSrc + 8)) != *((int32_t*)(pYRef + 8))) return 1;
105 if ( kiWidth > 12 )
106 iCmp = WelsMemcmp(pYSrc+12, pYRef+12, kiWidth-12);
107 return iCmp;
108}
109
110void ScrollDetectionCore(SPixMap* pSrcPixMap, SPixMap* pRefPixMap, int32_t iWidth, int32_t iHeight,
111 int32_t iOffsetX, int32_t iOffsetY, SScrollDetectionParam &sScrollDetectionParam){
112 bool bScrollDetected = 0;
113 uint8_t* pYLine;
114 uint8_t* pYTmp;
115 int32_t iTestPos, iSearchPos = 0, iOffsetAbs, iMaxAbs;
116 int32_t iPicHeight = pRefPixMap->sRect.iRectHeight;
117 int32_t iMinHeight = WELS_MAX(iOffsetY,0);
118 int32_t iMaxHeight = WELS_MIN(iOffsetY + iHeight - 1, iPicHeight-1) ;//offset_y + height - 1;//
119 uint8_t* pYRef, *pYSrc;
120 int32_t iYStride;
121
122 pYRef = (uint8_t*)pRefPixMap->pPixel[0];
123 pYSrc = (uint8_t*)pSrcPixMap->pPixel[0];
124 iYStride = pRefPixMap->iStride[0];
125
126 iTestPos = SelectTestLine(pYSrc, iWidth, iHeight, iPicHeight, iYStride, iOffsetX, iOffsetY);
127
128 if (iTestPos == -1){
129 sScrollDetectionParam.bScrollDetectFlag = 0;
130 return;
131 }
132 pYLine = pYSrc + iYStride * iTestPos + iOffsetX;
133 iMaxAbs = WELS_MIN(WELS_MAX(iTestPos-iMinHeight-1, iMaxHeight-iTestPos),MAX_SCROLL_MV_Y);
134 iSearchPos = iTestPos;
135 for (iOffsetAbs = 0; iOffsetAbs <= iMaxAbs; iOffsetAbs++){
136 iSearchPos = iTestPos + iOffsetAbs;
137 if (iSearchPos <= iMaxHeight){
138 pYTmp = pYRef + iSearchPos * iYStride + iOffsetX;
139 if (!CompareLine(pYLine, pYTmp, iWidth)){
140 uint8_t *pYUpper, *pYLineUpper;
141 int32_t iCheckedLines;
142 int32_t iLowOffset = WELS_MIN(iMaxHeight - iSearchPos, CHECK_OFFSET);
143 int32_t i;
144
145 iCheckedLines = WELS_MIN(iTestPos - iMinHeight + iLowOffset, 2 * CHECK_OFFSET);
146 pYUpper = pYTmp - (iCheckedLines - iLowOffset) * iYStride;
147 pYLineUpper = pYLine - (iCheckedLines - iLowOffset) * iYStride;
148
149 for(i = 0; i < iCheckedLines; i ++){
150 if (CompareLine(pYLineUpper, pYUpper, iWidth)){
151 break;
152 }
153 pYUpper += iYStride;
154 pYLineUpper += iYStride;
155 }
156 if (i == iCheckedLines){
157 bScrollDetected=1;
158 break;
159 }
160 }
161 }
162
163 iSearchPos = iTestPos - iOffsetAbs-1;
164 if (iSearchPos >= iMinHeight){
165 pYTmp = pYRef + iSearchPos * iYStride + iOffsetX;
166 if (!CompareLine(pYLine, pYTmp, iWidth))
167 {
168 uint8_t *pYUpper, *pYLineUpper;
169 int32_t iCheckedLines;
170 int32_t iUpOffset = WELS_MIN(iSearchPos - iMinHeight, CHECK_OFFSET);
171 int32_t i;
172
173 pYUpper = pYTmp - iUpOffset * iYStride;
174 pYLineUpper = pYLine - iUpOffset * iYStride;
175 iCheckedLines = WELS_MIN(iMaxHeight - iTestPos + iUpOffset, 2 * CHECK_OFFSET);
176
177 for(i = 0; i < iCheckedLines; i ++){
178 if (CompareLine(pYLineUpper,pYUpper, iWidth)){
179 break;
180 }
181 pYUpper += iYStride;
182 pYLineUpper += iYStride;
183 }
184 if (i == iCheckedLines){
185 bScrollDetected=1;
186 break;
187 }
188 }
189 }
190 }
191
192 if (!bScrollDetected){
193 sScrollDetectionParam.bScrollDetectFlag = 0;
194 }
195 else{
196 sScrollDetectionParam.bScrollDetectFlag = 1;
197 sScrollDetectionParam.iScrollMvY = iSearchPos - iTestPos; // pre_pos - cur_pos, change to mv
198 sScrollDetectionParam.iScrollMvX = 0;
199 }
200}
201
202WELSVP_NAMESPACE_END

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