1 /*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "sdk/android/native_api/video/video_source.h"
12
13 #include "sdk/android/src/jni/android_video_track_source.h"
14 #include "sdk/android/src/jni/native_capturer_observer.h"
15
16 namespace webrtc {
17
18 namespace {
19
20 // Hides full jni::AndroidVideoTrackSource interface and provides an instance of
21 // NativeCapturerObserver associated with the video source. Does not extend
22 // AndroidVideoTrackSource to avoid diamond inheritance on
23 // VideoTrackSourceInterface.
24 class JavaVideoTrackSourceImpl : public JavaVideoTrackSourceInterface {
25 public:
JavaVideoTrackSourceImpl(JNIEnv * env,rtc::Thread * signaling_thread,bool is_screencast,bool align_timestamps)26 JavaVideoTrackSourceImpl(JNIEnv* env,
27 rtc::Thread* signaling_thread,
28 bool is_screencast,
29 bool align_timestamps)
30 : android_video_track_source_(
31 rtc::make_ref_counted<jni::AndroidVideoTrackSource>(
32 signaling_thread,
33 env,
34 is_screencast,
35 align_timestamps)),
36 native_capturer_observer_(jni::CreateJavaNativeCapturerObserver(
37 env,
38 android_video_track_source_)) {}
39
GetJavaVideoCapturerObserver(JNIEnv * env)40 ScopedJavaLocalRef<jobject> GetJavaVideoCapturerObserver(
41 JNIEnv* env) override {
42 return ScopedJavaLocalRef<jobject>(env, native_capturer_observer_);
43 }
44
45 // Delegate VideoTrackSourceInterface methods to android_video_track_source_.
RegisterObserver(ObserverInterface * observer)46 void RegisterObserver(ObserverInterface* observer) override {
47 android_video_track_source_->RegisterObserver(observer);
48 }
49
UnregisterObserver(ObserverInterface * observer)50 void UnregisterObserver(ObserverInterface* observer) override {
51 android_video_track_source_->UnregisterObserver(observer);
52 }
53
state() const54 SourceState state() const override {
55 return android_video_track_source_->state();
56 }
57
remote() const58 bool remote() const override { return android_video_track_source_->remote(); }
59
AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame> * sink,const rtc::VideoSinkWants & wants)60 void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
61 const rtc::VideoSinkWants& wants) override {
62 // The method is defined private in the implementation so we have to access
63 // it through the interface...
64 static_cast<VideoTrackSourceInterface*>(android_video_track_source_.get())
65 ->AddOrUpdateSink(sink, wants);
66 }
67
RemoveSink(rtc::VideoSinkInterface<VideoFrame> * sink)68 void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override {
69 // The method is defined private in the implementation so we have to access
70 // it through the interface...
71 static_cast<VideoTrackSourceInterface*>(android_video_track_source_.get())
72 ->RemoveSink(sink);
73 }
74
is_screencast() const75 bool is_screencast() const override {
76 return android_video_track_source_->is_screencast();
77 }
78
needs_denoising() const79 absl::optional<bool> needs_denoising() const override {
80 return android_video_track_source_->needs_denoising();
81 }
82
GetStats(Stats * stats)83 bool GetStats(Stats* stats) override {
84 // The method is defined private in the implementation so we have to access
85 // it through the interface...
86 return static_cast<VideoTrackSourceInterface*>(
87 android_video_track_source_.get())
88 ->GetStats(stats);
89 }
90
91 private:
92 // Encoded sinks not implemented for JavaVideoTrackSourceImpl.
SupportsEncodedOutput() const93 bool SupportsEncodedOutput() const override { return false; }
GenerateKeyFrame()94 void GenerateKeyFrame() override {}
AddEncodedSink(rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame> * sink)95 void AddEncodedSink(
96 rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>* sink) override {}
RemoveEncodedSink(rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame> * sink)97 void RemoveEncodedSink(
98 rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>* sink) override {}
99
100 rtc::scoped_refptr<jni::AndroidVideoTrackSource> android_video_track_source_;
101 ScopedJavaGlobalRef<jobject> native_capturer_observer_;
102 };
103
104 } // namespace
105
CreateJavaVideoSource(JNIEnv * jni,rtc::Thread * signaling_thread,bool is_screencast,bool align_timestamps)106 rtc::scoped_refptr<JavaVideoTrackSourceInterface> CreateJavaVideoSource(
107 JNIEnv* jni,
108 rtc::Thread* signaling_thread,
109 bool is_screencast,
110 bool align_timestamps) {
111 return rtc::make_ref_counted<JavaVideoTrackSourceImpl>(
112 jni, signaling_thread, is_screencast, align_timestamps);
113 }
114
115 } // namespace webrtc
116