Home | History | Annotate | Download | only in source

Lines Matching refs:frame

45 void FrameList::InsertFrame(VCMFrameBuffer* frame) {
46 insert(rbegin().base(), FrameListPair(frame->TimeStamp(), frame));
60 VCMFrameBuffer* frame = it->second;
62 return frame;
78 // Throw at least one frame.
99 // This frame is empty, try to update the last decoded state and drop it
335 // We have received frame(s) since last call to this function
347 // Calculate frame rate
381 // Will the packet sequence be complete if the next frame is grabbed for
382 // decoding right now? That is, have we lost a frame between the last decoded
383 // frame and the next, or is the next
384 // frame missing one or more packets?
387 // Finding oldest frame ready for decoder, check sequence number and size
394 // Frame not ready to be decoded.
401 // complete frame, |max_wait_time_ms| decided by caller.
427 // Finding oldest frame ready for decoder.
441 // We already have a frame, reset the event.
470 // If we have exactly one frame in the buffer, release it only if it is
487 // Extract the frame with the desired timestamp.
488 VCMFrameBuffer* frame = decodable_frames_.PopFrame(timestamp);
490 if (!frame) {
491 frame = incomplete_frames_.PopFrame(timestamp);
492 if (frame)
493 continuous = last_decoded_state_.ContinuousFrame(frame);
498 // Frame pulled out from jitter buffer, update the jitter estimate.
499 const bool retransmitted = (frame
502 } else if (frame->Length() > 0) {
507 if (frame->GetState() == kStateComplete) {
508 UpdateJitterEstimate(*frame, false);
511 waiting_for_completion_.frame_size = frame->Length();
513 frame->LatestPacketTimeMs();
514 waiting_for_completion_.timestamp = frame->TimeStamp();
521 frame->PrepareForDecode(continuous);
523 // We have a frame - update the last decoded state and nack list.
524 last_decoded_state_.SetState(frame);
527 if ((*frame).IsSessionComplete())
528 UpdateAveragePacketsPerFrame(frame->NumPackets());
530 return frame;
533 // Release frame when done with decoding. Should never be used to release
535 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) {
537 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame);
543 // Gets frame to use for this timestamp. If no match, get empty frame.
545 VCMFrameBuffer** frame) {
546 // Does this packet belong to an old frame?
554 // belongs to a frame with a timestamp equal to the last decoded
569 *frame = incomplete_frames_.FindFrame(packet.timestamp);
570 if (*frame)
572 *frame = decodable_frames_.FindFrame(packet.timestamp);
573 if (*frame)
576 // No match, return empty frame.
577 *frame = GetEmptyFrame();
579 if (!*frame) {
580 // No free frame! Try to reclaim some...
581 LOG(LS_WARNING) << "Unable to get empty frame; Recycling.";
583 *frame = GetEmptyFrame();
584 assert(*frame);
589 (*frame)->Reset();
593 int64_t VCMJitterBuffer::LastPacketTime(const VCMEncodedFrame* frame,
598 static_cast<const VCMFrameBuffer*>(frame);
607 VCMFrameBuffer* frame = NULL;
608 const VCMFrameBufferEnum error = GetFrame(packet, &frame);
609 if (error != kNoError && frame == NULL) {
621 // This packet belongs to an old, already decoded frame, we want to update
656 VCMFrameBufferStateEnum previous_state = frame->GetState();
660 bool first = (frame->GetHighSeqNum() == -1);
664 VCMFrameBufferEnum buffer_return = frame->InsertPacket(packet,
668 if (!frame->GetCountedFrame()) {
669 TRACE_EVENT_ASYNC_BEGIN1("webrtc", "Video", frame->TimeStamp(),
670 "timestamp", frame->TimeStamp());
680 frame->IncrementNackCount();
691 // Is the frame already in the decodable list?
694 bool continuous = IsContinuous(*frame);
699 // This frame will be cleaned up later from the frame list.
700 frame->Reset();
705 CountFrame(*frame);
706 frame->SetCountedFrame(true);
715 *retransmitted = (frame->GetNackCount() > 0);
725 decodable_frames_.InsertFrame(frame);
726 FindAndInsertContinuousFrames(*frame);
728 incomplete_frames_.InsertFrame(frame);
734 if (frame->GetState() == kStateEmpty &&
735 last_decoded_state_.UpdateEmptyFrame(frame)) {
736 free_frames_.push_back(frame);
737 frame->Reset();
738 frame = NULL;
741 incomplete_frames_.InsertFrame(frame);
761 bool VCMJitterBuffer::IsContinuousInState(const VCMFrameBuffer& frame,
765 // Is this frame (complete or decodable) and continuous?
767 // as SessionInfo determines this state based on the error mode (and frame
769 if ((frame.GetState() == kStateComplete ||
770 frame.GetState() == kStateDecodable) &&
771 decoding_state.ContinuousFrame(&frame)) {
778 bool VCMJitterBuffer::IsContinuous(const VCMFrameBuffer& frame) const {
779 if (IsContinuousInState(frame, last_decoded_state_)) {
787 if (IsNewerTimestamp(decodable_frame->TimeStamp(), frame.TimeStamp())) {
791 if (IsContinuousInState(frame, decoding_state)) {
804 // frame until we hit one of the following:
809 VCMFrameBuffer* frame = it->second;
810 if (IsNewerTimestamp(new_frame.TimeStamp(), frame->TimeStamp())) {
814 if (IsContinuousInState(*frame, decoding_state)) {
815 decodable_frames_.InsertFrame(frame);
817 decoding_state.SetState(frame);
818 } else if (frame->TemporalId() <= 0) {
899 const VCMFrameBuffer& frame) const {
900 assert(frame.GetLowSeqNum() >= 0);
901 if (frame.HaveFirstPacket())
902 return frame.GetLowSeqNum();
906 return frame.GetLowSeqNum() - 1;
952 // Request a key frame if we don't have one already.
957 // Skip to the last key frame. If it's incomplete we will start
960 // streams because only the first packet of a key frame is marked.
1007 LOG(LS_WARNING) << "Requesting key frame due to too large NACK list.";
1012 LOG(LS_WARNING) << "Requesting key frame due to missing too old packets";
1028 // request a key frame than to retransmit this many missing packets.
1097 VCMFrameBuffer* frame = free_frames_.front();
1099 return frame;
1113 // Recycle oldest frames up to a key frame, used if jitter buffer is completely
1132 LOG(LS_INFO) << "Found key frame while dropping frames.";
1133 // Reset last decoded state to make sure the next frame decoded is a key
1134 // frame, and start NACKing from here.
1147 void VCMJitterBuffer::CountFrame(const VCMFrameBuffer& frame) {
1148 if (!frame.GetCountedFrame()) {
1153 if (frame.FrameType() == kVideoFrameKey) {
1155 frame.TimeStamp(), "KeyComplete");
1158 frame.TimeStamp(), "DeltaComplete");
1162 // adding all key and delta frames might differ from frame count.
1163 if (frame.IsSessionComplete()) {
1164 ++receive_statistics_[frame.FrameType()];
1218 void VCMJitterBuffer::UpdateJitterEstimate(const VCMFrameBuffer& frame,
1220 if (frame.LatestPacketTimeMs() == -1) {
1225 UpdateJitterEstimate(frame.LatestPacketTimeMs(), frame.TimeStamp(),
1226 frame.Length(), incomplete_frame);