1ba487d97Sopenharmony_ci/* 2ba487d97Sopenharmony_ci * Copyright (c) 2020 Huawei Device Co., Ltd. 3ba487d97Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ba487d97Sopenharmony_ci * you may not use this file except in compliance with the License. 5ba487d97Sopenharmony_ci * You may obtain a copy of the License at 6ba487d97Sopenharmony_ci * 7ba487d97Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ba487d97Sopenharmony_ci * 9ba487d97Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ba487d97Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ba487d97Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ba487d97Sopenharmony_ci * See the License for the specific language governing permissions and 13ba487d97Sopenharmony_ci * limitations under the License. 14ba487d97Sopenharmony_ci */ 15ba487d97Sopenharmony_ci 16ba487d97Sopenharmony_ci#include "source.h" 17ba487d97Sopenharmony_ci#include "media_log.h" 18ba487d97Sopenharmony_ci 19ba487d97Sopenharmony_cinamespace OHOS { 20ba487d97Sopenharmony_cinamespace Media { 21ba487d97Sopenharmony_ciSource::Source(const std::string &uri) 22ba487d97Sopenharmony_ci : uri_(uri), 23ba487d97Sopenharmony_ci sourceType_(SourceType::SOURCE_TYPE_URI) 24ba487d97Sopenharmony_ci{} 25ba487d97Sopenharmony_ci 26ba487d97Sopenharmony_ciSource::Source(const std::string &uri, const std::map<std::string, std::string> &header) 27ba487d97Sopenharmony_ci : uri_(uri), 28ba487d97Sopenharmony_ci sourceType_(SourceType::SOURCE_TYPE_URI), 29ba487d97Sopenharmony_ci header_(header) 30ba487d97Sopenharmony_ci{} 31ba487d97Sopenharmony_ci 32ba487d97Sopenharmony_ciSource::Source(const std::shared_ptr<StreamSource> &stream, const Format &formats) 33ba487d97Sopenharmony_ci : sourceType_(SourceType::SOURCE_TYPE_STREAM), 34ba487d97Sopenharmony_ci stream_(stream) 35ba487d97Sopenharmony_ci{ 36ba487d97Sopenharmony_ci format_.CopyFrom(formats); 37ba487d97Sopenharmony_ci} 38ba487d97Sopenharmony_ci 39ba487d97Sopenharmony_ciSource::Source(const std::shared_ptr<DataConsumer> &dataConsumer) 40ba487d97Sopenharmony_ci : sourceType_(SourceType::SOURCE_TYPE_STREAM), 41ba487d97Sopenharmony_ci dataConsumer_(dataConsumer) 42ba487d97Sopenharmony_ci{ 43ba487d97Sopenharmony_ci} 44ba487d97Sopenharmony_ci 45ba487d97Sopenharmony_ciSourceType Source::GetSourceType() const 46ba487d97Sopenharmony_ci{ 47ba487d97Sopenharmony_ci return sourceType_; 48ba487d97Sopenharmony_ci} 49ba487d97Sopenharmony_ci 50ba487d97Sopenharmony_ciconst std::string &Source::GetSourceUri() const 51ba487d97Sopenharmony_ci{ 52ba487d97Sopenharmony_ci return uri_; 53ba487d97Sopenharmony_ci} 54ba487d97Sopenharmony_ci 55ba487d97Sopenharmony_ciconst std::map<std::string, std::string> &Source::GetSourceHeader() const 56ba487d97Sopenharmony_ci{ 57ba487d97Sopenharmony_ci return header_; 58ba487d97Sopenharmony_ci} 59ba487d97Sopenharmony_ci 60ba487d97Sopenharmony_ciconst std::shared_ptr<StreamSource> &Source::GetSourceStream() const 61ba487d97Sopenharmony_ci{ 62ba487d97Sopenharmony_ci return stream_; 63ba487d97Sopenharmony_ci} 64ba487d97Sopenharmony_ciconst Format &Source::GetSourceStreamFormat() const 65ba487d97Sopenharmony_ci{ 66ba487d97Sopenharmony_ci return format_; 67ba487d97Sopenharmony_ci} 68ba487d97Sopenharmony_ci 69ba487d97Sopenharmony_ciconst std::shared_ptr<DataConsumer> &Source::GetDataConsumer() const 70ba487d97Sopenharmony_ci{ 71ba487d97Sopenharmony_ci return dataConsumer_; 72ba487d97Sopenharmony_ci} 73ba487d97Sopenharmony_ci 74ba487d97Sopenharmony_ciStreamSource::StreamSource() 75ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED 76ba487d97Sopenharmony_ci : surface_(nullptr), 77ba487d97Sopenharmony_ci curBuffer_(nullptr) 78ba487d97Sopenharmony_ci#endif 79ba487d97Sopenharmony_ci{} 80ba487d97Sopenharmony_ci 81ba487d97Sopenharmony_ciStreamSource::~StreamSource() 82ba487d97Sopenharmony_ci{ 83ba487d97Sopenharmony_ci MEDIA_DEBUG_LOG("[%s,%d] in", __func__, __LINE__); 84ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED 85ba487d97Sopenharmony_ci if (surface_ != nullptr) { 86ba487d97Sopenharmony_ci delete surface_; 87ba487d97Sopenharmony_ci } 88ba487d97Sopenharmony_ci#endif 89ba487d97Sopenharmony_ci} 90ba487d97Sopenharmony_ci 91ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED 92ba487d97Sopenharmony_civoid StreamSource::SetSurface(Surface* surface) 93ba487d97Sopenharmony_ci{ 94ba487d97Sopenharmony_ci surface_ = surface; 95ba487d97Sopenharmony_ci} 96ba487d97Sopenharmony_ci 97ba487d97Sopenharmony_ciSurface* StreamSource::GetSurface(void) 98ba487d97Sopenharmony_ci{ 99ba487d97Sopenharmony_ci return surface_; 100ba487d97Sopenharmony_ci} 101ba487d97Sopenharmony_ci#endif 102ba487d97Sopenharmony_ci 103ba487d97Sopenharmony_ciuint8_t* StreamSource::GetSharedBuffer(size_t& size) 104ba487d97Sopenharmony_ci{ 105ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED 106ba487d97Sopenharmony_ci if ((surface_ == nullptr) || (curBuffer_ != nullptr)) { 107ba487d97Sopenharmony_ci return nullptr; 108ba487d97Sopenharmony_ci } 109ba487d97Sopenharmony_ci SurfaceBuffer* surfaceBuffer = surface_->RequestBuffer(); 110ba487d97Sopenharmony_ci if (surfaceBuffer != nullptr) { 111ba487d97Sopenharmony_ci curBuffer_ = surfaceBuffer; 112ba487d97Sopenharmony_ci size = surface_->GetSize(); 113ba487d97Sopenharmony_ci return static_cast<uint8_t*>(surfaceBuffer->GetVirAddr()); 114ba487d97Sopenharmony_ci } else { 115ba487d97Sopenharmony_ci return nullptr; 116ba487d97Sopenharmony_ci } 117ba487d97Sopenharmony_ci#else 118ba487d97Sopenharmony_ci return nullptr; 119ba487d97Sopenharmony_ci#endif 120ba487d97Sopenharmony_ci} 121ba487d97Sopenharmony_ci 122ba487d97Sopenharmony_ciint StreamSource::QueueSharedBuffer(void* buffer, size_t size) 123ba487d97Sopenharmony_ci{ 124ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED 125ba487d97Sopenharmony_ci if ((surface_ == nullptr) || (buffer == nullptr) || (curBuffer_ == nullptr)) { 126ba487d97Sopenharmony_ci return -1; 127ba487d97Sopenharmony_ci } 128ba487d97Sopenharmony_ci 129ba487d97Sopenharmony_ci if(buffer != curBuffer_->GetVirAddr()) { 130ba487d97Sopenharmony_ci return -1; 131ba487d97Sopenharmony_ci } 132ba487d97Sopenharmony_ci curBuffer_->SetInt32(0, size); 133ba487d97Sopenharmony_ci if (surface_->FlushBuffer(curBuffer_) != 0) { 134ba487d97Sopenharmony_ci surface_->CancelBuffer(curBuffer_); 135ba487d97Sopenharmony_ci curBuffer_ = nullptr; 136ba487d97Sopenharmony_ci return -1; 137ba487d97Sopenharmony_ci } 138ba487d97Sopenharmony_ci curBuffer_ = nullptr; 139ba487d97Sopenharmony_ci#endif 140ba487d97Sopenharmony_ci return 0; 141ba487d97Sopenharmony_ci} 142ba487d97Sopenharmony_ci} // namespace Media 143ba487d97Sopenharmony_ci} // namespace OHOS 144