/* * Copyright (c) 2022-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define HST_LOG_TAG "DataStreamImpl" #include "data_stream_impl.h" #include "foundation/log.h" namespace OHOS { namespace Media { DataStreamImpl::DataStreamImpl(size_t size, size_t count, MemoryType type) { FALSE_LOG(type == MemoryType::VIRTUAL_ADDR); for (size_t i = 0; i < count; ++i) { auto buffer = std::make_shared(size); emptyBuffers_.push(buffer); allBuffers_.emplace_back(buffer); } } bool DataStreamImpl::GetDataBuffer(std::shared_ptr& buffer, int timeout) { OSAL::ScopedLock lock(dataMutex_); if (dataBuffers_.empty()) { dataCondition_.Wait(lock, [this] { return !dataBuffers_.empty(); }); } buffer = dataBuffers_.front(); dataBuffers_.pop(); return true; } bool DataStreamImpl::QueueEmptyBuffer(const std::shared_ptr& buffer) { OSAL::ScopedLock lock(emptyMutex_); emptyBuffers_.push(buffer); emptyCondition_.NotifyAll(); return true; } bool DataStreamImpl::QueueEmptyBuffer(uint8_t* address) { OSAL::ScopedLock lock(emptyMutex_); for (size_t i = 0; i < allBuffers_.size(); i++) { if (allBuffers_[i]->GetAddress() == address) { emptyBuffers_.push(allBuffers_[i]); emptyCondition_.NotifyAll(); return true; } } MEDIA_LOG_E("Queue empty buffer address not in DataStream."); return false; } bool DataStreamImpl::GetEmptyBuffer(std::shared_ptr& buffer, int timeout) { OSAL::ScopedLock lock(emptyMutex_); if (emptyBuffers_.empty()) { emptyCondition_.Wait(lock, [this] { return !emptyBuffers_.empty(); }); } buffer = emptyBuffers_.front(); emptyBuffers_.pop(); return true; } bool DataStreamImpl::QueueDataBuffer(const std::shared_ptr& buffer) { OSAL::ScopedLock lock(dataMutex_); dataBuffers_.push(buffer); dataCondition_.NotifyAll(); return true; } VirtualDataBuffer::VirtualDataBuffer(size_t capacity) : capacity_(capacity) { address_ = new uint8_t[capacity]; } VirtualDataBuffer::~VirtualDataBuffer() { delete [] address_; } bool VirtualDataBuffer::IsEos() { return isEos_; } void VirtualDataBuffer::SetEos(bool isEos) { isEos_ = isEos; } uint8_t* VirtualDataBuffer::GetAddress() { return address_; } size_t VirtualDataBuffer::GetCapacity() { return capacity_; } size_t VirtualDataBuffer::GetSize() { return size_; } void VirtualDataBuffer::SetSize(size_t size) { size_ = size; } } // Media } // OHOS