OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chromecast/browser/media/media_pipeline_host.h" | 5 #include "chromecast/browser/media/media_pipeline_host.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 MediaPipelineHost::~MediaPipelineHost() { | 46 MediaPipelineHost::~MediaPipelineHost() { |
47 DCHECK(thread_checker_.CalledOnValidThread()); | 47 DCHECK(thread_checker_.CalledOnValidThread()); |
48 | 48 |
49 for (MediaTrackMap::iterator it = media_track_map_.begin(); | 49 for (MediaTrackMap::iterator it = media_track_map_.begin(); |
50 it != media_track_map_.end(); ++it) { | 50 it != media_track_map_.end(); ++it) { |
51 scoped_ptr<MediaTrackHost> media_track(it->second); | 51 scoped_ptr<MediaTrackHost> media_track(it->second); |
52 } | 52 } |
53 media_track_map_.clear(); | 53 media_track_map_.clear(); |
54 } | 54 } |
55 | 55 |
56 void MediaPipelineHost::Initialize( | 56 void MediaPipelineHost::Initialize(LoadType load_type, |
57 LoadType load_type, | 57 const MediaPipelineClient& client, |
58 const MediaPipelineClient& client, | 58 const CreateBackendCB& create_backend_cb) { |
59 const CreateDeviceComponentsCB& create_device_components_cb) { | |
60 DCHECK(thread_checker_.CalledOnValidThread()); | 59 DCHECK(thread_checker_.CalledOnValidThread()); |
61 media_pipeline_.reset(new MediaPipelineImpl()); | 60 media_pipeline_.reset(new MediaPipelineImpl()); |
62 task_runner_.reset(new TaskRunnerImpl()); | 61 task_runner_.reset(new TaskRunnerImpl()); |
63 MediaPipelineDeviceParams::MediaSyncType sync_type = | 62 MediaPipelineDeviceParams::MediaSyncType sync_type = |
64 (load_type == kLoadTypeMediaStream) | 63 (load_type == kLoadTypeMediaStream) |
65 ? MediaPipelineDeviceParams::kModeIgnorePts | 64 ? MediaPipelineDeviceParams::kModeIgnorePts |
66 : MediaPipelineDeviceParams::kModeSyncPts; | 65 : MediaPipelineDeviceParams::kModeSyncPts; |
67 MediaPipelineDeviceParams default_parameters(sync_type, task_runner_.get()); | 66 MediaPipelineDeviceParams default_parameters(sync_type, task_runner_.get()); |
68 | 67 |
69 media_pipeline_->SetClient(client); | 68 media_pipeline_->SetClient(client); |
70 media_pipeline_->Initialize( | 69 media_pipeline_->Initialize(load_type, |
71 load_type, create_device_components_cb.Run(default_parameters).Pass()); | 70 create_backend_cb.Run(default_parameters).Pass()); |
72 } | 71 } |
73 | 72 |
74 void MediaPipelineHost::SetAvPipe( | 73 void MediaPipelineHost::SetAvPipe( |
75 TrackId track_id, | 74 TrackId track_id, |
76 scoped_ptr<base::SharedMemory> shared_mem, | 75 scoped_ptr<base::SharedMemory> shared_mem, |
77 const base::Closure& pipe_read_activity_cb, | 76 const base::Closure& pipe_read_activity_cb, |
78 const base::Closure& av_pipe_set_cb) { | 77 const base::Closure& av_pipe_set_cb) { |
79 DCHECK(thread_checker_.CalledOnValidThread()); | 78 DCHECK(thread_checker_.CalledOnValidThread()); |
80 CHECK(track_id == kAudioTrackId || track_id == kVideoTrackId); | 79 CHECK(track_id == kAudioTrackId || track_id == kVideoTrackId); |
81 | 80 |
(...skipping 10 matching lines...) Expand all Loading... |
92 MediaTrackHost* media_track_host; | 91 MediaTrackHost* media_track_host; |
93 if (it == media_track_map_.end()) { | 92 if (it == media_track_map_.end()) { |
94 media_track_host = new MediaTrackHost(); | 93 media_track_host = new MediaTrackHost(); |
95 media_track_map_.insert( | 94 media_track_map_.insert( |
96 std::pair<TrackId, MediaTrackHost*>(track_id, media_track_host)); | 95 std::pair<TrackId, MediaTrackHost*>(track_id, media_track_host)); |
97 } else { | 96 } else { |
98 media_track_host = it->second; | 97 media_track_host = it->second; |
99 } | 98 } |
100 media_track_host->pipe_write_cb = frame_provider_host->GetFifoWriteEventCb(); | 99 media_track_host->pipe_write_cb = frame_provider_host->GetFifoWriteEventCb(); |
101 | 100 |
102 scoped_ptr<CodedFrameProvider> frame_provider(frame_provider_host.release()); | |
103 if (track_id == kAudioTrackId) { | 101 if (track_id == kAudioTrackId) { |
104 media_pipeline_->GetAudioPipelineImpl()->SetCodedFrameProvider( | 102 audio_frame_provider_ = frame_provider_host.Pass(); |
105 frame_provider.Pass()); | |
106 } else { | 103 } else { |
107 media_pipeline_->GetVideoPipelineImpl()->SetCodedFrameProvider( | 104 video_frame_provider_ = frame_provider_host.Pass(); |
108 frame_provider.Pass()); | |
109 } | 105 } |
110 av_pipe_set_cb.Run(); | 106 av_pipe_set_cb.Run(); |
111 } | 107 } |
112 | 108 |
113 void MediaPipelineHost::AudioInitialize( | 109 void MediaPipelineHost::AudioInitialize( |
114 TrackId track_id, | 110 TrackId track_id, |
115 const AvPipelineClient& client, | 111 const AvPipelineClient& client, |
116 const ::media::AudioDecoderConfig& config, | 112 const ::media::AudioDecoderConfig& config, |
117 const ::media::PipelineStatusCB& status_cb) { | 113 const ::media::PipelineStatusCB& status_cb) { |
118 DCHECK(thread_checker_.CalledOnValidThread()); | 114 DCHECK(thread_checker_.CalledOnValidThread()); |
119 CHECK(track_id == kAudioTrackId); | 115 CHECK(track_id == kAudioTrackId); |
120 media_pipeline_->GetAudioPipeline()->SetClient(client); | |
121 media_pipeline_->InitializeAudio( | 116 media_pipeline_->InitializeAudio( |
122 config, scoped_ptr<CodedFrameProvider>(), status_cb); | 117 config, client, audio_frame_provider_.Pass(), status_cb); |
123 } | 118 } |
124 | 119 |
125 void MediaPipelineHost::VideoInitialize( | 120 void MediaPipelineHost::VideoInitialize( |
126 TrackId track_id, | 121 TrackId track_id, |
127 const VideoPipelineClient& client, | 122 const VideoPipelineClient& client, |
128 const std::vector<::media::VideoDecoderConfig>& configs, | 123 const std::vector< ::media::VideoDecoderConfig>& configs, |
129 const ::media::PipelineStatusCB& status_cb) { | 124 const ::media::PipelineStatusCB& status_cb) { |
130 DCHECK(thread_checker_.CalledOnValidThread()); | 125 DCHECK(thread_checker_.CalledOnValidThread()); |
131 CHECK(track_id == kVideoTrackId); | 126 CHECK(track_id == kVideoTrackId); |
132 media_pipeline_->GetVideoPipeline()->SetClient(client); | |
133 media_pipeline_->InitializeVideo( | 127 media_pipeline_->InitializeVideo( |
134 configs, scoped_ptr<CodedFrameProvider>(), status_cb); | 128 configs, client, video_frame_provider_.Pass(), status_cb); |
135 } | 129 } |
136 | 130 |
137 void MediaPipelineHost::StartPlayingFrom(base::TimeDelta time) { | 131 void MediaPipelineHost::StartPlayingFrom(base::TimeDelta time) { |
138 DCHECK(thread_checker_.CalledOnValidThread()); | 132 DCHECK(thread_checker_.CalledOnValidThread()); |
139 media_pipeline_->StartPlayingFrom(time); | 133 media_pipeline_->StartPlayingFrom(time); |
140 } | 134 } |
141 | 135 |
142 void MediaPipelineHost::Flush(const ::media::PipelineStatusCB& status_cb) { | 136 void MediaPipelineHost::Flush(const ::media::PipelineStatusCB& status_cb) { |
143 DCHECK(thread_checker_.CalledOnValidThread()); | 137 DCHECK(thread_checker_.CalledOnValidThread()); |
144 media_pipeline_->Flush(status_cb); | 138 media_pipeline_->Flush(status_cb); |
145 } | 139 } |
146 | 140 |
147 void MediaPipelineHost::Stop() { | 141 void MediaPipelineHost::Stop() { |
148 DCHECK(thread_checker_.CalledOnValidThread()); | 142 DCHECK(thread_checker_.CalledOnValidThread()); |
149 media_pipeline_->Stop(); | 143 media_pipeline_->Stop(); |
150 } | 144 } |
151 | 145 |
152 void MediaPipelineHost::SetPlaybackRate(double playback_rate) { | 146 void MediaPipelineHost::SetPlaybackRate(double playback_rate) { |
153 DCHECK(thread_checker_.CalledOnValidThread()); | 147 DCHECK(thread_checker_.CalledOnValidThread()); |
154 media_pipeline_->SetPlaybackRate(playback_rate); | 148 media_pipeline_->SetPlaybackRate(playback_rate); |
155 } | 149 } |
156 | 150 |
157 void MediaPipelineHost::SetVolume(TrackId track_id, float volume) { | 151 void MediaPipelineHost::SetVolume(TrackId track_id, float volume) { |
158 DCHECK(thread_checker_.CalledOnValidThread()); | 152 DCHECK(thread_checker_.CalledOnValidThread()); |
159 CHECK(track_id == kAudioTrackId); | 153 CHECK(track_id == kAudioTrackId); |
160 media_pipeline_->GetAudioPipeline()->SetVolume(volume); | 154 media_pipeline_->SetVolume(volume); |
161 } | 155 } |
162 | 156 |
163 void MediaPipelineHost::SetCdm(BrowserCdmCast* cdm) { | 157 void MediaPipelineHost::SetCdm(BrowserCdmCast* cdm) { |
164 DCHECK(thread_checker_.CalledOnValidThread()); | 158 DCHECK(thread_checker_.CalledOnValidThread()); |
165 media_pipeline_->SetCdm(cdm); | 159 media_pipeline_->SetCdm(cdm); |
166 } | 160 } |
167 | 161 |
168 void MediaPipelineHost::NotifyPipeWrite(TrackId track_id) { | 162 void MediaPipelineHost::NotifyPipeWrite(TrackId track_id) { |
169 DCHECK(thread_checker_.CalledOnValidThread()); | 163 DCHECK(thread_checker_.CalledOnValidThread()); |
170 MediaTrackMap::iterator it = media_track_map_.find(track_id); | 164 MediaTrackMap::iterator it = media_track_map_.find(track_id); |
171 if (it == media_track_map_.end()) | 165 if (it == media_track_map_.end()) |
172 return; | 166 return; |
173 | 167 |
174 MediaTrackHost* media_track_host = it->second; | 168 MediaTrackHost* media_track_host = it->second; |
175 if (!media_track_host->pipe_write_cb.is_null()) | 169 if (!media_track_host->pipe_write_cb.is_null()) |
176 media_track_host->pipe_write_cb.Run(); | 170 media_track_host->pipe_write_cb.Run(); |
177 } | 171 } |
178 | 172 |
179 } // namespace media | 173 } // namespace media |
180 } // namespace chromecast | 174 } // namespace chromecast |
OLD | NEW |