| /* |
| * Copyright 2019 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 androidx.annotation.Nullable; |
| |
| /** |
| * Lightweight abstraction for an object that can receive video frames, process them, and pass them |
| * on to another object. This object is also allowed to observe capturer start/stop. |
| */ |
| public interface VideoProcessor extends CapturerObserver { |
| public static class FrameAdaptationParameters { |
| public final int cropX; |
| public final int cropY; |
| public final int cropWidth; |
| public final int cropHeight; |
| public final int scaleWidth; |
| public final int scaleHeight; |
| public final long timestampNs; |
| public final boolean drop; |
| |
| public FrameAdaptationParameters(int cropX, int cropY, int cropWidth, int cropHeight, |
| int scaleWidth, int scaleHeight, long timestampNs, boolean drop) { |
| this.cropX = cropX; |
| this.cropY = cropY; |
| this.cropWidth = cropWidth; |
| this.cropHeight = cropHeight; |
| this.scaleWidth = scaleWidth; |
| this.scaleHeight = scaleHeight; |
| this.timestampNs = timestampNs; |
| this.drop = drop; |
| } |
| } |
| |
| /** |
| * This is a chance to access an unadapted frame. The default implementation applies the |
| * adaptation and forwards the frame to {@link #onFrameCaptured(VideoFrame)}. |
| */ |
| default void onFrameCaptured(VideoFrame frame, FrameAdaptationParameters parameters) { |
| VideoFrame adaptedFrame = applyFrameAdaptationParameters(frame, parameters); |
| if (adaptedFrame != null) { |
| onFrameCaptured(adaptedFrame); |
| adaptedFrame.release(); |
| } |
| } |
| |
| /** |
| * Set the sink that receives the output from this processor. Null can be passed in to unregister |
| * a sink. |
| */ |
| void setSink(@Nullable VideoSink sink); |
| |
| /** |
| * Applies the frame adaptation parameters to a frame. Returns null if the frame is meant to be |
| * dropped. Returns a new frame. The caller is responsible for releasing the returned frame. |
| */ |
| public static @Nullable VideoFrame applyFrameAdaptationParameters( |
| VideoFrame frame, FrameAdaptationParameters parameters) { |
| if (parameters.drop) { |
| return null; |
| } |
| |
| final VideoFrame.Buffer adaptedBuffer = |
| frame.getBuffer().cropAndScale(parameters.cropX, parameters.cropY, parameters.cropWidth, |
| parameters.cropHeight, parameters.scaleWidth, parameters.scaleHeight); |
| return new VideoFrame(adaptedBuffer, frame.getRotation(), parameters.timestampNs); |
| } |
| } |