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

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

Issue 2990463002: [EXPERIMENTAL] Generic stereo codec with index header sending merged frames
Patch Set: Created 3 years, 5 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 FrameBuffer::~FrameBuffer() {} 55 FrameBuffer::~FrameBuffer() {}
56 56
57 FrameBuffer::ReturnReason FrameBuffer::NextFrame( 57 FrameBuffer::ReturnReason FrameBuffer::NextFrame(
58 int64_t max_wait_time_ms, 58 int64_t max_wait_time_ms,
59 std::unique_ptr<FrameObject>* frame_out) { 59 std::unique_ptr<FrameObject>* frame_out) {
60 TRACE_EVENT0("webrtc", "FrameBuffer::NextFrame"); 60 TRACE_EVENT0("webrtc", "FrameBuffer::NextFrame");
61 int64_t latest_return_time_ms = 61 int64_t latest_return_time_ms =
62 clock_->TimeInMilliseconds() + max_wait_time_ms; 62 clock_->TimeInMilliseconds() + max_wait_time_ms;
63 int64_t wait_ms = max_wait_time_ms; 63 int64_t wait_ms = max_wait_time_ms;
64 int64_t now_ms = 0; 64 int64_t now_ms = 0;
65
66 do { 65 do {
67 now_ms = clock_->TimeInMilliseconds(); 66 now_ms = clock_->TimeInMilliseconds();
68 { 67 {
69 rtc::CritScope lock(&crit_); 68 rtc::CritScope lock(&crit_);
70 new_continuous_frame_event_.Reset(); 69 new_continuous_frame_event_.Reset();
71 if (stopped_) 70 if (stopped_) {
72 return kStopped; 71 return kStopped;
72 }
73 73
74 wait_ms = max_wait_time_ms; 74 wait_ms = max_wait_time_ms;
75 75
76 // Need to hold |crit_| in order to use |frames_|, therefore we 76 // Need to hold |crit_| in order to use |frames_|, therefore we
77 // set it here in the loop instead of outside the loop in order to not 77 // set it here in the loop instead of outside the loop in order to not
78 // acquire the lock unnecesserily. 78 // acquire the lock unnecesserily.
79 next_frame_it_ = frames_.end(); 79 next_frame_it_ = frames_.end();
80 80
81 // |frame_it| points to the first frame after the 81 // |frame_it| points to the first frame after the
82 // |last_decoded_frame_it_|. 82 // |last_decoded_frame_it_|.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 // Sanity check for RTP timestamp monotonicity. 155 // Sanity check for RTP timestamp monotonicity.
156 if (last_decoded_frame_it_ != frames_.end()) { 156 if (last_decoded_frame_it_ != frames_.end()) {
157 const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first; 157 const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first;
158 const FrameKey& frame_key = next_frame_it_->first; 158 const FrameKey& frame_key = next_frame_it_->first;
159 159
160 const bool frame_is_higher_spatial_layer_of_last_decoded_frame = 160 const bool frame_is_higher_spatial_layer_of_last_decoded_frame =
161 last_decoded_frame_timestamp_ == frame->timestamp && 161 last_decoded_frame_timestamp_ == frame->timestamp &&
162 last_decoded_frame_key.picture_id == frame_key.picture_id && 162 last_decoded_frame_key.picture_id == frame_key.picture_id &&
163 last_decoded_frame_key.spatial_layer < frame_key.spatial_layer; 163 last_decoded_frame_key.spatial_layer < frame_key.spatial_layer;
164 164
165 if (AheadOrAt(last_decoded_frame_timestamp_, frame->timestamp) && 165 if (AheadOf(last_decoded_frame_timestamp_, frame->timestamp) &&
166 !frame_is_higher_spatial_layer_of_last_decoded_frame) { 166 !frame_is_higher_spatial_layer_of_last_decoded_frame) {
167 // TODO(brandtr): Consider clearing the entire buffer when we hit 167 // TODO(brandtr): Consider clearing the entire buffer when we hit
168 // these conditions. 168 // these conditions.
169 LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) (" 169 LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) ("
170 << frame->timestamp << ":" << frame->picture_id << ":" 170 << frame->timestamp << ":" << frame->picture_id << ":"
171 << static_cast<int>(frame->spatial_layer) << ")" 171 << static_cast<int>(frame->spatial_layer) << ")"
172 << " sent to decoder after frame with" 172 << " sent to decoder after frame with"
173 << " (timestamp:picture_id:spatial_id) (" 173 << " (timestamp:picture_id:spatial_id) ("
174 << last_decoded_frame_timestamp_ << ":" 174 << last_decoded_frame_timestamp_ << ":"
175 << last_decoded_frame_key.picture_id << ":" 175 << last_decoded_frame_key.picture_id << ":"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 // Test if inserting this frame would cause the order of the frames to become 322 // Test if inserting this frame would cause the order of the frames to become
323 // ambiguous (covering more than half the interval of 2^16). This can happen 323 // ambiguous (covering more than half the interval of 2^16). This can happen
324 // when the picture id make large jumps mid stream. 324 // when the picture id make large jumps mid stream.
325 if (!frames_.empty() && 325 if (!frames_.empty() &&
326 key < frames_.begin()->first && 326 key < frames_.begin()->first &&
327 frames_.rbegin()->first < key) { 327 frames_.rbegin()->first < key) {
328 LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer."; 328 LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer.";
329 ClearFramesAndHistory(); 329 ClearFramesAndHistory();
330 last_continuous_picture_id = -1; 330 last_continuous_picture_id = -1;
331 } 331 }
332
333 auto info = frames_.insert(std::make_pair(key, FrameInfo())).first; 332 auto info = frames_.insert(std::make_pair(key, FrameInfo())).first;
334 333
335 if (info->second.frame) { 334 if (info->second.frame) {
336 LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id 335 LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
337 << ":" << static_cast<int>(key.spatial_layer) 336 << ":" << static_cast<int>(key.spatial_layer)
338 << ") already inserted, dropping frame."; 337 << ") already inserted, dropping frame.";
339 return last_continuous_picture_id; 338 return last_continuous_picture_id;
340 } 339 }
341 340
342 if (!UpdateFrameInfoWithIncomingFrame(*frame, info)) 341 if (!UpdateFrameInfoWithIncomingFrame(*frame, info))
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 } 394 }
396 395
397 void FrameBuffer::PropagateDecodability(const FrameInfo& info) { 396 void FrameBuffer::PropagateDecodability(const FrameInfo& info) {
398 TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability"); 397 TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability");
399 RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames); 398 RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames);
400 for (size_t d = 0; d < info.num_dependent_frames; ++d) { 399 for (size_t d = 0; d < info.num_dependent_frames; ++d) {
401 auto ref_info = frames_.find(info.dependent_frames[d]); 400 auto ref_info = frames_.find(info.dependent_frames[d]);
402 RTC_DCHECK(ref_info != frames_.end()); 401 RTC_DCHECK(ref_info != frames_.end());
403 // TODO(philipel): Look into why we've seen this happen. 402 // TODO(philipel): Look into why we've seen this happen.
404 if (ref_info != frames_.end()) { 403 if (ref_info != frames_.end()) {
405 RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U); 404 // RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U);
406 --ref_info->second.num_missing_decodable; 405 --ref_info->second.num_missing_decodable;
407 } 406 }
408 } 407 }
409 } 408 }
410 409
411 void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) { 410 void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) {
412 TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame"); 411 TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame");
413 if (last_decoded_frame_it_ == frames_.end()) { 412 if (last_decoded_frame_it_ == frames_.end()) {
414 last_decoded_frame_it_ = frames_.begin(); 413 last_decoded_frame_it_ = frames_.begin();
415 } else { 414 } else {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 frames_.clear(); 546 frames_.clear();
548 last_decoded_frame_it_ = frames_.end(); 547 last_decoded_frame_it_ = frames_.end();
549 last_continuous_frame_it_ = frames_.end(); 548 last_continuous_frame_it_ = frames_.end();
550 next_frame_it_ = frames_.end(); 549 next_frame_it_ = frames_.end();
551 num_frames_history_ = 0; 550 num_frames_history_ = 0;
552 num_frames_buffered_ = 0; 551 num_frames_buffered_ = 0;
553 } 552 }
554 553
555 } // namespace video_coding 554 } // namespace video_coding
556 } // namespace webrtc 555 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/encoded_frame.cc ('k') | webrtc/modules/video_coding/frame_object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698