FrameTransformer.cpp (2613B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 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 5 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ 6 7 #include "libwebrtcglue/FrameTransformer.h" 8 9 #include <stdint.h> 10 11 #include <memory> 12 #include <utility> 13 14 #include "api/frame_transformer_interface.h" 15 #include "api/scoped_refptr.h" 16 #include "libwebrtcglue/FrameTransformerProxy.h" 17 #include "mozilla/Mutex.h" 18 19 namespace mozilla { 20 21 FrameTransformer::FrameTransformer(bool aVideo) 22 : webrtc::FrameTransformerInterface(), 23 mVideo(aVideo), 24 mCallbacksMutex("FrameTransformer::mCallbacksMutex"), 25 mProxyMutex("FrameTransformer::mProxyMutex") {} 26 27 FrameTransformer::~FrameTransformer() { 28 if (mProxy) { 29 mProxy->SetLibwebrtcTransformer(nullptr); 30 } 31 } 32 33 void FrameTransformer::Transform( 34 std::unique_ptr<webrtc::TransformableFrameInterface> aFrame) { 35 MutexAutoLock lock(mProxyMutex); 36 if (mProxy) { 37 mProxy->Transform(std::move(aFrame)); 38 return; 39 } 40 41 // No transformer, just passthrough 42 OnTransformedFrame(std::move(aFrame)); 43 } 44 45 void FrameTransformer::RegisterTransformedFrameCallback( 46 webrtc::scoped_refptr<webrtc::TransformedFrameCallback> aCallback) { 47 MutexAutoLock lock(mCallbacksMutex); 48 mCallback = aCallback; 49 } 50 51 void FrameTransformer::UnregisterTransformedFrameCallback() { 52 MutexAutoLock lock(mCallbacksMutex); 53 mCallback = nullptr; 54 } 55 56 void FrameTransformer::RegisterTransformedFrameSinkCallback( 57 webrtc::scoped_refptr<webrtc::TransformedFrameCallback> aCallback, 58 uint32_t aSsrc) { 59 MutexAutoLock lock(mCallbacksMutex); 60 mCallbacksBySsrc[aSsrc] = aCallback; 61 } 62 63 void FrameTransformer::UnregisterTransformedFrameSinkCallback(uint32_t aSsrc) { 64 MutexAutoLock lock(mCallbacksMutex); 65 mCallbacksBySsrc.erase(aSsrc); 66 } 67 68 void FrameTransformer::OnTransformedFrame( 69 std::unique_ptr<webrtc::TransformableFrameInterface> aFrame) { 70 MutexAutoLock lock(mCallbacksMutex); 71 if (mCallback) { 72 mCallback->OnTransformedFrame(std::move(aFrame)); 73 } else if (auto it = mCallbacksBySsrc.find(aFrame->GetSsrc()); 74 it != mCallbacksBySsrc.end()) { 75 it->second->OnTransformedFrame(std::move(aFrame)); 76 } 77 } 78 79 void FrameTransformer::SetProxy(FrameTransformerProxy* aProxy) { 80 MutexAutoLock lock(mProxyMutex); 81 if (mProxy) { 82 mProxy->SetLibwebrtcTransformer(nullptr); 83 } 84 mProxy = aProxy; 85 if (mProxy) { 86 mProxy->SetLibwebrtcTransformer(this); 87 } 88 } 89 90 } // namespace mozilla