Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chromecast/browser/media/media_pipeline_host.h" | |
| 6 | |
| 7 #include <utility> | |
| 8 | |
| 9 #include "base/bind.h" | |
| 10 #include "base/callback.h" | |
| 11 #include "base/location.h" | |
| 12 #include "base/memory/shared_memory.h" | |
| 13 #include "base/single_thread_task_runner.h" | |
| 14 #include "chromecast/common/media/shared_memory_chunk.h" | |
| 15 #include "chromecast/media/cma/backend/media_pipeline_device.h" | |
| 16 #include "chromecast/media/cma/backend/media_pipeline_device_params.h" | |
| 17 #include "chromecast/media/cma/ipc/media_message_fifo.h" | |
| 18 #include "chromecast/media/cma/ipc_streamer/coded_frame_provider_host.h" | |
| 19 #include "chromecast/media/cma/pipeline/audio_pipeline_impl.h" | |
| 20 #include "chromecast/media/cma/pipeline/media_pipeline_impl.h" | |
| 21 #include "chromecast/media/cma/pipeline/video_pipeline_impl.h" | |
| 22 | |
| 23 namespace chromecast { | |
| 24 namespace media { | |
| 25 | |
| 26 struct MediaPipelineHost::MediaTrackHost { | |
| 27 MediaTrackHost(); | |
| 28 ~MediaTrackHost(); | |
| 29 | |
| 30 base::Closure pipe_write_cb; | |
| 31 }; | |
| 32 | |
| 33 MediaPipelineHost::MediaTrackHost::MediaTrackHost() { | |
| 34 } | |
| 35 | |
| 36 MediaPipelineHost::MediaTrackHost::~MediaTrackHost() { | |
| 37 } | |
| 38 | |
| 39 MediaPipelineHost::MediaPipelineHost() { | |
| 40 thread_checker_.DetachFromThread(); | |
| 41 } | |
| 42 | |
| 43 MediaPipelineHost::~MediaPipelineHost() { | |
| 44 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 45 | |
| 46 for (MediaTrackMap::iterator it = media_track_map_.begin(); | |
| 47 it != media_track_map_.end(); ++it) { | |
| 48 scoped_ptr<MediaTrackHost> media_track(it->second); | |
| 49 } | |
| 50 media_track_map_.clear(); | |
| 51 } | |
| 52 | |
| 53 void MediaPipelineHost::Initialize( | |
| 54 LoadType load_type, | |
| 55 const MediaPipelineClient& client) { | |
| 56 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 57 media_pipeline_.reset(new MediaPipelineImpl()); | |
| 58 MediaPipelineDeviceParams default_parameters; | |
| 59 if (load_type == kLoadTypeMediaStream) | |
| 60 default_parameters.disable_synchronization = true; | |
| 61 media_pipeline_->Initialize( | |
| 62 load_type, | |
| 63 CreateMediaPipelineDevice(default_parameters).Pass()); | |
| 64 media_pipeline_->SetClient(client); | |
| 65 } | |
| 66 | |
| 67 void MediaPipelineHost::SetAvPipe( | |
| 68 TrackId track_id, | |
| 69 scoped_ptr<base::SharedMemory> shared_mem, | |
| 70 const base::Closure& pipe_read_activity_cb, | |
| 71 const base::Closure& av_pipe_set_cb) { | |
| 72 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 73 CHECK(track_id == kAudioTrackId || track_id == kVideoTrackId); | |
| 74 | |
| 75 size_t shared_mem_size = shared_mem->requested_size(); | |
| 76 scoped_ptr<MediaMemoryChunk> shared_memory_chunk( | |
| 77 new SharedMemoryChunk( | |
|
gunsch
2014/12/23 22:27:19
nit: could merge to one line
erickung1
2014/12/23 22:34:45
Done.
| |
| 78 shared_mem.Pass(), shared_mem_size)); | |
| 79 scoped_ptr<MediaMessageFifo> media_message_fifo( | |
| 80 new MediaMessageFifo( | |
|
gunsch
2014/12/23 22:27:19
nit: could merge to one line
erickung1
2014/12/23 22:34:46
Done.
| |
| 81 shared_memory_chunk.Pass(), shared_mem_size)); | |
| 82 media_message_fifo->ObserveReadActivity(pipe_read_activity_cb); | |
| 83 scoped_ptr<CodedFrameProviderHost> frame_provider_host( | |
| 84 new CodedFrameProviderHost(media_message_fifo.Pass())); | |
| 85 | |
| 86 MediaTrackMap::iterator it = media_track_map_.find(track_id); | |
| 87 MediaTrackHost* media_track_host; | |
| 88 if (it == media_track_map_.end()) { | |
| 89 media_track_host = new MediaTrackHost(); | |
| 90 media_track_map_.insert( | |
| 91 std::pair<TrackId, MediaTrackHost*>(track_id, media_track_host)); | |
| 92 } else { | |
| 93 media_track_host = it->second; | |
| 94 } | |
| 95 media_track_host->pipe_write_cb = frame_provider_host->GetFifoWriteEventCb(); | |
| 96 | |
| 97 scoped_ptr<CodedFrameProvider> frame_provider(frame_provider_host.release()); | |
| 98 if (track_id == kAudioTrackId) { | |
| 99 media_pipeline_->GetAudioPipelineImpl()->SetCodedFrameProvider( | |
| 100 frame_provider.Pass()); | |
| 101 } else { | |
| 102 media_pipeline_->GetVideoPipelineImpl()->SetCodedFrameProvider( | |
| 103 frame_provider.Pass()); | |
| 104 } | |
| 105 av_pipe_set_cb.Run(); | |
| 106 } | |
| 107 | |
| 108 void MediaPipelineHost::AudioInitialize( | |
| 109 TrackId track_id, | |
| 110 const AvPipelineClient& client, | |
| 111 const ::media::AudioDecoderConfig& config, | |
| 112 const ::media::PipelineStatusCB& status_cb) { | |
| 113 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 114 CHECK(track_id == kAudioTrackId); | |
| 115 media_pipeline_->GetAudioPipeline()->SetClient(client); | |
| 116 media_pipeline_->InitializeAudio( | |
| 117 config, scoped_ptr<CodedFrameProvider>(), status_cb); | |
| 118 } | |
| 119 | |
| 120 void MediaPipelineHost::VideoInitialize( | |
| 121 TrackId track_id, | |
| 122 const VideoPipelineClient& client, | |
| 123 const ::media::VideoDecoderConfig& config, | |
| 124 const ::media::PipelineStatusCB& status_cb) { | |
| 125 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 126 CHECK(track_id == kVideoTrackId); | |
| 127 media_pipeline_->GetVideoPipeline()->SetClient(client); | |
| 128 media_pipeline_->InitializeVideo( | |
| 129 config, scoped_ptr<CodedFrameProvider>(), status_cb); | |
| 130 } | |
| 131 | |
| 132 void MediaPipelineHost::StartPlayingFrom(base::TimeDelta time) { | |
| 133 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 134 media_pipeline_->StartPlayingFrom(time); | |
| 135 } | |
| 136 | |
| 137 void MediaPipelineHost::Flush(const ::media::PipelineStatusCB& status_cb) { | |
| 138 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 139 media_pipeline_->Flush(status_cb); | |
| 140 } | |
| 141 | |
| 142 void MediaPipelineHost::Stop() { | |
| 143 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 144 media_pipeline_->Stop(); | |
| 145 } | |
| 146 | |
| 147 void MediaPipelineHost::SetPlaybackRate(float playback_rate) { | |
| 148 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 149 media_pipeline_->SetPlaybackRate(playback_rate); | |
| 150 } | |
| 151 | |
| 152 void MediaPipelineHost::SetVolume(TrackId track_id, float volume) { | |
| 153 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 154 CHECK(track_id == kAudioTrackId); | |
| 155 media_pipeline_->GetAudioPipeline()->SetVolume(volume); | |
| 156 } | |
| 157 | |
| 158 void MediaPipelineHost::SetCdm( | |
| 159 int render_process_id, int render_frame_id, int cdm_id) { | |
| 160 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 161 | |
| 162 // TODO(gunsch): Find a way to get content::BrowserCdmManager since it is not | |
| 163 // under content/public/. | |
|
gunsch
2014/12/23 22:27:19
Feel free to add reference to crbug.com/444930
erickung1
2014/12/23 22:34:45
Done.
| |
| 164 NOTIMPLEMENTED(); | |
| 165 } | |
| 166 | |
| 167 void MediaPipelineHost::NotifyPipeWrite(TrackId track_id) { | |
| 168 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 169 MediaTrackMap::iterator it = media_track_map_.find(track_id); | |
| 170 if (it == media_track_map_.end()) | |
| 171 return; | |
| 172 | |
| 173 MediaTrackHost* media_track_host = it->second; | |
| 174 if (!media_track_host->pipe_write_cb.is_null()) | |
| 175 media_track_host->pipe_write_cb.Run(); | |
| 176 } | |
| 177 | |
| 178 } // namespace media | |
| 179 } // namespace chromecast | |
| 180 | |
| OLD | NEW |