/*
|
* 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.example.nativecodec;
|
|
import android.app.Activity;
|
import android.app.NativeActivity;
|
import android.graphics.PixelFormat;
|
import android.graphics.SurfaceTexture;
|
import android.graphics.drawable.Drawable;
|
import android.os.Bundle;
|
import android.util.Log;
|
import android.util.Xml;
|
import android.view.Surface;
|
import android.view.SurfaceHolder;
|
import android.view.SurfaceView;
|
import android.view.View;
|
import android.widget.AdapterView;
|
import android.widget.ArrayAdapter;
|
import android.widget.Button;
|
import android.widget.CompoundButton;
|
import android.widget.CompoundButton.OnCheckedChangeListener;
|
import android.widget.ImageButton;
|
import android.widget.ImageView;
|
import android.widget.RadioButton;
|
import android.widget.Spinner;
|
import android.content.Context;
|
import android.graphics.Bitmap;
|
import android.graphics.BitmapFactory;
|
import android.graphics.Canvas;
|
import android.util.AttributeSet;
|
import android.widget.Button;
|
import android.widget.TextView;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.nio.ByteBuffer;
|
|
import cn.com.basic.face.util.NativeImg;
|
import cn.com.basic.face.util.RtspFaceNative;
|
|
public class NativeCodec extends Activity {
|
static final String TAG = "NativeCodec";
|
|
String mSourceString = null;
|
|
SurfaceView mSurfaceView1;
|
SurfaceHolder mSurfaceHolder1;
|
|
SurfaceView mSurfaceView2;
|
SurfaceHolder mSurfaceHolder2;
|
|
SurfaceView mSurfaceView3;
|
SurfaceHolder mSurfaceHolder3;
|
|
VideoSink mSelectedVideoSink;
|
VideoSink mNativeCodecPlayerVideoSink;
|
|
SurfaceHolderVideoSink mSurfaceHolder1VideoSink;
|
GLViewVideoSink mGLView1VideoSink;
|
|
boolean mCreated = false;
|
boolean mIsPlaying = false;
|
|
public static NativeImg faceImg = null;
|
|
/** Called when the activity is first created. */
|
@Override
|
public void onCreate(Bundle icicle) {
|
super.onCreate(icicle);
|
setContentView(R.layout.main);
|
ThisActivity = this;
|
|
try {
|
Process su = Runtime.getRuntime().exec("su");
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
//Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c", cmd});
|
|
RtspFaceNative.init();
|
for (int i=0 ;i < 32; i+=2){
|
RtspFaceNative.setFaceLabel(1, i, "中文名字");
|
RtspFaceNative.setFaceLabel(1, i+1, "abcd");
|
RtspFaceNative.setFaceLabel(2, i, "中文名字");
|
RtspFaceNative.setFaceLabel(2, i+1, "abcd");
|
}
|
|
RtspFaceNative.setLocalIP("192.168.1.93");
|
|
mGLView1 = (MyGLSurfaceView) findViewById(R.id.glsurfaceview1);
|
|
// set up the Surface 1 video sink
|
mSurfaceView1 = (SurfaceView) findViewById(R.id.surfaceview1);
|
mSurfaceHolder1 = mSurfaceView1.getHolder();
|
|
mSurfaceView2 = (SurfaceView) findViewById(R.id.surfaceview2);
|
mSurfaceHolder2 = mSurfaceView2.getHolder();
|
|
mSurfaceView3 = (SurfaceView) findViewById(R.id.surfaceview3);
|
mSurfaceHolder3 = mSurfaceView3.getHolder();
|
|
|
mSurfaceHolder1.addCallback(new SurfaceHolder.Callback() {
|
|
@Override
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
Log.v(TAG, "surfaceChanged format=" + format + ", width=" + width + ", height="
|
+ height);
|
}
|
|
@Override
|
public void surfaceCreated(SurfaceHolder holder) {
|
Log.v(TAG, "surfaceCreated");
|
if (mRadio1.isChecked()) {
|
//setSurface(1, holder.getSurface());
|
}
|
}
|
|
@Override
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
Log.v(TAG, "surfaceDestroyed");
|
}
|
|
});
|
|
// initialize content source spinner
|
Spinner sourceSpinner = (Spinner) findViewById(R.id.source_spinner);
|
ArrayAdapter<CharSequence> sourceAdapter = ArrayAdapter.createFromResource(
|
this, R.array.source_array, android.R.layout.simple_spinner_item);
|
sourceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
sourceSpinner.setAdapter(sourceAdapter);
|
sourceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
|
@Override
|
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
|
mSourceString = parent.getItemAtPosition(pos).toString();
|
Log.v(TAG, "onItemSelected " + mSourceString);
|
}
|
|
@Override
|
public void onNothingSelected(AdapterView parent) {
|
Log.v(TAG, "onNothingSelected");
|
mSourceString = null;
|
}
|
|
});
|
|
mRadio1 = (RadioButton) findViewById(R.id.radio1);
|
mRadio2 = (RadioButton) findViewById(R.id.radio2);
|
|
OnCheckedChangeListener checklistener = new CompoundButton.OnCheckedChangeListener() {
|
|
@Override
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
Log.i("@@@@", "oncheckedchanged");
|
if (buttonView == mRadio1 && isChecked) {
|
mRadio2.setChecked(false);
|
}
|
if (buttonView == mRadio2 && isChecked) {
|
mRadio1.setChecked(false);
|
}
|
|
|
if (isChecked) {
|
if (mRadio1.isChecked()) {
|
if (mSurfaceHolder1VideoSink == null) {
|
mSurfaceHolder1VideoSink = new SurfaceHolderVideoSink(mSurfaceHolder1);
|
//mSurfaceHolder1VideoSink.useAsSinkForNative();
|
}
|
mSelectedVideoSink = mSurfaceHolder1VideoSink;
|
mGLView1.onPause();
|
Log.i("@@@@", "glview pause");
|
} else {
|
mGLView1.onResume();
|
if (mGLView1VideoSink == null) {
|
mGLView1VideoSink = new GLViewVideoSink(mGLView1);
|
//mGLView1VideoSink.useAsSinkForNative();
|
}
|
mSelectedVideoSink = mGLView1VideoSink;
|
}
|
switchSurface();
|
}
|
}
|
};
|
mRadio1.setOnCheckedChangeListener(checklistener);
|
mRadio2.setOnCheckedChangeListener(checklistener);
|
mRadio2.toggle();
|
|
// the surfaces themselves are easier targets than the radio buttons
|
mSurfaceView1.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
mRadio1.toggle();
|
}
|
});
|
mGLView1.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
mRadio2.toggle();
|
}
|
});
|
|
mSurfaceView1.getHolder().addCallback(new SurfaceHolder.Callback() {
|
@Override
|
public void surfaceCreated(SurfaceHolder holder) {
|
|
}
|
|
@Override
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
|
}
|
|
@Override
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
|
}
|
});
|
|
((SurfaceView) findViewById(R.id.surfaceview3)).setOnClickListener(new View.OnClickListener() {
|
public void onClick(View view) {
|
mSurfaceHolder3.setFormat(PixelFormat.RGB_565);
|
Surface s3 = mSurfaceHolder3.getSurface();
|
RtspFaceNative.setCaptureSurface(s3);
|
}
|
});
|
|
// initialize button click handlers
|
|
// native MediaPlayer start/pause
|
((Button) findViewById(R.id.start_native)).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
public void onClick(View view) {
|
if (!mCreated) {
|
if (mNativeCodecPlayerVideoSink == null) {
|
if (mSelectedVideoSink == null) {
|
return;
|
}
|
//mSelectedVideoSink.useAsSinkForNative();
|
mNativeCodecPlayerVideoSink = mSelectedVideoSink;
|
}
|
if (mSourceString != null) {
|
|
//RtspFaceNative.setSurface(1, s, mSurfaceHolder1.getSurface());
|
|
//RtspFaceNative.setSurface(1, mSurfaceHolderDecoder1.getSurface());
|
|
//mSurfaceHolder1.setFormat(PixelFormat.RGBA_8888);
|
mSurfaceHolder1.setFormat(PixelFormat.RGB_565);
|
Surface s = mSurfaceHolder1.getSurface();
|
RtspFaceNative.setSurface(1, s);
|
|
//mSurfaceHolder2.setFormat(PixelFormat.RGBA_8888);
|
mSurfaceHolder2.setFormat(PixelFormat.RGB_565);
|
Surface s2 = mSurfaceHolder2.getSurface();
|
RtspFaceNative.setSurface(2, s2);
|
|
//SurfaceTexture st = mGLView1VideoSink.mMyGLSurfaceView.getSurfaceTexture();
|
//Surface sgl = new Surface(st);
|
//RtspFaceNative.setSurface(2, sgl, sgl);
|
//mGLView1VideoSink.useAsSinkForNative();
|
//sgl.release();
|
|
RtspFaceNative.setFaceCallback(1, "cn/com/basic/face/util/RtspFaceNative", "faceCallBack");
|
RtspFaceNative.setFaceCallback(2, "cn/com/basic/face/util/RtspFaceNative", "faceCallBack");
|
|
//try
|
//{
|
// String str = convertStreamToString(ThisActivity.getAssets().open("license.lic"));
|
// RtspFaceNative.dbgSetStfaceLicense(str);
|
//}
|
//catch(Exception ex)
|
//{
|
// return ;
|
//}
|
|
//mCreated = createStreamingMediaPlayer(getResources().getAssets(), mSourceString);
|
//#todo ok
|
//mCreated = RtspFaceNative.createPlayer(1, "rtsp://admin:admin@192.168.1.188:554/cam/realmonitor?channel=1&subtype=2");
|
mCreated = RtspFaceNative.createPlayer(1, "rtsp://admin:admin12345@192.168.1.202:554/h264/ch1/main/av_stream");
|
//mCreated = RtspFaceNative.createPlayer(2, "rtsp://Admin:1234@192.168.1.22/h264");
|
//mCreated = RtspFaceNative.createPlayer(2, "rtsp://admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream");
|
//mCreated = createPlayer(1, "rtsp://192.168.1.56:8554");
|
|
//byte[] arr = new byte[5];
|
//arr[0] = 3; arr[1] = 4; arr[2] = 5;
|
//RtspFaceNative.getFaceList(1, arr);
|
|
}
|
}
|
if (mCreated) {
|
mIsPlaying = !mIsPlaying;
|
//setPlayingStreamingMediaPlayer(mIsPlaying);
|
}
|
}
|
|
});
|
|
|
// native MediaPlayer rewind
|
((Button) findViewById(R.id.rewind_native)).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
public void onClick(View view) {
|
if (mNativeCodecPlayerVideoSink != null) {
|
//rewindStreamingMediaPlayer();
|
}
|
}
|
|
});
|
|
((Button) findViewById(R.id.addface_native)).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
public void onClick(View view) {
|
Log.i("@@@", "addface_native onClick");
|
|
}
|
|
});
|
|
((ImageView) findViewById(R.id.addface_image)).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
public void onClick(View view) {
|
Log.i("@@@", "addface_image onClick");
|
//ImageView image = (ImageView)ThisActivity.findViewById(R.id.addface_image);
|
//image.setImageBitmap(faceBitmap);
|
}
|
|
});
|
|
((Button) findViewById(R.id.addface_native)).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
public void onClick(View view) {
|
Log.i("@@@", "addface_image onClick");
|
RtspFaceNative.dbgFaceAdd(ThisActivity.faceImg);
|
}
|
|
});
|
|
}
|
|
static NativeCodec ThisActivity;
|
|
public String convertStreamToString(InputStream is) {
|
try
|
{
|
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
StringBuilder sb = new StringBuilder();
|
String line = null;
|
while ((line = reader.readLine()) != null) {
|
sb.append(line).append("\n");
|
}
|
reader.close();
|
return sb.toString();
|
}
|
catch(Exception ex)
|
{
|
return "";
|
}
|
}
|
|
public static void setFaceDrawable(NativeImg img)
|
{
|
//ImageView image = (ImageView)ThisActivity.findViewById(R.id.addface_image);
|
//return image;
|
|
ThisActivity.faceImg = img;
|
|
//ImageView image = (ImageView)ThisActivity.findViewById(R.id.addface_image);
|
//image.callOnClick();
|
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
ThisActivity.runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
Bitmap bitmap = Bitmap.createBitmap(faceImg.width, faceImg.height, Bitmap.Config.RGB_565);//ARGB_8888
|
ByteBuffer byteBuffer = ByteBuffer.wrap(faceImg.image, 0, faceImg.size);
|
bitmap.copyPixelsFromBuffer(byteBuffer);
|
|
ImageView image = (ImageView)ThisActivity.findViewById(R.id.addface_image);
|
image.setImageBitmap(bitmap);
|
|
TextView textView1 = (TextView)ThisActivity.findViewById(R.id.textView1);
|
textView1.setText(RtspFaceNative.dbgGetLog());
|
}
|
});
|
}
|
}).start();
|
}
|
|
void switchSurface() {
|
|
//mGLView1VideoSink.useAsSinkForNative();
|
//mSurfaceHolder1VideoSink.useAsSinkForNative();
|
|
if (mCreated && mNativeCodecPlayerVideoSink != mSelectedVideoSink) {
|
// shutdown and recreate on other surface
|
Log.i("@@@", "shutting down player");
|
//shutdown(1);
|
//shutdown(2);
|
mCreated = false;
|
//mSelectedVideoSink.useAsSinkForNative();
|
|
|
|
mNativeCodecPlayerVideoSink = mSelectedVideoSink;
|
if (mSourceString != null) {
|
Log.i("@@@", "recreating player");
|
//mCreated = createStreamingMediaPlayer(getResources().getAssets(),mSourceString);
|
//mCreated = createPlayer(1, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream");
|
//mCreated = createPlayer(2, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream");
|
//mCreated = createPlayer(1, "rtsp://192.168.1.56:8554");
|
mIsPlaying = false;
|
}
|
}
|
}
|
|
/** Called when the activity is about to be paused. */
|
@Override
|
protected void onPause()
|
{
|
mIsPlaying = false;
|
//setPlayingStreamingMediaPlayer(false);
|
mGLView1.onPause();
|
super.onPause();
|
}
|
|
@Override
|
protected void onResume() {
|
super.onResume();
|
if (mRadio2.isChecked()) {
|
mGLView1.onResume();
|
}
|
}
|
|
/** Called when the activity is about to be destroyed. */
|
@Override
|
protected void onDestroy()
|
{
|
RtspFaceNative.shutdown(1);
|
RtspFaceNative.shutdown(2);
|
mCreated = false;
|
super.onDestroy();
|
}
|
|
private MyGLSurfaceView mGLView1;
|
|
private RadioButton mRadio1;
|
|
private RadioButton mRadio2;
|
|
/** Native methods, implemented in jni folder */
|
//public static native void createEngine();
|
//public static native boolean createStreamingMediaPlayer(AssetManager assetMgr, String filename);
|
//public static native void setPlayingStreamingMediaPlayer(boolean isPlaying);
|
//public static native void shutdown();
|
//public static native void setSurface(Surface surface);
|
//public static native void rewindStreamingMediaPlayer();
|
|
//public static native void init();
|
//public static native void setSurface(int cameraIdx, Surface surface);
|
//public static native boolean createPlayer(int cameraIdx, String uri);
|
//public static native void shutdown(int cameraIdx);
|
//// typedef void (* Java_com_example_nativecodec_NativeCodec_FaceCallback_func)(int cameraIdx, int count);
|
//public static native boolean setFaceCallback(int cameraIdx, String func);
|
//public static native void lockFace(int cameraIdx);
|
//public static native void releaseFace(int cameraIdx);
|
//public static native boolean getFaceList(int cameraIdx, byte[] faceListPb);
|
//public static native boolean getFaceImages(int cameraIdx, byte[] faceImagesIdx, byte[] faceImages);
|
|
/** Load jni .so on initialization */
|
static {
|
//System.loadLibrary("rtspface_client");
|
System.loadLibrary("rtspface_server");
|
//System.loadLibrary("opencv_java3");
|
}
|
|
// VideoSink abstracts out the difference between Surface and SurfaceTexture
|
// aka SurfaceHolder and GLSurfaceView
|
static abstract class VideoSink {
|
|
abstract void setFixedSize(int width, int height);
|
abstract void useAsSinkForNative();
|
|
}
|
|
static class SurfaceHolderVideoSink extends VideoSink {
|
|
private final SurfaceHolder mSurfaceHolder;
|
|
SurfaceHolderVideoSink(SurfaceHolder surfaceHolder) {
|
mSurfaceHolder = surfaceHolder;
|
}
|
|
@Override
|
void setFixedSize(int width, int height) {
|
mSurfaceHolder.setFixedSize(width, height);
|
}
|
|
@Override
|
void useAsSinkForNative() {
|
Surface s = mSurfaceHolder.getSurface();
|
Log.i("@@@", "setting surface " + s);
|
//mSurfaceHolder1.setFormat(PixelFormat.RGBA_8888);
|
//RtspFaceNative.setSurface(1, s);
|
}
|
|
}
|
|
static class GLViewVideoSink extends VideoSink {
|
|
private final MyGLSurfaceView mMyGLSurfaceView;
|
|
GLViewVideoSink(MyGLSurfaceView myGLSurfaceView) {
|
mMyGLSurfaceView = myGLSurfaceView;
|
}
|
|
@Override
|
void setFixedSize(int width, int height) {
|
}
|
|
@Override
|
void useAsSinkForNative() {
|
SurfaceTexture st = mMyGLSurfaceView.getSurfaceTexture();
|
Surface s = new Surface(st);
|
//setEGLConfigChooser(8, 8, 8, 8, 0, 0);
|
//RtspFaceNative.setSurface(1, s);
|
s.release();
|
}
|
|
}
|
|
}
|