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

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

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

Powered by Google App Engine
This is Rietveld 408576698