Canonicals.h (6236B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef MEDIA_WEBRTC_SIGNALING_GTEST_CANONICALS_H_ 8 #define MEDIA_WEBRTC_SIGNALING_GTEST_CANONICALS_H_ 9 10 #include "mozilla/gtest/WaitFor.h" 11 #include "MediaConduitControl.h" 12 #include "MediaPipeline.h" 13 14 namespace mozilla { 15 16 #define INIT_CANONICAL(name, val) \ 17 name(AbstractThread::MainThread(), val, "ConcreteCanonicals::" #name) 18 class ConcreteCanonicals { 19 public: 20 ConcreteCanonicals() 21 : INIT_CANONICAL(mReceiving, false), 22 INIT_CANONICAL(mTransmitting, false), 23 INIT_CANONICAL(mLocalSsrcs, Ssrcs()), 24 INIT_CANONICAL(mLocalVideoRtxSsrcs, Ssrcs()), 25 INIT_CANONICAL(mLocalCname, std::string()), 26 INIT_CANONICAL(mMid, std::string()), 27 INIT_CANONICAL(mSyncGroup, std::string()), 28 INIT_CANONICAL(mLocalSendRtpExtensions, RtpExtList()), 29 INIT_CANONICAL(mLocalRecvRtpExtensions, RtpExtList()), 30 INIT_CANONICAL(mRemoteSsrc, 0), 31 INIT_CANONICAL(mRemoteVideoRtxSsrc, 0), 32 INIT_CANONICAL(mFrameTransformerProxySend, nullptr), 33 INIT_CANONICAL(mFrameTransformerProxyRecv, nullptr), 34 INIT_CANONICAL(mAudioRecvCodecs, std::vector<AudioCodecConfig>()), 35 INIT_CANONICAL(mAudioSendCodec, Nothing()), 36 INIT_CANONICAL(mVideoRecvCodecs, std::vector<VideoCodecConfig>()), 37 INIT_CANONICAL(mVideoSendCodec, Nothing()), 38 INIT_CANONICAL(mVideoRecvRtpRtcpConfig, Nothing()), 39 INIT_CANONICAL(mVideoSendRtpRtcpConfig, Nothing()), 40 INIT_CANONICAL(mVideoCodecMode, webrtc::VideoCodecMode::kRealtimeVideo), 41 INIT_CANONICAL(mVideoDegradationPreference, 42 webrtc::DegradationPreference::DISABLED) {} 43 44 Canonical<bool> mReceiving; 45 Canonical<bool> mTransmitting; 46 Canonical<Ssrcs> mLocalSsrcs; 47 Canonical<Ssrcs> mLocalVideoRtxSsrcs; 48 Canonical<std::string> mLocalCname; 49 Canonical<std::string> mMid; 50 Canonical<std::string> mSyncGroup; 51 Canonical<RtpExtList> mLocalSendRtpExtensions; 52 Canonical<RtpExtList> mLocalRecvRtpExtensions; 53 Canonical<Ssrc> mRemoteSsrc; 54 Canonical<Ssrc> mRemoteVideoRtxSsrc; 55 Canonical<RefPtr<FrameTransformerProxy>> mFrameTransformerProxySend; 56 Canonical<RefPtr<FrameTransformerProxy>> mFrameTransformerProxyRecv; 57 58 Canonical<std::vector<AudioCodecConfig>> mAudioRecvCodecs; 59 Canonical<Maybe<AudioCodecConfig>> mAudioSendCodec; 60 MediaEventProducer<DtmfEvent> mDtmfEvent; 61 62 Canonical<std::vector<VideoCodecConfig>> mVideoRecvCodecs; 63 Canonical<Maybe<VideoCodecConfig>> mVideoSendCodec; 64 Canonical<Maybe<RtpRtcpConfig>> mVideoRecvRtpRtcpConfig; 65 Canonical<Maybe<RtpRtcpConfig>> mVideoSendRtpRtcpConfig; 66 Canonical<webrtc::VideoCodecMode> mVideoCodecMode; 67 Canonical<webrtc::DegradationPreference> mVideoDegradationPreference; 68 }; 69 #undef INIT_CANONICAL 70 71 class ConcreteControl : public AudioConduitControlInterface, 72 public VideoConduitControlInterface, 73 public MediaPipelineReceiveControlInterface, 74 public MediaPipelineTransmitControlInterface, 75 private ConcreteCanonicals { 76 private: 77 RefPtr<nsISerialEventTarget> mTarget; 78 79 public: 80 explicit ConcreteControl(RefPtr<nsISerialEventTarget> aTarget) 81 : mTarget(std::move(aTarget)) {} 82 83 template <typename Function> 84 void Update(Function aFunction) { 85 mTarget->Dispatch(NS_NewRunnableFunction( 86 __func__, [&] { aFunction(*static_cast<ConcreteCanonicals*>(this)); })); 87 WaitForMirrors(mTarget); 88 } 89 90 // MediaConduitControlInterface 91 // -- MediaPipelineReceiveControlInterface 92 Canonical<bool>& CanonicalReceiving() override { return mReceiving; } 93 // -- MediaPipelineTransmitControlInterface 94 Canonical<bool>& CanonicalTransmitting() override { return mTransmitting; } 95 Canonical<Ssrcs>& CanonicalLocalSsrcs() override { return mLocalSsrcs; } 96 Canonical<Ssrcs>& CanonicalLocalVideoRtxSsrcs() override { 97 return mLocalVideoRtxSsrcs; 98 } 99 Canonical<std::string>& CanonicalLocalCname() override { return mLocalCname; } 100 Canonical<std::string>& CanonicalMid() override { return mMid; } 101 Canonical<Ssrc>& CanonicalRemoteSsrc() override { return mRemoteSsrc; } 102 Canonical<Ssrc>& CanonicalRemoteVideoRtxSsrc() override { 103 return mRemoteVideoRtxSsrc; 104 } 105 Canonical<std::string>& CanonicalSyncGroup() override { return mSyncGroup; } 106 Canonical<RtpExtList>& CanonicalLocalRecvRtpExtensions() override { 107 return mLocalRecvRtpExtensions; 108 } 109 Canonical<RtpExtList>& CanonicalLocalSendRtpExtensions() override { 110 return mLocalSendRtpExtensions; 111 } 112 Canonical<RefPtr<FrameTransformerProxy>>& CanonicalFrameTransformerProxySend() 113 override { 114 return mFrameTransformerProxySend; 115 } 116 Canonical<RefPtr<FrameTransformerProxy>>& CanonicalFrameTransformerProxyRecv() 117 override { 118 return mFrameTransformerProxyRecv; 119 } 120 121 // AudioConduitControlInterface 122 Canonical<Maybe<AudioCodecConfig>>& CanonicalAudioSendCodec() override { 123 return mAudioSendCodec; 124 } 125 Canonical<std::vector<AudioCodecConfig>>& CanonicalAudioRecvCodecs() 126 override { 127 return mAudioRecvCodecs; 128 } 129 MediaEventSource<DtmfEvent>& OnDtmfEvent() override { return mDtmfEvent; } 130 131 // VideoConduitControlInterface 132 Canonical<Maybe<VideoCodecConfig>>& CanonicalVideoSendCodec() override { 133 return mVideoSendCodec; 134 } 135 Canonical<Maybe<RtpRtcpConfig>>& CanonicalVideoSendRtpRtcpConfig() override { 136 return mVideoSendRtpRtcpConfig; 137 } 138 Canonical<std::vector<VideoCodecConfig>>& CanonicalVideoRecvCodecs() 139 override { 140 return mVideoRecvCodecs; 141 } 142 Canonical<Maybe<RtpRtcpConfig>>& CanonicalVideoRecvRtpRtcpConfig() override { 143 return mVideoRecvRtpRtcpConfig; 144 } 145 Canonical<webrtc::VideoCodecMode>& CanonicalVideoCodecMode() override { 146 return mVideoCodecMode; 147 } 148 Canonical<webrtc::DegradationPreference>& 149 CanonicalVideoDegradationPreference() override { 150 return mVideoDegradationPreference; 151 } 152 }; 153 154 } // namespace mozilla 155 156 #endif