Definition at line 315 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. 00316 { 00317 if (startFile >= mVideoSet->NrFiles()) 00318 { 00319 ILOG_ERROR("DoWalk: startFile out of range"); 00320 return -1; 00321 } 00322 if (numberFiles == -1) 00323 numberFiles = mVideoSet->NrFiles() - startFile; 00324 if (startFile + numberFiles >= mVideoSet->NrFiles()) 00325 numberFiles = mVideoSet->NrFiles() - startFile; 00326 00327 for (size_t l=0 ; l<mListeners.size() ; l++) 00328 { 00329 mListeners[l]->HandleNewWalk(mVideoSet); 00330 mListeners[l]->HandleNewWalk(mVideoSet, "Frames"); 00331 if (mSegmentation) 00332 mListeners[l]->HandleNewWalk(mVideoSet, mSegmentation); 00333 //if ((mConfig.numberFrames != -1) && (!mConfig.iFrames)) 00334 if (mConfig.partialWalk) 00335 mListeners[l]->HandleNewWalkPartial(mVideoSet, startFrame, 00336 mConfig.stepSize, 00337 mConfig.numberFrames); 00338 } 00339 00340 for (int fileId=startFile ; fileId<startFile+numberFiles ; fileId++) 00341 { 00342 if (mConfig.virtualWalk) // cannot do much, yet... 00343 { 00344 for (size_t l=0 ; l<mListeners.size() ; l++) 00345 mListeners[l]->HandleNewFile(mVideoSet, fileId, 0); 00346 for (size_t l=0 ; l<mListeners.size() ; l++) 00347 mListeners[l]->HandleDoneFile(mVideoSet, fileId, 0); 00348 continue; 00349 } 00350 00351 Stream::RgbDataSrc* src = mVideoSet->GetVideo(fileId); 00352 if (src == 0) 00353 { 00354 //ILOG_ERROR("DoWalk: skipping file: " + 00355 // mVideoSet->GetTuple(fileId)); 00356 //continue; 00357 ILOG_ERROR("DoWalk: Failed on file: " + 00358 mVideoSet->GetAsPath(fileId)); 00359 return -3; 00360 } 00361 00362 for (size_t l=0 ; l<mListeners.size() ; l++) 00363 mListeners[l]->HandleNewFile(mVideoSet, fileId, src); 00364 00365 if (!src->GotoFrame(startFrame)) 00366 { 00367 ILOG_ERROR("DoWalk: Failed on src->GotoFrame() for file: " + 00368 mVideoSet->GetAsPath(fileId)); 00369 delete src; 00370 return -5; 00371 } 00372 00373 if (src->FrameNr() != startFrame) // Hmmm, always succeeds?? 00374 continue; 00375 00376 if (mConfig.iFrames) 00377 { 00378 while (!src->CurIsIFrame() && !src->TheEnd()) 00379 { 00380 if (!src->NextFrame(mConfig.stepSize)) 00381 { 00382 ILOG_ERROR("DoWalk: Failed on src->NextFrame() for file: " + 00383 mVideoSet->GetAsPath(fileId)); 00384 delete src; 00385 return -6; 00386 } 00387 } 00388 } 00389 00390 if (src->TheEnd()) 00391 { 00392 ILOG_ERROR("DoWalk: no IFrames found"); 00393 continue; 00394 } 00395 00396 int lastShot = -1; 00397 int numberFrames = mConfig.numberFrames; 00398 bool done = false; 00399 do 00400 { 00401 if (mSegmentation) 00402 { 00403 int frame = src->FrameNr(); 00404 int shot = mSegmentation->GetShotId(fileId, frame); 00405 if (shot != lastShot) 00406 { 00407 if (lastShot != -1) 00408 for (size_t l=0 ; l<mListeners.size() ; l++) 00409 mListeners[l]->HandleDoneShot(mVideoSet, fileId, 00410 src, lastShot); 00411 for (size_t l=0 ; l<mListeners.size() ; l++) 00412 mListeners[l]->HandleNewShot(mVideoSet, fileId, 00413 src, shot); 00414 lastShot = shot; 00415 } 00416 } 00417 00418 for (size_t l=0 ; l<mListeners.size() ; l++) 00419 mListeners[l]->HandleNewFrame(mVideoSet, fileId, src); 00420 00421 if (mConfig.stepSize == 10000000) // special case 00422 { 00423 done = true; 00424 } 00425 else 00426 { 00427 // using try/catch in order to continue in case of 00428 // JNI memory problems, which are signaled using exceptions; 00429 try 00430 { 00431 src->NextFrame(mConfig.stepSize); 00432 if (mConfig.iFrames) 00433 { 00434 while (!src->CurIsIFrame() && !src->TheEnd()) 00435 src->NextFrame(mConfig.stepSize); 00436 } 00437 } 00438 catch (std::exception& e) 00439 { 00440 String eMsg(e.what()); 00441 //ILOG_ERROR("DoWalk: failed on src->NextFrame; skipping " 00442 // + mVideoSet->GetTuple(fileId)); 00443 //break; 00444 ILOG_ERROR("DoWalk: Failed on src->NextFrame() for file: " 00445 + mVideoSet->GetAsPath(fileId) + ": " + eMsg); 00446 delete src; 00447 return -4; 00448 } 00449 } 00450 00451 if (src->TheEnd()) 00452 done = true; 00453 00454 if (numberFrames > 0) // -1 implies no limit 00455 { 00456 numberFrames--; 00457 if (numberFrames <= 0) 00458 done = true; 00459 } 00460 } while (!done); 00461 00462 if (mSegmentation && (lastShot != -1)) 00463 for (size_t l=0 ; l<mListeners.size() ; l++) 00464 mListeners[l]->HandleDoneShot(mVideoSet, fileId, src, 00465 lastShot); 00466 for (size_t l=0 ; l<mListeners.size() ; l++) 00467 mListeners[l]->HandleDoneFile(mVideoSet, fileId, src); 00468 00469 delete src; 00470 } 00471 00472 for (size_t l=0 ; l<mListeners.size() ; l++) 00473 mListeners[l]->HandleDoneWalk(mVideoSet); 00474 00475 return 0; 00476 }
Here is the call graph for this function:
|