Index: media/filters/chunk_demuxer.cc |
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
index 9b1bbd7fdaec9dae76d16d10455f03a10be56719..74ab8c1a9c5ece30c3686070c164b5653339734a 100644 |
--- a/media/filters/chunk_demuxer.cc |
+++ b/media/filters/chunk_demuxer.cc |
@@ -15,8 +15,10 @@ |
#include "base/macros.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/stl_util.h" |
+#include "base/strings/string_number_conversions.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" |
@@ -28,13 +30,14 @@ using base::TimeDelta; |
namespace media { |
ChunkDemuxerStream::ChunkDemuxerStream(Type type, |
- bool splice_frames_enabled) |
+ bool splice_frames_enabled, |
+ MediaTrack::TrackId media_track_id) |
: type_(type), |
liveness_(DemuxerStream::LIVENESS_UNKNOWN), |
+ media_track_id_(media_track_id), |
state_(UNINITIALIZED), |
splice_frames_enabled_(splice_frames_enabled), |
- partial_append_window_trimming_enabled_(false) { |
-} |
+ partial_append_window_trimming_enabled_(false) {} |
void ChunkDemuxerStream::StartReturningData() { |
DVLOG(1) << "ChunkDemuxerStream::StartReturningData()"; |
@@ -372,7 +375,8 @@ ChunkDemuxer::ChunkDemuxer( |
splice_frames_enabled_(splice_frames_enabled), |
detected_audio_track_count_(0), |
detected_video_track_count_(0), |
- detected_text_track_count_(0) { |
+ detected_text_track_count_(0), |
+ next_track_id_(1) { |
DCHECK(!open_cb_.is_null()); |
DCHECK(!encrypted_media_init_data_cb_.is_null()); |
} |
@@ -565,6 +569,14 @@ void ChunkDemuxer::SetTracksWatcher( |
source_state_map_[id]->SetTracksWatcher(tracks_updated_cb); |
} |
+const DemuxerStream* ChunkDemuxer::GetDemuxerStreamByTrackId( |
+ MediaTrack::TrackId track_id) const { |
+ base::AutoLock auto_lock(lock_); |
+ auto it = track_id_to_demux_stream_map_.find(track_id); |
+ DCHECK(it != track_id_to_demux_stream_map_.end()); |
+ return it->second; |
+} |
+ |
void ChunkDemuxer::RemoveId(const std::string& id) { |
base::AutoLock auto_lock(lock_); |
CHECK(IsValidId(id)); |
@@ -1005,24 +1017,33 @@ void ChunkDemuxer::OnSourceInitDone( |
ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream( |
DemuxerStream::Type type) { |
+ // New ChunkDemuxerStreams can be created only during initialization segment |
+ // processing, which happens when a new chunk of data is appended and the |
+ // lock_ must be held by ChunkDemuxer::AppendData. |
+ lock_.AssertAcquired(); |
+ |
+ MediaTrack::TrackId media_track_id = base::UintToString(next_track_id_++); |
+ |
switch (type) { |
case DemuxerStream::AUDIO: |
if (audio_) |
return NULL; |
- audio_.reset( |
- new ChunkDemuxerStream(DemuxerStream::AUDIO, splice_frames_enabled_)); |
+ audio_.reset(new ChunkDemuxerStream( |
+ DemuxerStream::AUDIO, splice_frames_enabled_, media_track_id)); |
+ track_id_to_demux_stream_map_[media_track_id] = audio_.get(); |
return audio_.get(); |
break; |
case DemuxerStream::VIDEO: |
if (video_) |
return NULL; |
- video_.reset( |
- new ChunkDemuxerStream(DemuxerStream::VIDEO, splice_frames_enabled_)); |
+ video_.reset(new ChunkDemuxerStream( |
+ DemuxerStream::VIDEO, splice_frames_enabled_, media_track_id)); |
+ track_id_to_demux_stream_map_[media_track_id] = video_.get(); |
return video_.get(); |
break; |
case DemuxerStream::TEXT: { |
- return new ChunkDemuxerStream(DemuxerStream::TEXT, |
- splice_frames_enabled_); |
+ return new ChunkDemuxerStream(DemuxerStream::TEXT, splice_frames_enabled_, |
+ media_track_id); |
break; |
} |
case DemuxerStream::UNKNOWN: |