Add media stream release logging
[WebKit-https.git] / Source / WebCore / platform / mediastream / RealtimeIncomingVideoSource.cpp
1 /*
2  * Copyright (C) 2017-2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer
12  *    in the documentation and/or other materials provided with the
13  *    distribution.
14  * 3. Neither the name of Google Inc. nor the names of its contributors
15  *    may be used to endorse or promote products derived from this
16  *    software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #include "RealtimeIncomingVideoSource.h"
33
34 #if USE(LIBWEBRTC)
35
36 namespace WebCore {
37
38 RealtimeIncomingVideoSource::RealtimeIncomingVideoSource(rtc::scoped_refptr<webrtc::VideoTrackInterface>&& videoTrack, String&& videoTrackId)
39     : RealtimeMediaSource(Type::Video, "remote video"_s, WTFMove(videoTrackId))
40     , m_videoTrack(WTFMove(videoTrack))
41 {
42     notifyMutedChange(!m_videoTrack);
43
44     RealtimeMediaSourceSupportedConstraints constraints;
45     constraints.setSupportsWidth(true);
46     constraints.setSupportsHeight(true);
47     m_currentSettings = RealtimeMediaSourceSettings { };
48     m_currentSettings->setSupportedConstraints(WTFMove(constraints));
49 }
50
51 void RealtimeIncomingVideoSource::startProducingData()
52 {
53     if (m_videoTrack)
54         m_videoTrack->AddOrUpdateSink(this, rtc::VideoSinkWants());
55 }
56
57 void RealtimeIncomingVideoSource::setSourceTrack(rtc::scoped_refptr<webrtc::VideoTrackInterface>&& track)
58 {
59     ASSERT(track);
60
61     if (m_videoTrack && isProducingData())
62         m_videoTrack->RemoveSink(this);
63     m_videoTrack = WTFMove(track);
64     notifyMutedChange(!m_videoTrack);
65     if (isProducingData())
66         m_videoTrack->AddOrUpdateSink(this, rtc::VideoSinkWants());
67 }
68
69 void RealtimeIncomingVideoSource::stopProducingData()
70 {
71     if (m_videoTrack)
72         m_videoTrack->RemoveSink(this);
73 }
74
75 const RealtimeMediaSourceCapabilities& RealtimeIncomingVideoSource::capabilities()
76 {
77     return RealtimeMediaSourceCapabilities::emptyCapabilities();
78 }
79
80 const RealtimeMediaSourceSettings& RealtimeIncomingVideoSource::settings()
81 {
82     if (m_currentSettings)
83         return m_currentSettings.value();
84
85     RealtimeMediaSourceSupportedConstraints constraints;
86     constraints.setSupportsWidth(true);
87     constraints.setSupportsHeight(true);
88
89     RealtimeMediaSourceSettings settings;
90     auto& size = this->size();
91     settings.setWidth(size.width());
92     settings.setHeight(size.height());
93     settings.setSupportedConstraints(constraints);
94
95     m_currentSettings = WTFMove(settings);
96     return m_currentSettings.value();
97 }
98
99 void RealtimeIncomingVideoSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings)
100 {
101     if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height }))
102         m_currentSettings = WTF::nullopt;
103 }
104
105 } // namespace WebCore
106
107 #endif // USE(LIBWEBRTC)