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 |