// 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
