bool decodeFrame(StreamFrameMap& streamFrames) { bool done = false; while(!done) { // demux PacketPtr packet = demuxPacket(); if(packet == 0){ FlogE("demuxing failed"); return 0; } // decode decodePacket(packet, streamFrames); // check if any frames finished for(auto pair : streamFrames){ FramePtr frame = pair.second; if(frame->finished != 0){ // set timestamp and break out of loop int64_t pts = av_frame_get_best_effort_timestamp(frame->GetAvFrame()); if(pair.first == videoStream){ if(firstDts == AV_NOPTS_VALUE){ firstDts = frame->GetAvFrame()->pkt_dts; FlogD("setting firstDts to: " << firstDts); } if(firstPts == AV_NOPTS_VALUE){ firstPts = pts; FlogD("setting firstPts to: " << firstPts); } } frame->SetPts(pts); done = true; } } } // successfully decoded frame, reset retry counter ResetRetries(); return true; }