| // Copyright 2014 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 "ppapi/shared_impl/media_stream_buffer_manager.h" | |
| #include <stddef.h> | |
| #include <utility> | |
| #include "base/check_op.h" | |
| #include "ppapi/c/pp_errors.h" | |
| #include "ppapi/shared_impl/media_stream_buffer.h" | |
| namespace ppapi { | |
| MediaStreamBufferManager::Delegate::~Delegate() {} | |
| void MediaStreamBufferManager::Delegate::OnNewBufferEnqueued() {} | |
| MediaStreamBufferManager::MediaStreamBufferManager(Delegate* delegate) | |
| : delegate_(delegate), buffer_size_(0), number_of_buffers_(0) { | |
| DCHECK(delegate_); | |
| } | |
| MediaStreamBufferManager::~MediaStreamBufferManager() {} | |
| bool MediaStreamBufferManager::SetBuffers(int32_t number_of_buffers, | |
| int32_t buffer_size, | |
| base::UnsafeSharedMemoryRegion region, | |
| bool enqueue_all_buffers) { | |
| DCHECK(region.IsValid()); | |
| DCHECK_GT(number_of_buffers, 0); | |
| DCHECK_GT(buffer_size, | |
| static_cast<int32_t>(sizeof(MediaStreamBuffer::Header))); | |
| DCHECK_EQ(buffer_size & 0x3, 0); | |
| number_of_buffers_ = number_of_buffers; | |
| buffer_size_ = buffer_size; | |
| size_t size = number_of_buffers_ * buffer_size; | |
| region_ = std::move(region); | |
| mapping_ = region_.MapAt(0, size); | |
| if (!mapping_.IsValid()) | |
| return false; | |
| buffer_queue_.clear(); | |
| buffers_.clear(); | |
| uint8_t* p = mapping_.GetMemoryAsSpan<uint8_t>().data(); | |
| for (int32_t i = 0; i < number_of_buffers; ++i) { | |
| if (enqueue_all_buffers) | |
| buffer_queue_.push_back(i); | |
| buffers_.push_back(reinterpret_cast<MediaStreamBuffer*>(p)); | |
| p += buffer_size_; | |
| } | |
| return true; | |
| } | |
| int32_t MediaStreamBufferManager::DequeueBuffer() { | |
| if (buffer_queue_.empty()) | |
| return PP_ERROR_FAILED; | |
| int32_t buffer = buffer_queue_.front(); | |
| buffer_queue_.pop_front(); | |
| return buffer; | |
| } | |
| std::vector<int32_t> MediaStreamBufferManager::DequeueBuffers() { | |
| std::vector<int32_t> buffers(buffer_queue_.begin(), buffer_queue_.end()); | |
| buffer_queue_.clear(); | |
| return buffers; | |
| } | |
| void MediaStreamBufferManager::EnqueueBuffer(int32_t index) { | |
| CHECK_GE(index, 0) << "Invalid buffer index"; | |
| CHECK_LT(index, number_of_buffers_) << "Invalid buffer index"; | |
| buffer_queue_.push_back(index); | |
| delegate_->OnNewBufferEnqueued(); | |
| } | |
| bool MediaStreamBufferManager::HasAvailableBuffer() { | |
| return !buffer_queue_.empty(); | |
| } | |
| MediaStreamBuffer* MediaStreamBufferManager::GetBufferPointer(int32_t index) { | |
| if (index < 0 || index >= number_of_buffers_) | |
| return NULL; | |
| return buffers_[index]; | |
| } | |
| } // namespace ppapi |