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