From d33d0e8765af96fddcbc14a16022b11929863259 Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Sun, 20 Jun 2021 21:46:52 +0900 Subject: [PATCH] Hide AndroidVideoBuffer class and use factory function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a step to ensure that the Java to C++ Video Frame Buffer conversion respects its types. Bug: webrtc:12602 Change-Id: I1b688b1f421f44474e022b433f9075e75744d86f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/223082 Reviewed-by: Xavier Lepaul‎ Commit-Queue: Xavier Lepaul‎ Cr-Commit-Position: refs/heads/master@{#34487} --- .../src/jni/android_video_track_source.cc | 6 +- .../src/jni/android_video_track_source.h | 2 +- sdk/android/src/jni/video_encoder_wrapper.cc | 1 + sdk/android/src/jni/video_encoder_wrapper.h | 1 - sdk/android/src/jni/video_frame.cc | 55 +++++++++++++++++-- sdk/android/src/jni/video_frame.h | 48 +--------------- 6 files changed, 59 insertions(+), 54 deletions(-) diff --git a/sdk/android/src/jni/android_video_track_source.cc b/sdk/android/src/jni/android_video_track_source.cc index 72cf3955f0..ae9d651d67 100644 --- a/sdk/android/src/jni/android_video_track_source.cc +++ b/sdk/android/src/jni/android_video_track_source.cc @@ -10,11 +10,11 @@ #include "sdk/android/src/jni/android_video_track_source.h" -#include "sdk/android/generated_video_jni/NativeAndroidVideoTrackSource_jni.h" - #include #include "rtc_base/logging.h" +#include "sdk/android/generated_video_jni/NativeAndroidVideoTrackSource_jni.h" +#include "sdk/android/src/jni/video_frame.h" namespace webrtc { namespace jni { @@ -132,7 +132,7 @@ void AndroidVideoTrackSource::OnFrameCaptured( jlong j_timestamp_ns, const JavaRef& j_video_frame_buffer) { rtc::scoped_refptr buffer = - AndroidVideoBuffer::Create(env, j_video_frame_buffer); + JavaToNativeFrameBuffer(env, j_video_frame_buffer); const VideoRotation rotation = jintToVideoRotation(j_rotation); // AdaptedVideoTrackSource handles applying rotation for I420 frames. diff --git a/sdk/android/src/jni/android_video_track_source.h b/sdk/android/src/jni/android_video_track_source.h index eeac48f1e8..625633b90b 100644 --- a/sdk/android/src/jni/android_video_track_source.h +++ b/sdk/android/src/jni/android_video_track_source.h @@ -18,7 +18,7 @@ #include "rtc_base/checks.h" #include "rtc_base/thread.h" #include "rtc_base/timestamp_aligner.h" -#include "sdk/android/src/jni/video_frame.h" +#include "sdk/android/src/jni/jni_helpers.h" namespace webrtc { namespace jni { diff --git a/sdk/android/src/jni/video_encoder_wrapper.cc b/sdk/android/src/jni/video_encoder_wrapper.cc index 4e6d764457..fe7508709f 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.cc +++ b/sdk/android/src/jni/video_encoder_wrapper.cc @@ -27,6 +27,7 @@ #include "sdk/android/native_api/jni/java_types.h" #include "sdk/android/src/jni/encoded_image.h" #include "sdk/android/src/jni/video_codec_status.h" +#include "sdk/android/src/jni/video_frame.h" namespace webrtc { namespace jni { diff --git a/sdk/android/src/jni/video_encoder_wrapper.h b/sdk/android/src/jni/video_encoder_wrapper.h index 1a42b05bc6..ae45004324 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.h +++ b/sdk/android/src/jni/video_encoder_wrapper.h @@ -25,7 +25,6 @@ #include "modules/video_coding/svc/scalable_video_controller_no_layering.h" #include "rtc_base/synchronization/mutex.h" #include "sdk/android/src/jni/jni_helpers.h" -#include "sdk/android/src/jni/video_frame.h" namespace webrtc { namespace jni { diff --git a/sdk/android/src/jni/video_frame.cc b/sdk/android/src/jni/video_frame.cc index 98728032e8..e27a5c841b 100644 --- a/sdk/android/src/jni/video_frame.cc +++ b/sdk/android/src/jni/video_frame.cc @@ -10,12 +10,8 @@ #include "sdk/android/src/jni/video_frame.h" -#include - #include "api/scoped_refptr.h" #include "common_video/include/video_frame_buffer.h" -#include "rtc_base/checks.h" -#include "rtc_base/logging.h" #include "rtc_base/ref_counted_object.h" #include "rtc_base/time_utils.h" #include "sdk/android/generated_video_jni/VideoFrame_jni.h" @@ -27,6 +23,51 @@ namespace jni { namespace { +class AndroidVideoBuffer : public VideoFrameBuffer { + public: + // Creates a native VideoFrameBuffer from a Java VideoFrame.Buffer. + static rtc::scoped_refptr Create( + JNIEnv* jni, + const JavaRef& j_video_frame_buffer); + + // Similar to the Create() above, but adopts and takes ownership of the Java + // VideoFrame.Buffer. I.e. retain() will not be called, but release() will be + // called when the returned AndroidVideoBuffer is destroyed. + static rtc::scoped_refptr Adopt( + JNIEnv* jni, + const JavaRef& j_video_frame_buffer); + + ~AndroidVideoBuffer() override; + + const ScopedJavaGlobalRef& video_frame_buffer() const; + + // Crops a region defined by |crop_x|, |crop_y|, |crop_width| and + // |crop_height|. Scales it to size |scale_width| x |scale_height|. + rtc::scoped_refptr CropAndScale(int crop_x, + int crop_y, + int crop_width, + int crop_height, + int scale_width, + int scale_height) override; + + protected: + // Should not be called directly. Adopts the Java VideoFrame.Buffer. Use + // Create() or Adopt() instead for clarity. + AndroidVideoBuffer(JNIEnv* jni, const JavaRef& j_video_frame_buffer); + + private: + Type type() const override; + int width() const override; + int height() const override; + + rtc::scoped_refptr ToI420() override; + + const int width_; + const int height_; + // Holds a VideoFrame.Buffer. + const ScopedJavaGlobalRef j_video_frame_buffer_; +}; + class AndroidVideoI420Buffer : public I420BufferInterface { public: // Adopts and takes ownership of the Java VideoFrame.Buffer. I.e. retain() @@ -189,6 +230,12 @@ rtc::scoped_refptr AndroidVideoBuffer::ToI420() { return AndroidVideoI420Buffer::Adopt(jni, width_, height_, j_i420_buffer); } +rtc::scoped_refptr JavaToNativeFrameBuffer( + JNIEnv* jni, + const JavaRef& j_video_frame_buffer) { + return AndroidVideoBuffer::Create(jni, j_video_frame_buffer); +} + VideoFrame JavaToNativeFrame(JNIEnv* jni, const JavaRef& j_video_frame, uint32_t timestamp_rtp) { diff --git a/sdk/android/src/jni/video_frame.h b/sdk/android/src/jni/video_frame.h index d1e463bba2..9b916de40b 100644 --- a/sdk/android/src/jni/video_frame.h +++ b/sdk/android/src/jni/video_frame.h @@ -15,56 +15,14 @@ #include "api/video/video_frame.h" #include "api/video/video_frame_buffer.h" -#include "api/video/video_rotation.h" #include "sdk/android/src/jni/jni_helpers.h" namespace webrtc { namespace jni { -class AndroidVideoBuffer : public VideoFrameBuffer { - public: - // Creates a native VideoFrameBuffer from a Java VideoFrame.Buffer. - static rtc::scoped_refptr Create( - JNIEnv* jni, - const JavaRef& j_video_frame_buffer); - - // Similar to the Create() above, but adopts and takes ownership of the Java - // VideoFrame.Buffer. I.e. retain() will not be called, but release() will be - // called when the returned AndroidVideoBuffer is destroyed. - static rtc::scoped_refptr Adopt( - JNIEnv* jni, - const JavaRef& j_video_frame_buffer); - - ~AndroidVideoBuffer() override; - - const ScopedJavaGlobalRef& video_frame_buffer() const; - - // Crops a region defined by |crop_x|, |crop_y|, |crop_width| and - // |crop_height|. Scales it to size |scale_width| x |scale_height|. - rtc::scoped_refptr CropAndScale(int crop_x, - int crop_y, - int crop_width, - int crop_height, - int scale_width, - int scale_height) override; - - protected: - // Should not be called directly. Adopts the Java VideoFrame.Buffer. Use - // Create() or Adopt() instead for clarity. - AndroidVideoBuffer(JNIEnv* jni, const JavaRef& j_video_frame_buffer); - - private: - Type type() const override; - int width() const override; - int height() const override; - - rtc::scoped_refptr ToI420() override; - - const int width_; - const int height_; - // Holds a VideoFrame.Buffer. - const ScopedJavaGlobalRef j_video_frame_buffer_; -}; +rtc::scoped_refptr JavaToNativeFrameBuffer( + JNIEnv* jni, + const JavaRef& j_video_frame_buffer); VideoFrame JavaToNativeFrame(JNIEnv* jni, const JavaRef& j_video_frame,