| 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:
|
|
|