Definition at line 255 of file Walker.h. References Impala::Core::Stream::RgbDataSrc::CurIsIFrame(), Impala::Core::Stream::RgbDataSrc::FrameNr(), Impala::Core::Database::RawDataSet::GetAsPath(), Impala::Core::VideoSet::Segmentation::GetShotId(), Impala::Core::VideoSet::VideoSet::GetVideo(), Impala::Core::Stream::RgbDataSrc::GotoFrame(), Impala::Core::VideoSet::WalkerConfig::iFrames, ILOG_ERROR, mConfig, mListeners, mSegmentation, mVideoSet, Impala::Core::Stream::RgbDataSrc::NextFrame(), Impala::Core::Database::RawDataSet::NrFiles(), Impala::Core::VideoSet::WalkerConfig::numberFrames, Impala::Core::VideoSet::WalkerConfig::partialWalk, Impala::Core::VideoSet::WalkerConfig::stepSize, Impala::Core::Stream::RgbDataSrc::TheEnd(), and Impala::Core::VideoSet::WalkerConfig::virtualWalk. 00256 { 00257 if (startFile >= mVideoSet->NrFiles()) 00258 { 00259 ILOG_ERROR("DoWalk: startFile out of range"); 00260 return; 00261 } 00262 if (numberFiles == -1) 00263 numberFiles = mVideoSet->NrFiles() - startFile; 00264 if (startFile + numberFiles >= mVideoSet->NrFiles()) 00265 numberFiles = mVideoSet->NrFiles() - startFile; 00266 00267 for (size_t l=0 ; l<mListeners.size() ; l++) 00268 { 00269 mListeners[l]->HandleNewWalk(mVideoSet); 00270 mListeners[l]->HandleNewWalk(mVideoSet, "Frames"); 00271 if (mSegmentation) 00272 mListeners[l]->HandleNewWalk(mVideoSet, mSegmentation); 00273 //if ((mConfig.numberFrames != -1) && (!mConfig.iFrames)) 00274 if (mConfig.partialWalk) 00275 mListeners[l]->HandleNewWalkPartial(mVideoSet, startFrame, 00276 mConfig.stepSize, 00277 mConfig.numberFrames); 00278 } 00279 00280 for (int fileId=startFile ; fileId<startFile+numberFiles ; fileId++) 00281 { 00282 if (mConfig.virtualWalk) // cannot do much, yet... 00283 { 00284 for (size_t l=0 ; l<mListeners.size() ; l++) 00285 mListeners[l]->HandleNewFile(mVideoSet, fileId, 0); 00286 for (size_t l=0 ; l<mListeners.size() ; l++) 00287 mListeners[l]->HandleDoneFile(mVideoSet, fileId, 0); 00288 continue; 00289 } 00290 00291 Stream::RgbDataSrc* src = mVideoSet->GetVideo(fileId); 00292 if (src == 0) 00293 { 00294 ILOG_ERROR("DoWalk: Failed on file: " + 00295 mVideoSet->GetAsPath(fileId)); 00296 continue; 00297 } 00298 00299 for (size_t l=0 ; l<mListeners.size() ; l++) 00300 mListeners[l]->HandleNewFile(mVideoSet, fileId, src); 00301 00302 if (!src->GotoFrame(startFrame)) 00303 { 00304 ILOG_ERROR("DoWalk: Failed on src->GotoFrame() for file: " + 00305 mVideoSet->GetAsPath(fileId)); 00306 delete src; 00307 src = 0; 00308 } 00309 00310 if (src && mConfig.iFrames) 00311 { 00312 while (!src->CurIsIFrame() && !src->TheEnd()) 00313 { 00314 if (!src->NextFrame(mConfig.stepSize)) 00315 { 00316 ILOG_ERROR("DoWalk: Failed on src->NextFrame() for file: " + 00317 mVideoSet->GetAsPath(fileId)); 00318 delete src; 00319 src = 0; 00320 break; 00321 } 00322 } 00323 } 00324 00325 if (src && src->TheEnd()) 00326 ILOG_ERROR("DoWalk: no IFrames found"); 00327 00328 int lastShot = -1; 00329 int numberFrames = mConfig.numberFrames; 00330 bool done = false; 00331 do 00332 { 00333 if (!src) 00334 break; 00335 00336 if (mSegmentation) 00337 { 00338 int frame = src->FrameNr(); 00339 int shot = mSegmentation->GetShotId(fileId, frame); 00340 if (shot != lastShot) 00341 { 00342 if (lastShot != -1) 00343 for (size_t l=0 ; l<mListeners.size() ; l++) 00344 mListeners[l]->HandleDoneShot(mVideoSet, fileId, 00345 src, lastShot); 00346 for (size_t l=0 ; l<mListeners.size() ; l++) 00347 mListeners[l]->HandleNewShot(mVideoSet, fileId, 00348 src, shot); 00349 lastShot = shot; 00350 } 00351 } 00352 00353 for (size_t l=0 ; l<mListeners.size() ; l++) 00354 mListeners[l]->HandleNewFrame(mVideoSet, fileId, src); 00355 00356 if (mConfig.stepSize == 10000000) // special case 00357 { 00358 done = true; 00359 } 00360 else 00361 { 00362 // using try/catch in order to continue in case of 00363 // JNI memory problems, which are signaled using exceptions; 00364 try 00365 { 00366 src->NextFrame(mConfig.stepSize); 00367 if (mConfig.iFrames) 00368 { 00369 while (!src->CurIsIFrame() && !src->TheEnd()) 00370 src->NextFrame(mConfig.stepSize); 00371 } 00372 } 00373 catch (std::exception& e) 00374 { 00375 String eMsg(e.what()); 00376 ILOG_ERROR("DoWalk: Failed on src->NextFrame() for file: " 00377 + mVideoSet->GetAsPath(fileId) + ": " + eMsg); 00378 delete src; 00379 src = 0; 00380 break; 00381 } 00382 } 00383 00384 if (src->TheEnd()) 00385 done = true; 00386 00387 if (numberFrames > 0) // -1 implies no limit 00388 { 00389 numberFrames--; 00390 if (numberFrames <= 0) 00391 done = true; 00392 } 00393 } while (!done); 00394 00395 if (mSegmentation && (lastShot != -1)) 00396 for (size_t l=0 ; l<mListeners.size() ; l++) 00397 mListeners[l]->HandleDoneShot(mVideoSet, fileId, src, 00398 lastShot); 00399 00400 for (size_t l=0 ; l<mListeners.size() ; l++) 00401 mListeners[l]->HandleDoneFile(mVideoSet, fileId, src); 00402 00403 if (src) 00404 delete src; 00405 } 00406 00407 for (size_t l=0 ; l<mListeners.size() ; l++) 00408 mListeners[l]->HandleDoneWalk(mVideoSet); 00409 }
Here is the call graph for this function:
|