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

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

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:


Generated on Thu Jan 13 09:22:20 2011 for ImpalaSrc by  doxygen 1.5.1