blob: 1f4bc4dead8788d2185060b191d957dee7c44771 [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
Steve Anton10542f22019-01-11 09:11:00 -080013#include "sdk/android/src/jni/android_video_track_source.h"
14#include "sdk/android/src/jni/native_capturer_observer.h"
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020015
16namespace webrtc {
17
18namespace {
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.
24class JavaVideoTrackSourceImpl : public JavaVideoTrackSourceInterface {
25 public:
26 JavaVideoTrackSourceImpl(JNIEnv* env,
27 rtc::Thread* signaling_thread,
Magnus Jedvert95140712018-11-15 12:07:32 +010028 bool is_screencast,
29 bool align_timestamps)
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020030 : android_video_track_source_(
31 new rtc::RefCountedObject<jni::AndroidVideoTrackSource>(
32 signaling_thread,
33 env,
Magnus Jedvert95140712018-11-15 12:07:32 +010034 is_screencast,
35 align_timestamps)),
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020036 native_capturer_observer_(jni::CreateJavaNativeCapturerObserver(
37 env,
38 android_video_track_source_)) {}
39
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_.
46 void RegisterObserver(ObserverInterface* observer) override {
47 android_video_track_source_->RegisterObserver(observer);
48 }
49
50 void UnregisterObserver(ObserverInterface* observer) override {
51 android_video_track_source_->UnregisterObserver(observer);
52 }
53
54 SourceState state() const override {
55 return android_video_track_source_->state();
56 }
57
58 bool remote() const override { return android_video_track_source_->remote(); }
59
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
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
75 bool is_screencast() const override {
76 return android_video_track_source_->is_screencast();
77 }
78
Danil Chapovalov196100e2018-06-21 10:17:24 +020079 absl::optional<bool> needs_denoising() const override {
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +020080 return android_video_track_source_->needs_denoising();
81 }
82
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:
Markus Handell6efc14b2020-05-05 20:11:13 +020092 // Encoded sinks not implemented for JavaVideoTrackSourceImpl.
93 bool SupportsEncodedOutput() const override { return false; }
94 void GenerateKeyFrame() override {}
95 void AddEncodedSink(
96 rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>* sink) override {}
97 void RemoveEncodedSink(
98 rtc::VideoSinkInterface<webrtc::RecordableEncodedFrame>* sink) override {}
99
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +0200100 rtc::scoped_refptr<jni::AndroidVideoTrackSource> android_video_track_source_;
101 ScopedJavaGlobalRef<jobject> native_capturer_observer_;
102};
103
104} // namespace
105
106rtc::scoped_refptr<JavaVideoTrackSourceInterface> CreateJavaVideoSource(
107 JNIEnv* jni,
108 rtc::Thread* signaling_thread,
Magnus Jedvert95140712018-11-15 12:07:32 +0100109 bool is_screencast,
110 bool align_timestamps) {
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +0200111 return new rtc::RefCountedObject<JavaVideoTrackSourceImpl>(
Magnus Jedvert95140712018-11-15 12:07:32 +0100112 jni, signaling_thread, is_screencast, align_timestamps);
Sami Kalliomäkiff1de0a2018-05-16 12:49:47 +0200113}
114
115} // namespace webrtc