| Index: webrtc/api/android/java/src/org/webrtc/VideoFileRenderer.java
|
| diff --git a/webrtc/api/android/java/src/org/webrtc/VideoFileRenderer.java b/webrtc/api/android/java/src/org/webrtc/VideoFileRenderer.java
|
| deleted file mode 100644
|
| index 1ad3a5936eba8c92f7353796e28728f9466d2c9a..0000000000000000000000000000000000000000
|
| --- a/webrtc/api/android/java/src/org/webrtc/VideoFileRenderer.java
|
| +++ /dev/null
|
| @@ -1,149 +0,0 @@
|
| -/*
|
| - * 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 android.os.Handler;
|
| -import android.os.HandlerThread;
|
| -import java.io.FileOutputStream;
|
| -import java.io.IOException;
|
| -import java.nio.ByteBuffer;
|
| -import java.util.concurrent.CountDownLatch;
|
| -
|
| -/**
|
| - * Can be used to save the video frames to file.
|
| - */
|
| -public class VideoFileRenderer implements VideoRenderer.Callbacks {
|
| - private static final String TAG = "VideoFileRenderer";
|
| -
|
| - private final HandlerThread renderThread;
|
| - private final Object handlerLock = new Object();
|
| - private final Handler renderThreadHandler;
|
| - private final FileOutputStream videoOutFile;
|
| - private final int outputFileWidth;
|
| - private final int outputFileHeight;
|
| - private final int outputFrameSize;
|
| - private final ByteBuffer outputFrameBuffer;
|
| - private EglBase eglBase;
|
| - private YuvConverter yuvConverter;
|
| -
|
| - public VideoFileRenderer(String outputFile, int outputFileWidth, int outputFileHeight,
|
| - final EglBase.Context sharedContext) throws IOException {
|
| - if ((outputFileWidth % 2) == 1 || (outputFileHeight % 2) == 1) {
|
| - throw new IllegalArgumentException("Does not support uneven width or height");
|
| - }
|
| -
|
| - this.outputFileWidth = outputFileWidth;
|
| - this.outputFileHeight = outputFileHeight;
|
| -
|
| - outputFrameSize = outputFileWidth * outputFileHeight * 3 / 2;
|
| - outputFrameBuffer = ByteBuffer.allocateDirect(outputFrameSize);
|
| -
|
| - videoOutFile = new FileOutputStream(outputFile);
|
| - videoOutFile.write(
|
| - ("YUV4MPEG2 C420 W" + outputFileWidth + " H" + outputFileHeight + " Ip F30:1 A1:1\n")
|
| - .getBytes());
|
| -
|
| - renderThread = new HandlerThread(TAG);
|
| - renderThread.start();
|
| - renderThreadHandler = new Handler(renderThread.getLooper());
|
| -
|
| - ThreadUtils.invokeAtFrontUninterruptibly(renderThreadHandler, new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - eglBase = EglBase.create(sharedContext, EglBase.CONFIG_PIXEL_BUFFER);
|
| - eglBase.createDummyPbufferSurface();
|
| - eglBase.makeCurrent();
|
| - yuvConverter = new YuvConverter();
|
| - }
|
| - });
|
| - }
|
| -
|
| - @Override
|
| - public void renderFrame(final VideoRenderer.I420Frame frame) {
|
| - renderThreadHandler.post(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - renderFrameOnRenderThread(frame);
|
| - }
|
| - });
|
| - }
|
| -
|
| - private void renderFrameOnRenderThread(VideoRenderer.I420Frame frame) {
|
| - final float frameAspectRatio = (float) frame.rotatedWidth() / (float) frame.rotatedHeight();
|
| -
|
| - final float[] rotatedSamplingMatrix =
|
| - RendererCommon.rotateTextureMatrix(frame.samplingMatrix, frame.rotationDegree);
|
| - final float[] layoutMatrix = RendererCommon.getLayoutMatrix(
|
| - false, frameAspectRatio, (float) outputFileWidth / outputFileHeight);
|
| - final float[] texMatrix = RendererCommon.multiplyMatrices(rotatedSamplingMatrix, layoutMatrix);
|
| -
|
| - try {
|
| - videoOutFile.write("FRAME\n".getBytes());
|
| - if (!frame.yuvFrame) {
|
| - yuvConverter.convert(outputFrameBuffer, outputFileWidth, outputFileHeight, outputFileWidth,
|
| - frame.textureId, texMatrix);
|
| -
|
| - int stride = outputFileWidth;
|
| - byte[] data = outputFrameBuffer.array();
|
| - int offset = outputFrameBuffer.arrayOffset();
|
| -
|
| - // Write Y
|
| - videoOutFile.write(data, offset, outputFileWidth * outputFileHeight);
|
| -
|
| - // Write U
|
| - for (int r = outputFileHeight; r < outputFileHeight * 3 / 2; ++r) {
|
| - videoOutFile.write(data, offset + r * stride, stride / 2);
|
| - }
|
| -
|
| - // Write V
|
| - for (int r = outputFileHeight; r < outputFileHeight * 3 / 2; ++r) {
|
| - videoOutFile.write(data, offset + r * stride + stride / 2, stride / 2);
|
| - }
|
| - } else {
|
| - nativeI420Scale(frame.yuvPlanes[0], frame.yuvStrides[0], frame.yuvPlanes[1],
|
| - frame.yuvStrides[1], frame.yuvPlanes[2], frame.yuvStrides[2], frame.width, frame.height,
|
| - outputFrameBuffer, outputFileWidth, outputFileHeight);
|
| - videoOutFile.write(
|
| - outputFrameBuffer.array(), outputFrameBuffer.arrayOffset(), outputFrameSize);
|
| - }
|
| - } catch (IOException e) {
|
| - Logging.e(TAG, "Failed to write to file for video out");
|
| - throw new RuntimeException(e);
|
| - } finally {
|
| - VideoRenderer.renderFrameDone(frame);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Release all resources. All already posted frames will be rendered first.
|
| - */
|
| - public void release() {
|
| - final CountDownLatch cleanupBarrier = new CountDownLatch(1);
|
| - renderThreadHandler.post(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - try {
|
| - videoOutFile.close();
|
| - } catch (IOException e) {
|
| - Logging.d(TAG, "Error closing output video file");
|
| - }
|
| - yuvConverter.release();
|
| - eglBase.release();
|
| - renderThread.quit();
|
| - cleanupBarrier.countDown();
|
| - }
|
| - });
|
| - ThreadUtils.awaitUninterruptibly(cleanupBarrier);
|
| - }
|
| -
|
| - public static native void nativeI420Scale(ByteBuffer srcY, int strideY, ByteBuffer srcU,
|
| - int strideU, ByteBuffer srcV, int strideV, int width, int height, ByteBuffer dst,
|
| - int dstWidth, int dstHeight);
|
| -}
|
|
|