diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.cc | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.cc b/chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.cc new file mode 100644 index 00000000000..6dbaa7fedf7 --- /dev/null +++ b/chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.cc @@ -0,0 +1,100 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.h" + +#include <utility> + +#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" +#include "third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame_delegate.h" +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" +#include "third_party/webrtc/api/frame_transformer_interface.h" + +namespace blink { + +RTCEncodedAudioFrame::RTCEncodedAudioFrame( + std::unique_ptr<webrtc::TransformableFrameInterface> webrtc_frame) + : delegate_(base::MakeRefCounted<RTCEncodedAudioFrameDelegate>( + std::move(webrtc_frame), + Vector<uint32_t>())) {} + +RTCEncodedAudioFrame::RTCEncodedAudioFrame( + std::unique_ptr<webrtc::TransformableAudioFrameInterface> + webrtc_audio_frame) { + Vector<uint32_t> contributing_sources; + if (webrtc_audio_frame) { + wtf_size_t num_csrcs = webrtc_audio_frame->GetHeader().numCSRCs; + contributing_sources.ReserveInitialCapacity(num_csrcs); + for (wtf_size_t i = 0; i < num_csrcs; i++) { + contributing_sources.push_back( + webrtc_audio_frame->GetHeader().arrOfCSRCs[i]); + } + } + delegate_ = base::MakeRefCounted<RTCEncodedAudioFrameDelegate>( + std::move(webrtc_audio_frame), std::move(contributing_sources)); +} + +RTCEncodedAudioFrame::RTCEncodedAudioFrame( + scoped_refptr<RTCEncodedAudioFrameDelegate> delegate) + : delegate_(std::move(delegate)) {} + +uint64_t RTCEncodedAudioFrame::timestamp() const { + return delegate_->Timestamp(); +} + +DOMArrayBuffer* RTCEncodedAudioFrame::data() const { + if (!frame_data_) { + frame_data_ = delegate_->CreateDataBuffer(); + } + return frame_data_; +} + +DOMArrayBuffer* RTCEncodedAudioFrame::additionalData() const { + return nullptr; +} + +void RTCEncodedAudioFrame::setData(DOMArrayBuffer* data) { + frame_data_ = data; +} + +uint32_t RTCEncodedAudioFrame::synchronizationSource() const { + return delegate_->Ssrc(); +} + +Vector<uint32_t> RTCEncodedAudioFrame::contributingSources() const { + return delegate_->ContributingSources(); +} + +String RTCEncodedAudioFrame::toString() const { + StringBuilder sb; + sb.Append("RTCEncodedAudioFrame{timestamp: "); + sb.AppendNumber(timestamp()); + sb.Append("us, size: "); + sb.AppendNumber(data() ? data()->ByteLengthAsSizeT() : 0); + sb.Append("}"); + return sb.ToString(); +} + +void RTCEncodedAudioFrame::SyncDelegate() const { + delegate_->SetData(frame_data_); +} + +scoped_refptr<RTCEncodedAudioFrameDelegate> RTCEncodedAudioFrame::Delegate() + const { + SyncDelegate(); + return delegate_; +} + +std::unique_ptr<webrtc::TransformableFrameInterface> +RTCEncodedAudioFrame::PassWebRtcFrame() { + SyncDelegate(); + return delegate_->PassWebRtcFrame(); +} + +void RTCEncodedAudioFrame::Trace(Visitor* visitor) { + ScriptWrappable::Trace(visitor); + visitor->Trace(frame_data_); +} + +} // namespace blink |