Skip to content

Commit 432a28b

Browse files
authored
Fix set frame transformer (#125)
1 parent 7534c15 commit 432a28b

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

audio/channel_receive.cc

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -917,24 +917,29 @@ void ChannelReceive::SetAssociatedSendChannel(
917917
void ChannelReceive::SetDepacketizerToDecoderFrameTransformer(
918918
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
919919
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
920-
if (!frame_transformer) {
921-
RTC_DCHECK_NOTREACHED() << "Not setting the transformer?";
922-
return;
923-
}
924-
if(frame_transformer_delegate_) {
920+
921+
// Check if a reset is needed
922+
if (frame_transformer_delegate_ &&
923+
frame_transformer_delegate_->FrameTransformer() != frame_transformer) {
925924
frame_transformer_delegate_->Reset();
926-
}
927-
if (frame_transformer_delegate_) {
928-
// Depending on when the channel is created, the transformer might be set
929-
// twice. Don't replace the delegate if it was already initialized.
930-
// TODO(crbug.com/webrtc/15674): Prevent multiple calls during
931-
// reconfiguration.
932-
RTC_CHECK_EQ(frame_transformer_delegate_->FrameTransformer(),
933-
frame_transformer);
934-
return;
925+
frame_transformer_delegate_ = nullptr;
926+
RTC_DLOG(LS_INFO) << "Frame transformer delegate has been reset.";
935927
}
936928

937-
InitFrameTransformerDelegate(std::move(frame_transformer));
929+
// Initialize the delegate if needed
930+
if (frame_transformer_delegate_ &&
931+
frame_transformer_delegate_->FrameTransformer() == frame_transformer) {
932+
RTC_DLOG(LS_INFO)
933+
<< "Frame transformer is already set to the provided transformer.";
934+
} else {
935+
if (!frame_transformer) {
936+
RTC_DCHECK_NOTREACHED() << "Attempted to set a null frame transformer.";
937+
} else {
938+
RTC_DLOG(LS_INFO) << "Initializing frame transformer delegate with the "
939+
"new frame transformer.";
940+
InitFrameTransformerDelegate(std::move(frame_transformer));
941+
}
942+
}
938943
}
939944

940945
void ChannelReceive::SetFrameDecryptor(

sdk/objc/api/peerconnection/RTCFrameCryptor.mm

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,21 +127,27 @@ - (nullable instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory
127127
rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack = nativeRtpSender->track();
128128
if (nativeTrack == nullptr) return nil;
129129

130-
_observer = rtc::make_ref_counted<webrtc::RTCFrameCryptorDelegateAdapter>(self);
131-
_participantId = participantId;
132-
133130
webrtc::FrameCryptorTransformer::MediaType mediaType =
134131
nativeTrack->kind() == "audio" ? webrtc::FrameCryptorTransformer::MediaType::kAudioFrame
135132
: webrtc::FrameCryptorTransformer::MediaType::kVideoFrame;
136133

134+
os_unfair_lock_lock(&_lock);
135+
_observer = rtc::make_ref_counted<webrtc::RTCFrameCryptorDelegateAdapter>(self);
136+
_participantId = participantId;
137+
137138
_frame_crypto_transformer =
138139
rtc::scoped_refptr<webrtc::FrameCryptorTransformer>(new webrtc::FrameCryptorTransformer(
139140
factory.signalingThread, [participantId stdString], mediaType,
140141
[self algorithmFromEnum:algorithm], keyProvider.nativeKeyProvider));
141142

142-
nativeRtpSender->SetEncoderToPacketizerFrameTransformer(_frame_crypto_transformer);
143+
factory.workerThread->BlockingCall([self, nativeRtpSender] {
144+
// Must be called on Worker thread
145+
nativeRtpSender->SetEncoderToPacketizerFrameTransformer(_frame_crypto_transformer);
146+
});
147+
143148
_frame_crypto_transformer->SetEnabled(false);
144149
_frame_crypto_transformer->RegisterFrameCryptorTransformerObserver(_observer);
150+
os_unfair_lock_unlock(&_lock);
145151
}
146152

147153
return self;
@@ -161,21 +167,27 @@ - (nullable instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory
161167
rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack = nativeRtpReceiver->track();
162168
if (nativeTrack == nullptr) return nil;
163169

164-
_observer = rtc::make_ref_counted<webrtc::RTCFrameCryptorDelegateAdapter>(self);
165-
_participantId = participantId;
166-
167170
webrtc::FrameCryptorTransformer::MediaType mediaType =
168171
nativeTrack->kind() == "audio" ? webrtc::FrameCryptorTransformer::MediaType::kAudioFrame
169172
: webrtc::FrameCryptorTransformer::MediaType::kVideoFrame;
170173

174+
os_unfair_lock_lock(&_lock);
175+
_observer = rtc::make_ref_counted<webrtc::RTCFrameCryptorDelegateAdapter>(self);
176+
_participantId = participantId;
177+
171178
_frame_crypto_transformer =
172179
rtc::scoped_refptr<webrtc::FrameCryptorTransformer>(new webrtc::FrameCryptorTransformer(
173180
factory.signalingThread, [participantId stdString], mediaType,
174181
[self algorithmFromEnum:algorithm], keyProvider.nativeKeyProvider));
175182

176-
nativeRtpReceiver->SetDepacketizerToDecoderFrameTransformer(_frame_crypto_transformer);
183+
factory.workerThread->BlockingCall([self, nativeRtpReceiver] {
184+
// Must be called on Worker thread
185+
nativeRtpReceiver->SetDepacketizerToDecoderFrameTransformer(_frame_crypto_transformer);
186+
});
187+
177188
_frame_crypto_transformer->SetEnabled(false);
178189
_frame_crypto_transformer->RegisterFrameCryptorTransformerObserver(_observer);
190+
os_unfair_lock_unlock(&_lock);
179191
}
180192

181193
return self;

0 commit comments

Comments
 (0)