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

Side by Side Diff: media/base/android/media_player_renderer.cc

Issue 2075303002: [DO NOT COMMIT] Initial MediaPlayerRenderer plumbing and basic features (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
(Empty)
1 // Copyright 2016 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 "media/base/android/media_player_renderer.h"
6
7 #include <memory>
8
9 #include "content/browser/android/child_process_launcher_android.h"
10 #include "content/browser/media/android/media_resource_getter_impl.h"
11 #include "content/public/browser/browser_context.h"
12 #include "content/public/browser/render_process_host.h"
13 #include "content/public/browser/storage_partition.h"
14 #include "content/public/browser/web_contents.h"
15 #include "media/base/android/url_demuxer_stream.h"
16 #include "mojo/common/user_agent.h"
17
18 namespace media {
19
20 MediaPlayerRenderer::MediaPlayerRenderer(
21 content::RenderFrameHost* render_frame_host)
22 : render_frame_host_(render_frame_host),
23 duration_(base::TimeDelta::FromMicroseconds(0)),
24 weak_factory_(this) {}
25
26 MediaPlayerRenderer::~MediaPlayerRenderer() {}
27
28 void MediaPlayerRenderer::Initialize(
29 DemuxerStreamProvider* demuxer_stream_provider,
30 RendererClient* client,
31 const PipelineStatusCB& init_cb) {
32 DVLOG(1) << __FUNCTION__;
33 DemuxerStream* stream =
34 demuxer_stream_provider->GetStream(DemuxerStream::Type::URL);
35 if (stream) {
36 // TODO(tguilbert): FOR REVIEW: are c-style casts allowed?
37 UrlDemuxerStream* temp = (UrlDemuxerStream*)stream;
38 url_ = temp->url();
39 renderer_client_ = client;
40
41 // TODO(tguilbert): Use appropriate parameters (instead of GURL).
42 const int kIrrelevantMediaPlayerId = 0;
43 media_player_.reset(new MediaPlayerBridge(
44 kIrrelevantMediaPlayerId, url_, GURL(),
45 // TODO(tguilbert): What is the appropriate user agent to use?
46 mojo::common::GetUserAgent(), false, this,
47 base::Bind(&MediaPlayerRenderer::OnDecoderResourcesReleased,
48 weak_factory_.GetWeakPtr()),
49 GURL(), false, 0));
50
51 media_player_->SetVideoSurface(content::GetViewSurface(surface_id_));
liberato (no reviews please) 2016/06/23 21:31:38 i think that using SV initially during development
52 media_player_->Initialize();
53 init_cb.Run(PIPELINE_OK);
54 } else {
55 LOG(ERROR) << "DemuxerStreamProvider does not have a URL stream";
56 init_cb.Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
57 }
58 }
59
60 void MediaPlayerRenderer::SetCdm(CdmContext* cdm_context,
61 const CdmAttachedCB& cdm_attached_cb) {
62 DVLOG(2) << __FUNCTION__;
63 NOTREACHED();
64 }
65
66 void MediaPlayerRenderer::SetSurfaceId(int surface_id) {
67 surface_id_ = surface_id;
68 }
69
70 void MediaPlayerRenderer::Flush(const base::Closure& flush_cb) {
71 DVLOG(2) << __FUNCTION__;
72 flush_cb.Run();
73 }
74
75 void MediaPlayerRenderer::StartPlayingFrom(base::TimeDelta time) {
76 DVLOG(2) << __FUNCTION__;
77 // TODO(tguilbert): MediaPlayer's Start() is idempotent, but investigate
78 // MediaPlayerBridge's idempotency when it is in an error state. (It seems
79 // that calling start after receiving an error is counted as a new error).
80 //
81 // TODO(tguilbert): make sure IsPlayerReady() is true, and handle the cases
82 // when it's not.
83
84 media_player_->Start();
85 media_player_->SeekTo(time);
86 }
87
88 void MediaPlayerRenderer::SetPlaybackRate(double playback_rate) {
89 DVLOG(2) << __FUNCTION__;
90 // TODO(tguilbert): Should the state be save in order to prevent redundant
91 // calls?
92 if (playback_rate == 0) {
93 media_player_->Pause(false);
94 } else {
95 //
96 // TODO(tguilbert): Make sure IsPlayerReady() is true, and handle the cases
97 // when it's not.
98 media_player_->Start();
99 }
100 }
101
102 void MediaPlayerRenderer::SetVolume(float volume) {
103 media_player_->SetVolume(volume);
104 }
105
106 base::TimeDelta MediaPlayerRenderer::GetMediaTime() {
107 return media_player_->GetCurrentTime();
108 }
109
110 bool MediaPlayerRenderer::HasAudio() {
111 return media_player_->HasAudio();
112 }
113
114 bool MediaPlayerRenderer::HasVideo() {
115 return media_player_->HasVideo();
116 }
117
118 MediaResourceGetter* MediaPlayerRenderer::GetMediaResourceGetter() {
119 DVLOG(1) << __FUNCTION__;
120
121 if (!media_resource_getter_.get()) {
122 content::WebContents* web_contents =
123 content::WebContents::FromRenderFrameHost(render_frame_host_);
124 content::RenderProcessHost* host = web_contents->GetRenderProcessHost();
125 content::BrowserContext* context = host->GetBrowserContext();
126 content::StoragePartition* partition = host->GetStoragePartition();
127 storage::FileSystemContext* file_system_context =
128 partition ? partition->GetFileSystemContext() : NULL;
129 // Eventually this needs to be fixed to pass the correct frame rather
130 // than just using the main frame.
131 media_resource_getter_.reset(new content::MediaResourceGetterImpl(
132 context, file_system_context, host->GetID(),
133 web_contents->GetMainFrame()->GetRoutingID()));
134 }
135 return media_resource_getter_.get();
136 }
137
138 MediaUrlInterceptor* MediaPlayerRenderer::GetMediaUrlInterceptor() {
139 DVLOG(1) << __FUNCTION__;
140 return nullptr;
141 }
142
143 void MediaPlayerRenderer::OnTimeUpdate(int player_id,
144 base::TimeDelta current_timestamp,
145 base::TimeTicks current_time_ticks) {
146 // TODO(tguilbert): Handle this if necessary.
147 }
148
149 void MediaPlayerRenderer::OnMediaMetadataChanged(int player_id,
150 base::TimeDelta duration,
151 int width,
152 int height,
153 bool success) {
154 DVLOG(1) << __FUNCTION__ << " { duration: " << duration.InMilliseconds()
155 << "(ms) witdh: " << width << ", height: " << height
156 << ", success: " << success << "}";
157 if (duration_ != duration) {
158 duration_ = duration;
159 renderer_client_->OnDurationChange(duration);
160 }
161 }
162
163 void MediaPlayerRenderer::OnPlaybackComplete(int player_id) {
164 DVLOG(1) << __FUNCTION__;
165 renderer_client_->OnEnded();
166 }
167
168 void MediaPlayerRenderer::OnMediaInterrupted(int player_id) {
169 DVLOG(1) << __FUNCTION__;
170 // TODO(tguilbert): Handle this if necessary.
171 }
172
173 void MediaPlayerRenderer::OnBufferingUpdate(int player_id, int percentage) {
174 DVLOG(1) << __FUNCTION__;
175 // TODO(tguilbert): Determine proper threshold for triggering the have enough,
176 // and only trigger it once.
177 renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_ENOUGH);
178 }
179
180 void MediaPlayerRenderer::OnSeekComplete(int player_id,
181 const base::TimeDelta& current_time) {
182 DVLOG(1) << __FUNCTION__;
183 // TODO(tguilbert): Handle this if necessary.
184 }
185
186 void MediaPlayerRenderer::OnError(int player_id, int error) {
187 DVLOG(1) << __FUNCTION__ << " Error: " << error;
188 // TODO(tguilbert): Use more detailed errors if needed.
189 //
190 // TODO(tguilbert): Save the error state and properly error out or reset on
191 // future calls.
192
193 // Some errors are forwarded to the MediaPlayerListener, but are of no
194 // importance to us. Ignore these errors, which are reported as error 0 by
195 // MediaPlayerListener.
196 if (error)
197 renderer_client_->OnError(PIPELINE_ERROR_COULD_NOT_RENDER);
198 }
199
200 void MediaPlayerRenderer::OnVideoSizeChanged(int player_id,
201 int width,
202 int height) {
203 DVLOG(2) << __FUNCTION__;
204 renderer_client_->OnVideoNaturalSizeChange(gfx::Size(width, height));
205 }
206
207 void MediaPlayerRenderer::OnWaitingForDecryptionKey(int player_id) {
208 DVLOG(1) << __FUNCTION__;
209 NOTREACHED();
210 }
211
212 MediaPlayerAndroid* MediaPlayerRenderer::GetFullscreenPlayer() {
213 NOTREACHED();
214 return nullptr;
215 }
216
217 MediaPlayerAndroid* MediaPlayerRenderer::GetPlayer(int player_id) {
218 NOTREACHED();
219 return nullptr;
220 }
221
222 bool MediaPlayerRenderer::RequestPlay(int player_id,
223 base::TimeDelta duration,
224 bool has_audio) {
225 // TODO(tguilbert): Determine wheter or not this function should return false.
226 return true;
227 }
228
229 void MediaPlayerRenderer::OnDecoderResourcesReleased(int player_id) {
230 // TODO(tguilbert): Since we are not using a pool of MediaPlayerAndroid
231 // instances, this function not be relevant. Investigate whether the use of
232 // the MediaThrottler is needed.
233 }
234
235 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698