| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 | 59 |
| 60 FrameBuffer::ReturnReason FrameBuffer::NextFrame( | 60 FrameBuffer::ReturnReason FrameBuffer::NextFrame( |
| 61 int64_t max_wait_time_ms, | 61 int64_t max_wait_time_ms, |
| 62 std::unique_ptr<FrameObject>* frame_out, | 62 std::unique_ptr<FrameObject>* frame_out, |
| 63 bool keyframe_required) { | 63 bool keyframe_required) { |
| 64 TRACE_EVENT0("webrtc", "FrameBuffer::NextFrame"); | 64 TRACE_EVENT0("webrtc", "FrameBuffer::NextFrame"); |
| 65 int64_t latest_return_time_ms = | 65 int64_t latest_return_time_ms = |
| 66 clock_->TimeInMilliseconds() + max_wait_time_ms; | 66 clock_->TimeInMilliseconds() + max_wait_time_ms; |
| 67 int64_t wait_ms = max_wait_time_ms; | 67 int64_t wait_ms = max_wait_time_ms; |
| 68 int64_t now_ms = 0; | 68 int64_t now_ms = 0; |
| 69 | |
| 70 do { | 69 do { |
| 71 now_ms = clock_->TimeInMilliseconds(); | 70 now_ms = clock_->TimeInMilliseconds(); |
| 72 { | 71 { |
| 73 rtc::CritScope lock(&crit_); | 72 rtc::CritScope lock(&crit_); |
| 74 new_continuous_frame_event_.Reset(); | 73 new_continuous_frame_event_.Reset(); |
| 75 if (stopped_) | 74 if (stopped_) { |
| 76 return kStopped; | 75 return kStopped; |
| 76 } |
| 77 | 77 |
| 78 wait_ms = max_wait_time_ms; | 78 wait_ms = max_wait_time_ms; |
| 79 | 79 |
| 80 // Need to hold |crit_| in order to use |frames_|, therefore we | 80 // Need to hold |crit_| in order to use |frames_|, therefore we |
| 81 // set it here in the loop instead of outside the loop in order to not | 81 // set it here in the loop instead of outside the loop in order to not |
| 82 // acquire the lock unnecesserily. | 82 // acquire the lock unnecesserily. |
| 83 next_frame_it_ = frames_.end(); | 83 next_frame_it_ = frames_.end(); |
| 84 | 84 |
| 85 // |frame_it| points to the first frame after the | 85 // |frame_it| points to the first frame after the |
| 86 // |last_decoded_frame_it_|. | 86 // |last_decoded_frame_it_|. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 // Sanity check for RTP timestamp monotonicity. | 165 // Sanity check for RTP timestamp monotonicity. |
| 166 if (last_decoded_frame_it_ != frames_.end()) { | 166 if (last_decoded_frame_it_ != frames_.end()) { |
| 167 const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first; | 167 const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first; |
| 168 const FrameKey& frame_key = next_frame_it_->first; | 168 const FrameKey& frame_key = next_frame_it_->first; |
| 169 | 169 |
| 170 const bool frame_is_higher_spatial_layer_of_last_decoded_frame = | 170 const bool frame_is_higher_spatial_layer_of_last_decoded_frame = |
| 171 last_decoded_frame_timestamp_ == frame->timestamp && | 171 last_decoded_frame_timestamp_ == frame->timestamp && |
| 172 last_decoded_frame_key.picture_id == frame_key.picture_id && | 172 last_decoded_frame_key.picture_id == frame_key.picture_id && |
| 173 last_decoded_frame_key.spatial_layer < frame_key.spatial_layer; | 173 last_decoded_frame_key.spatial_layer < frame_key.spatial_layer; |
| 174 | 174 |
| 175 if (AheadOrAt(last_decoded_frame_timestamp_, frame->timestamp) && | 175 if (AheadOf(last_decoded_frame_timestamp_, frame->timestamp) && |
| 176 !frame_is_higher_spatial_layer_of_last_decoded_frame) { | 176 !frame_is_higher_spatial_layer_of_last_decoded_frame) { |
| 177 // TODO(brandtr): Consider clearing the entire buffer when we hit | 177 // TODO(brandtr): Consider clearing the entire buffer when we hit |
| 178 // these conditions. | 178 // these conditions. |
| 179 LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) (" | 179 LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) (" |
| 180 << frame->timestamp << ":" << frame->picture_id << ":" | 180 << frame->timestamp << ":" << frame->picture_id << ":" |
| 181 << static_cast<int>(frame->spatial_layer) << ")" | 181 << static_cast<int>(frame->spatial_layer) << ")" |
| 182 << " sent to decoder after frame with" | 182 << " sent to decoder after frame with" |
| 183 << " (timestamp:picture_id:spatial_id) (" | 183 << " (timestamp:picture_id:spatial_id) (" |
| 184 << last_decoded_frame_timestamp_ << ":" | 184 << last_decoded_frame_timestamp_ << ":" |
| 185 << last_decoded_frame_key.picture_id << ":" | 185 << last_decoded_frame_key.picture_id << ":" |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 // Test if inserting this frame would cause the order of the frames to become | 342 // Test if inserting this frame would cause the order of the frames to become |
| 343 // ambiguous (covering more than half the interval of 2^16). This can happen | 343 // ambiguous (covering more than half the interval of 2^16). This can happen |
| 344 // when the picture id make large jumps mid stream. | 344 // when the picture id make large jumps mid stream. |
| 345 if (!frames_.empty() && | 345 if (!frames_.empty() && |
| 346 key < frames_.begin()->first && | 346 key < frames_.begin()->first && |
| 347 frames_.rbegin()->first < key) { | 347 frames_.rbegin()->first < key) { |
| 348 LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer."; | 348 LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer."; |
| 349 ClearFramesAndHistory(); | 349 ClearFramesAndHistory(); |
| 350 last_continuous_picture_id = -1; | 350 last_continuous_picture_id = -1; |
| 351 } | 351 } |
| 352 | |
| 353 auto info = frames_.insert(std::make_pair(key, FrameInfo())).first; | 352 auto info = frames_.insert(std::make_pair(key, FrameInfo())).first; |
| 354 | 353 |
| 355 if (info->second.frame) { | 354 if (info->second.frame) { |
| 356 LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id | 355 LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id |
| 357 << ":" << static_cast<int>(key.spatial_layer) | 356 << ":" << static_cast<int>(key.spatial_layer) |
| 358 << ") already inserted, dropping frame."; | 357 << ") already inserted, dropping frame."; |
| 359 return last_continuous_picture_id; | 358 return last_continuous_picture_id; |
| 360 } | 359 } |
| 361 | 360 |
| 362 if (!UpdateFrameInfoWithIncomingFrame(*frame, info)) | 361 if (!UpdateFrameInfoWithIncomingFrame(*frame, info)) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 } | 414 } |
| 416 | 415 |
| 417 void FrameBuffer::PropagateDecodability(const FrameInfo& info) { | 416 void FrameBuffer::PropagateDecodability(const FrameInfo& info) { |
| 418 TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability"); | 417 TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability"); |
| 419 RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames); | 418 RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames); |
| 420 for (size_t d = 0; d < info.num_dependent_frames; ++d) { | 419 for (size_t d = 0; d < info.num_dependent_frames; ++d) { |
| 421 auto ref_info = frames_.find(info.dependent_frames[d]); | 420 auto ref_info = frames_.find(info.dependent_frames[d]); |
| 422 RTC_DCHECK(ref_info != frames_.end()); | 421 RTC_DCHECK(ref_info != frames_.end()); |
| 423 // TODO(philipel): Look into why we've seen this happen. | 422 // TODO(philipel): Look into why we've seen this happen. |
| 424 if (ref_info != frames_.end()) { | 423 if (ref_info != frames_.end()) { |
| 425 RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U); | 424 // RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U); |
| 426 --ref_info->second.num_missing_decodable; | 425 --ref_info->second.num_missing_decodable; |
| 427 } | 426 } |
| 428 } | 427 } |
| 429 } | 428 } |
| 430 | 429 |
| 431 void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) { | 430 void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) { |
| 432 TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame"); | 431 TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame"); |
| 433 if (last_decoded_frame_it_ == frames_.end()) { | 432 if (last_decoded_frame_it_ == frames_.end()) { |
| 434 last_decoded_frame_it_ = frames_.begin(); | 433 last_decoded_frame_it_ = frames_.begin(); |
| 435 } else { | 434 } else { |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 frames_.clear(); | 570 frames_.clear(); |
| 572 last_decoded_frame_it_ = frames_.end(); | 571 last_decoded_frame_it_ = frames_.end(); |
| 573 last_continuous_frame_it_ = frames_.end(); | 572 last_continuous_frame_it_ = frames_.end(); |
| 574 next_frame_it_ = frames_.end(); | 573 next_frame_it_ = frames_.end(); |
| 575 num_frames_history_ = 0; | 574 num_frames_history_ = 0; |
| 576 num_frames_buffered_ = 0; | 575 num_frames_buffered_ = 0; |
| 577 } | 576 } |
| 578 | 577 |
| 579 } // namespace video_coding | 578 } // namespace video_coding |
| 580 } // namespace webrtc | 579 } // namespace webrtc |
| OLD | NEW |