package com.example.datalibrary.lim; 
 | 
  
 | 
import android.util.Log; 
 | 
  
 | 
import com.hjimi.api.iminect.ImiDevice; 
 | 
import com.hjimi.api.iminect.ImiFrameMode; 
 | 
import com.hjimi.api.iminect.Utils; 
 | 
  
 | 
import java.nio.ByteBuffer; 
 | 
import java.nio.ByteOrder; 
 | 
  
 | 
  
 | 
public class SimpleViewer extends Thread { 
 | 
  
 | 
    private boolean mShouldRun = false; 
 | 
  
 | 
    private ImiDevice.ImiStreamType mStreamType; 
 | 
    private GLPanel mGLPanel; 
 | 
    private GLPanel mIrGLPanel; 
 | 
    private DecodePanel mDecodePanel; 
 | 
    private ImiDevice mDevice; 
 | 
    private ImiFrameMode mCurrentMode; 
 | 
    private DataDealListener dataDealInterface; 
 | 
  
 | 
    public byte[] rgbData; 
 | 
    public byte[] deptData; 
 | 
    public byte[] irData; 
 | 
  
 | 
    public SimpleViewer(ImiDevice device, ImiDevice.ImiStreamType streamType, DataDealListener dealInterface) { 
 | 
        mDevice = device; 
 | 
        mStreamType = streamType; 
 | 
        dataDealInterface = dealInterface; 
 | 
    } 
 | 
  
 | 
    public void setGLPanel(GLPanel mGLPanel) { 
 | 
        this.mGLPanel = mGLPanel; 
 | 
    } 
 | 
  
 | 
    public void setIrGLPanel(GLPanel mIrGLPanel) { 
 | 
        this.mIrGLPanel = mIrGLPanel; 
 | 
    } 
 | 
  
 | 
    public void setDecodePanel(DecodePanel decodePanel) { 
 | 
        this.mDecodePanel = decodePanel; 
 | 
    } 
 | 
  
 | 
    public interface DataDealListener { 
 | 
        void dealDepth(byte[] data); 
 | 
        void dealRgb(byte[] data); 
 | 
        void dealIr(byte[] data); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void run() { 
 | 
        super.run(); 
 | 
        // get current framemode. 
 | 
        // int pid = android.os.Process.myPid(); 
 | 
        try { 
 | 
  
 | 
            if (mDevice == null || mStreamType == null){ 
 | 
                return; 
 | 
            } 
 | 
            mCurrentMode = mDevice.getCurrentFrameMode(mStreamType); 
 | 
  
 | 
            // Log.d("imi_test", "sv runs start, pid:"+pid+", mCurrentMode format:"+mCurrentMode.getFormat()+", mShouldRun:"+mShouldRun); 
 | 
            // start read frame. 
 | 
            while (mShouldRun) { 
 | 
                ImiDevice.ImiFrame nextFrame = mDevice.readNextFrame(mStreamType, 25); 
 | 
                // Log.d("imi_test", "sv runs , pid:"+pid+", nextFrame size:"+((nextFrame!=null)?""+nextFrame.getSize(): "null")); 
 | 
                // frame maybe null, if null, continue. 
 | 
                if (nextFrame == null){ 
 | 
                    continue; 
 | 
                } 
 | 
                // Log.d("imi_test", "sv runs , pid:"+pid+", mStreamType:"+mStreamType); 
 | 
                switch (mStreamType) { 
 | 
                    case COLOR: 
 | 
                        // draw color. 
 | 
                        drawColor(nextFrame); 
 | 
                        break; 
 | 
                    case DEPTH: 
 | 
                        // draw depth. 
 | 
                        drawDepth(nextFrame); 
 | 
                        break; 
 | 
                    case IR: 
 | 
                        // draw ir 
 | 
                        drawIr(nextFrame); 
 | 
                        break; 
 | 
                    case DEPTH_IR: 
 | 
                        drawDepthIR(nextFrame); 
 | 
                        break; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            Log.d("imi_test", "sv run end"); 
 | 
        }catch (Exception e){ 
 | 
            e.fillInStackTrace(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void drawDepthIR(ImiDevice.ImiFrame nextFrame) { 
 | 
        ByteBuffer frameData = nextFrame.getData(); 
 | 
        int width = nextFrame.getWidth(); 
 | 
        int height = nextFrame.getHeight(); 
 | 
  
 | 
        if (null == frameData) { 
 | 
            Log.d("imi_test", "drawDepthIR frameData is null"); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        ByteBuffer depthData = Utils.depth2RGB888(frameData, width, height, true, false); 
 | 
        // mDepthGLPanel.paint(null, depthData, width, height); 
 | 
        if (depthData != null) { 
 | 
            int depthLen = frameData.remaining(); 
 | 
            byte[] depthByte = new byte[depthLen]; 
 | 
            frameData.get(depthByte); 
 | 
            deptData = depthByte; 
 | 
            if (dataDealInterface != null) { 
 | 
                dataDealInterface.dealDepth(deptData); 
 | 
            } 
 | 
            /*FaceDepthGateActivity faceDepthGateActivity = new FaceDepthGateActivity(); 
 | 
            faceDepthGateActivity.dealDepth(depthByte);*/ 
 | 
  
 | 
            if (mGLPanel != null){ 
 | 
                mGLPanel.paint(null, depthData, width, height); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        ByteBuffer irBuffer = ByteBuffer.allocateDirect(width * height * 2); 
 | 
        irBuffer.order(ByteOrder.nativeOrder()); 
 | 
        irBuffer.position(0); 
 | 
  
 | 
        frameData.position(width * height * 2); 
 | 
        irBuffer.put(frameData); 
 | 
  
 | 
        ByteBuffer irDataBuf =  Utils.ir2RGB888(irBuffer, width, height, false); 
 | 
  
 | 
        // mIRGLPanel.paint(null, irData, width, height); 
 | 
        if (irDataBuf != null) { 
 | 
            int irLen = irDataBuf.remaining(); 
 | 
            byte[] irByte = new byte[irLen]; 
 | 
            irDataBuf.get(irByte); 
 | 
            irData = irByte; 
 | 
            if (dataDealInterface != null) { 
 | 
                dataDealInterface.dealIr(irData); 
 | 
            } 
 | 
  
 | 
            if (mIrGLPanel != null) { 
 | 
                mIrGLPanel.paint(null, irDataBuf, width, height); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void drawDepth(ImiDevice.ImiFrame nextFrame) { 
 | 
        ByteBuffer frameData = nextFrame.getData(); 
 | 
        int width = nextFrame.getWidth(); 
 | 
        int height = nextFrame.getHeight(); 
 | 
        // Log.d("imi_test", "drawColor width:"+width+", height:"+height); 
 | 
  
 | 
        // TODO: 测试代码 
 | 
        frameData = Utils.depth2RGB888(nextFrame, true, false); 
 | 
  
 | 
        // mGLPanel.paint(null, frameData, width, height); 
 | 
        // Log.d("imi_test", "drawDepth Format:"+mCurrentMode.getFormat()); 
 | 
  
 | 
        if (frameData != null) { 
 | 
            int depthLen = frameData.remaining(); 
 | 
            byte[] depthByte = new byte[depthLen]; 
 | 
            frameData.get(depthByte); 
 | 
            deptData = depthByte; 
 | 
            if (dataDealInterface != null) { 
 | 
                dataDealInterface.dealDepth(deptData); 
 | 
            } 
 | 
            /*FaceDepthGateActivity faceDepthGateActivity = new FaceDepthGateActivity(); 
 | 
            faceDepthGateActivity.dealDepth(depthByte);*/ 
 | 
  
 | 
            if (mGLPanel != null){ 
 | 
                mGLPanel.paint(null, frameData, width, height); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void drawIr(ImiDevice.ImiFrame nextFrame) { 
 | 
        ByteBuffer frameData = nextFrame.getData(); 
 | 
        int width = nextFrame.getWidth(); 
 | 
        int height = nextFrame.getHeight(); 
 | 
  
 | 
        frameData = Utils.ir2RGB888(nextFrame, false); 
 | 
  
 | 
        if (frameData != null) { 
 | 
            int irLen = frameData.remaining(); 
 | 
            byte[] irByte = new byte[irLen]; 
 | 
            frameData.get(irByte); 
 | 
            deptData = irByte; 
 | 
            if (dataDealInterface != null) { 
 | 
                dataDealInterface.dealIr(deptData); 
 | 
            } 
 | 
  
 | 
            if (mGLPanel != null) { 
 | 
                mGLPanel.paint(null, frameData, width, height); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public byte[] getDeptData(){ 
 | 
        return deptData; 
 | 
    } 
 | 
  
 | 
    public byte[] getRgbData(){ 
 | 
        return rgbData; 
 | 
    } 
 | 
  
 | 
    public byte[] getIrData(){ 
 | 
        return irData; 
 | 
    } 
 | 
  
 | 
    private void drawColor(ImiDevice.ImiFrame nextFrame) { 
 | 
        ByteBuffer frameData = nextFrame.getData(); 
 | 
        int width = nextFrame.getWidth(); 
 | 
        int height = nextFrame.getHeight(); 
 | 
        // Log.d("imi_test", "drawColor width:"+width+", height:"+height); 
 | 
  
 | 
        if (frameData != null) { 
 | 
            int rgbByteLen = frameData.remaining(); 
 | 
            byte[] rgbByte = new byte[rgbByteLen]; 
 | 
            frameData.get(rgbByte); 
 | 
            rgbData = rgbByte; 
 | 
            if (dataDealInterface != null) { 
 | 
                dataDealInterface.dealRgb(rgbData); 
 | 
            } 
 | 
            /*FaceDepthGateActivity faceDepthGateActivity = new FaceDepthGateActivity(); 
 | 
            faceDepthGateActivity.dealRgb(rgbByte);*/ 
 | 
        } 
 | 
  
 | 
        // Log.d("imi_test", "drawColor Format:"+mCurrentMode.getFormat()); 
 | 
        // draw color image. 
 | 
        switch (mCurrentMode.getFormat()) { 
 | 
            case IMI_PIXEL_FORMAT_IMAGE_H264: 
 | 
                if (mDecodePanel != null){ 
 | 
                    mDecodePanel.paint(frameData, nextFrame.getTimeStamp()); 
 | 
                } 
 | 
                break; 
 | 
            case IMI_PIXEL_FORMAT_IMAGE_YUV420SP: 
 | 
                frameData = Utils.yuv420sp2RGB(nextFrame); 
 | 
                if (mGLPanel != null){ 
 | 
                    mGLPanel.paint(null, frameData, width, height); 
 | 
                } 
 | 
                break; 
 | 
            case IMI_PIXEL_FORMAT_IMAGE_RGB24: 
 | 
                if (mGLPanel != null){ 
 | 
                    mGLPanel.paint(null, frameData, width, height); 
 | 
                } 
 | 
                break; 
 | 
            default: 
 | 
                break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void onPause(){ 
 | 
        if (mGLPanel != null){ 
 | 
            mGLPanel.onPause(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void onResume(){ 
 | 
        if (mGLPanel != null){ 
 | 
            mGLPanel.onResume(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void onStart(){ 
 | 
        if (!mShouldRun){ 
 | 
            mShouldRun = true; 
 | 
  
 | 
            // start read thread 
 | 
            this.start(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void onDestroy(){ 
 | 
        mShouldRun = false; 
 | 
    } 
 | 
} 
 |