/* * 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.82"); 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 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(); } } }