/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mobilyzer.util.video;
import com.mobilyzer.UpdateIntent;
import com.mobilyzer.util.Logger;
import com.mobilyzer.util.video.player.DashVodRendererBuilder;
import com.mobilyzer.util.video.player.DefaultRendererBuilder;
import com.mobilyzer.util.video.player.DemoPlayer;
import com.mobilyzer.util.video.player.DashVodRendererBuilder.AdaptiveType;
import com.mobilyzer.util.video.player.DemoPlayer.RendererBuilder;
import com.mobilyzer.util.video.util.DemoUtil;
import com.google.android.exoplayer.ExoPlayer;
import android.app.Service;
import android.content.Intent;
import android.graphics.SurfaceTexture;
import android.net.Uri;
import android.opengl.GLES20;
import android.os.IBinder;
import android.util.Log;
import android.view.Surface;
/**
* An activity that plays media using {@link DemoPlayer}.
*/
public class VideoPlayerService extends Service implements //SurfaceHolder.Callback,
DemoPlayer.Listener {
private static final int MENU_GROUP_TRACKS = 1;
private static final int ID_OFFSET = 2;
private EventLogger eventLogger;
// private TextView debugTextView;
// private TextView playerStateTextView;
private DemoPlayer player;
private boolean playerNeedsPrepare;
private boolean autoPlay = true;
private int playerPosition;
private boolean enableBackgroundAudio = false;
private Uri contentUri;
private int contentType;
private String contentId;
private SurfaceTexture mTexture;
private Surface mSurface;
private boolean isResultSent;
@Override
public int onStartCommand(Intent intent, int flags, int startId){
Logger.i("Video Player service started!");
contentUri = intent.getData();
contentType = intent.getIntExtra(DemoUtil.CONTENT_TYPE_EXTRA, DemoUtil.TYPE_PROGRESSIVE);
contentId = intent.getStringExtra(DemoUtil.CONTENT_ID_EXTRA);
this.isResultSent = false;
preparePlayer();
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
releasePlayer(true);
}
// Internal methods
private RendererBuilder getRendererBuilder() {
String userAgent = DemoUtil.getUserAgent(this);
if (this.contentType == DemoUtil.TYPE_DASH_VOD) {
return new DashVodRendererBuilder(userAgent, contentUri.toString(), contentId,
new WidevineTestMediaDrmCallback(contentId), null, AdaptiveType.CBA );
}
else if (this.contentType == DemoUtil.TYPE_BBA){
return new DashVodRendererBuilder(userAgent, contentUri.toString(), contentId,
new WidevineTestMediaDrmCallback(contentId), null, AdaptiveType.BBA);
}
else if (this.contentType == DemoUtil.TYPE_PROGRESSIVE) {
return new DefaultRendererBuilder(this, contentUri, null);
}
else {
return null;
}
}
private void preparePlayer() {
if (player == null) {
player = new DemoPlayer(getRendererBuilder());
player.addListener(this);
player.seekTo(playerPosition);
playerNeedsPrepare = true;
eventLogger = new EventLogger();
eventLogger.startSession();
player.addListener(eventLogger);
player.setInfoListener(eventLogger);
player.setInternalErrorListener(eventLogger);
}
if (playerNeedsPrepare) {
player.prepare();
playerNeedsPrepare = false;
}
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
int textureID = textures[0];
Log.e("TextureId", "" + textureID);
mTexture = new SurfaceTexture(textureID);
mSurface = new Surface(mTexture);
player.setSurface(mSurface);
maybeStartPlayback();
}
private void maybeStartPlayback() {
if (autoPlay) {
player.setPlayWhenReady(true);
autoPlay = false;
}
}
private void releasePlayer(boolean isSucceed) {
if (player != null) {
playerPosition = player.getCurrentPosition();
player.release();
player = null;
if (!isResultSent) {
Intent videoResult = eventLogger.endSession();
videoResult.putExtra(UpdateIntent.VIDEO_TASK_PAYLOAD_IS_SUCCEED, isSucceed);
this.sendBroadcast(videoResult);
isResultSent = true;
}
eventLogger = null;
}
}
// DemoPlayer.Listener implementation
@Override
public void onStateChanged(boolean playWhenReady, int playbackState) {
String text = "playWhenReady=" + playWhenReady + ", playbackState=";
switch(playbackState) {
case ExoPlayer.STATE_BUFFERING:
text += "buffering";
break;
case ExoPlayer.STATE_ENDED:
text += "ended";
break;
case ExoPlayer.STATE_IDLE:
text += "idle";
break;
case ExoPlayer.STATE_PREPARING:
text += "preparing";
break;
case ExoPlayer.STATE_READY:
text += "ready";
break;
default:
text += "unknown";
break;
}
Log.e("", text);
if (playbackState == ExoPlayer.STATE_ENDED) {
Log.e("", "Playback ended!");
releasePlayer(true);
this.stopSelf();
}
// playerStateTextView.setText(text);
}
@Override
public void onError(Exception e) {
Log.e("BgPlayerService", "Error occurs!");
playerNeedsPrepare = true;
releasePlayer(false);
this.stopSelf();
}
@Override
public void onVideoSizeChanged(int width, int height) {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}