passthrough_sysmem_buffer_stream.cc 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/fuchsia/common/passthrough_sysmem_buffer_stream.h"
  5. #include "media/base/decoder_buffer.h"
  6. namespace media {
  7. PassthroughSysmemBufferStream::PassthroughSysmemBufferStream(
  8. SysmemAllocatorClient* sysmem_allocator)
  9. : sysmem_allocator_(sysmem_allocator) {
  10. DCHECK(sysmem_allocator_);
  11. }
  12. PassthroughSysmemBufferStream::~PassthroughSysmemBufferStream() = default;
  13. void PassthroughSysmemBufferStream::Initialize(Sink* sink,
  14. size_t min_buffer_size,
  15. size_t min_buffer_count) {
  16. DCHECK(sink);
  17. sink_ = sink;
  18. fuchsia::sysmem::BufferCollectionConstraints buffer_constraints =
  19. VmoBuffer::GetRecommendedConstraints(min_buffer_count, min_buffer_size,
  20. /*writable=*/true);
  21. // Create buffer collection.
  22. output_buffer_collection_ = sysmem_allocator_->AllocateNewCollection();
  23. output_buffer_collection_->CreateSharedToken(
  24. base::BindOnce(&Sink::OnSysmemBufferStreamBufferCollectionToken,
  25. base::Unretained(sink_)));
  26. output_buffer_collection_->Initialize(std::move(buffer_constraints),
  27. "CrPassthroughSysmemBufferStream");
  28. output_buffer_collection_->AcquireBuffers(
  29. base::BindOnce(&PassthroughSysmemBufferStream::OnBuffersAcquired,
  30. base::Unretained(this)));
  31. }
  32. void PassthroughSysmemBufferStream::EnqueueBuffer(
  33. scoped_refptr<DecoderBuffer> buffer) {
  34. queue_.EnqueueBuffer(std::move(buffer));
  35. }
  36. void PassthroughSysmemBufferStream::Reset() {
  37. queue_.ResetQueue();
  38. }
  39. void PassthroughSysmemBufferStream::OnBuffersAcquired(
  40. std::vector<VmoBuffer> buffers,
  41. const fuchsia::sysmem::SingleBufferSettings& buffer_settings) {
  42. queue_.Start(
  43. std::move(buffers),
  44. base::BindRepeating(&PassthroughSysmemBufferStream::ProcessOutputPacket,
  45. base::Unretained(this)),
  46. base::BindRepeating(&PassthroughSysmemBufferStream::ProcessEndOfStream,
  47. base::Unretained(this)));
  48. }
  49. void PassthroughSysmemBufferStream::ProcessOutputPacket(
  50. const DecoderBuffer* buffer,
  51. StreamProcessorHelper::IoPacket packet) {
  52. sink_->OnSysmemBufferStreamOutputPacket(std::move(packet));
  53. }
  54. void PassthroughSysmemBufferStream::ProcessEndOfStream() {
  55. sink_->OnSysmemBufferStreamEndOfStream();
  56. }
  57. } // namespace media