History

make the decoder compile and run with treason

Sigrid Solveig Haflínudóttir committed 5 years ago

Commit 37423d41 parent be8e62f71 files · +961 −1217Browse files

Showing the changes to codec/decoder/core/src/cabac_decoder.cpp (1 of 71 files). Show all

Unified · Split

codec/decoder/core/src/cabac_decoder.cpp+57−57
@@ -31,7 +31,7 @@ · 30 unmodified lines
31 * cabac_decoder.cpp: deals with cabac state transition and related functions31 * cabac_decoder.cpp: deals with cabac state transition and related functions
32 */32 */
33#include "cabac_decoder.h"33#include "cabac_decoder.h"
34namespace WelsDec {34
35static const int16_t g_kMvdBinPos2Ctx [8] = {0, 1, 2, 3, 3, 3, 3, 3};35static const int16_t g_kMvdBinPos2Ctx [8] = {0, 1, 2, 3, 3, 3, 3, 3};
36 36
37void WelsCabacGlobalInit (PWelsDecoderContext pCtx) {37void WelsCabacGlobalInit (PWelsDecoderContext pCtx) {
@@ -41,8 +41,8 @@ void WelsCabacGlobalInit (PWelsDecoderContext pCtx) { · 3 unmodified lines
41 int32_t m = g_kiCabacGlobalContextIdx[iIdx][iModel][0];41 int32_t m = g_kiCabacGlobalContextIdx[iIdx][iModel][0];
42 int32_t n = g_kiCabacGlobalContextIdx[iIdx][iModel][1];42 int32_t n = g_kiCabacGlobalContextIdx[iIdx][iModel][1];
43 int32_t iPreCtxState = WELS_CLIP3 ((((m * iQp) >> 4) + n), 1, 126);43 int32_t iPreCtxState = WELS_CLIP3 ((((m * iQp) >> 4) + n), 1, 126);
44 uint8_t uiValMps = 0;44 uint8_t uiValMps;
45 uint8_t uiStateIdx = 0;45 uint8_t uiStateIdx;
46 if (iPreCtxState <= 63) {46 if (iPreCtxState <= 63) {
47 uiStateIdx = 63 - iPreCtxState;47 uiStateIdx = 63 - iPreCtxState;
48 uiValMps = 0;48 uiValMps = 0;
@@ -59,7 +59,8 @@ void WelsCabacGlobalInit (PWelsDecoderContext pCtx) { · 10 unmodified lines
59 59
60// ------------------- 1. context initialization60// ------------------- 1. context initialization
61void WelsCabacContextInit (PWelsDecoderContext pCtx, uint8_t eSliceType, int32_t iCabacInitIdc, int32_t iQp) {61void WelsCabacContextInit (PWelsDecoderContext pCtx, uint8_t eSliceType, int32_t iCabacInitIdc, int32_t iQp) {
62 int32_t iIdx = pCtx->eSliceType == WelsCommon::I_SLICE ? 0 : iCabacInitIdc + 1;62 int32_t iIdx = pCtx->eSliceType == I_SLICE ? 0 : iCabacInitIdc + 1;
63 (void)eSliceType;
63 if (!pCtx->bCabacInited) {64 if (!pCtx->bCabacInited) {
64 WelsCabacGlobalInit (pCtx);65 WelsCabacGlobalInit (pCtx);
65 }66 }
@@ -102,43 +103,43 @@ void RestoreCabacDecEngineToBS (PWelsCabacDecEngine pDecEngine, PBitStringAux pB · 36 unmodified lines
102}103}
103 104
104// ------------------- 3. actual decoding105// ------------------- 3. actual decoding
105int32_t Read32BitsCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiValue, int32_t& iNumBitsRead) {106int32_t Read32BitsCabac (PWelsCabacDecEngine pDecEngine, uint32_t *uiValue, int32_t *iNumBitsRead) {
106 intX_t iLeftBytes = pDecEngine->pBuffEnd - pDecEngine->pBuffCurr;107 intX_t iLeftBytes = pDecEngine->pBuffEnd - pDecEngine->pBuffCurr;
107 iNumBitsRead = 0;108 *iNumBitsRead = 0;
108 uiValue = 0;109 *uiValue = 0;
109 if (iLeftBytes <= 0) {110 if (iLeftBytes <= 0) {
110 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_CABAC_NO_BS_TO_READ);111 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_CABAC_NO_BS_TO_READ);
111 }112 }
112 switch (iLeftBytes) {113 switch (iLeftBytes) {
113 case 3:114 case 3:
114 uiValue = ((pDecEngine->pBuffCurr[0]) << 16 | (pDecEngine->pBuffCurr[1]) << 8 | (pDecEngine->pBuffCurr[2]));115 *uiValue = ((pDecEngine->pBuffCurr[0]) << 16 | (pDecEngine->pBuffCurr[1]) << 8 | (pDecEngine->pBuffCurr[2]));
115 pDecEngine->pBuffCurr += 3;116 pDecEngine->pBuffCurr += 3;
116 iNumBitsRead = 24;117 *iNumBitsRead = 24;
117 break;118 break;
118 case 2:119 case 2:
119 uiValue = ((pDecEngine->pBuffCurr[0]) << 8 | (pDecEngine->pBuffCurr[1]));120 *uiValue = ((pDecEngine->pBuffCurr[0]) << 8 | (pDecEngine->pBuffCurr[1]));
120 pDecEngine->pBuffCurr += 2;121 pDecEngine->pBuffCurr += 2;
121 iNumBitsRead = 16;122 *iNumBitsRead = 16;
122 break;123 break;
123 case 1:124 case 1:
124 uiValue = pDecEngine->pBuffCurr[0];125 *uiValue = pDecEngine->pBuffCurr[0];
125 pDecEngine->pBuffCurr += 1;126 pDecEngine->pBuffCurr += 1;
126 iNumBitsRead = 8;127 *iNumBitsRead = 8;
127 break;128 break;
128 default:129 default:
129 uiValue = ((pDecEngine->pBuffCurr[0] << 24) | (pDecEngine->pBuffCurr[1]) << 16 | (pDecEngine->pBuffCurr[2]) << 8 |130 *uiValue = ((pDecEngine->pBuffCurr[0] << 24) | (pDecEngine->pBuffCurr[1]) << 16 | (pDecEngine->pBuffCurr[2]) << 8 |
130 (pDecEngine->pBuffCurr[3]));131 (pDecEngine->pBuffCurr[3]));
131 pDecEngine->pBuffCurr += 4;132 pDecEngine->pBuffCurr += 4;
132 iNumBitsRead = 32;133 *iNumBitsRead = 32;
133 break;134 break;
134 }135 }
135 return ERR_NONE;136 return ERR_NONE;
136}137}
137 138
138int32_t DecodeBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, uint32_t& uiBinVal) {139int32_t DecodeBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, uint32_t *uiBinVal) {
139 int32_t iErrorInfo = ERR_NONE;140 int32_t iErrorInfo;
140 uint32_t uiState = pBinCtx->uiState;141 uint32_t uiState = pBinCtx->uiState;
141 uiBinVal = pBinCtx->uiMPS;142 *uiBinVal = pBinCtx->uiMPS;
142 uint64_t uiOffset = pDecEngine->uiOffset;143 uint64_t uiOffset = pDecEngine->uiOffset;
143 uint64_t uiRange = pDecEngine->uiRange;144 uint64_t uiRange = pDecEngine->uiRange;
144 145
@@ -147,7 +148,7 @@ int32_t DecodeBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, u · 2 unmodified lines
147 uiRange -= uiRangeLPS;148 uiRange -= uiRangeLPS;
148 if (uiOffset >= (uiRange << pDecEngine->iBitsLeft)) { //LPS149 if (uiOffset >= (uiRange << pDecEngine->iBitsLeft)) { //LPS
149 uiOffset -= (uiRange << pDecEngine->iBitsLeft);150 uiOffset -= (uiRange << pDecEngine->iBitsLeft);
150 uiBinVal ^= 0x0001;151 *uiBinVal ^= 0x0001;
151 if (!uiState)152 if (!uiState)
152 pBinCtx->uiMPS ^= 0x01;153 pBinCtx->uiMPS ^= 0x01;
153 pBinCtx->uiState = g_kuiStateTransTable[uiState][0];154 pBinCtx->uiState = g_kuiStateTransTable[uiState][0];
@@ -171,7 +172,7 @@ int32_t DecodeBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, u · 17 unmodified lines
171 }172 }
172 uint32_t uiVal = 0;173 uint32_t uiVal = 0;
173 int32_t iNumBitsRead = 0;174 int32_t iNumBitsRead = 0;
174 iErrorInfo = Read32BitsCabac (pDecEngine, uiVal, iNumBitsRead);175 iErrorInfo = Read32BitsCabac (pDecEngine, &uiVal, &iNumBitsRead);
175 pDecEngine->uiOffset = (uiOffset << iNumBitsRead) | uiVal;176 pDecEngine->uiOffset = (uiOffset << iNumBitsRead) | uiVal;
176 pDecEngine->iBitsLeft += iNumBitsRead;177 pDecEngine->iBitsLeft += iNumBitsRead;
177 if (iErrorInfo && pDecEngine->iBitsLeft < 0) {178 if (iErrorInfo && pDecEngine->iBitsLeft < 0) {
@@ -180,8 +181,8 @@ int32_t DecodeBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, u · 2 unmodified lines
180 return ERR_NONE;181 return ERR_NONE;
181}182}
182 183
183int32_t DecodeBypassCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiBinVal) {184int32_t DecodeBypassCabac (PWelsCabacDecEngine pDecEngine, uint32_t *uiBinVal) {
184 int32_t iErrorInfo = ERR_NONE;185 int32_t iErrorInfo;
185 int32_t iBitsLeft = pDecEngine->iBitsLeft;186 int32_t iBitsLeft = pDecEngine->iBitsLeft;
186 uint64_t uiOffset = pDecEngine->uiOffset;187 uint64_t uiOffset = pDecEngine->uiOffset;
187 uint64_t uiRangeValue;188 uint64_t uiRangeValue;
@@ -190,7 +191,7 @@ int32_t DecodeBypassCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiBinVal) { · 2 unmodified lines
190 if (iBitsLeft <= 0) {191 if (iBitsLeft <= 0) {
191 uint32_t uiVal = 0;192 uint32_t uiVal = 0;
192 int32_t iNumBitsRead = 0;193 int32_t iNumBitsRead = 0;
193 iErrorInfo = Read32BitsCabac (pDecEngine, uiVal, iNumBitsRead);194 iErrorInfo = Read32BitsCabac (pDecEngine, &uiVal, &iNumBitsRead);
194 uiOffset = (uiOffset << iNumBitsRead) | uiVal;195 uiOffset = (uiOffset << iNumBitsRead) | uiVal;
195 iBitsLeft = iNumBitsRead;196 iBitsLeft = iNumBitsRead;
196 if (iErrorInfo && iBitsLeft == 0) {197 if (iErrorInfo && iBitsLeft == 0) {
@@ -202,24 +203,24 @@ int32_t DecodeBypassCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiBinVal) { · 5 unmodified lines
202 if (uiOffset >= uiRangeValue) {203 if (uiOffset >= uiRangeValue) {
203 pDecEngine->iBitsLeft = iBitsLeft;204 pDecEngine->iBitsLeft = iBitsLeft;
204 pDecEngine->uiOffset = uiOffset - uiRangeValue;205 pDecEngine->uiOffset = uiOffset - uiRangeValue;
205 uiBinVal = 1;206 *uiBinVal = 1;
206 return ERR_NONE;207 return ERR_NONE;
207 }208 }
208 pDecEngine->iBitsLeft = iBitsLeft;209 pDecEngine->iBitsLeft = iBitsLeft;
209 pDecEngine->uiOffset = uiOffset;210 pDecEngine->uiOffset = uiOffset;
210 uiBinVal = 0;211 *uiBinVal = 0;
211 return ERR_NONE;212 return ERR_NONE;
212}213}
213 214
214int32_t DecodeTerminateCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiBinVal) {215int32_t DecodeTerminateCabac (PWelsCabacDecEngine pDecEngine, uint32_t *uiBinVal) {
215 int32_t iErrorInfo = ERR_NONE;216 int32_t iErrorInfo = ERR_NONE;
216 uint64_t uiRange = pDecEngine->uiRange - 2;217 uint64_t uiRange = pDecEngine->uiRange - 2;
217 uint64_t uiOffset = pDecEngine->uiOffset;218 uint64_t uiOffset = pDecEngine->uiOffset;
218 219
219 if (uiOffset >= (uiRange << pDecEngine->iBitsLeft)) {220 if (uiOffset >= (uiRange << pDecEngine->iBitsLeft)) {
220 uiBinVal = 1;221 *uiBinVal = 1;
221 } else {222 } else {
222 uiBinVal = 0;223 *uiBinVal = 0;
223 // Renorm224 // Renorm
224 if (uiRange < WELS_CABAC_QUARTER) {225 if (uiRange < WELS_CABAC_QUARTER) {
225 int32_t iRenorm = g_kRenormTable256[uiRange];226 int32_t iRenorm = g_kRenormTable256[uiRange];
@@ -228,7 +229,7 @@ int32_t DecodeTerminateCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiBinVal · 2 unmodified lines
228 if (pDecEngine->iBitsLeft < 0) {229 if (pDecEngine->iBitsLeft < 0) {
229 uint32_t uiVal = 0;230 uint32_t uiVal = 0;
230 int32_t iNumBitsRead = 0;231 int32_t iNumBitsRead = 0;
231 iErrorInfo = Read32BitsCabac (pDecEngine, uiVal, iNumBitsRead);232 iErrorInfo = Read32BitsCabac (pDecEngine, &uiVal, &iNumBitsRead);
232 pDecEngine->uiOffset = (pDecEngine->uiOffset << iNumBitsRead) | uiVal;233 pDecEngine->uiOffset = (pDecEngine->uiOffset << iNumBitsRead) | uiVal;
233 pDecEngine->iBitsLeft += iNumBitsRead;234 pDecEngine->iBitsLeft += iNumBitsRead;
234 }235 }
@@ -245,30 +246,30 @@ int32_t DecodeTerminateCabac (PWelsCabacDecEngine pDecEngine, uint32_t& uiBinVal · 10 unmodified lines
245}246}
246 247
247int32_t DecodeUnaryBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, int32_t iCtxOffset,248int32_t DecodeUnaryBinCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, int32_t iCtxOffset,
248 uint32_t& uiSymVal) {249 uint32_t *uiSymVal) {
249 uiSymVal = 0;250 *uiSymVal = 0;
250 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, uiSymVal));251 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, uiSymVal));
251 if (uiSymVal == 0) {252 if (*uiSymVal == 0) {
252 return ERR_NONE;253 return ERR_NONE;
253 } else {254 } else {
254 uint32_t uiCode;255 uint32_t uiCode;
255 pBinCtx += iCtxOffset;256 pBinCtx += iCtxOffset;
256 uiSymVal = 0;257 *uiSymVal = 0;
257 do {258 do {
258 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, uiCode));259 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, &uiCode));
259 ++uiSymVal;260 ++(*uiSymVal);
260 } while (uiCode != 0);261 } while (uiCode != 0);
261 return ERR_NONE;262 return ERR_NONE;
262 }263 }
263}264}
264 265
265int32_t DecodeExpBypassCabac (PWelsCabacDecEngine pDecEngine, int32_t iCount, uint32_t& uiSymVal) {266int32_t DecodeExpBypassCabac (PWelsCabacDecEngine pDecEngine, int32_t iCount, uint32_t *uiSymVal) {
266 uint32_t uiCode;267 uint32_t uiCode;
267 int32_t iSymTmp = 0;268 int32_t iSymTmp = 0;
268 int32_t iSymTmp2 = 0;269 int32_t iSymTmp2 = 0;
269 uiSymVal = 0;270 *uiSymVal = 0;
270 do {271 do {
271 WELS_READ_VERIFY (DecodeBypassCabac (pDecEngine, uiCode));272 WELS_READ_VERIFY (DecodeBypassCabac (pDecEngine, &uiCode));
272 if (uiCode == 1) {273 if (uiCode == 1) {
273 iSymTmp += (1 << iCount);274 iSymTmp += (1 << iCount);
274 ++iCount;275 ++iCount;
@@ -279,55 +280,54 @@ int32_t DecodeExpBypassCabac (PWelsCabacDecEngine pDecEngine, int32_t iCount, ui · 4 unmodified lines
279 }280 }
280 281
281 while (iCount--) {282 while (iCount--) {
282 WELS_READ_VERIFY (DecodeBypassCabac (pDecEngine, uiCode));283 WELS_READ_VERIFY (DecodeBypassCabac (pDecEngine, &uiCode));
283 if (uiCode == 1) {284 if (uiCode == 1) {
284 iSymTmp2 |= (1 << iCount);285 iSymTmp2 |= (1 << iCount);
285 }286 }
286 }287 }
287 uiSymVal = (uint32_t) (iSymTmp + iSymTmp2);288 *uiSymVal = (uint32_t) (iSymTmp + iSymTmp2);
288 return ERR_NONE;289 return ERR_NONE;
289}290}
290 291
291uint32_t DecodeUEGLevelCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, uint32_t& uiCode) {292uint32_t DecodeUEGLevelCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, uint32_t *uiCode) {
292 uiCode = 0;293 *uiCode = 0;
293 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, uiCode));294 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, uiCode));
294 if (uiCode == 0)295 if (*uiCode == 0)
295 return ERR_NONE;296 return ERR_NONE;
296 else {297 else {
297 uint32_t uiTmp, uiCount = 1;298 uint32_t uiTmp, uiCount = 1;
298 uiCode = 0;299 *uiCode = 0;
299 do {300 do {
300 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, uiTmp));301 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx, &uiTmp));
301 ++uiCode;302 ++(*uiCode);
302 ++uiCount;303 ++uiCount;
303 } while (uiTmp != 0 && uiCount != 13);304 } while (uiTmp != 0 && uiCount != 13);
304 305
305 if (uiTmp != 0) {306 if (uiTmp != 0) {
306 WELS_READ_VERIFY (DecodeExpBypassCabac (pDecEngine, 0, uiTmp));307 WELS_READ_VERIFY (DecodeExpBypassCabac (pDecEngine, 0, &uiTmp));
307 uiCode += uiTmp + 1;308 *uiCode += uiTmp + 1;
308 }309 }
309 return ERR_NONE;310 return ERR_NONE;
310 }311 }
311 return ERR_NONE;
312}312}
313 313
314int32_t DecodeUEGMvCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, uint32_t iMaxBin, uint32_t& uiCode) {314int32_t DecodeUEGMvCabac (PWelsCabacDecEngine pDecEngine, PWelsCabacCtx pBinCtx, uint32_t iMaxBin, uint32_t *uiCode) {
315 USED(iMaxBin);
315 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx + g_kMvdBinPos2Ctx[0], uiCode));316 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx + g_kMvdBinPos2Ctx[0], uiCode));
316 if (uiCode == 0)317 if (*uiCode == 0)
317 return ERR_NONE;318 return ERR_NONE;
318 else {319 else {
319 uint32_t uiTmp, uiCount = 1;320 uint32_t uiTmp, uiCount = 1;
320 uiCode = 0;321 *uiCode = 0;
321 do {322 do {
322 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx + g_kMvdBinPos2Ctx[uiCount++], uiTmp));323 WELS_READ_VERIFY (DecodeBinCabac (pDecEngine, pBinCtx + g_kMvdBinPos2Ctx[uiCount++], &uiTmp));
323 uiCode++;324 (*uiCode)++;
324 } while (uiTmp != 0 && uiCount != 8);325 } while (uiTmp != 0 && uiCount != 8);
325 326
326 if (uiTmp != 0) {327 if (uiTmp != 0) {
327 WELS_READ_VERIFY (DecodeExpBypassCabac (pDecEngine, 3, uiTmp));328 WELS_READ_VERIFY (DecodeExpBypassCabac (pDecEngine, 3, &uiTmp));
328 uiCode += (uiTmp + 1);329 *uiCode += (uiTmp + 1);
329 }330 }
330 return ERR_NONE;331 return ERR_NONE;
331 }332 }
332}333}
333}

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