blob: bb04295fbe0c2e923c43c761a75c0c0b85505970 [file] [log] [blame]
// Copyright 2021 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 "media/fuchsia/common/passthrough_sysmem_buffer_stream.h"
#include "media/base/decoder_buffer.h"
namespace media {
PassthroughSysmemBufferStream::PassthroughSysmemBufferStream(
SysmemAllocatorClient* sysmem_allocator)
: sysmem_allocator_(sysmem_allocator) {
DCHECK(sysmem_allocator_);
}
PassthroughSysmemBufferStream::~PassthroughSysmemBufferStream() = default;
void PassthroughSysmemBufferStream::Initialize(Sink* sink,
size_t min_buffer_size,
size_t min_buffer_count) {
DCHECK(sink);
sink_ = sink;
fuchsia::sysmem::BufferCollectionConstraints buffer_constraints =
VmoBuffer::GetRecommendedConstraints(min_buffer_count, min_buffer_size,
/*writable=*/true);
// Create buffer collection.
output_buffer_collection_ = sysmem_allocator_->AllocateNewCollection();
output_buffer_collection_->CreateSharedToken(
base::BindOnce(&Sink::OnSysmemBufferStreamBufferCollectionToken,
base::Unretained(sink_)));
output_buffer_collection_->Initialize(std::move(buffer_constraints),
"CrPassthroughSysmemBufferStream");
output_buffer_collection_->AcquireBuffers(
base::BindOnce(&PassthroughSysmemBufferStream::OnBuffersAcquired,
base::Unretained(this)));
}
void PassthroughSysmemBufferStream::EnqueueBuffer(
scoped_refptr<DecoderBuffer> buffer) {
queue_.EnqueueBuffer(std::move(buffer));
}
void PassthroughSysmemBufferStream::Reset() {
queue_.ResetQueue();
}
void PassthroughSysmemBufferStream::OnBuffersAcquired(
std::vector<VmoBuffer> buffers,
const fuchsia::sysmem::SingleBufferSettings& buffer_settings) {
queue_.Start(
std::move(buffers),
base::BindRepeating(&PassthroughSysmemBufferStream::ProcessOutputPacket,
base::Unretained(this)),
base::BindRepeating(&PassthroughSysmemBufferStream::ProcessEndOfStream,
base::Unretained(this)));
}
void PassthroughSysmemBufferStream::ProcessOutputPacket(
const DecoderBuffer* buffer,
StreamProcessorHelper::IoPacket packet) {
sink_->OnSysmemBufferStreamOutputPacket(std::move(packet));
}
void PassthroughSysmemBufferStream::ProcessEndOfStream() {
sink_->OnSysmemBufferStreamEndOfStream();
}
} // namespace media