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)