| 226 | } |
| 227 | |
| 228 | bool DecoderParseSyntaxTest::DecodeBs (const char* sFileName, EDecCase eDecCase) { |
| 229 | |
| 230 | uint8_t* pBuf = NULL; |
| 231 | int32_t iBufPos = 0; |
| 232 | int32_t iFileSize; |
| 233 | int32_t i = 0; |
| 234 | int32_t iSliceSize; |
| 235 | int32_t iEndOfStreamFlag = 0; |
| 236 | FILE* pH264File; |
| 237 | uint8_t uiStartCode[4] = {0, 0, 0, 1}; |
| 238 | int iRet = 0; |
| 239 | |
| 240 | #if defined(ANDROID_NDK) |
| 241 | std::string filename = std::string ("/sdcard/") + sFileName; |
| 242 | if ((pH264File = fopen (filename.c_str(), "rb")) == NULL) |
| 243 | return false; |
| 244 | #else |
| 245 | if ((pH264File = fopen (sFileName, "rb")) == NULL) |
| 246 | return false; |
| 247 | #endif |
| 248 | fseek (pH264File, 0L, SEEK_END); |
| 249 | iFileSize = (int32_t) ftell (pH264File); |
| 250 | fseek (pH264File, 0L, SEEK_SET); |
| 251 | pBuf = new uint8_t[iFileSize + 4]; |
| 252 | if (pBuf == NULL) { |
| 253 | fclose (pH264File); |
| 254 | return false; |
| 255 | } |
| 256 | if ((fread (pBuf, 1, iFileSize, pH264File) != (unsigned int) iFileSize)) { |
| 257 | fclose (pH264File); |
| 258 | if (pBuf) { |
| 259 | delete[] pBuf; |
| 260 | pBuf = NULL; |
| 261 | } |
| 262 | return false; |
| 263 | } |
| 264 | memcpy (pBuf + iFileSize, &uiStartCode[0], 4); //confirmed_safe_unsafe_usage |
| 265 | while (true) { |
| 266 | if (iBufPos >= iFileSize) { |
| 267 | iEndOfStreamFlag = true; |
| 268 | if (iEndOfStreamFlag) |
| 269 | m_pDec->SetOption (DECODER_OPTION_END_OF_STREAM, (void*)&iEndOfStreamFlag); |
| 270 | break; |
| 271 | } |
| 272 | for (i = 0; i < iFileSize; i++) { |
| 273 | if ((pBuf[iBufPos + i] == 0 && pBuf[iBufPos + i + 1] == 0 && pBuf[iBufPos + i + 2] == 0 && pBuf[iBufPos + i + 3] == 1 |
| 274 | && i > 0)) { |
| 275 | break; |
| 276 | } |
| 277 | } |
| 278 | iSliceSize = i; |
| 279 | iRet |= DecodeFrame (pBuf + iBufPos, iSliceSize, m_pData, &m_sBufferInfo, m_pCtx); |
| 280 | iBufPos += iSliceSize; |
| 281 | } |
| 282 | if (eDecCase == CorrectDec) { |
| 283 | EXPECT_TRUE (iRet == dsErrorFree); |
| 284 | } else if (eDecCase == ErrorDec) { |
| 285 | EXPECT_TRUE ((iRet & (dsBitstreamError | dsRefLost | dsDataErrorConcealed)) != 0) << "iRet = " << iRet; |
nothing calls this directly
no test coverage detected