Index: webrtc/modules/video_render/android/java/src/org/webrtc/videoengine/ViESurfaceRenderer.java |
diff --git a/webrtc/modules/video_render/android/java/src/org/webrtc/videoengine/ViESurfaceRenderer.java b/webrtc/modules/video_render/android/java/src/org/webrtc/videoengine/ViESurfaceRenderer.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..71f26c259ffebdea261b2288ac11b7d085efa9d7 |
--- /dev/null |
+++ b/webrtc/modules/video_render/android/java/src/org/webrtc/videoengine/ViESurfaceRenderer.java |
@@ -0,0 +1,185 @@ |
+/* |
+ * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+package org.webrtc.videoengine; |
+ |
+// The following four imports are needed saveBitmapToJPEG which |
+// is for debug only |
+import java.io.ByteArrayOutputStream; |
+import java.io.FileNotFoundException; |
+import java.io.FileOutputStream; |
+import java.io.IOException; |
+import java.nio.ByteBuffer; |
+ |
+import android.graphics.Bitmap; |
+import android.graphics.Canvas; |
+import android.graphics.Rect; |
+import android.view.SurfaceHolder; |
+import android.view.SurfaceView; |
+import android.view.SurfaceHolder.Callback; |
+ |
+import org.webrtc.Logging; |
+ |
+public class ViESurfaceRenderer implements Callback { |
+ |
+ private final static String TAG = "WEBRTC"; |
+ |
+ // the bitmap used for drawing. |
+ private Bitmap bitmap = null; |
+ private ByteBuffer byteBuffer = null; |
+ private SurfaceHolder surfaceHolder; |
+ // Rect of the source bitmap to draw |
+ private Rect srcRect = new Rect(); |
+ // Rect of the destination canvas to draw to |
+ private Rect dstRect = new Rect(); |
+ private float dstTopScale = 0; |
+ private float dstBottomScale = 1; |
+ private float dstLeftScale = 0; |
+ private float dstRightScale = 1; |
+ |
+ public ViESurfaceRenderer(SurfaceView view) { |
+ surfaceHolder = view.getHolder(); |
+ if(surfaceHolder == null) |
+ return; |
+ surfaceHolder.addCallback(this); |
+ } |
+ |
+ // surfaceChanged and surfaceCreated share this function |
+ private void changeDestRect(int dstWidth, int dstHeight) { |
+ dstRect.right = (int)(dstRect.left + dstRightScale * dstWidth); |
+ dstRect.bottom = (int)(dstRect.top + dstBottomScale * dstHeight); |
+ } |
+ |
+ public void surfaceChanged(SurfaceHolder holder, int format, |
+ int in_width, int in_height) { |
+ Logging.d(TAG, "ViESurfaceRender::surfaceChanged"); |
+ |
+ changeDestRect(in_width, in_height); |
+ |
+ Logging.d(TAG, "ViESurfaceRender::surfaceChanged" + |
+ " in_width:" + in_width + " in_height:" + in_height + |
+ " srcRect.left:" + srcRect.left + |
+ " srcRect.top:" + srcRect.top + |
+ " srcRect.right:" + srcRect.right + |
+ " srcRect.bottom:" + srcRect.bottom + |
+ " dstRect.left:" + dstRect.left + |
+ " dstRect.top:" + dstRect.top + |
+ " dstRect.right:" + dstRect.right + |
+ " dstRect.bottom:" + dstRect.bottom); |
+ } |
+ |
+ public void surfaceCreated(SurfaceHolder holder) { |
+ Canvas canvas = surfaceHolder.lockCanvas(); |
+ if(canvas != null) { |
+ Rect dst = surfaceHolder.getSurfaceFrame(); |
+ if(dst != null) { |
+ changeDestRect(dst.right - dst.left, dst.bottom - dst.top); |
+ Logging.d(TAG, "ViESurfaceRender::surfaceCreated" + |
+ " dst.left:" + dst.left + |
+ " dst.top:" + dst.top + |
+ " dst.right:" + dst.right + |
+ " dst.bottom:" + dst.bottom + |
+ " srcRect.left:" + srcRect.left + |
+ " srcRect.top:" + srcRect.top + |
+ " srcRect.right:" + srcRect.right + |
+ " srcRect.bottom:" + srcRect.bottom + |
+ " dstRect.left:" + dstRect.left + |
+ " dstRect.top:" + dstRect.top + |
+ " dstRect.right:" + dstRect.right + |
+ " dstRect.bottom:" + dstRect.bottom); |
+ } |
+ surfaceHolder.unlockCanvasAndPost(canvas); |
+ } |
+ } |
+ |
+ public void surfaceDestroyed(SurfaceHolder holder) { |
+ Logging.d(TAG, "ViESurfaceRenderer::surfaceDestroyed"); |
+ bitmap = null; |
+ byteBuffer = null; |
+ } |
+ |
+ public Bitmap CreateBitmap(int width, int height) { |
+ Logging.d(TAG, "CreateByteBitmap " + width + ":" + height); |
+ if (bitmap == null) { |
+ try { |
+ android.os.Process.setThreadPriority( |
+ android.os.Process.THREAD_PRIORITY_DISPLAY); |
+ } |
+ catch (Exception e) { |
+ } |
+ } |
+ bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); |
+ srcRect.left = 0; |
+ srcRect.top = 0; |
+ srcRect.bottom = height; |
+ srcRect.right = width; |
+ return bitmap; |
+ } |
+ |
+ public ByteBuffer CreateByteBuffer(int width, int height) { |
+ Logging.d(TAG, "CreateByteBuffer " + width + ":" + height); |
+ if (bitmap == null) { |
+ bitmap = CreateBitmap(width, height); |
+ byteBuffer = ByteBuffer.allocateDirect(width * height * 2); |
+ } |
+ return byteBuffer; |
+ } |
+ |
+ public void SetCoordinates(float left, float top, |
+ float right, float bottom) { |
+ Logging.d(TAG, "SetCoordinates " + left + "," + top + ":" + |
+ right + "," + bottom); |
+ dstLeftScale = left; |
+ dstTopScale = top; |
+ dstRightScale = right; |
+ dstBottomScale = bottom; |
+ } |
+ |
+ // It saves bitmap data to a JPEG picture, this function is for debug only. |
+ private void saveBitmapToJPEG(int width, int height) { |
+ ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); |
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteOutStream); |
+ |
+ try{ |
+ FileOutputStream output = new FileOutputStream(String.format( |
+ "/sdcard/render_%d.jpg", System.currentTimeMillis())); |
+ output.write(byteOutStream.toByteArray()); |
+ output.flush(); |
+ output.close(); |
+ } |
+ catch (FileNotFoundException e) { |
+ } |
+ catch (IOException e) { |
+ } |
+ } |
+ |
+ public void DrawByteBuffer() { |
+ if(byteBuffer == null) |
+ return; |
+ byteBuffer.rewind(); |
+ bitmap.copyPixelsFromBuffer(byteBuffer); |
+ DrawBitmap(); |
+ } |
+ |
+ public void DrawBitmap() { |
+ if(bitmap == null) |
+ return; |
+ |
+ Canvas canvas = surfaceHolder.lockCanvas(); |
+ if(canvas != null) { |
+ // The follow line is for debug only |
+ // saveBitmapToJPEG(srcRect.right - srcRect.left, |
+ // srcRect.bottom - srcRect.top); |
+ canvas.drawBitmap(bitmap, srcRect, dstRect, null); |
+ surfaceHolder.unlockCanvasAndPost(canvas); |
+ } |
+ } |
+ |
+} |