1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License.
5da853ecaSopenharmony_ci * You may obtain a copy of the License at
6da853ecaSopenharmony_ci *
7da853ecaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8da853ecaSopenharmony_ci *
9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and
13da853ecaSopenharmony_ci * limitations under the License.
14da853ecaSopenharmony_ci */
15da853ecaSopenharmony_ci
16da853ecaSopenharmony_ci#ifndef AVCODEC_SOURCE_PLUGIN_H
17da853ecaSopenharmony_ci#define AVCODEC_SOURCE_PLUGIN_H
18da853ecaSopenharmony_ci
19da853ecaSopenharmony_ci#include <map>
20da853ecaSopenharmony_ci#include <string>
21da853ecaSopenharmony_ci
22da853ecaSopenharmony_ci#include "common/media_source.h"
23da853ecaSopenharmony_ci#include "plugin/plugin_base.h"
24da853ecaSopenharmony_ci#include "plugin/plugin_buffer.h"
25da853ecaSopenharmony_ci#include "plugin/plugin_caps.h"
26da853ecaSopenharmony_ci#include "plugin/plugin_definition.h"
27da853ecaSopenharmony_ci#include "meta/media_types.h"
28da853ecaSopenharmony_ci#include "plugin/plugin_time.h"
29da853ecaSopenharmony_ci
30da853ecaSopenharmony_cinamespace OHOS {
31da853ecaSopenharmony_cinamespace Media {
32da853ecaSopenharmony_cinamespace Plugins {
33da853ecaSopenharmony_ci
34da853ecaSopenharmony_cienum StreamType {
35da853ecaSopenharmony_ci    MIXED = 0,
36da853ecaSopenharmony_ci    VIDEO,
37da853ecaSopenharmony_ci    AUDIO,
38da853ecaSopenharmony_ci    SUBTITLE
39da853ecaSopenharmony_ci};
40da853ecaSopenharmony_ci
41da853ecaSopenharmony_cienum VideoType {
42da853ecaSopenharmony_ci    VIDEO_TYPE_SDR = 0,
43da853ecaSopenharmony_ci    VIDEO_TYPE_HDR_VIVID = 1,
44da853ecaSopenharmony_ci    VIDEO_TYPE_HDR_10
45da853ecaSopenharmony_ci};
46da853ecaSopenharmony_ci
47da853ecaSopenharmony_ciclass StreamInfo {
48da853ecaSopenharmony_cipublic:
49da853ecaSopenharmony_ci    int32_t streamId;
50da853ecaSopenharmony_ci    StreamType type;
51da853ecaSopenharmony_ci    uint32_t bitRate;
52da853ecaSopenharmony_ci
53da853ecaSopenharmony_ci    int32_t videoHeight = 0;
54da853ecaSopenharmony_ci    int32_t videoWidth = 0;
55da853ecaSopenharmony_ci    std::string lang = "";
56da853ecaSopenharmony_ci    VideoType videoType = VideoType::VIDEO_TYPE_SDR;
57da853ecaSopenharmony_ci    std::string trackName = "";
58da853ecaSopenharmony_ci};
59da853ecaSopenharmony_ci
60da853ecaSopenharmony_ci/**
61da853ecaSopenharmony_ci * @brief Source Plugin Interface.
62da853ecaSopenharmony_ci *
63da853ecaSopenharmony_ci * The data source may be network push or active read.
64da853ecaSopenharmony_ci *
65da853ecaSopenharmony_ci * @since 1.0
66da853ecaSopenharmony_ci * @version 1.0
67da853ecaSopenharmony_ci */
68da853ecaSopenharmony_ciclass SourcePlugin : public PluginBase {
69da853ecaSopenharmony_ci    /// constructor
70da853ecaSopenharmony_cipublic:
71da853ecaSopenharmony_ci    explicit SourcePlugin(std::string name): PluginBase(std::move(name)) {}
72da853ecaSopenharmony_ci    /**
73da853ecaSopenharmony_ci     * @brief Set the data source to source plugin.
74da853ecaSopenharmony_ci     *
75da853ecaSopenharmony_ci     * The function is valid only in the CREATED state.
76da853ecaSopenharmony_ci     *
77da853ecaSopenharmony_ci     * @param source data source, uri or stream source
78da853ecaSopenharmony_ci     * @return  Execution status return
79da853ecaSopenharmony_ci     *  @retval OK: Plugin SetSource succeeded.
80da853ecaSopenharmony_ci     *  @retval ERROR_WRONG_STATE: Call this function in non wrong state
81da853ecaSopenharmony_ci     *  @retval ERROR_NOT_EXISTED: Uri is not existed.
82da853ecaSopenharmony_ci     *  @retval ERROR_UNSUPPORTED_FORMAT: Uri is not supported.
83da853ecaSopenharmony_ci     *  @retval ERROR_INVALID_PARAMETER: Uri is invalid.
84da853ecaSopenharmony_ci     */
85da853ecaSopenharmony_ci    virtual Status SetSource(std::shared_ptr<MediaSource> source) = 0;
86da853ecaSopenharmony_ci
87da853ecaSopenharmony_ci    /**
88da853ecaSopenharmony_ci     * @brief Read data from data source.
89da853ecaSopenharmony_ci     *
90da853ecaSopenharmony_ci     * The function is valid only after RUNNING state.
91da853ecaSopenharmony_ci     *
92da853ecaSopenharmony_ci     * @param buffer Buffer to store the data, it can be nullptr or empty to get the buffer from plugin.
93da853ecaSopenharmony_ci     * @param expectedLen   Expected data size to be read
94da853ecaSopenharmony_ci     * @return  Execution status return
95da853ecaSopenharmony_ci     *  @retval OK: Plugin Read succeeded.
96da853ecaSopenharmony_ci     *  @retval ERROR_NOT_ENOUGH_DATA: Data not enough
97da853ecaSopenharmony_ci     *  @retval END_OF_STREAM: End of stream
98da853ecaSopenharmony_ci     */
99da853ecaSopenharmony_ci    virtual Status Read(std::shared_ptr<Buffer>& buffer, uint64_t offset, size_t expectedLen) = 0;
100da853ecaSopenharmony_ci
101da853ecaSopenharmony_ci    /**
102da853ecaSopenharmony_ci     * @brief Read data from data source.
103da853ecaSopenharmony_ci     *
104da853ecaSopenharmony_ci     * The function is valid only after RUNNING state.
105da853ecaSopenharmony_ci     *
106da853ecaSopenharmony_ci     * @param streamId stream index.
107da853ecaSopenharmony_ci     * @param buffer Buffer to store the data, it can be nullptr or empty to get the buffer from plugin.
108da853ecaSopenharmony_ci     * @param expectedLen   Expected data size to be read
109da853ecaSopenharmony_ci     * @return  Execution status return
110da853ecaSopenharmony_ci     *  @retval OK: Plugin Read succeeded.
111da853ecaSopenharmony_ci     *  @retval ERROR_NOT_ENOUGH_DATA: Data not enough
112da853ecaSopenharmony_ci     *  @retval END_OF_STREAM: End of stream
113da853ecaSopenharmony_ci     */
114da853ecaSopenharmony_ci    virtual Status Read(int32_t streamId, std::shared_ptr<Buffer>& buffer, uint64_t offset, size_t expectedLen)
115da853ecaSopenharmony_ci    {
116da853ecaSopenharmony_ci        return Status::OK;
117da853ecaSopenharmony_ci    }
118da853ecaSopenharmony_ci
119da853ecaSopenharmony_ci    /**
120da853ecaSopenharmony_ci     * @brief Get data source size.
121da853ecaSopenharmony_ci     *
122da853ecaSopenharmony_ci     * The function is valid only after INITIALIZED state.
123da853ecaSopenharmony_ci     *
124da853ecaSopenharmony_ci     * @param size data source size.
125da853ecaSopenharmony_ci     * @return  Execution status return.
126da853ecaSopenharmony_ci     *  @retval OK: Plugin GetSize succeeded.
127da853ecaSopenharmony_ci     */
128da853ecaSopenharmony_ci    virtual Status GetSize(uint64_t& size) = 0;
129da853ecaSopenharmony_ci
130da853ecaSopenharmony_ci    /**
131da853ecaSopenharmony_ci     * @brief Indicates that the current source can be seek.
132da853ecaSopenharmony_ci     *
133da853ecaSopenharmony_ci     * The function is valid only after INITIALIZED state.
134da853ecaSopenharmony_ci     *
135da853ecaSopenharmony_ci     * @return  Execution status return
136da853ecaSopenharmony_ci     *  @retval OK: Plugin GetSeekable succeeded.
137da853ecaSopenharmony_ci     */
138da853ecaSopenharmony_ci    virtual Seekable GetSeekable() = 0;
139da853ecaSopenharmony_ci
140da853ecaSopenharmony_ci    /**
141da853ecaSopenharmony_ci     * @brief Seeks for a specified position for the source.
142da853ecaSopenharmony_ci     *
143da853ecaSopenharmony_ci     * After being started, the source seeks for a specified position to read data frames.
144da853ecaSopenharmony_ci     *
145da853ecaSopenharmony_ci     * The function is valid only after RUNNING state.
146da853ecaSopenharmony_ci     *
147da853ecaSopenharmony_ci     * @param offset position to read data frames
148da853ecaSopenharmony_ci     * @return  Execution status return
149da853ecaSopenharmony_ci     *  @retval OK: Plugin SeekTo succeeded.
150da853ecaSopenharmony_ci     *  @retval ERROR_INVALID_DATA: The offset is invalid.
151da853ecaSopenharmony_ci     */
152da853ecaSopenharmony_ci    virtual Status SeekTo(uint64_t offset) = 0;
153da853ecaSopenharmony_ci
154da853ecaSopenharmony_ci    virtual Status Reset() = 0;
155da853ecaSopenharmony_ci
156da853ecaSopenharmony_ci    virtual void SetDemuxerState(int32_t streamId) {}
157da853ecaSopenharmony_ci
158da853ecaSopenharmony_ci    virtual void SetDownloadErrorState() {}
159da853ecaSopenharmony_ci
160da853ecaSopenharmony_ci    virtual void SetBundleName(const std::string& bundleName) {}
161da853ecaSopenharmony_ci
162da853ecaSopenharmony_ci    virtual Status GetDownloadInfo(DownloadInfo& downloadInfo)
163da853ecaSopenharmony_ci    {
164da853ecaSopenharmony_ci        return Status::OK;
165da853ecaSopenharmony_ci    }
166da853ecaSopenharmony_ci
167da853ecaSopenharmony_ci    virtual Status GetPlaybackInfo(PlaybackInfo& playbackInfo)
168da853ecaSopenharmony_ci    {
169da853ecaSopenharmony_ci        return Status::OK;
170da853ecaSopenharmony_ci    }
171da853ecaSopenharmony_ci
172da853ecaSopenharmony_ci    virtual Status GetBitRates(std::vector<uint32_t>& bitRates)
173da853ecaSopenharmony_ci    {
174da853ecaSopenharmony_ci        return Status::OK;
175da853ecaSopenharmony_ci    }
176da853ecaSopenharmony_ci
177da853ecaSopenharmony_ci    virtual Status SelectBitRate(uint32_t bitRate)
178da853ecaSopenharmony_ci    {
179da853ecaSopenharmony_ci        return Status::OK;
180da853ecaSopenharmony_ci    }
181da853ecaSopenharmony_ci
182da853ecaSopenharmony_ci    virtual bool IsSeekToTimeSupported()
183da853ecaSopenharmony_ci    {
184da853ecaSopenharmony_ci        return false;
185da853ecaSopenharmony_ci    }
186da853ecaSopenharmony_ci
187da853ecaSopenharmony_ci    virtual Status SeekToTime(int64_t seekTime, SeekMode mode)
188da853ecaSopenharmony_ci    {
189da853ecaSopenharmony_ci        return Status::OK;
190da853ecaSopenharmony_ci    }
191da853ecaSopenharmony_ci
192da853ecaSopenharmony_ci    virtual Status GetDuration(int64_t& duration)
193da853ecaSopenharmony_ci    {
194da853ecaSopenharmony_ci        duration = Plugins::HST_TIME_NONE;
195da853ecaSopenharmony_ci        return Status::OK;
196da853ecaSopenharmony_ci    }
197da853ecaSopenharmony_ci
198da853ecaSopenharmony_ci    virtual bool IsNeedPreDownload()
199da853ecaSopenharmony_ci    {
200da853ecaSopenharmony_ci        return false;
201da853ecaSopenharmony_ci    }
202da853ecaSopenharmony_ci
203da853ecaSopenharmony_ci    virtual Status SetReadBlockingFlag(bool isReadBlockingAllowed)
204da853ecaSopenharmony_ci    {
205da853ecaSopenharmony_ci        return Status::OK;
206da853ecaSopenharmony_ci    }
207da853ecaSopenharmony_ci
208da853ecaSopenharmony_ci    virtual void SetInterruptState(bool isInterruptNeeded) {}
209da853ecaSopenharmony_ci
210da853ecaSopenharmony_ci    virtual Status SetCurrentBitRate(int32_t bitRate, int32_t streamID)
211da853ecaSopenharmony_ci    {
212da853ecaSopenharmony_ci        return Status::OK;
213da853ecaSopenharmony_ci    }
214da853ecaSopenharmony_ci
215da853ecaSopenharmony_ci    virtual Status GetStreamInfo(std::vector<StreamInfo>& streams)
216da853ecaSopenharmony_ci    {
217da853ecaSopenharmony_ci        return Status::OK;
218da853ecaSopenharmony_ci    }
219da853ecaSopenharmony_ci
220da853ecaSopenharmony_ci    virtual Status SelectStream(int32_t streamID)
221da853ecaSopenharmony_ci    {
222da853ecaSopenharmony_ci        return Status::OK;
223da853ecaSopenharmony_ci    }
224da853ecaSopenharmony_ci
225da853ecaSopenharmony_ci    virtual Status Pause()
226da853ecaSopenharmony_ci    {
227da853ecaSopenharmony_ci        return Status::OK;
228da853ecaSopenharmony_ci    }
229da853ecaSopenharmony_ci
230da853ecaSopenharmony_ci    virtual Status Resume()
231da853ecaSopenharmony_ci    {
232da853ecaSopenharmony_ci        return Status::OK;
233da853ecaSopenharmony_ci    }
234da853ecaSopenharmony_ci
235da853ecaSopenharmony_ci    virtual void SetEnableOnlineFdCache(bool isEnableFdCache)
236da853ecaSopenharmony_ci    {
237da853ecaSopenharmony_ci        (void)isEnableFdCache;
238da853ecaSopenharmony_ci    }
239da853ecaSopenharmony_ci
240da853ecaSopenharmony_ci    virtual size_t GetSegmentOffset()
241da853ecaSopenharmony_ci    {
242da853ecaSopenharmony_ci        return 0;
243da853ecaSopenharmony_ci    }
244da853ecaSopenharmony_ci
245da853ecaSopenharmony_ci    virtual bool GetHLSDiscontinuity()
246da853ecaSopenharmony_ci    {
247da853ecaSopenharmony_ci        return false;
248da853ecaSopenharmony_ci    }
249da853ecaSopenharmony_ci
250da853ecaSopenharmony_ci    virtual Status StopBufferring(bool isAppBackground)
251da853ecaSopenharmony_ci    {
252da853ecaSopenharmony_ci        return Status::OK;
253da853ecaSopenharmony_ci    }
254da853ecaSopenharmony_ci
255da853ecaSopenharmony_ci    virtual void WaitForBufferingEnd() {}
256da853ecaSopenharmony_ci};
257da853ecaSopenharmony_ci
258da853ecaSopenharmony_ci/// Source plugin api major number.
259da853ecaSopenharmony_ci#define SOURCE_API_VERSION_MAJOR (1)
260da853ecaSopenharmony_ci
261da853ecaSopenharmony_ci/// Source plugin api minor number
262da853ecaSopenharmony_ci#define SOURCE_API_VERSION_MINOR (0)
263da853ecaSopenharmony_ci
264da853ecaSopenharmony_ci/// Source plugin version
265da853ecaSopenharmony_ci#define SOURCE_API_VERSION MAKE_VERSION(SOURCE_API_VERSION_MAJOR, SOURCE_API_VERSION_MINOR)
266da853ecaSopenharmony_ci
267da853ecaSopenharmony_ci/**
268da853ecaSopenharmony_ci * @brief Describes the source plugin information.
269da853ecaSopenharmony_ci *
270da853ecaSopenharmony_ci * @since 1.0
271da853ecaSopenharmony_ci * @version 1.0
272da853ecaSopenharmony_ci */
273da853ecaSopenharmony_cistruct SourcePluginDef : public PluginDefBase {
274da853ecaSopenharmony_ci    SourcePluginDef()
275da853ecaSopenharmony_ci        : PluginDefBase()
276da853ecaSopenharmony_ci    {
277da853ecaSopenharmony_ci        apiVersion = SOURCE_API_VERSION; ///< Source plugin version.
278da853ecaSopenharmony_ci        pluginType = PluginType::SOURCE; ///< Plugin type, MUST be SOURCE.
279da853ecaSopenharmony_ci    }
280da853ecaSopenharmony_ci};
281da853ecaSopenharmony_ci} // namespace Plugins
282da853ecaSopenharmony_ci} // namespace Media
283da853ecaSopenharmony_ci} // namespace OHOS
284da853ecaSopenharmony_ci#endif // AVCODEC_SOURCE_PLUGIN_H
285