blob: 22c75552fb1893a13a8386bdb469a418ca614f7b [file] [log] [blame]
perkj@webrtc.org83bc7212015-02-11 11:26:56 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
perkj@webrtc.org83bc7212015-02-11 11:26:56 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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.
perkj@webrtc.org83bc7212015-02-11 11:26:56 +00009 */
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000010
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/androidvideocapturer.h"
12
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
14
Sami Kalliomaki9b0dc622016-07-01 09:37:42 +020015#include "webrtc/api/java/jni/native_handle_impl.h"
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000016#include "webrtc/base/common.h"
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000017#include "webrtc/base/timeutils.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010018#include "webrtc/media/engine/webrtcvideoframe.h"
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000019
20namespace webrtc {
21
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000022AndroidVideoCapturer::AndroidVideoCapturer(
Per33544192015-04-02 12:30:51 +020023 const rtc::scoped_refptr<AndroidVideoCapturerDelegate>& delegate)
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000024 : running_(false),
Magnus Jedvert77ed80a2016-06-30 10:05:33 +020025 delegate_(delegate) {
Per33544192015-04-02 12:30:51 +020026 thread_checker_.DetachFromThread();
Magnus Jedvert5199c742016-02-18 13:09:54 +010027 SetSupportedFormats(delegate_->GetSupportedFormats());
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000028}
29
30AndroidVideoCapturer::~AndroidVideoCapturer() {
henrikg91d6ede2015-09-17 00:24:34 -070031 RTC_CHECK(!running_);
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000032}
33
34cricket::CaptureState AndroidVideoCapturer::Start(
35 const cricket::VideoFormat& capture_format) {
henrikg91d6ede2015-09-17 00:24:34 -070036 RTC_CHECK(thread_checker_.CalledOnValidThread());
37 RTC_CHECK(!running_);
Magnus Jedvert6ec1f922015-08-28 11:40:59 +020038 const int fps = cricket::VideoFormat::IntervalToFps(capture_format.interval);
39 LOG(LS_INFO) << " AndroidVideoCapturer::Start " << capture_format.width << "x"
40 << capture_format.height << "@" << fps;
Alex Glaznev2f5be9a2015-05-19 10:56:32 -070041
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000042 running_ = true;
Magnus Jedvert6ec1f922015-08-28 11:40:59 +020043 delegate_->Start(capture_format.width, capture_format.height, fps, this);
perkj@webrtc.org8f605e82015-02-17 13:53:56 +000044 SetCaptureFormat(&capture_format);
Magnus Jedvert77ed80a2016-06-30 10:05:33 +020045 return cricket::CS_STARTING;
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000046}
47
48void AndroidVideoCapturer::Stop() {
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000049 LOG(LS_INFO) << " AndroidVideoCapturer::Stop ";
henrikg91d6ede2015-09-17 00:24:34 -070050 RTC_CHECK(thread_checker_.CalledOnValidThread());
51 RTC_CHECK(running_);
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000052 running_ = false;
53 SetCaptureFormat(NULL);
54
55 delegate_->Stop();
Magnus Jedvert77ed80a2016-06-30 10:05:33 +020056 SetCaptureState(cricket::CS_STOPPED);
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000057}
58
59bool AndroidVideoCapturer::IsRunning() {
henrikg91d6ede2015-09-17 00:24:34 -070060 RTC_CHECK(thread_checker_.CalledOnValidThread());
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000061 return running_;
62}
63
Peter Boström0c4e06b2015-10-07 12:23:21 +020064bool AndroidVideoCapturer::GetPreferredFourccs(std::vector<uint32_t>* fourccs) {
henrikg91d6ede2015-09-17 00:24:34 -070065 RTC_CHECK(thread_checker_.CalledOnValidThread());
perkj@webrtc.org2ad3bb12015-02-23 11:14:57 +000066 fourccs->push_back(cricket::FOURCC_YV12);
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000067 return true;
68}
69
70void AndroidVideoCapturer::OnCapturerStarted(bool success) {
henrikg91d6ede2015-09-17 00:24:34 -070071 RTC_CHECK(thread_checker_.CalledOnValidThread());
Magnus Jedvert77ed80a2016-06-30 10:05:33 +020072 const cricket::CaptureState new_state =
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000073 success ? cricket::CS_RUNNING : cricket::CS_FAILED;
Perfb45d172016-02-29 12:07:35 +010074 SetCaptureState(new_state);
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000075}
76
Åsa Persson2b679252015-06-15 09:53:05 +020077void AndroidVideoCapturer::OnOutputFormatRequest(
78 int width, int height, int fps) {
henrikg91d6ede2015-09-17 00:24:34 -070079 RTC_CHECK(thread_checker_.CalledOnValidThread());
Per766ad3b2016-04-05 15:23:49 +020080 cricket::VideoFormat format(width, height,
81 cricket::VideoFormat::FpsToInterval(fps), 0);
Åsa Persson2b679252015-06-15 09:53:05 +020082 video_adapter()->OnOutputFormatRequest(format);
83}
84
Magnus Jedvert6ec1f922015-08-28 11:40:59 +020085bool AndroidVideoCapturer::GetBestCaptureFormat(
86 const cricket::VideoFormat& desired,
87 cricket::VideoFormat* best_format) {
Magnus Jedvert5e7834e2016-02-12 17:05:29 +010088 // Delegate this choice to VideoCapturer.startCapture().
Magnus Jedvert6ec1f922015-08-28 11:40:59 +020089 *best_format = desired;
90 return true;
91}
92
perkj@webrtc.org83bc7212015-02-11 11:26:56 +000093} // namespace webrtc