package com.basic.security.utils.socket; import android.graphics.Bitmap; import com.basic.security.utils.RenderScriptHelper; import com.basic.security.utils.RotateUtil; import java.io.ByteArrayOutputStream; import java.util.LinkedList; import java.util.Map; public class YuvToJpgFrameBufferManager extends Thread { private static final int MAX_BUFFER_COUNT = 4; private final int mFrameLength; ByteArrayOutputStream jpgBaos = new ByteArrayOutputStream(); RotateUtil rotateUtil = new RotateUtil(); byte[] jpgByteArray; RenderScriptHelper renderScriptHelper = new RenderScriptHelper(); private YuvFrameQueue[] mBufferQueue; private int mFillCount = 0; private int mRemained = 0; private int mWidth, mHeight; private LinkedList mYUVQueue = new LinkedList(); private BitmapListener mListener; public YuvToJpgFrameBufferManager(int frameLength, int width, int height) { mWidth = width; mHeight = height; mFrameLength = frameLength; mBufferQueue = new YuvFrameQueue[MAX_BUFFER_COUNT]; for (int i = 0; i < MAX_BUFFER_COUNT; ++i) { mBufferQueue[i] = new YuvFrameQueue(mFrameLength, width, height); } } public YuvToJpgFrameBufferManager(int frameLength, int width, int height, BitmapListener listener) { this(frameLength, width, height); mListener = listener; start(); } public void fillBuffer1(Map faceListMap, byte[] data, int len, boolean hasFaces) { data = rotateUtil.rotateYUV420Degree270(data, mWidth, mHeight); int mWidth1 = mHeight; int mHeight1 = mWidth; Bitmap bufferedImage = renderScriptHelper.getBitmapFromFrameData(data, mWidth1, mHeight1); if (hasFaces) { mListener.detectFace(faceListMap, data, mWidth1, mHeight1, bufferedImage, new byte[]{}); } mListener.onBitmap(bufferedImage); } public void fillBuffer(byte[] data, int len) { mFillCount = mFillCount % MAX_BUFFER_COUNT; if (mRemained != 0) { if (mRemained < len) { mBufferQueue[mFillCount].fillBuffer(data, 0, mRemained, mYUVQueue); ++mFillCount; if (mFillCount == MAX_BUFFER_COUNT) mFillCount = 0; mBufferQueue[mFillCount].fillBuffer(data, mRemained, len - mRemained, mYUVQueue); mRemained = mFrameLength - len + mRemained; } else if (mRemained == len) { mBufferQueue[mFillCount].fillBuffer(data, 0, mRemained, mYUVQueue); mRemained = 0; ++mFillCount; if (mFillCount == MAX_BUFFER_COUNT) mFillCount = 0; } else { mBufferQueue[mFillCount].fillBuffer(data, 0, len, mYUVQueue); mRemained = mRemained - len; } } else { mBufferQueue[mFillCount].fillBuffer(data, 0, len, mYUVQueue); if (len < mFrameLength) { mRemained = mFrameLength - len; } else { ++mFillCount; if (mFillCount == MAX_BUFFER_COUNT) mFillCount = 0; } } } public void setOnDataListener(BitmapListener listener) { mListener = listener; start(); } public void close() { interrupt(); try { join(); } catch (InterruptedException e) { e.printStackTrace(); } } public void run() { super.run(); long lastTimeShowImage = System.currentTimeMillis(); while (!Thread.currentThread().isInterrupted()) { byte[] data; synchronized (mYUVQueue) { data = mYUVQueue.poll(); if (data != null) { data = rotateUtil.rotateYUV420Degree90(data, mWidth, mHeight); int mWidth1 = mHeight; int mHeight1 = mWidth; Bitmap bufferedImage = renderScriptHelper.getBitmapFromFrameData(data, mWidth1, mHeight1); mListener.onBitmap(bufferedImage); } } } } }