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

virtual int Impala::Core::Stream::Lavc::VideoAccessStrategy::DecodeNextFrame ( bool *  isValidFrame,
bool *  isKeyFrame,
PacketTrace pktTrace 
) const [inline, virtual]

Reads packets until a video frame can be decoded from such packet.

Definition at line 212 of file VideoAccessStrategy.h.

References Impala::Core::Table::TableTem< Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T >::Add(), Impala::Core::Stream::Lavc::VideoAccessObject::AtEof(), Impala::Core::Stream::Lavc::VideoAccessObject::CurrentFilePosition(), Impala::Core::Stream::Lavc::VideoAccessObject::CurrentPacketFlags(), Impala::Core::Stream::Lavc::VideoAccessObject::CurrentPacketIsVideo(), Impala::Core::Stream::Lavc::VideoAccessObject::CurrentPacketSize(), Impala::Core::Stream::Lavc::VideoAccessObject::DecodeFrame(), Impala::Core::Stream::Lavc::VideoAccessObject::FrameIsKey(), Impala::Core::Stream::Lavc::VideoAccessObject::FrameType(), Impala::Core::Stream::Lavc::VideoAccessObject::GopSize(), ILOG_DEBUG, ILOG_WARN, Impala::Max(), mVao, and Impala::Core::Stream::Lavc::VideoAccessObject::ReadPacket().

Referenced by Impala::Core::Stream::Lavc::StrategyUsingNativeIndex::ConstructIndexProtected(), and DecodeNextValidFrame().

00213     {
00214         //avcodec_get_frame_defaults(mFrame);
00215 
00216         const int MAX_READ_FAILURES = Max(15, 5 * mVao->GopSize());
00217         int nrOfReadFailures = 0;
00218         bool atEndOfFile = mVao->AtEof();
00219 
00220         bool readPacketFailed = false;
00221         *isValidFrame = false;
00222         *isKeyFrame = false;
00223         int rc = 0;
00224         while (true)
00225         {
00226             int readPacketResult = mVao->ReadPacket();
00227             readPacketFailed = (readPacketResult < 0);
00228             if (readPacketFailed)
00229             {
00230                 // upon a negative value, there may still be 
00231                 // valid frames left to decode
00232                 ILOG_DEBUG("ReadPacket() failed and returned: " << 
00233                     readPacketResult);
00234             }
00235             else if (pktTrace)
00236                 pktTrace->Add(mVao->CurrentPacketSize(), mVao->CurrentPacketFlags(), 
00237                     mVao->CurrentFilePosition(), mVao->CurrentPacketIsVideo());
00238 
00239             if (mVao->CurrentPacketIsVideo()) 
00240             {
00241                 int frameDecoded = -1;
00242                 int len = mVao->DecodeFrame(&frameDecoded);
00243 
00244                 // SK: used for problem analysis
00245                 int doDecodeTwice = false;
00246                 if (doDecodeTwice)
00247                 {
00248                     //int frameDecoded2nd = -1;
00249                     //int len2 = DecodeFrame(&frameDecoded2nd);
00250                     //if (frameDecoded && frameDecoded2nd)
00251                     //    ...
00252                     len = mVao->DecodeFrame(&frameDecoded);
00253                 }
00254 
00255                 if (frameDecoded != 0)
00256                 {
00257                     *isValidFrame = true;
00258                     *isKeyFrame = 
00259                         (mVao->FrameType() == 'I' && mVao->FrameIsKey());
00260                     break;
00261                 }
00262                 else
00263                 {
00264                     // do not continue if reading reached eof
00265                     if (atEndOfFile)
00266                     {
00267                         rc = -3;
00268                         break;
00269                     }
00270 
00271                     // mPacket->flags unequal zero seems to indicate incomplete
00272                     // frames other than P or B frames missing I or P frame data
00273                     if (mVao->CurrentPacketFlags() == 0)
00274                         break;
00275                 }
00276             }
00277  
00278             // while the read buffer already reached eof, there may
00279             // still be some valid frames left to decode!
00280             nrOfReadFailures++;
00281             if ((atEndOfFile || readPacketFailed) 
00282                 && (nrOfReadFailures > MAX_READ_FAILURES))
00283             {
00284                 ILOG_WARN("Max. nr of frame read failures reached (" <<
00285                     MAX_READ_FAILURES << "); probably at end of file");
00286                 rc = -1;
00287                 break;
00288             }
00289         } // while (true)
00290 
00291         return rc;
00292     }

Here is the call graph for this function:


Generated on Fri Mar 19 11:18:48 2010 for ImpalaSrc by  doxygen 1.5.1