| Index: media/filters/ffmpeg_demuxer.cc
|
| diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
|
| index e9b602fa4226cfee539de7f533ae36a35f364476..7c31f079fa821810bd5dcbf7b8c60a0e737e72e1 100644
|
| --- a/media/filters/ffmpeg_demuxer.cc
|
| +++ b/media/filters/ffmpeg_demuxer.cc
|
| @@ -1112,6 +1112,7 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb,
|
| }
|
|
|
| scoped_ptr<MediaTracks> media_tracks(new MediaTracks());
|
| + MediaTracks::TrackToDemuxStreamMap track_to_demux_stream_map;
|
| AVStream* audio_stream = NULL;
|
| AudioDecoderConfig audio_config;
|
| AVStream* video_stream = NULL;
|
| @@ -1205,22 +1206,25 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb,
|
|
|
| // Note when we find our audio/video stream (we only want one of each) and
|
| // record src= playback UMA stats for the stream's decoder config.
|
| + const MediaTrack* media_track = nullptr;
|
| if (codec_type == AVMEDIA_TYPE_AUDIO) {
|
| CHECK(!audio_stream);
|
| audio_stream = stream;
|
| audio_config = streams_[i]->audio_decoder_config();
|
| RecordAudioCodecStats(audio_config);
|
|
|
| - media_tracks->AddAudioTrack(audio_config, track_id, "main", track_label,
|
| - track_language);
|
| + media_track = media_tracks->AddAudioTrack(audio_config, track_id, "main",
|
| + track_label, track_language);
|
| + track_to_demux_stream_map[media_track] = streams_[i];
|
| } else if (codec_type == AVMEDIA_TYPE_VIDEO) {
|
| CHECK(!video_stream);
|
| video_stream = stream;
|
| video_config = streams_[i]->video_decoder_config();
|
| RecordVideoCodecStats(video_config, stream->codec->color_range);
|
|
|
| - media_tracks->AddVideoTrack(video_config, track_id, "main", track_label,
|
| - track_language);
|
| + media_track = media_tracks->AddVideoTrack(video_config, track_id, "main",
|
| + track_label, track_language);
|
| + track_to_demux_stream_map[media_track] = streams_[i];
|
| }
|
|
|
| max_duration = std::max(max_duration, streams_[i]->duration());
|
| @@ -1396,6 +1400,7 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb,
|
| metadata_event->params.SetInteger("bitrate", bitrate_);
|
| media_log_->AddEvent(std::move(metadata_event));
|
|
|
| + media_tracks->set_track_to_demux_stream_map(track_to_demux_stream_map);
|
| media_tracks_updated_cb_.Run(std::move(media_tracks));
|
|
|
| status_cb.Run(PIPELINE_OK);
|
| @@ -1579,4 +1584,27 @@ void FFmpegDemuxer::SetLiveness(DemuxerStream::Liveness liveness) {
|
| }
|
| }
|
|
|
| +void FFmpegDemuxer::OnTrackIdsAssigned(const MediaTracks& tracks,
|
| + const std::vector<unsigned>& track_ids) {
|
| + DCHECK_EQ(tracks.tracks().size(), track_ids.size());
|
| + const auto& track_to_demux_stream = tracks.track_to_demux_stream_map();
|
| + DCHECK_EQ(track_to_demux_stream.size(), tracks.tracks().size());
|
| + for (size_t i = 0; i < track_ids.size(); ++i) {
|
| + const MediaTrack* track = tracks.tracks()[i].get();
|
| + DCHECK(track);
|
| + const auto& it = track_to_demux_stream.find(track);
|
| + DCHECK(it != track_to_demux_stream.end());
|
| + DVLOG(3) << "OnTrackIdsAssigned track_id=" << track_ids[i]
|
| + << " DemuxerStream=" << it->second;
|
| + track_id_to_demux_stream_[track_ids[i]] = it->second;
|
| + }
|
| +}
|
| +
|
| +const DemuxerStream* FFmpegDemuxer::GetDemuxerStreamByTrackId(
|
| + unsigned track_id) const {
|
| + const auto& it = track_id_to_demux_stream_.find(track_id);
|
| + CHECK(it != track_id_to_demux_stream_.end());
|
| + return it->second;
|
| +}
|
| +
|
| } // namespace media
|
|
|