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 <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 if (!read_cb_.is_null()) { | 74 if (!read_cb_.is_null()) { |
75 base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kOk, | 75 base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kOk, |
76 StreamParserBuffer::CreateEOSBuffer()); | 76 StreamParserBuffer::CreateEOSBuffer()); |
77 } | 77 } |
78 } | 78 } |
79 | 79 |
80 bool ChunkDemuxerStream::IsSeekWaitingForData() const { | 80 bool ChunkDemuxerStream::IsSeekWaitingForData() const { |
81 base::AutoLock auto_lock(lock_); | 81 base::AutoLock auto_lock(lock_); |
82 | 82 |
83 // This method should not be called for text tracks. See the note in | 83 // This method should not be called for text tracks. See the note in |
84 // MediaSourceState::IsSeekWaitingForData(). | 84 // SourceBufferState::IsSeekWaitingForData(). |
85 DCHECK_NE(type_, DemuxerStream::TEXT); | 85 DCHECK_NE(type_, DemuxerStream::TEXT); |
86 | 86 |
87 return stream_->IsSeekPending(); | 87 return stream_->IsSeekPending(); |
88 } | 88 } |
89 | 89 |
90 void ChunkDemuxerStream::Seek(TimeDelta time) { | 90 void ChunkDemuxerStream::Seek(TimeDelta time) { |
91 DVLOG(1) << "ChunkDemuxerStream::Seek(" << time.InSecondsF() << ")"; | 91 DVLOG(1) << "ChunkDemuxerStream::Seek(" << time.InSecondsF() << ")"; |
92 base::AutoLock auto_lock(lock_); | 92 base::AutoLock auto_lock(lock_); |
93 DCHECK(read_cb_.is_null()); | 93 DCHECK(read_cb_.is_null()); |
94 DCHECK(state_ == UNINITIALIZED || state_ == RETURNING_ABORT_FOR_READS) | 94 DCHECK(state_ == UNINITIALIZED || state_ == RETURNING_ABORT_FOR_READS) |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 StreamParserFactory::Create(type, parsed_codec_ids, media_log_)); | 589 StreamParserFactory::Create(type, parsed_codec_ids, media_log_)); |
590 | 590 |
591 if (!stream_parser) | 591 if (!stream_parser) |
592 return ChunkDemuxer::kNotSupported; | 592 return ChunkDemuxer::kNotSupported; |
593 | 593 |
594 std::unique_ptr<FrameProcessor> frame_processor( | 594 std::unique_ptr<FrameProcessor> frame_processor( |
595 new FrameProcessor(base::Bind(&ChunkDemuxer::IncreaseDurationIfNecessary, | 595 new FrameProcessor(base::Bind(&ChunkDemuxer::IncreaseDurationIfNecessary, |
596 base::Unretained(this)), | 596 base::Unretained(this)), |
597 media_log_)); | 597 media_log_)); |
598 | 598 |
599 std::unique_ptr<MediaSourceState> source_state( | 599 std::unique_ptr<SourceBufferState> source_state(new SourceBufferState( |
600 new MediaSourceState(std::move(stream_parser), std::move(frame_processor), | 600 std::move(stream_parser), std::move(frame_processor), |
601 base::Bind(&ChunkDemuxer::CreateDemuxerStream, | 601 base::Bind(&ChunkDemuxer::CreateDemuxerStream, base::Unretained(this), |
602 base::Unretained(this), id), | 602 id), |
603 media_log_)); | 603 media_log_)); |
604 | 604 |
605 MediaSourceState::NewTextTrackCB new_text_track_cb; | 605 SourceBufferState::NewTextTrackCB new_text_track_cb; |
606 | 606 |
607 if (enable_text_) { | 607 if (enable_text_) { |
608 new_text_track_cb = base::Bind(&ChunkDemuxer::OnNewTextTrack, | 608 new_text_track_cb = base::Bind(&ChunkDemuxer::OnNewTextTrack, |
609 base::Unretained(this)); | 609 base::Unretained(this)); |
610 } | 610 } |
611 | 611 |
612 pending_source_init_ids_.insert(id); | 612 pending_source_init_ids_.insert(id); |
613 | 613 |
614 std::string expected_mss_codecs = codecs; | 614 std::string expected_sbs_codecs = codecs; |
615 if (codecs == "" && type == "audio/aac") | 615 if (codecs == "" && type == "audio/aac") |
616 expected_mss_codecs = "aac"; | 616 expected_sbs_codecs = "aac"; |
617 if (codecs == "" && (type == "audio/mpeg" || type == "audio/mp3")) | 617 if (codecs == "" && (type == "audio/mpeg" || type == "audio/mp3")) |
618 expected_mss_codecs = "mp3"; | 618 expected_sbs_codecs = "mp3"; |
619 | 619 |
620 source_state->Init( | 620 source_state->Init( |
621 base::Bind(&ChunkDemuxer::OnSourceInitDone, base::Unretained(this), id), | 621 base::Bind(&ChunkDemuxer::OnSourceInitDone, base::Unretained(this), id), |
622 expected_mss_codecs, encrypted_media_init_data_cb_, new_text_track_cb); | 622 expected_sbs_codecs, encrypted_media_init_data_cb_, new_text_track_cb); |
623 | 623 |
624 source_state_map_[id] = std::move(source_state); | 624 source_state_map_[id] = std::move(source_state); |
625 return kOk; | 625 return kOk; |
626 } | 626 } |
627 | 627 |
628 void ChunkDemuxer::SetTracksWatcher( | 628 void ChunkDemuxer::SetTracksWatcher( |
629 const std::string& id, | 629 const std::string& id, |
630 const MediaTracksUpdatedCB& tracks_updated_cb) { | 630 const MediaTracksUpdatedCB& tracks_updated_cb) { |
631 base::AutoLock auto_lock(lock_); | 631 base::AutoLock auto_lock(lock_); |
632 CHECK(IsValidId(id)); | 632 CHECK(IsValidId(id)); |
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1264 base::AutoLock auto_lock(lock_); | 1264 base::AutoLock auto_lock(lock_); |
1265 return GetBufferedRanges_Locked(); | 1265 return GetBufferedRanges_Locked(); |
1266 } | 1266 } |
1267 | 1267 |
1268 Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges_Locked() const { | 1268 Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges_Locked() const { |
1269 lock_.AssertAcquired(); | 1269 lock_.AssertAcquired(); |
1270 | 1270 |
1271 bool ended = state_ == ENDED; | 1271 bool ended = state_ == ENDED; |
1272 // TODO(acolwell): When we start allowing SourceBuffers that are not active, | 1272 // TODO(acolwell): When we start allowing SourceBuffers that are not active, |
1273 // we'll need to update this loop to only add ranges from active sources. | 1273 // we'll need to update this loop to only add ranges from active sources. |
1274 MediaSourceState::RangesList ranges_list; | 1274 SourceBufferState::RangesList ranges_list; |
1275 for (auto itr = source_state_map_.begin(); itr != source_state_map_.end(); | 1275 for (auto itr = source_state_map_.begin(); itr != source_state_map_.end(); |
1276 ++itr) { | 1276 ++itr) { |
1277 ranges_list.push_back(itr->second->GetBufferedRanges(duration_, ended)); | 1277 ranges_list.push_back(itr->second->GetBufferedRanges(duration_, ended)); |
1278 } | 1278 } |
1279 | 1279 |
1280 return MediaSourceState::ComputeRangesIntersection(ranges_list, ended); | 1280 return SourceBufferState::ComputeRangesIntersection(ranges_list, ended); |
1281 } | 1281 } |
1282 | 1282 |
1283 void ChunkDemuxer::StartReturningData() { | 1283 void ChunkDemuxer::StartReturningData() { |
1284 for (auto itr = source_state_map_.begin(); itr != source_state_map_.end(); | 1284 for (auto itr = source_state_map_.begin(); itr != source_state_map_.end(); |
1285 ++itr) { | 1285 ++itr) { |
1286 itr->second->StartReturningData(); | 1286 itr->second->StartReturningData(); |
1287 } | 1287 } |
1288 } | 1288 } |
1289 | 1289 |
1290 void ChunkDemuxer::AbortPendingReads_Locked() { | 1290 void ChunkDemuxer::AbortPendingReads_Locked() { |
(...skipping 18 matching lines...) Expand all Loading... |
1309 } | 1309 } |
1310 | 1310 |
1311 void ChunkDemuxer::ShutdownAllStreams() { | 1311 void ChunkDemuxer::ShutdownAllStreams() { |
1312 for (auto itr = source_state_map_.begin(); itr != source_state_map_.end(); | 1312 for (auto itr = source_state_map_.begin(); itr != source_state_map_.end(); |
1313 ++itr) { | 1313 ++itr) { |
1314 itr->second->Shutdown(); | 1314 itr->second->Shutdown(); |
1315 } | 1315 } |
1316 } | 1316 } |
1317 | 1317 |
1318 } // namespace media | 1318 } // namespace media |
OLD | NEW |