Chromium Code Reviews| Index: webrtc/api/android/java/src/org/webrtc/GlVideoFileDrawer.java |
| diff --git a/webrtc/api/android/java/src/org/webrtc/GlVideoFileDrawer.java b/webrtc/api/android/java/src/org/webrtc/GlVideoFileDrawer.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..cd3c147172863948883418c0ade34db54fb1b8d8 |
| --- /dev/null |
| +++ b/webrtc/api/android/java/src/org/webrtc/GlVideoFileDrawer.java |
| @@ -0,0 +1,126 @@ |
| +/* |
| + * Copyright 2016 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; |
| + |
| +import java.nio.ByteBuffer; |
| +import java.io.FileOutputStream; |
| +import java.io.IOException; |
| + |
| +public class GlVideoFileDrawer implements RendererCommon.GlDrawer { |
|
magjed_webrtc
2016/08/31 13:08:03
I don't think this is the best approach, I think y
|
| + private static final String TAG = "GlVideoFileDrawer"; |
| + |
| + private SurfaceTextureHelper surfaceTextureHelper; |
| + |
| + // We want to keep old drawing calls, and add our own. This is the old |
| + // drawer that we should also call. |
| + private RendererCommon.GlDrawer decoratedDrawer; |
| + |
| + //private String outputFileName; |
| + private FileOutputStream videoOutFile; |
| + private int outputFileWidth; |
| + private int outputFileHeight; |
| + |
| + public GlVideoFileDrawer( |
| + String outputFile, int outputFileWidth, int outputFileHeight, |
| + EglBase.Context sharedContext, RendererCommon.GlDrawer decoratedDrawer) { |
| + this.decoratedDrawer = decoratedDrawer; |
| + surfaceTextureHelper = SurfaceTextureHelper.create( |
|
magjed_webrtc
2016/08/31 14:10:46
The SurfaceTextureHelper will create a SurfaceText
mandermo
2016/09/16 12:32:30
Done.
|
| + "Stubbed camera conversion", sharedContext); |
| + this.outputFileWidth = outputFileWidth; |
| + this.outputFileHeight = outputFileHeight; |
| + try { |
| + videoOutFile = new FileOutputStream(outputFile); |
| + videoOutFile.write(( |
| + "YUV4MPEG2 C420 W" + outputFileWidth + |
| + " H" + outputFileHeight + " Ip F30:1 A1:1\n").getBytes()); |
| + } |
| + catch (IOException e) { |
| + Logging.d(TAG, "Failed to open file to print video out"); |
| + } |
| + } |
| + |
| + @Override |
| + public void drawOes(int oesTextureId, float[] texMatrix, |
| + int frameWidth, int frameHeight, |
| + int viewportX, int viewportY, int viewportWidth, int viewportHeight) { |
| + if (decoratedDrawer != null) { |
| + decoratedDrawer.drawOes(oesTextureId, texMatrix, frameWidth, frameHeight, |
| + viewportX, viewportY, viewportWidth, viewportHeight); |
| + } |
| + |
| + if (videoOutFile == null) { |
| + return; |
| + } |
| + int frameSize = outputFileWidth*outputFileHeight*3/2; |
| + ByteBuffer frameBytes = ByteBuffer.allocateDirect(frameSize); |
| + |
| + Logging.d(TAG, "Before convert()"); |
| + surfaceTextureHelper.getYuvConverter().convert( |
| + frameBytes, outputFileWidth, outputFileHeight, outputFileWidth, |
| + oesTextureId, texMatrix); |
| + Logging.d(TAG, "After convert()"); |
| + |
| + try { |
| + videoOutFile.write("FRAME\n".getBytes()); |
| + |
| + int width = outputFileWidth; |
| + int height = outputFileHeight; |
| + int stride = width; |
| + byte[] data = frameBytes.array(); |
| + int offset = frameBytes.arrayOffset(); |
| + |
| + Logging.d(TAG, |
| + "arrayOffset(): " + frameBytes.arrayOffset() + |
| + " hasArray: " + frameBytes.hasArray()); |
| + // Write Y |
| + videoOutFile.write(data, offset, width*height); |
| + |
| + // Write U |
| + for (int r = height; r<height*3/2; ++r) { |
| + videoOutFile.write(data, offset + r * stride, stride / 2); |
| + } |
| + |
| + // Write V |
| + for (int r = height; r<height*3/2; ++r) { |
| + videoOutFile.write(data, offset + r * stride + stride / 2, stride / 2); |
| + } |
| + } |
| + catch (IOException e) { |
| + Logging.d(TAG, "Failed to write to file for video out"); |
| + } |
| + } |
| + |
| + @Override |
| + public void drawRgb(int textureId, float[] texMatrix, |
| + int frameWidth, int frameHeight, |
| + int viewportX, int viewportY, int viewportWidth, int viewportHeight) { |
| + if (decoratedDrawer != null) { |
| + decoratedDrawer.drawRgb(textureId, texMatrix, frameWidth, frameHeight, |
| + viewportX, viewportY, viewportWidth, viewportHeight); |
| + } |
| + } |
| + |
| + @Override |
| + public void drawYuv(int[] yuvTextures, float[] texMatrix, int frameWidth, int frameHeight, |
| + int viewportX, int viewportY, int viewportWidth, int viewportHeight) { |
| + if (decoratedDrawer != null) { |
| + decoratedDrawer.drawYuv(yuvTextures, texMatrix, frameWidth, frameHeight, |
| + viewportX, viewportY, viewportWidth, viewportHeight); |
| + } |
| + } |
| + |
| + @Override |
| + public void release() { |
| + if (decoratedDrawer != null) { |
| + decoratedDrawer.release(); |
| + } |
| + } |
| +} |
| + |