15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/android/media_player_listener.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
91675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "base/location.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/single_thread_task_runner.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/MediaPlayerListener_jni.h"
131675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "media/base/android/media_player_android.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::CheckException;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaPlayerListener::MediaPlayerListener(
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
231675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    base::WeakPtr<MediaPlayerAndroid> media_player)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : task_runner_(task_runner),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_player_(media_player) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(task_runner_.get());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(media_player_);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaPlayerListener::~MediaPlayerListener() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::CreateMediaPlayerListener(
331675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    jobject context, jobject media_player) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(env);
361675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  if (j_media_player_listener_.is_null()) {
371675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    j_media_player_listener_.Reset(Java_MediaPlayerListener_create(
381675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch        env, reinterpret_cast<intptr_t>(this), context, media_player));
391675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaPlayerListener::ReleaseMediaPlayerListenerResources() {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(env);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!j_media_player_listener_.is_null()) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Java_MediaPlayerListener_releaseResources(
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        env, j_media_player_listener_.obj());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  j_media_player_listener_.Reset();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::OnMediaError(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */, jint error_type) {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
561675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnMediaError, media_player_, error_type));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::OnVideoSizeChanged(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */, jint width, jint height) {
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
621675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnVideoSizeChanged, media_player_,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width, height));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::OnBufferingUpdate(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */, jint percent) {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
691675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnBufferingUpdate, media_player_, percent));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::OnPlaybackComplete(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */) {
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
751675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnPlaybackComplete, media_player_));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::OnSeekComplete(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */) {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnSeekComplete, media_player_));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaPlayerListener::OnMediaPrepared(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */) {
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
871675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnMediaPrepared, media_player_));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaPlayerListener::OnMediaInterrupted(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JNIEnv* /* env */, jobject /* obj */) {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_runner_->PostTask(FROM_HERE, base::Bind(
931675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      &MediaPlayerAndroid::OnMediaInterrupted, media_player_));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaPlayerListener::RegisterMediaPlayerListener(JNIEnv* env) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ret = RegisterNativesImpl(env);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(g_MediaPlayerListener_clazz);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
103