| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chunk_demuxer.h" | 5 #include "media/filters/chunk_demuxer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <list> | 9 #include <list> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 | 608 |
| 609 DCHECK(!id.empty()); | 609 DCHECK(!id.empty()); |
| 610 MediaSourceStateMap::const_iterator itr = source_state_map_.find(id); | 610 MediaSourceStateMap::const_iterator itr = source_state_map_.find(id); |
| 611 if (itr == source_state_map_.end()) { | 611 if (itr == source_state_map_.end()) { |
| 612 LOG(WARNING) << __FUNCTION__ << " stream " << id << " not found"; | 612 LOG(WARNING) << __FUNCTION__ << " stream " << id << " not found"; |
| 613 return false; | 613 return false; |
| 614 } | 614 } |
| 615 return itr->second->EvictCodedFrames(media_time_dts, newDataSize); | 615 return itr->second->EvictCodedFrames(media_time_dts, newDataSize); |
| 616 } | 616 } |
| 617 | 617 |
| 618 void ChunkDemuxer::AppendData(const std::string& id, | 618 bool ChunkDemuxer::AppendData(const std::string& id, |
| 619 const uint8_t* data, | 619 const uint8_t* data, |
| 620 size_t length, | 620 size_t length, |
| 621 TimeDelta append_window_start, | 621 TimeDelta append_window_start, |
| 622 TimeDelta append_window_end, | 622 TimeDelta append_window_end, |
| 623 TimeDelta* timestamp_offset) { | 623 TimeDelta* timestamp_offset) { |
| 624 DVLOG(1) << "AppendData(" << id << ", " << length << ")"; | 624 DVLOG(1) << "AppendData(" << id << ", " << length << ")"; |
| 625 | 625 |
| 626 DCHECK(!id.empty()); | 626 DCHECK(!id.empty()); |
| 627 DCHECK(timestamp_offset); | 627 DCHECK(timestamp_offset); |
| 628 | 628 |
| 629 Ranges<TimeDelta> ranges; | 629 Ranges<TimeDelta> ranges; |
| 630 | 630 |
| 631 { | 631 { |
| 632 base::AutoLock auto_lock(lock_); | 632 base::AutoLock auto_lock(lock_); |
| 633 DCHECK_NE(state_, ENDED); | 633 DCHECK_NE(state_, ENDED); |
| 634 | 634 |
| 635 // Capture if any of the SourceBuffers are waiting for data before we start | 635 // Capture if any of the SourceBuffers are waiting for data before we start |
| 636 // parsing. | 636 // parsing. |
| 637 bool old_waiting_for_data = IsSeekWaitingForData_Locked(); | 637 bool old_waiting_for_data = IsSeekWaitingForData_Locked(); |
| 638 | 638 |
| 639 if (length == 0u) | 639 if (length == 0u) |
| 640 return; | 640 return true; |
| 641 | 641 |
| 642 DCHECK(data); | 642 DCHECK(data); |
| 643 | 643 |
| 644 switch (state_) { | 644 switch (state_) { |
| 645 case INITIALIZING: | 645 case INITIALIZING: |
| 646 case INITIALIZED: | 646 case INITIALIZED: |
| 647 DCHECK(IsValidId(id)); | 647 DCHECK(IsValidId(id)); |
| 648 if (!source_state_map_[id]->Append(data, length, append_window_start, | 648 if (!source_state_map_[id]->Append(data, length, append_window_start, |
| 649 append_window_end, | 649 append_window_end, |
| 650 timestamp_offset)) { | 650 timestamp_offset)) { |
| 651 ReportError_Locked(CHUNK_DEMUXER_ERROR_APPEND_FAILED); | 651 ReportError_Locked(CHUNK_DEMUXER_ERROR_APPEND_FAILED); |
| 652 return; | 652 return false; |
| 653 } | 653 } |
| 654 break; | 654 break; |
| 655 | 655 |
| 656 case PARSE_ERROR: | 656 case PARSE_ERROR: |
| 657 DVLOG(1) << "AppendData(): Ignoring data after a parse error."; | |
| 658 return; | |
| 659 | |
| 660 case WAITING_FOR_INIT: | 657 case WAITING_FOR_INIT: |
| 661 case ENDED: | 658 case ENDED: |
| 662 case SHUTDOWN: | 659 case SHUTDOWN: |
| 663 DVLOG(1) << "AppendData(): called in unexpected state " << state_; | 660 DVLOG(1) << "AppendData(): called in unexpected state " << state_; |
| 664 return; | 661 return false; |
| 665 } | 662 } |
| 666 | 663 |
| 667 // Check to see if data was appended at the pending seek point. This | 664 // Check to see if data was appended at the pending seek point. This |
| 668 // indicates we have parsed enough data to complete the seek. | 665 // indicates we have parsed enough data to complete the seek. |
| 669 if (old_waiting_for_data && !IsSeekWaitingForData_Locked() && | 666 if (old_waiting_for_data && !IsSeekWaitingForData_Locked() && |
| 670 !seek_cb_.is_null()) { | 667 !seek_cb_.is_null()) { |
| 671 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 668 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| 672 } | 669 } |
| 673 | 670 |
| 674 ranges = GetBufferedRanges_Locked(); | 671 ranges = GetBufferedRanges_Locked(); |
| 675 } | 672 } |
| 676 | 673 |
| 677 host_->OnBufferedTimeRangesChanged(ranges); | 674 host_->OnBufferedTimeRangesChanged(ranges); |
| 675 return true; |
| 678 } | 676 } |
| 679 | 677 |
| 680 void ChunkDemuxer::ResetParserState(const std::string& id, | 678 void ChunkDemuxer::ResetParserState(const std::string& id, |
| 681 TimeDelta append_window_start, | 679 TimeDelta append_window_start, |
| 682 TimeDelta append_window_end, | 680 TimeDelta append_window_end, |
| 683 TimeDelta* timestamp_offset) { | 681 TimeDelta* timestamp_offset) { |
| 684 DVLOG(1) << "ResetParserState(" << id << ")"; | 682 DVLOG(1) << "ResetParserState(" << id << ")"; |
| 685 base::AutoLock auto_lock(lock_); | 683 base::AutoLock auto_lock(lock_); |
| 686 DCHECK(!id.empty()); | 684 DCHECK(!id.empty()); |
| 687 CHECK(IsValidId(id)); | 685 CHECK(IsValidId(id)); |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1156 } | 1154 } |
| 1157 | 1155 |
| 1158 void ChunkDemuxer::ShutdownAllStreams() { | 1156 void ChunkDemuxer::ShutdownAllStreams() { |
| 1159 for (MediaSourceStateMap::iterator itr = source_state_map_.begin(); | 1157 for (MediaSourceStateMap::iterator itr = source_state_map_.begin(); |
| 1160 itr != source_state_map_.end(); ++itr) { | 1158 itr != source_state_map_.end(); ++itr) { |
| 1161 itr->second->Shutdown(); | 1159 itr->second->Shutdown(); |
| 1162 } | 1160 } |
| 1163 } | 1161 } |
| 1164 | 1162 |
| 1165 } // namespace media | 1163 } // namespace media |
| OLD | NEW |