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

Side by Side Diff: webkit/media/android/webmediaplayer_android.cc

Issue 10413015: Upstream implementation for embedded video for WebMediaPlayerAndroid (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressing feedbacks Created 8 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/media/android/webmediaplayer_android.h" 5 #include "webkit/media/android/webmediaplayer_android.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/file_path.h" 11 #include "base/file_path.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "media/base/android/media_player_bridge.h" 14 #include "media/base/android/media_player_bridge.h"
15 #include "net/base/mime_util.h" 15 #include "net/base/mime_util.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient. h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient. h"
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCookieJar .h" 18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCookieJar .h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h" 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h"
20 #include "webkit/media/android/stream_texture_factory_android.h"
21 #include "webkit/media/android/webmediaplayer_manager_android.h"
20 #include "webkit/media/android/webmediaplayer_proxy_android.h" 22 #include "webkit/media/android/webmediaplayer_proxy_android.h"
21 #include "webkit/media/webmediaplayer_util.h" 23 #include "webkit/media/webmediaplayer_util.h"
22 #include "webkit/media/webvideoframe_impl.h" 24 #include "webkit/media/webvideoframe_impl.h"
23 25
24 using WebKit::WebCanvas; 26 using WebKit::WebCanvas;
25 using WebKit::WebMediaPlayerClient; 27 using WebKit::WebMediaPlayerClient;
26 using WebKit::WebMediaPlayer; 28 using WebKit::WebMediaPlayer;
27 using WebKit::WebRect; 29 using WebKit::WebRect;
28 using WebKit::WebSize; 30 using WebKit::WebSize;
29 using WebKit::WebTimeRanges; 31 using WebKit::WebTimeRanges;
30 using WebKit::WebURL; 32 using WebKit::WebURL;
31 using WebKit::WebVideoFrame; 33 using WebKit::WebVideoFrame;
32 using media::MediaPlayerBridge; 34 using media::MediaPlayerBridge;
33 using media::VideoFrame; 35 using media::VideoFrame;
34 using webkit_media::WebVideoFrameImpl; 36 using webkit_media::WebVideoFrameImpl;
35 37
38 // TODO(qinmin): Figure out where we should define this more appropriately
39 #define GL_TEXTURE_EXTERNAL_OES 0x8D65
scherkus (not reviewing) 2012/05/26 00:56:09 static const uint32 and kCamelCase?
qinmin 2012/05/29 18:29:34 Done.
40
36 namespace webkit_media { 41 namespace webkit_media {
37 42
38 // Because we create the media player lazily on android, the duration of the 43 // Because we create the media player lazily on android, the duration of the
39 // media is initially unknown to us. This makes the user unable to perform 44 // media is initially unknown to us. This makes the user unable to perform
40 // seek. To solve this problem, we use a temporary duration of 100 seconds when 45 // seek. To solve this problem, we use a temporary duration of 100 seconds when
41 // the duration is unknown. And we scale the seek position later when duration 46 // the duration is unknown. And we scale the seek position later when duration
42 // is available. 47 // is available.
43 // TODO(qinmin): create a thread and use android MediaMetadataRetriever 48 // TODO(qinmin): create a thread and use android MediaMetadataRetriever
44 // class to extract the duration. 49 // class to extract the duration.
45 static const float kTemporaryDuration = 100.0f; 50 static const float kTemporaryDuration = 100.0f;
46 51
47 bool WebMediaPlayerAndroid::incognito_mode_ = false; 52 bool WebMediaPlayerAndroid::incognito_mode_ = false;
48 53
49 WebMediaPlayerAndroid::WebMediaPlayerAndroid( 54 WebMediaPlayerAndroid::WebMediaPlayerAndroid(
50 WebMediaPlayerClient* client, 55 WebMediaPlayerClient* client,
51 WebKit::WebCookieJar* cookie_jar) 56 WebKit::WebCookieJar* cookie_jar,
57 webkit_media::WebMediaPlayerManagerAndroid* manager,
58 webkit_media::StreamTextureFactory* factory)
52 : client_(client), 59 : client_(client),
53 buffered_(1u), 60 buffered_(1u),
54 video_frame_(new WebVideoFrameImpl(VideoFrame::CreateEmptyFrame())), 61 video_frame_(new WebVideoFrameImpl(VideoFrame::CreateEmptyFrame())),
55 proxy_(new WebMediaPlayerProxyAndroid(base::MessageLoopProxy::current(), 62 proxy_(new WebMediaPlayerProxyAndroid(base::MessageLoopProxy::current(),
56 AsWeakPtr())), 63 AsWeakPtr())),
57 prepared_(false), 64 prepared_(false),
58 duration_(0), 65 duration_(0),
59 pending_seek_(0), 66 pending_seek_(0),
60 seeking_(false), 67 seeking_(false),
61 playback_completed_(false), 68 playback_completed_(false),
62 buffered_bytes_(0), 69 buffered_bytes_(0),
63 cookie_jar_(cookie_jar), 70 cookie_jar_(cookie_jar),
71 manager_(manager),
64 pending_play_event_(false), 72 pending_play_event_(false),
65 network_state_(WebMediaPlayer::NetworkStateEmpty), 73 network_state_(WebMediaPlayer::NetworkStateEmpty),
66 ready_state_(WebMediaPlayer::ReadyStateHaveNothing) { 74 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
67 video_frame_.reset(new WebVideoFrameImpl(VideoFrame::CreateEmptyFrame())); 75 texture_id_(0),
76 stream_id_(0),
77 needs_establish_peer_(true),
78 stream_texture_factory_(factory) {
79 player_id_ = manager_->RegisterMediaPlayer(this);
80 if (stream_texture_factory_.get())
81 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy());
68 } 82 }
69 83
70 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { 84 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() {
71 if (media_player_.get()) { 85 if (media_player_.get()) {
72 media_player_->Stop(); 86 media_player_->Stop();
73 } 87 }
88
89 manager_->UnregisterMediaPlayer(player_id_);
74 } 90 }
75 91
76 void WebMediaPlayerAndroid::InitIncognito(bool incognito_mode) { 92 void WebMediaPlayerAndroid::InitIncognito(bool incognito_mode) {
77 incognito_mode_ = incognito_mode; 93 incognito_mode_ = incognito_mode;
78 } 94 }
79 95
80 void WebMediaPlayerAndroid::load(const WebURL& url) { 96 void WebMediaPlayerAndroid::load(const WebURL& url) {
81 url_ = url; 97 url_ = url;
82 98
83 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); 99 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading);
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 network_state_ = state; 438 network_state_ = state;
423 client_->networkStateChanged(); 439 client_->networkStateChanged();
424 } 440 }
425 441
426 void WebMediaPlayerAndroid::UpdateReadyState( 442 void WebMediaPlayerAndroid::UpdateReadyState(
427 WebMediaPlayer::ReadyState state) { 443 WebMediaPlayer::ReadyState state) {
428 ready_state_ = state; 444 ready_state_ = state;
429 client_->readyStateChanged(); 445 client_->readyStateChanged();
430 } 446 }
431 447
432 void WebMediaPlayerAndroid::SetVideoSurface(jobject j_surface) { 448 void WebMediaPlayerAndroid::ReleaseMediaResources() {
433 if (media_player_.get()) 449 // Pause the media player first.
434 media_player_->SetVideoSurface(j_surface); 450 pause();
451 client_->playbackStateChanged();
452
453 if (media_player_.get()) {
454 // Save the current media player status.
455 pending_seek_ = currentTime();
456 duration_ = duration();
457
458 media_player_.reset();
459 needs_establish_peer_ = true;
460 }
461 prepared_ = false;
435 } 462 }
436 463
437 void WebMediaPlayerAndroid::InitializeMediaPlayer() { 464 void WebMediaPlayerAndroid::InitializeMediaPlayer() {
438 CHECK(!media_player_.get()); 465 CHECK(!media_player_.get());
439 prepared_ = false; 466 prepared_ = false;
440 media_player_.reset(new MediaPlayerBridge()); 467 media_player_.reset(new MediaPlayerBridge());
441 media_player_->SetStayAwakeWhilePlaying(); 468 media_player_->SetStayAwakeWhilePlaying();
442 469
443 std::string cookies; 470 std::string cookies;
444 if (cookie_jar_ != NULL) { 471 if (cookie_jar_ != NULL) {
445 WebURL url(url_); 472 WebURL url(url_);
446 cookies = UTF16ToUTF8(cookie_jar_->cookies(url, url)); 473 cookies = UTF16ToUTF8(cookie_jar_->cookies(url, url));
jochen (gone - plz use gerrit) 2012/05/26 10:24:57 this breaks third-party cookie blocking settings.
qinmin 2012/05/29 18:29:34 Done.
447 } 474 }
448 media_player_->SetDataSource(url_.spec(), cookies, incognito_mode_); 475 media_player_->SetDataSource(url_.spec(), cookies, incognito_mode_);
449 476
450 media_player_->Prepare( 477 media_player_->Prepare(
451 base::Bind(&WebMediaPlayerProxyAndroid::MediaInfoCallback, proxy_), 478 base::Bind(&WebMediaPlayerProxyAndroid::MediaInfoCallback, proxy_),
452 base::Bind(&WebMediaPlayerProxyAndroid::MediaErrorCallback, proxy_), 479 base::Bind(&WebMediaPlayerProxyAndroid::MediaErrorCallback, proxy_),
453 base::Bind(&WebMediaPlayerProxyAndroid::VideoSizeChangedCallback, proxy_), 480 base::Bind(&WebMediaPlayerProxyAndroid::VideoSizeChangedCallback, proxy_),
454 base::Bind(&WebMediaPlayerProxyAndroid::BufferingUpdateCallback, proxy_), 481 base::Bind(&WebMediaPlayerProxyAndroid::BufferingUpdateCallback, proxy_),
455 base::Bind(&WebMediaPlayerProxyAndroid::MediaPreparedCallback, proxy_)); 482 base::Bind(&WebMediaPlayerProxyAndroid::MediaPreparedCallback, proxy_));
456 } 483 }
457 484
458 void WebMediaPlayerAndroid::PlayInternal() { 485 void WebMediaPlayerAndroid::PlayInternal() {
459 CHECK(prepared_); 486 CHECK(prepared_);
460 487
488 if (hasVideo() && stream_texture_factory_.get()) {
489 if (!stream_id_)
490 CreateStreamTexture();
491
492 if (needs_establish_peer_) {
493 stream_texture_factory_->EstablishPeer(stream_id_, player_id_);
494 needs_establish_peer_ = false;
495 }
496 }
497
461 if (paused()) 498 if (paused())
462 media_player_->Start(base::Bind( 499 media_player_->Start(base::Bind(
463 &WebMediaPlayerProxyAndroid::PlaybackCompleteCallback, proxy_)); 500 &WebMediaPlayerProxyAndroid::PlaybackCompleteCallback, proxy_));
464 } 501 }
465 502
466 void WebMediaPlayerAndroid::PauseInternal() { 503 void WebMediaPlayerAndroid::PauseInternal() {
467 CHECK(prepared_); 504 CHECK(prepared_);
468 media_player_->Pause(); 505 media_player_->Pause();
469 } 506 }
470 507
471 void WebMediaPlayerAndroid::SeekInternal(float seconds) { 508 void WebMediaPlayerAndroid::SeekInternal(float seconds) {
472 CHECK(prepared_); 509 CHECK(prepared_);
473 seeking_ = true; 510 seeking_ = true;
474 media_player_->SeekTo(ConvertSecondsToTimestamp(seconds), base::Bind( 511 media_player_->SeekTo(ConvertSecondsToTimestamp(seconds), base::Bind(
475 &WebMediaPlayerProxyAndroid::SeekCompleteCallback, proxy_)); 512 &WebMediaPlayerProxyAndroid::SeekCompleteCallback, proxy_));
476 } 513 }
477 514
515 void WebMediaPlayerAndroid::CreateStreamTexture() {
516 DCHECK(!stream_id_);
517 DCHECK(!texture_id_);
518 stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_);
519 if (texture_id_)
520 video_frame_.reset(new WebVideoFrameImpl(VideoFrame::WrapNativeTexture(
521 texture_id_,
522 GL_TEXTURE_EXTERNAL_OES,
523 texture_size_.width,
524 texture_size_.height,
525 base::TimeDelta(),
526 base::TimeDelta(),
527 base::Bind(&WebMediaPlayerAndroid::DestroyStreamTexture,
528 base::Unretained(this)))));
529 }
530
531 void WebMediaPlayerAndroid::DestroyStreamTexture() {
532 DCHECK(stream_id_);
533 DCHECK(texture_id_);
534 stream_texture_factory_->DestroyStreamTexture(texture_id_);
535 texture_id_ = 0;
536 stream_id_ = 0;
537 }
538
478 WebVideoFrame* WebMediaPlayerAndroid::getCurrentFrame() { 539 WebVideoFrame* WebMediaPlayerAndroid::getCurrentFrame() {
540 if (!stream_texture_proxy_->IsInitialized() && stream_id_) {
541 stream_texture_proxy_->Initialize(
542 stream_id_, video_frame_->width(), video_frame_->height());
543 }
544
479 return video_frame_.get(); 545 return video_frame_.get();
480 } 546 }
481 547
482 void WebMediaPlayerAndroid::putCurrentFrame( 548 void WebMediaPlayerAndroid::putCurrentFrame(
483 WebVideoFrame* web_video_frame) { 549 WebVideoFrame* web_video_frame) {
484 } 550 }
485 551
552 // This gets called both on compositor and main thread.
553 void WebMediaPlayerAndroid::setStreamTextureClient(
554 WebKit::WebStreamTextureClient* client) {
555 if (stream_texture_proxy_.get())
556 stream_texture_proxy_->SetClient(client);
557 }
558
486 } // namespace webkit_media 559 } // namespace webkit_media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698