Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class PictureView extends View {
- public static InputStream m_inStream;
- private int m_width = 320; //512;//640;
- private int m_height = 240; //512;//480;
- private int[] m_rgbData;
- private byte[] m_yuvData;
- private int m_yuv_size;
- private int m_rgb_size;
- private Context m_context;
- private Timer m_timer;
- private Handler m_handler;
- public PictureView(Context context, AttributeSet attrs) {
- super(context, attrs);
- m_context = context;
- m_yuv_size = (int)(m_width * m_height * 2.0f);
- m_rgb_size = (int)(m_width * m_height);
- m_yuvData = new byte[m_yuv_size];
- m_rgbData = new int[m_rgb_size];
- m_handler = new Handler() {
- public void handleMessage(Message msg) {
- if(readNextFrame()) {
- convertToRGB();
- invalidate();
- }
- }
- };
- m_timer = new Timer();
- m_timer.schedule(new TimerTask() {
- @Override
- public void run() {
- m_handler.obtainMessage(1).sendToTarget();
- }
- }, 0, 32);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- Bitmap bmp = Bitmap.createBitmap(m_width, m_height, Bitmap.Config.ARGB_8888);
- bmp.setPixels(m_rgbData, 0, m_width, 0, 0, m_width, m_height);
- canvas.drawBitmap(bmp, 0, 0, null);
- }
- private boolean readNextFrame() {
- try {
- int available = m_inStream.available();
- if(available <= 0) return false;
- if(m_yuv_size > available)
- m_yuv_size = available;
- m_inStream.read(m_yuvData, 0, m_yuv_size);
- } catch(Exception e) {
- e.printStackTrace();
- }
- return true;
- }
- private void convertToRGB() {
- // YUY2 to RGB.
- int rgbIndex =0 ;
- for (int j = 0, yp = 0; j < m_height; j++) {
- int u = 0, v = 0;
- for (int i = 0; i < (m_width>>1); i++, yp+=4,rgbIndex++) {
- int y = (0xff & ((int) m_yuvData[yp]))- 16;
- if (y < 0)
- y = 0;
- if ((i & 1) == 0) {
- u = (0xff & m_yuvData[yp + 1]) - 128;
- v = (0xff & m_yuvData[yp + 3]) - 128;
- }
- if (y < 0)
- y = 0;
- int y1164 = 1164 * y;
- int r = (y1164 + 1696 * v);
- int g = (y1164 - 833 * v - 391 * u);
- int b = (y1164 + 2066 * u);
- if (r < 0)
- r = 0;
- else if (r > 262143)
- r = 262143;
- if (g < 0)
- g = 0;
- else if (g > 262143)
- g = 262143;
- if (b < 0)
- b = 0;
- else if (b > 262143)
- b = 262143;
- m_rgbData[rgbIndex++] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
- y = (0xff & ((int) m_yuvData[yp+2]))- 16;
- if (y < 0)
- y = 0;
- y1164 = 1164 * y;
- r = (y1164 + 1696 * v);
- g = (y1164 - 833 * v - 391 * u);
- b = (y1164 + 2066 * u);
- //offers clamping control
- if (r < 0)
- r = 0;
- else if (r > 262143)
- r = 262143;
- if (g < 0)
- g = 0;
- else if (g > 262143)
- g = 262143;
- if (b < 0)
- b = 0;
- else if (b > 262143)
- b = 262143;
- m_rgbData[rgbIndex] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement