package com.basic.security.utils.yuv.pull.client; import android.graphics.Bitmap; import com.basic.security.utils.RenderScriptHelper; import com.basic.security.utils.RotateUtil; import java.io.ByteArrayOutputStream; import java.util.LinkedList; public class BufferManager 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 ImageBuffer[] mBufferQueue; private int mFillCount = 0; private int mRemained = 0; private int mWidth, mHeight; private LinkedList mYUVQueue = new LinkedList(); private DataListener mListener; public BufferManager(int frameLength, int width, int height) { mWidth = width; mHeight = height; mFrameLength = frameLength; mBufferQueue = new ImageBuffer[MAX_BUFFER_COUNT]; for (int i = 0; i < MAX_BUFFER_COUNT; ++i) { mBufferQueue[i] = new ImageBuffer(mFrameLength, width, height); } } 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(DataListener listener) { mListener = listener; start(); } public void close() { interrupt(); try { join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { // TODO Auto-generated method stub super.run(); long lastTimeShowImage = System.currentTimeMillis(); while (!Thread.currentThread().isInterrupted()) { byte[] data = null; synchronized (mYUVQueue) { data = mYUVQueue.poll(); if (data != null) { data = rotateUtil.rotateYUV420Degree90(data, mWidth, mHeight); int mWidth1 = mHeight; int mHeight1 = mWidth; long begin = System.currentTimeMillis(); Bitmap bufferedImage = renderScriptHelper.getBitmapFromFrameData(data, mWidth1, mHeight1); // YuvImage im = new YuvImage(data, ImageFormat.NV21, mWidth1, // mHeight1, null); // Rect r = new Rect(0,0,mWidth1,mHeight1); // jpgBaos.reset(); // im.compressToJpeg(r, 100, jpgBaos); // jpgByteArray = jpgBaos.toByteArray(); // // long t = System.currentTimeMillis(); // Bitmap bufferedImage = null; // bufferedImage = BitmapFactory.decodeByteArray(jpgByteArray, 0, jpgByteArray.length); // System.out.println("taken="+(System.currentTimeMillis() - begin)); mListener.onDirty(bufferedImage); System.out.println("上次显示图片的时间间隔:" + (System.currentTimeMillis() - lastTimeShowImage)); lastTimeShowImage = System.currentTimeMillis(); } } } } }