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:
|