blob: 56a56722eba6052d8de929c57a4c08e3e047d795 [file] [log] [blame]
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +02001/*
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
Steve Anton10542f22019-01-11 09:11:00 -080011#include "sdk/android/native_api/video/video_source.h"
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020012
Niels Möllerf4e3e2b2021-02-02 11:37:39 +010013#include "rtc_base/ref_counted_object.h"
Steve Anton10542f22019-01-11 09:11:00 -080014#include "sdk/android/src/jni/android_video_track_source.h"
15#include "sdk/android/src/jni/native_capturer_observer.h"
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020016
17namespace webrtc {
18
19namespace {
20
21// Hides full jni::AndroidVideoTrackSource interface and provides an instance of
22// NativeCapturerObserver associated with the video source. Does not extend
23// AndroidVideoTrackSource to avoid diamond inheritance on
24// VideoTrackSourceInterface.
25class JavaVideoTrackSourceImpl : public JavaVideoTrackSourceInterface {
26 public:
27 JavaVideoTrackSourceImpl(JNIEnv* env,
28 rtc::Thread* signaling_thread,
Magnus Jedvert95140712018-11-15 12:07:32 +010029 bool is_screencast,
30 bool align_timestamps)
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020031 : android_video_track_source_(
32 new rtc::RefCountedObject<jni::AndroidVideoTrackSource>(
33 signaling_thread,
34 env,
Magnus Jedvert95140712018-11-15 12:07:32 +010035 is_screencast,
36 align_timestamps)),
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020037 native_capturer_observer_(jni::CreateJavaNativeCapturerObserver(
38 env,
39 android_video_track_source_)) {}
40
41 ScopedJavaLocalRef<jobject> GetJavaVideoCapturerObserver(
42 JNIEnv* env) override {
43 return ScopedJavaLocalRef<jobject>(env, native_capturer_observer_);
44 }
45
46 // Delegate VideoTrackSourceInterface methods to android_video_track_source_.
47 void RegisterObserver(ObserverInterface* observer) override {
48 android_video_track_source_->RegisterObserver(observer);
49 }
50
51 void UnregisterObserver(ObserverInterface* observer) override {
52 android_video_track_source_->UnregisterObserver(observer);
53 }
54
55 SourceState state() const override {
56 return android_video_track_source_->state();
57 }
58
59 bool remote() const override { return android_video_track_source_->remote(); }
60
61 void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
62 const rtc::VideoSinkWants& wants) override {
63 // The method is defined private in the implementation so we have to access
64 // it through the interface...
65 static_cast<VideoTrackSourceInterface*>(android_video_track_source_.get())
66 ->AddOrUpdateSink(sink, wants);
67 }
68
69 void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override {
70 // The method is defined private in the implementation so we have to access
71 // it through the interface...
72 static_cast<VideoTrackSourceInterface*>(android_video_track_source_.get())
73 ->RemoveSink(sink);
74 }
75
76 bool is_screencast() const override {
77 return android_video_track_source_->is_screencast();
78 }
79
Danil Chapovalov196100e2018-06-21 10:17:24 +020080 absl::optional<bool> needs_denoising() const override {
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020081 return android_video_track_source_->needs_denoising();
82 }
83
84 bool GetStats(Stats* stats) override {
85 // The method is defined private in the implementation so we have to access
86 // it through the interface...
87 return static_cast<VideoTrackSourceInterface*>(
88 android_video_track_source_.get())
89 ->GetStats(stats);
90 }
91
92 private:
Markus Handell6efc14b2020-05-05 20:11:13 +020093 // Encoded sinks not implemented for JavaVideoTrackSourceImpl.
94 bool SupportsEncodedOutput() const override { return false; }
95 void GenerateKeyFrame() override {}
96 void AddEncodedSink(
97 rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>* sink) override {}
98 void RemoveEncodedSink(
99 rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>* sink) override {}
100
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +0200101 rtc::scoped_refptr<jni::AndroidVideoTrackSource> android_video_track_source_;
102 ScopedJavaGlobalRef<jobject> native_capturer_observer_;
103};
104
105} // namespace
106
107rtc::scoped_refptr<JavaVideoTrackSourceInterface> CreateJavaVideoSource(
108 JNIEnv* jni,
109 rtc::Thread* signaling_thread,
Magnus Jedvert95140712018-11-15 12:07:32 +0100110 bool is_screencast,
111 bool align_timestamps) {
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +0200112 return new rtc::RefCountedObject<JavaVideoTrackSourceImpl>(
Magnus Jedvert95140712018-11-15 12:07:32 +0100113 jni, signaling_thread, is_screencast, align_timestamps);
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +0200114}
115
116} // namespace webrtc