blob: f8e941fa2d648557284f4f6dfed25fe8dbe677e0 [file] [log] [blame]
// 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/bindings/modules/v8/v8_rtc_encoded_audio_frame_metadata.h"
#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_;
}
RTCEncodedAudioFrameMetadata* RTCEncodedAudioFrame::getMetadata() const {
RTCEncodedAudioFrameMetadata* metadata =
RTCEncodedAudioFrameMetadata::Create();
metadata->setSynchronizationSource(delegate_->Ssrc());
metadata->setContributingSources(delegate_->ContributingSources());
return metadata;
}
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()->ByteLength() : 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) const {
ScriptWrappable::Trace(visitor);
visitor->Trace(frame_data_);
}
} // namespace blink