Index: media/filters/chunk_demuxer.cc |
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
index 53ce1f3ec09c046598f5a0b9f5c9a2aa9254ecfa..fc5c073c0d7335e83ec2341fcddf4ab75e43fa4b 100644 |
--- a/media/filters/chunk_demuxer.cc |
+++ b/media/filters/chunk_demuxer.cc |
@@ -17,6 +17,7 @@ |
#include "base/stl_util.h" |
#include "media/base/audio_decoder_config.h" |
#include "media/base/bind_to_current_loop.h" |
+#include "media/base/media_tracks.h" |
#include "media/base/stream_parser_buffer.h" |
#include "media/base/timestamp_constants.h" |
#include "media/base/video_decoder_config.h" |
@@ -1002,32 +1003,31 @@ void ChunkDemuxer::OnSourceInitDone( |
base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
} |
-ChunkDemuxerStream* |
-ChunkDemuxer::CreateDemuxerStream(DemuxerStream::Type type) { |
- switch (type) { |
- case DemuxerStream::AUDIO: |
+ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream( |
+ const MediaTrack& media_track) { |
+ // Demuxer streams can only be created when ChunkDemuxer::AppendData is in |
+ // progress. |
+ lock_.AssertAcquired(); |
+ switch (media_track.type()) { |
+ case MediaTrack::Audio: |
if (audio_) |
return NULL; |
audio_.reset( |
new ChunkDemuxerStream(DemuxerStream::AUDIO, splice_frames_enabled_)); |
return audio_.get(); |
break; |
- case DemuxerStream::VIDEO: |
+ case MediaTrack::Video: |
if (video_) |
return NULL; |
video_.reset( |
new ChunkDemuxerStream(DemuxerStream::VIDEO, splice_frames_enabled_)); |
return video_.get(); |
break; |
- case DemuxerStream::TEXT: { |
+ case MediaTrack::Text: { |
return new ChunkDemuxerStream(DemuxerStream::TEXT, |
splice_frames_enabled_); |
break; |
} |
- case DemuxerStream::UNKNOWN: |
- case DemuxerStream::NUM_TYPES: |
- NOTREACHED(); |
- return NULL; |
} |
NOTREACHED(); |
return NULL; |
@@ -1040,6 +1040,31 @@ void ChunkDemuxer::OnNewTextTrack(ChunkDemuxerStream* text_stream, |
host_->AddTextStream(text_stream, config); |
} |
+void ChunkDemuxer::OnTrackIdsAssigned(const MediaTracks& tracks, |
+ const std::vector<unsigned>& track_ids) { |
+ // New tracks and therefore track id assignements can happen only during |
+ // ChunkDemuxer::AppendData processing, which should be holding the lock. |
+ lock_.AssertAcquired(); |
+ |
+ const auto& new_track_id_map = tracks.OnTrackIdsAssigned(track_ids); |
+ |
+ // ChunkDemuxer might have multiple media track sets (since it can have |
+ // multiple SourceBuffers), so we need to merge the map for the current set of |
+ // tracks with the global |track_id_to_demux_stream_| map shared across all |
+ // SourceBuffers. |
+ for (const auto& it : new_track_id_map) { |
+ track_id_to_demux_stream_[it.first] = it.second; |
+ } |
+} |
+ |
+const DemuxerStream* ChunkDemuxer::GetDemuxerStreamByTrackId( |
+ unsigned track_id) const { |
+ base::AutoLock auto_lock(lock_); |
+ const auto& it = track_id_to_demux_stream_.find(track_id); |
+ CHECK(it != track_id_to_demux_stream_.end()); |
+ return it->second; |
+} |
+ |
bool ChunkDemuxer::IsValidId(const std::string& source_id) const { |
lock_.AssertAcquired(); |
return source_state_map_.count(source_id) > 0u; |