If you think the Android project streamvid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
Java Source Code
/*
* Copyright (C) 2011-2014 GUIGUI Simon, fyhertz@gmail.com
* /*www.java2s.com*/
* This file is part of libstreaming (https://github.com/fyhertz/libstreaming)
*
* Spydroid is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This source code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this source code; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/package net.majorkernelpanic.streaming.gl;
import java.util.concurrent.Semaphore;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.graphics.SurfaceTexture.OnFrameAvailableListener;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
publicclass SurfaceView extends android.view.SurfaceView implements Runnable, OnFrameAvailableListener, SurfaceHolder.Callback {
publicfinalstatic String TAG = "GLSurfaceView";
private Thread mThread = null;
privateboolean mFrameAvailable = false;
privateboolean mRunning = true;
private SurfaceManager mViewSurfaceManager = null;
private SurfaceManager mCodecSurfaceManager = null;
private TextureManager mTextureManager = null;
private Semaphore mLock = new Semaphore(0);
private Object mSyncObject = new Object();
public SurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
getHolder().addCallback(this);
}
public SurfaceTexture getSurfaceTexture() {
return mTextureManager.getSurfaceTexture();
}
publicvoid addMediaCodecSurface(Surface surface) {
synchronized (mSyncObject) {
mCodecSurfaceManager = new SurfaceManager(surface,mViewSurfaceManager);
}
}
publicvoid removeMediaCodecSurface() {
synchronized (mSyncObject) {
if (mCodecSurfaceManager != null) {
mCodecSurfaceManager.release();
mCodecSurfaceManager = null;
}
}
}
publicvoid startGLThread() {
Log.d(TAG,"Thread started.");
if (mTextureManager == null) {
mTextureManager = new TextureManager();
}
if (mTextureManager.getSurfaceTexture() == null) {
mThread = new Thread(SurfaceView.this);
mRunning = true;
mThread.start();
mLock.acquireUninterruptibly();
}
}
@Override
publicvoid run() {
mViewSurfaceManager = new SurfaceManager(getHolder().getSurface());
mViewSurfaceManager.makeCurrent();
mTextureManager.createTexture().setOnFrameAvailableListener(this);
mLock.release();
try {
long ts = 0, oldts = 0;
while (mRunning) {
synchronized (mSyncObject) {
mSyncObject.wait(2500);
if (mFrameAvailable) {
mFrameAvailable = false;
mViewSurfaceManager.makeCurrent();
mTextureManager.updateFrame();
mTextureManager.drawFrame();
mViewSurfaceManager.swapBuffer();
if (mCodecSurfaceManager != null) {
mCodecSurfaceManager.makeCurrent();
mTextureManager.drawFrame();
oldts = ts;
ts = mTextureManager.getSurfaceTexture().getTimestamp();
//Log.d(TAG,"FPS: "+(1000000000/(ts-oldts)));
mCodecSurfaceManager.setPresentationTime(ts);
mCodecSurfaceManager.swapBuffer();
}
} else {
Log.e(TAG,"No frame received !");
}
}
}
} catch (InterruptedException ignore) {
} finally {
mViewSurfaceManager.release();
mTextureManager.release();
}
}
@Override
publicvoid onFrameAvailable(SurfaceTexture surfaceTexture) {
synchronized (mSyncObject) {
mFrameAvailable = true;
mSyncObject.notifyAll();
}
}
@Override
publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
publicvoid surfaceCreated(SurfaceHolder holder) {
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder) {
if (mThread != null) {
mThread.interrupt();
}
mRunning = false;
}
}