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<byte[]> mYUVQueue = new LinkedList<byte[]>();
|
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<String, Object> 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);
|
}
|
}
|
}
|
}
|
}
|