Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

int Impala::Core::VideoSet::Walker::DoWalk ( int  startFile,
int  numberFiles,
int  startFrame 
) [inline]

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:


Generated on Fri Mar 19 11:33:42 2010 for ImpalaSrc by  doxygen 1.5.1