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

Side by Side Diff: media/base/pipeline_impl.cc

Issue 3045021: Fixing crash in buffer bar painting code (Closed)
Patch Set: Created 10 years, 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // TODO(scherkus): clean up PipelineImpl... too many crazy function names, 5 // TODO(scherkus): clean up PipelineImpl... too many crazy function names,
6 // potential deadlocks, etc... 6 // potential deadlocks, etc...
7 7
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/condition_variable.h" 10 #include "base/condition_variable.h"
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 return loaded_; 287 return loaded_;
288 } 288 }
289 289
290 PipelineError PipelineImpl::GetError() const { 290 PipelineError PipelineImpl::GetError() const {
291 AutoLock auto_lock(lock_); 291 AutoLock auto_lock(lock_);
292 return error_; 292 return error_;
293 } 293 }
294 294
295 void PipelineImpl::SetCurrentReadPosition(int64 offset) { 295 void PipelineImpl::SetCurrentReadPosition(int64 offset) {
296 AutoLock auto_lock(lock_); 296 AutoLock auto_lock(lock_);
297
298 // The current read position should never be ahead of the buffered byte
299 // position but threading issues between BufferedDataSource::DoneRead_Locked()
300 // and BufferedDataSource::NetworkEventCallback() can cause them to be
301 // temporarily out of sync. The easiest fix for this is to cap both
302 // buffered_bytes_ and current_bytes_ to always be legal values in
303 // SetCurrentReadPosition() and in SetBufferedBytes().
304 if (offset > buffered_bytes_)
305 buffered_bytes_ = offset;
297 current_bytes_ = offset; 306 current_bytes_ = offset;
298 } 307 }
299 308
300 int64 PipelineImpl::GetCurrentReadPosition() { 309 int64 PipelineImpl::GetCurrentReadPosition() {
301 AutoLock auto_lock(lock_); 310 AutoLock auto_lock(lock_);
302 return current_bytes_; 311 return current_bytes_;
303 } 312 }
304 313
305 void PipelineImpl::SetPipelineEndedCallback(PipelineCallback* ended_callback) { 314 void PipelineImpl::SetPipelineEndedCallback(PipelineCallback* ended_callback) {
306 DCHECK(!IsRunning()) 315 DCHECK(!IsRunning())
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 451
443 void PipelineImpl::SetTotalBytes(int64 total_bytes) { 452 void PipelineImpl::SetTotalBytes(int64 total_bytes) {
444 DCHECK(IsRunning()); 453 DCHECK(IsRunning());
445 AutoLock auto_lock(lock_); 454 AutoLock auto_lock(lock_);
446 total_bytes_ = total_bytes; 455 total_bytes_ = total_bytes;
447 } 456 }
448 457
449 void PipelineImpl::SetBufferedBytes(int64 buffered_bytes) { 458 void PipelineImpl::SetBufferedBytes(int64 buffered_bytes) {
450 DCHECK(IsRunning()); 459 DCHECK(IsRunning());
451 AutoLock auto_lock(lock_); 460 AutoLock auto_lock(lock_);
461
462 // See comments in SetCurrentReadPosition() about capping.
463 if (buffered_bytes < current_bytes_)
464 current_bytes_ = buffered_bytes;
452 buffered_bytes_ = buffered_bytes; 465 buffered_bytes_ = buffered_bytes;
453 } 466 }
454 467
455 void PipelineImpl::SetVideoSize(size_t width, size_t height) { 468 void PipelineImpl::SetVideoSize(size_t width, size_t height) {
456 DCHECK(IsRunning()); 469 DCHECK(IsRunning());
457 AutoLock auto_lock(lock_); 470 AutoLock auto_lock(lock_);
458 video_width_ = width; 471 video_width_ = width;
459 video_height_ = height; 472 video_height_ = height;
460 } 473 }
461 474
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 filters_.front()->Stop(NewCallback( 1038 filters_.front()->Stop(NewCallback(
1026 this, &PipelineImpl::OnFilterStateTransition)); 1039 this, &PipelineImpl::OnFilterStateTransition));
1027 } else { 1040 } else {
1028 state_ = kStopped; 1041 state_ = kStopped;
1029 message_loop_->PostTask(FROM_HERE, 1042 message_loop_->PostTask(FROM_HERE,
1030 NewRunnableMethod(this, &PipelineImpl::FinishDestroyingFiltersTask)); 1043 NewRunnableMethod(this, &PipelineImpl::FinishDestroyingFiltersTask));
1031 } 1044 }
1032 } 1045 }
1033 1046
1034 } // namespace media 1047 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698