content_video_view.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/android/content_video_view.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/android/jni_android.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/android/media_player_manager_impl.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/android/surface_texture_peer.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/content_switches.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "jni/ContentVideoView_jni.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::AttachCurrentThread;
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::CheckException;
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::ScopedJavaGlobalRef;
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool ContentVideoView::RegisterContentVideoView(JNIEnv* env) {
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return RegisterNativesImpl(env);
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochContentVideoView::ContentVideoView(MediaPlayerManagerImpl* manager)
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : manager_(manager) {
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochContentVideoView::~ContentVideoView() {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DestroyContentVideoView();
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::CreateContentVideoView() {
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (j_content_video_view_.is_null()) {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    JNIEnv* env = AttachCurrentThread();
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    j_content_video_view_.Reset(Java_ContentVideoView_createContentVideoView(
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        env, reinterpret_cast<jint>(this)));
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else {
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Just ask video view to reopen the video.
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Java_ContentVideoView_openVideo(AttachCurrentThread(),
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    j_content_video_view_.obj());
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::DestroyContentVideoView() {
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!j_content_video_view_.is_null()) {
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Java_ContentVideoView_destroyContentVideoView(AttachCurrentThread());
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    j_content_video_view_.Reset();
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// static
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::KeepScreenOn(bool screen_on) {
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Java_ContentVideoView_keepScreenOnContentVideoView(AttachCurrentThread(),
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                                     screen_on);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentVideoView::OnMediaPlayerError(int error_type) {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!j_content_video_view_.is_null()) {
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Java_ContentVideoView_onMediaPlayerError(AttachCurrentThread(),
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             j_content_video_view_.obj(),
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             error_type);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentVideoView::OnVideoSizeChanged(int width, int height) {
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!j_content_video_view_.is_null()) {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Java_ContentVideoView_onVideoSizeChanged(AttachCurrentThread(),
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             j_content_video_view_.obj(),
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             width,
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             height);
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::OnBufferingUpdate(int percent) {
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!j_content_video_view_.is_null()) {
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Java_ContentVideoView_onBufferingUpdate(AttachCurrentThread(),
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                            j_content_video_view_.obj(),
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                            percent);
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentVideoView::OnPlaybackComplete() {
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!j_content_video_view_.is_null()) {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Java_ContentVideoView_onPlaybackComplete(AttachCurrentThread(),
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             j_content_video_view_.obj());
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ContentVideoView::UpdateMediaMetadata() {
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!j_content_video_view_.is_null())
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    UpdateMediaMetadata(AttachCurrentThread(), j_content_video_view_.obj());
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ContentVideoView::GetVideoWidth(JNIEnv*, jobject obj) const {
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return player ? player->GetVideoWidth() : 0;
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ContentVideoView::GetVideoHeight(JNIEnv*, jobject obj) const {
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return player ? player->GetVideoHeight() : 0;
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ContentVideoView::GetDurationInMilliSeconds(JNIEnv*, jobject obj) const {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return player ? player->GetDuration().InMilliseconds() : -1;
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int ContentVideoView::GetCurrentPosition(JNIEnv*, jobject obj) const {
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return player ? player->GetCurrentTime().InMilliseconds() : 0;
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool ContentVideoView::IsPlaying(JNIEnv*, jobject obj) {
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return player ? player->IsPlaying() : false;
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::SeekTo(JNIEnv*, jobject obj, jint msec) {
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  manager_->FullscreenPlayerSeek(msec);
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::Play(JNIEnv*, jobject obj) {
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  manager_->FullscreenPlayerPlay();
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::Pause(JNIEnv*, jobject obj) {
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  manager_->FullscreenPlayerPause();
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::ExitFullscreen(
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    JNIEnv*, jobject, jboolean release_media_player) {
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  manager_->ExitFullscreen(release_media_player);
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  j_content_video_view_.Reset();
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentVideoView::SetSurface(JNIEnv* env, jobject obj,
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  jobject surface) {
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  manager_->SetVideoSurface(surface);
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ContentVideoView::UpdateMediaMetadata(JNIEnv* env, jobject obj) {
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (player && player->IsPlayerReady())
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Java_ContentVideoView_updateMediaMetadata(
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        env, obj, player->GetVideoWidth(), player->GetVideoHeight(),
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        player->GetDuration().InMilliseconds(), player->CanPause(),
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        player->CanSeekForward(), player->CanSeekBackward());
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace content
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)