Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(773)

Side by Side Diff: media/filters/chunk_demuxer.cc

Issue 1812543003: Allow muting/unmuting audio through media track API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@blink-sb-tracks6
Patch Set: rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <list> 9 #include <list>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/callback_helpers.h" 13 #include "base/callback_helpers.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "media/base/audio_decoder_config.h" 17 #include "media/base/audio_decoder_config.h"
18 #include "media/base/bind_to_current_loop.h" 18 #include "media/base/bind_to_current_loop.h"
19 #include "media/base/media_track.h"
19 #include "media/base/stream_parser_buffer.h" 20 #include "media/base/stream_parser_buffer.h"
20 #include "media/base/timestamp_constants.h" 21 #include "media/base/timestamp_constants.h"
21 #include "media/base/video_decoder_config.h" 22 #include "media/base/video_decoder_config.h"
22 #include "media/filters/frame_processor.h" 23 #include "media/filters/frame_processor.h"
23 #include "media/filters/stream_parser_factory.h" 24 #include "media/filters/stream_parser_factory.h"
24 25
25 using base::TimeDelta; 26 using base::TimeDelta;
26 27
27 namespace media { 28 namespace media {
28 29
(...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 StartReturningData(); 972 StartReturningData();
972 973
973 if (duration_ == kNoTimestamp()) 974 if (duration_ == kNoTimestamp())
974 duration_ = kInfiniteDuration(); 975 duration_ = kInfiniteDuration();
975 976
976 // The demuxer is now initialized after the |start_timestamp_| was set. 977 // The demuxer is now initialized after the |start_timestamp_| was set.
977 ChangeState_Locked(INITIALIZED); 978 ChangeState_Locked(INITIALIZED);
978 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); 979 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
979 } 980 }
980 981
981 ChunkDemuxerStream* 982 ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream(
982 ChunkDemuxer::CreateDemuxerStream(DemuxerStream::Type type) { 983 const MediaTrack& media_track) {
983 switch (type) { 984 // Demuxer streams can only be created when ChunkDemuxer::AppendData is in
984 case DemuxerStream::AUDIO: 985 // progress.
986 lock_.AssertAcquired();
987 switch (media_track.type()) {
988 case MediaTrack::Audio:
985 if (audio_) 989 if (audio_)
986 return NULL; 990 return NULL;
987 audio_.reset( 991 audio_.reset(
988 new ChunkDemuxerStream(DemuxerStream::AUDIO, splice_frames_enabled_)); 992 new ChunkDemuxerStream(DemuxerStream::AUDIO, splice_frames_enabled_));
993 DVLOG(5) << "Associating media_track=" << &media_track
wolenetz 2016/03/30 00:31:32 nit: level 5 is really really verbose. consider le
servolk 2016/03/30 01:13:13 Done.
994 << " with demuxer_stream=" << audio_.get();
995 track_to_stream_map_[&media_track] = audio_.get();
989 return audio_.get(); 996 return audio_.get();
990 break; 997 break;
991 case DemuxerStream::VIDEO: 998 case MediaTrack::Video:
992 if (video_) 999 if (video_)
993 return NULL; 1000 return NULL;
994 video_.reset( 1001 video_.reset(
995 new ChunkDemuxerStream(DemuxerStream::VIDEO, splice_frames_enabled_)); 1002 new ChunkDemuxerStream(DemuxerStream::VIDEO, splice_frames_enabled_));
1003 DVLOG(5) << "Associating media_track=" << &media_track
1004 << " with demuxer_stream=" << video_.get();
1005 track_to_stream_map_[&media_track] = video_.get();
996 return video_.get(); 1006 return video_.get();
997 break; 1007 break;
998 case DemuxerStream::TEXT: { 1008 case MediaTrack::Text: {
999 return new ChunkDemuxerStream(DemuxerStream::TEXT, 1009 return new ChunkDemuxerStream(DemuxerStream::TEXT,
1000 splice_frames_enabled_); 1010 splice_frames_enabled_);
1001 break; 1011 break;
1002 } 1012 }
1003 case DemuxerStream::UNKNOWN:
1004 case DemuxerStream::NUM_TYPES:
1005 NOTREACHED();
1006 return NULL;
1007 } 1013 }
1008 NOTREACHED(); 1014 NOTREACHED();
1009 return NULL; 1015 return NULL;
1010 } 1016 }
1011 1017
1012 void ChunkDemuxer::OnNewTextTrack(ChunkDemuxerStream* text_stream, 1018 void ChunkDemuxer::OnNewTextTrack(ChunkDemuxerStream* text_stream,
1013 const TextTrackConfig& config) { 1019 const TextTrackConfig& config) {
1014 lock_.AssertAcquired(); 1020 lock_.AssertAcquired();
1015 DCHECK_NE(state_, SHUTDOWN); 1021 DCHECK_NE(state_, SHUTDOWN);
1016 host_->AddTextStream(text_stream, config); 1022 host_->AddTextStream(text_stream, config);
1017 } 1023 }
1018 1024
1025 void ChunkDemuxer::OnTrackIdAssigned(unsigned track_id,
1026 const MediaTrack* track) {
1027 // New tracks and therefore track id assignements can happen only during
1028 // ChunkDemuxer::AppendData processing, which should be holding the lock.
1029 lock_.AssertAcquired();
1030 DVLOG(5) << "OnTrackIdAssigned track_id=" << track_id << " track=" << track;
1031 if (track) {
1032 DCHECK(track_id_to_track_map_.find(track_id) ==
1033 track_id_to_track_map_.end());
1034 track_id_to_track_map_[track_id] = track;
1035 } else {
1036 DCHECK(track_id_to_track_map_.find(track_id) !=
1037 track_id_to_track_map_.end());
1038 track_id_to_track_map_.erase(track_id);
1039 }
1040 }
1041
1042 const DemuxerStream* ChunkDemuxer::GetDemuxerStreamByTrackId(
1043 unsigned track_id) const {
1044 base::AutoLock auto_lock(lock_);
1045 const auto& it1 = track_id_to_track_map_.find(track_id);
1046 CHECK(it1 != track_id_to_track_map_.end());
1047 const auto& it2 = track_to_stream_map_.find(it1->second);
1048 CHECK(it2 != track_to_stream_map_.end());
1049 return it2->second;
1050 }
1051
1019 bool ChunkDemuxer::IsValidId(const std::string& source_id) const { 1052 bool ChunkDemuxer::IsValidId(const std::string& source_id) const {
1020 lock_.AssertAcquired(); 1053 lock_.AssertAcquired();
1021 return source_state_map_.count(source_id) > 0u; 1054 return source_state_map_.count(source_id) > 0u;
1022 } 1055 }
1023 1056
1024 void ChunkDemuxer::UpdateDuration(TimeDelta new_duration) { 1057 void ChunkDemuxer::UpdateDuration(TimeDelta new_duration) {
1025 DCHECK(duration_ != new_duration); 1058 DCHECK(duration_ != new_duration);
1026 user_specified_duration_ = -1; 1059 user_specified_duration_ = -1;
1027 duration_ = new_duration; 1060 duration_ = new_duration;
1028 host_->SetDuration(new_duration); 1061 host_->SetDuration(new_duration);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1115 } 1148 }
1116 1149
1117 void ChunkDemuxer::ShutdownAllStreams() { 1150 void ChunkDemuxer::ShutdownAllStreams() {
1118 for (MediaSourceStateMap::iterator itr = source_state_map_.begin(); 1151 for (MediaSourceStateMap::iterator itr = source_state_map_.begin();
1119 itr != source_state_map_.end(); ++itr) { 1152 itr != source_state_map_.end(); ++itr) {
1120 itr->second->Shutdown(); 1153 itr->second->Shutdown();
1121 } 1154 }
1122 } 1155 }
1123 1156
1124 } // namespace media 1157 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698