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

Side by Side Diff: media/filters/decoder_stream.cc

Issue 2110463003: Remove pending demuxer read state, prefer flag, it's not stable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use expect. Created 4 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
« no previous file with comments | « media/filters/decoder_stream.h ('k') | media/filters/video_frame_stream_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "media/filters/decoder_stream.h" 5 #include "media/filters/decoder_stream.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // |pending_buffers_|. 390 // |pending_buffers_|.
391 DecodeInternal(DecoderBuffer::CreateEOSBuffer()); 391 DecodeInternal(DecoderBuffer::CreateEOSBuffer());
392 } 392 }
393 393
394 template <DemuxerStream::Type StreamType> 394 template <DemuxerStream::Type StreamType>
395 void DecoderStream<StreamType>::OnDecodeDone(int buffer_size, 395 void DecoderStream<StreamType>::OnDecodeDone(int buffer_size,
396 bool end_of_stream, 396 bool end_of_stream,
397 DecodeStatus status) { 397 DecodeStatus status) {
398 FUNCTION_DVLOG(2) << ": " << status; 398 FUNCTION_DVLOG(2) << ": " << status;
399 DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER || 399 DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER ||
400 state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) 400 state_ == STATE_ERROR)
401 << state_; 401 << state_;
402 DCHECK_GT(pending_decode_requests_, 0); 402 DCHECK_GT(pending_decode_requests_, 0);
403 403
404 --pending_decode_requests_; 404 --pending_decode_requests_;
405 405
406 TRACE_EVENT_ASYNC_END0("media", GetTraceString<StreamType>(), this); 406 TRACE_EVENT_ASYNC_END0("media", GetTraceString<StreamType>(), this);
407 407
408 if (end_of_stream) { 408 if (end_of_stream) {
409 DCHECK(!pending_decode_requests_); 409 DCHECK(!pending_decode_requests_);
410 decoding_eos_ = false; 410 decoding_eos_ = false;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 return; 474 return;
475 } 475 }
476 } 476 }
477 477
478 template <DemuxerStream::Type StreamType> 478 template <DemuxerStream::Type StreamType>
479 void DecoderStream<StreamType>::OnDecodeOutputReady( 479 void DecoderStream<StreamType>::OnDecodeOutputReady(
480 const scoped_refptr<Output>& output) { 480 const scoped_refptr<Output>& output) {
481 FUNCTION_DVLOG(2) << ": " << output->timestamp().InMilliseconds() << " ms"; 481 FUNCTION_DVLOG(2) << ": " << output->timestamp().InMilliseconds() << " ms";
482 DCHECK(output.get()); 482 DCHECK(output.get());
483 DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER || 483 DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER ||
484 state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) 484 state_ == STATE_ERROR)
485 << state_; 485 << state_;
486 486
487 if (state_ == STATE_ERROR) { 487 if (state_ == STATE_ERROR) {
488 DCHECK(read_cb_.is_null()); 488 DCHECK(read_cb_.is_null());
489 return; 489 return;
490 } 490 }
491 491
492 // Drop decoding result if Reset() was called during decoding. 492 // Drop decoding result if Reset() was called during decoding.
493 // The resetting process will be handled when the decoder is reset. 493 // The resetting process will be handled when the decoder is reset.
494 if (!reset_cb_.is_null()) 494 if (!reset_cb_.is_null())
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 532
533 if (!fallback_buffers_.empty()) { 533 if (!fallback_buffers_.empty()) {
534 scoped_refptr<DecoderBuffer> buffer = fallback_buffers_.front(); 534 scoped_refptr<DecoderBuffer> buffer = fallback_buffers_.front();
535 fallback_buffers_.pop_front(); 535 fallback_buffers_.pop_front();
536 536
537 // Decode the buffer without re-appending it to |pending_buffers_|. 537 // Decode the buffer without re-appending it to |pending_buffers_|.
538 DecodeInternal(buffer); 538 DecodeInternal(buffer);
539 return; 539 return;
540 } 540 }
541 541
542 // Set a flag in addition to the state, because the state can be overwritten 542 // We may get here when a read is already pending, ignore this.
543 // when encountering an error. See crbug.com/597605. 543 if (pending_demuxer_read_)
544 DCHECK(!pending_demuxer_read_); 544 return;
545
545 pending_demuxer_read_ = true; 546 pending_demuxer_read_ = true;
546
547 state_ = STATE_PENDING_DEMUXER_READ;
548 stream_->Read(base::Bind(&DecoderStream<StreamType>::OnBufferReady, 547 stream_->Read(base::Bind(&DecoderStream<StreamType>::OnBufferReady,
549 weak_factory_.GetWeakPtr())); 548 weak_factory_.GetWeakPtr()));
550 } 549 }
551 550
552 template <DemuxerStream::Type StreamType> 551 template <DemuxerStream::Type StreamType>
553 void DecoderStream<StreamType>::OnBufferReady( 552 void DecoderStream<StreamType>::OnBufferReady(
554 DemuxerStream::Status status, 553 DemuxerStream::Status status,
555 const scoped_refptr<DecoderBuffer>& buffer) { 554 const scoped_refptr<DecoderBuffer>& buffer) {
556 FUNCTION_DVLOG(2) << ": " << status << ", " 555 FUNCTION_DVLOG(2) << ": " << status << ", "
557 << (buffer.get() ? buffer->AsHumanReadableString() 556 << (buffer.get() ? buffer->AsHumanReadableString()
558 : "NULL"); 557 : "NULL");
559 558
560 DCHECK(task_runner_->BelongsToCurrentThread()); 559 DCHECK(task_runner_->BelongsToCurrentThread());
561 DCHECK(pending_demuxer_read_); 560 DCHECK(pending_demuxer_read_);
562 if (decoded_frames_since_fallback_) { 561 if (decoded_frames_since_fallback_) {
563 DCHECK(state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) 562 DCHECK(pending_demuxer_read_ || state_ == STATE_ERROR) << state_;
564 << state_;
565 } else { 563 } else {
566 DCHECK(state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR || 564 DCHECK(state_ == STATE_ERROR || state_ == STATE_REINITIALIZING_DECODER ||
567 state_ == STATE_REINITIALIZING_DECODER || state_ == STATE_NORMAL) 565 state_ == STATE_NORMAL)
568 << state_; 566 << state_;
569 } 567 }
570 DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status; 568 DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status;
571
572 // Unset the flag. STATE_PENDING_DEMUXER_READ might have been overwritten.
573 // See crbug.com/597605.
574 pending_demuxer_read_ = false; 569 pending_demuxer_read_ = false;
575 570
576 // If parallel decode requests are supported, multiple read requests might 571 // If parallel decode requests are supported, multiple read requests might
577 // have been sent to the demuxer. The buffers might arrive while the decoder 572 // have been sent to the demuxer. The buffers might arrive while the decoder
578 // is reinitializing after falling back on first decode error. 573 // is reinitializing after falling back on first decode error.
579 if (state_ == STATE_REINITIALIZING_DECODER && 574 if (state_ == STATE_REINITIALIZING_DECODER &&
580 !decoded_frames_since_fallback_) { 575 !decoded_frames_since_fallback_) {
581 switch (status) { 576 switch (status) {
582 case DemuxerStream::kOk: 577 case DemuxerStream::kOk:
583 // Save valid buffers to be consumed by the new decoder. 578 // Save valid buffers to be consumed by the new decoder.
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 } 784 }
790 785
791 // The resetting process will be continued in OnDecoderReinitialized(). 786 // The resetting process will be continued in OnDecoderReinitialized().
792 ReinitializeDecoder(); 787 ReinitializeDecoder();
793 } 788 }
794 789
795 template class DecoderStream<DemuxerStream::VIDEO>; 790 template class DecoderStream<DemuxerStream::VIDEO>;
796 template class DecoderStream<DemuxerStream::AUDIO>; 791 template class DecoderStream<DemuxerStream::AUDIO>;
797 792
798 } // namespace media 793 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/decoder_stream.h ('k') | media/filters/video_frame_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698