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

Side by Side Diff: content/browser/media/android/media_player_renderer.cc

Issue 2230583002: Add MediaPlayerRenderer/MediaPlayerRendererClient (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed Chris' comment Created 4 years, 4 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 "content/browser/media/android/media_player_renderer.h"
6
7 #include <memory>
8
9 #include "content/browser/media/android/media_resource_getter_impl.h"
10 #include "content/public/browser/browser_context.h"
11 #include "content/public/browser/render_process_host.h"
12 #include "content/public/browser/storage_partition.h"
13 #include "content/public/browser/web_contents.h"
14 #include "content/public/common/content_client.h"
15
16 // TODO(tguilbert): Remove this ID once MediaPlayerManager has been deleted
17 // and MediaPlayerBridge updated. See comment in header file.
18 const int kUnusedAndIrrelevantPlayerId = 0;
DaleCurtis 2016/08/10 21:14:05 constexpr int..
tguilbert 2016/08/11 00:28:59 Done.
19
20 namespace content {
21
22 MediaPlayerRenderer::MediaPlayerRenderer(RenderFrameHost* render_frame_host)
23 : render_frame_host_(render_frame_host),
24 duration_(base::TimeDelta::FromMicroseconds(0)),
DaleCurtis 2016/08/10 21:14:04 Unnecessary, default is zero.
tguilbert 2016/08/11 00:28:59 Done.
25 has_error_(false),
26 weak_factory_(this) {}
27
28 MediaPlayerRenderer::~MediaPlayerRenderer() {}
29
30 void MediaPlayerRenderer::Initialize(
31 media::DemuxerStreamProvider* demuxer_stream_provider,
32 media::RendererClient* client,
33 const media::PipelineStatusCB& init_cb) {
34 DVLOG(1) << __func__;
35 if (demuxer_stream_provider->GetType() !=
36 media::DemuxerStreamProvider::Type::URL) {
37 LOG(ERROR) << "DemuxerStreamProvider is not of Type URL";
DaleCurtis 2016/08/10 21:14:04 Prefer DLOG?
tguilbert 2016/08/11 00:28:59 Done.
38 init_cb.Run(media::PIPELINE_ERROR_INITIALIZATION_FAILED);
39 return;
40 }
41
42 GURL url = demuxer_stream_provider->GetUrl();
43 renderer_client_ = client;
44
45 const std::string user_agent = GetContentClient()->GetUserAgent();
46
47 // TODO(tguilbert): FOR REVIEWERS: I am not sure what each parameter below
48 // is used for. Are there any ones that I should be concerned with ATM? I
49 // have added the parameter name for convenience next to the ones I don't
50 // know what to do with.
51 media_player_.reset(new media::MediaPlayerBridge(
52 kUnusedAndIrrelevantPlayerId, url,
53 GURL(), // first_party_for_cookies
DaleCurtis 2016/08/10 21:14:05 I think this will be important to fill. How is WMP
tguilbert 2016/08/11 00:28:59 WMPA gets it from the WebFrame.document().firstPar
54 user_agent,
55 false, // hide_url_log
56 this, base::Bind(&MediaPlayerRenderer::OnDecoderResourcesReleased,
57 weak_factory_.GetWeakPtr()),
58 GURL(), // frame_url
59 false, // allow_crendentials
60 0)); // media_session_id
61
62 // TODO(tguilbert): Register and Send the proper surface ID. See
63 // crbug.com/627658
64
65 media_player_->Initialize();
66 init_cb.Run(media::PIPELINE_OK);
67 }
68
69 void MediaPlayerRenderer::SetCdm(media::CdmContext* cdm_context,
70 const media::CdmAttachedCB& cdm_attached_cb) {
71 NOTREACHED();
72 }
73
74 void MediaPlayerRenderer::Flush(const base::Closure& flush_cb) {
75 DVLOG(3) << __func__;
76 flush_cb.Run();
77 }
78
79 void MediaPlayerRenderer::StartPlayingFrom(base::TimeDelta time) {
80 // MediaPlayerBridge's Start() is idempotent, except when it has encountered
81 // an error (in which case, calling Start() again is logged as a new error).
82 if (has_error_)
83 return;
84
85 media_player_->Start();
86 media_player_->SeekTo(time);
DaleCurtis 2016/08/10 21:14:05 Should SeekTo happen first?
tguilbert 2016/08/11 00:28:59 Either one works. Calling Start() first causes the
87 }
88
89 void MediaPlayerRenderer::SetPlaybackRate(double playback_rate) {
DaleCurtis 2016/08/10 21:14:04 Needs a comment about what's happening here. You'r
tguilbert 2016/08/11 00:28:59 Good point. I added a comment in the header file.
90 if (has_error_)
91 return;
92
93 if (playback_rate == 0) {
94 media_player_->Pause(true);
95 } else {
96 // MediaPlayerBridge's Start() is idempotent.
97 media_player_->Start();
98 }
99 }
100
101 void MediaPlayerRenderer::SetVolume(float volume) {
102 media_player_->SetVolume(volume);
103 }
104
105 base::TimeDelta MediaPlayerRenderer::GetMediaTime() {
106 return media_player_->GetCurrentTime();
107 }
108
109 bool MediaPlayerRenderer::HasAudio() {
110 return media_player_->HasAudio();
111 }
112
113 bool MediaPlayerRenderer::HasVideo() {
114 return media_player_->HasVideo();
115 }
116
117 media::MediaResourceGetter* MediaPlayerRenderer::GetMediaResourceGetter() {
118 if (!media_resource_getter_.get()) {
119 WebContents* web_contents =
DaleCurtis 2016/08/10 21:14:04 This can only be done on the UI thread IIRC. Do yo
tguilbert 2016/08/11 00:28:59 Added, but I don't know where else I should add th
120 WebContents::FromRenderFrameHost(render_frame_host_);
121 RenderProcessHost* host = web_contents->GetRenderProcessHost();
122 BrowserContext* context = host->GetBrowserContext();
123 StoragePartition* partition = host->GetStoragePartition();
124 storage::FileSystemContext* file_system_context =
125 partition ? partition->GetFileSystemContext() : nullptr;
126 media_resource_getter_.reset(
127 new MediaResourceGetterImpl(context, file_system_context, host->GetID(),
128 render_frame_host_->GetRoutingID()));
129 }
130 return media_resource_getter_.get();
131 }
132
133 media::MediaUrlInterceptor* MediaPlayerRenderer::GetMediaUrlInterceptor() {
134 return nullptr;
DaleCurtis 2016/08/10 21:14:04 TODO plumb this through? Or is this overridden at
tguilbert 2016/08/11 00:28:59 Opened 636588.
135 }
136
137 void MediaPlayerRenderer::OnTimeUpdate(int player_id,
138 base::TimeDelta current_timestamp,
139 base::TimeTicks current_time_ticks) {}
140
141 void MediaPlayerRenderer::OnMediaMetadataChanged(int player_id,
142 base::TimeDelta duration,
143 int width,
144 int height,
145 bool success) {
146 if (video_size_ != gfx::Size(width, height))
147 OnVideoSizeChanged(kUnusedAndIrrelevantPlayerId, width, height);
148
149 if (duration_ != duration) {
150 duration_ = duration;
151 // TODO(tguilbert): Add OnDurationChange to the RendererClient interface.
DaleCurtis 2016/08/10 21:14:05 Probably this will be important. I think MP gets t
tguilbert 2016/08/11 00:28:59 The CL is already done, I just took it out of this
152 // See crbug.com/635991.
153 }
154 }
155
156 void MediaPlayerRenderer::OnPlaybackComplete(int player_id) {
157 renderer_client_->OnEnded();
158 }
159
160 void MediaPlayerRenderer::OnMediaInterrupted(int player_id) {}
161
162 void MediaPlayerRenderer::OnBufferingUpdate(int player_id, int percentage) {
163 // As per Android documentation, |percentage| actually indicates "percentage
164 // buffered or played". E.g. if we are at 50% playback and have 1%
165 // buffered, |percentage| will be equal to 51.
166 //
167 // MediaPlayer manages its own buffering and will pause internally if ever it
168 // runs out of data. Therefore, we can always return BUFFERING_HAVE_ENOUGH.
169 renderer_client_->OnBufferingStateChange(media::BUFFERING_HAVE_ENOUGH);
170 }
171
172 void MediaPlayerRenderer::OnSeekComplete(int player_id,
173 const base::TimeDelta& current_time) {}
174
175 void MediaPlayerRenderer::OnError(int player_id, int error) {
176 DVLOG(2) << __func__ << " Error: " << error;
DaleCurtis 2016/08/10 21:14:05 I'd make this a LOG(ERROR) for finding issues in t
DaleCurtis 2016/08/10 21:14:05 I'd make this a LOG(ERROR) for finding issues in t
tguilbert 2016/08/11 00:28:59 Changed this to early return, to prevent the non-e
177 // TODO(tguilbert): Use more detailed errors if needed.
178
179 // Some errors are forwarded to the MediaPlayerListener, but are of no
180 // importance to us. Ignore these errors, which are reported as error 0 by
181 // MediaPlayerListener.
182 if (error) {
183 has_error_ = true;
184 renderer_client_->OnError(media::PIPELINE_ERROR_COULD_NOT_RENDER);
DaleCurtis 2016/08/10 21:14:04 We may want a special error for external renderers
tguilbert 2016/08/11 00:28:59 Done. Is there anything that needs updating UMA?
185 }
186 }
187
188 void MediaPlayerRenderer::OnVideoSizeChanged(int player_id,
189 int width,
190 int height) {
191 video_size_ = gfx::Size(width, height);
192 renderer_client_->OnVideoNaturalSizeChange(video_size_);
193 }
194
195 void MediaPlayerRenderer::OnWaitingForDecryptionKey(int player_id) {
196 NOTREACHED();
197 }
198
199 media::MediaPlayerAndroid* MediaPlayerRenderer::GetFullscreenPlayer() {
200 NOTREACHED();
201 return nullptr;
202 }
203
204 media::MediaPlayerAndroid* MediaPlayerRenderer::GetPlayer(int player_id) {
205 NOTREACHED();
206 return nullptr;
207 }
208
209 bool MediaPlayerRenderer::RequestPlay(int player_id,
210 base::TimeDelta duration,
211 bool has_audio) {
212 return true;
DaleCurtis 2016/08/10 21:14:04 May need to carry over some logic from WMPA/etc to
tguilbert 2016/08/11 00:28:59 I am not familiar with this area of the code at al
213 }
214
215 void MediaPlayerRenderer::OnDecoderResourcesReleased(int player_id) {
216 // Since we are not using a pool of MediaPlayerAndroid instances, this
217 // function is not relevant.
218
219 // TODO(tguilbert): Investigate whether the use of the MediaThrottler is
DaleCurtis 2016/08/10 21:14:05 I think you can instead use an exponential back of
tguilbert 2016/08/11 00:28:59 Created 636615 and added TODO.
220 // needed.
221 }
222
223 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698