Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: modules/video_coding/frame_buffer2.cc

Issue 3015663002: [Experiment] Alpha Channel Support
Patch Set: Remove Frame Matching On Sender Side Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 // Sanity check for RTP timestamp monotonicity. 163 // Sanity check for RTP timestamp monotonicity.
164 if (last_decoded_frame_it_ != frames_.end()) { 164 if (last_decoded_frame_it_ != frames_.end()) {
165 const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first; 165 const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first;
166 const FrameKey& frame_key = next_frame_it_->first; 166 const FrameKey& frame_key = next_frame_it_->first;
167 167
168 const bool frame_is_higher_spatial_layer_of_last_decoded_frame = 168 const bool frame_is_higher_spatial_layer_of_last_decoded_frame =
169 last_decoded_frame_timestamp_ == frame->timestamp && 169 last_decoded_frame_timestamp_ == frame->timestamp &&
170 last_decoded_frame_key.picture_id == frame_key.picture_id && 170 last_decoded_frame_key.picture_id == frame_key.picture_id &&
171 last_decoded_frame_key.spatial_layer < frame_key.spatial_layer; 171 last_decoded_frame_key.spatial_layer < frame_key.spatial_layer;
172 172
173 if (AheadOrAt(last_decoded_frame_timestamp_, frame->timestamp) && 173 if (AheadOf(last_decoded_frame_timestamp_, frame->timestamp) &&
174 !frame_is_higher_spatial_layer_of_last_decoded_frame) { 174 !frame_is_higher_spatial_layer_of_last_decoded_frame) {
175 // TODO(brandtr): Consider clearing the entire buffer when we hit 175 // TODO(brandtr): Consider clearing the entire buffer when we hit
176 // these conditions. 176 // these conditions.
177 LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) (" 177 LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) ("
178 << frame->timestamp << ":" << frame->picture_id << ":" 178 << frame->timestamp << ":" << frame->picture_id << ":"
179 << static_cast<int>(frame->spatial_layer) << ")" 179 << static_cast<int>(frame->spatial_layer) << ")"
180 << " sent to decoder after frame with" 180 << " sent to decoder after frame with"
181 << " (timestamp:picture_id:spatial_id) (" 181 << " (timestamp:picture_id:spatial_id) ("
182 << last_decoded_frame_timestamp_ << ":" 182 << last_decoded_frame_timestamp_ << ":"
183 << last_decoded_frame_key.picture_id << ":" 183 << last_decoded_frame_key.picture_id << ":"
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 // Test if inserting this frame would cause the order of the frames to become 335 // Test if inserting this frame would cause the order of the frames to become
336 // ambiguous (covering more than half the interval of 2^16). This can happen 336 // ambiguous (covering more than half the interval of 2^16). This can happen
337 // when the picture id make large jumps mid stream. 337 // when the picture id make large jumps mid stream.
338 if (!frames_.empty() && 338 if (!frames_.empty() &&
339 key < frames_.begin()->first && 339 key < frames_.begin()->first &&
340 frames_.rbegin()->first < key) { 340 frames_.rbegin()->first < key) {
341 LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer."; 341 LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer.";
342 ClearFramesAndHistory(); 342 ClearFramesAndHistory();
343 last_continuous_picture_id = -1; 343 last_continuous_picture_id = -1;
344 } 344 }
345
346 auto info = frames_.insert(std::make_pair(key, FrameInfo())).first; 345 auto info = frames_.insert(std::make_pair(key, FrameInfo())).first;
347 346
348 if (info->second.frame) { 347 if (info->second.frame) {
349 LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id 348 LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
350 << ":" << static_cast<int>(key.spatial_layer) 349 << ":" << static_cast<int>(key.spatial_layer)
351 << ") already inserted, dropping frame."; 350 << ") already inserted, dropping frame.";
352 return last_continuous_picture_id; 351 return last_continuous_picture_id;
353 } 352 }
354 353
355 if (!UpdateFrameInfoWithIncomingFrame(*frame, info)) 354 if (!UpdateFrameInfoWithIncomingFrame(*frame, info))
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 } 407 }
409 408
410 void FrameBuffer::PropagateDecodability(const FrameInfo& info) { 409 void FrameBuffer::PropagateDecodability(const FrameInfo& info) {
411 TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability"); 410 TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability");
412 RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames); 411 RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames);
413 for (size_t d = 0; d < info.num_dependent_frames; ++d) { 412 for (size_t d = 0; d < info.num_dependent_frames; ++d) {
414 auto ref_info = frames_.find(info.dependent_frames[d]); 413 auto ref_info = frames_.find(info.dependent_frames[d]);
415 RTC_DCHECK(ref_info != frames_.end()); 414 RTC_DCHECK(ref_info != frames_.end());
416 // TODO(philipel): Look into why we've seen this happen. 415 // TODO(philipel): Look into why we've seen this happen.
417 if (ref_info != frames_.end()) { 416 if (ref_info != frames_.end()) {
418 RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U); 417 // RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U);
419 --ref_info->second.num_missing_decodable; 418 --ref_info->second.num_missing_decodable;
420 } 419 }
421 } 420 }
422 } 421 }
423 422
424 void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) { 423 void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) {
425 TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame"); 424 TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame");
426 if (last_decoded_frame_it_ == frames_.end()) { 425 if (last_decoded_frame_it_ == frames_.end()) {
427 last_decoded_frame_it_ = frames_.begin(); 426 last_decoded_frame_it_ = frames_.begin();
428 } else { 427 } else {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 frames_.clear(); 563 frames_.clear();
565 last_decoded_frame_it_ = frames_.end(); 564 last_decoded_frame_it_ = frames_.end();
566 last_continuous_frame_it_ = frames_.end(); 565 last_continuous_frame_it_ = frames_.end();
567 next_frame_it_ = frames_.end(); 566 next_frame_it_ = frames_.end();
568 num_frames_history_ = 0; 567 num_frames_history_ = 0;
569 num_frames_buffered_ = 0; 568 num_frames_buffered_ = 0;
570 } 569 }
571 570
572 } // namespace video_coding 571 } // namespace video_coding
573 } // namespace webrtc 572 } // namespace webrtc
OLDNEW
« no previous file with comments | « modules/video_coding/encoded_frame.cc ('k') | modules/video_coding/include/video_codec_initializer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698