1 /*
2  * Copyright (c) 2021-2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef HISTREAMER_PLUGIN_INTF_SOURCE_PLUGIN_H
17 #define HISTREAMER_PLUGIN_INTF_SOURCE_PLUGIN_H
18 
19 #include <map>
20 #include <string>
21 #include "plugin/common/media_source.h"
22 #include "plugin/common/plugin_caps.h"
23 #include "plugin/common/plugin_source_tags.h"
24 #include "plugin/interface/plugin_base.h"
25 #include "plugin/interface/plugin_definition.h"
26 
27 namespace OHOS {
28 namespace Media {
29 namespace Plugin {
30 /**
31  * @brief Source Plugin Interface.
32  *
33  * The data source may be network push or active read.
34  *
35  * @since 1.0
36  * @version 1.0
37  */
38 struct SourcePlugin : public PluginBase {
39     /// constructor
SourcePluginOHOS::Media::Plugin::SourcePlugin40     explicit SourcePlugin(std::string name): PluginBase(std::move(name)) {}
41     /**
42      * @brief Set the data source to source plugin.
43      *
44      * The function is valid only in the CREATED state.
45      *
46      * @param source data source, uri or stream source
47      * @return  Execution status return
48      *  @retval OK: Plugin SetSource succeeded.
49      *  @retval ERROR_WRONG_STATE: Call this function in non wrong state
50      *  @retval ERROR_NOT_EXISTED: Uri is not existed.
51      *  @retval ERROR_UNSUPPORTED_FORMAT: Uri is not supported.
52      *  @retval ERROR_INVALID_PARAMETER: Uri is invalid.
53      */
54     virtual OHOS::Media::Plugin::Status SetSource(std::shared_ptr<MediaSource> source) = 0;
55 
56     /**
57      * @brief Read data from data source.
58      *
59      * The function is valid only after RUNNING state.
60      *
61      * @param buffer Buffer to store the data, it can be nullptr or empty to get the buffer from plugin.
62      * @param expectedLen   Expected data size to be read
63      * @return  Execution status return
64      *  @retval OK: Plugin Read succeeded.
65      *  @retval ERROR_NOT_ENOUGH_DATA: Data not enough
66      *  @retval END_OF_STREAM: End of stream
67      */
68     virtual Status Read(std::shared_ptr<Buffer>& buffer, size_t expectedLen) = 0;
69 
70     /**
71      * @brief Get data source size.
72      *
73      * The function is valid only after INITIALIZED state.
74      *
75      * @param size data source size.
76      * @return  Execution status return.
77      *  @retval OK: Plugin GetSize succeeded.
78      */
79     virtual Status GetSize(uint64_t& size) = 0;
80 
81     /**
82      * @brief Indicates that the current source can be seek.
83      *
84      * The function is valid only after INITIALIZED state.
85      *
86      * @return  Execution status return
87      *  @retval OK: Plugin GetSeekable succeeded.
88      */
89     virtual Seekable GetSeekable() = 0;
90 
91     /**
92      * @brief Seeks for a specified position for the source.
93      *
94      * After being started, the source seeks for a specified position to read data frames.
95      *
96      * The function is valid only after RUNNING state.
97      *
98      * @param offset position to read data frames
99      * @return  Execution status return
100      *  @retval OK: Plugin SeekTo succeeded.
101      *  @retval ERROR_INVALID_DATA: The offset is invalid.
102      */
SeekToPosOHOS::Media::Plugin::SourcePlugin103     virtual Status SeekToPos(int64_t offset)
104     {
105         return Status::ERROR_UNIMPLEMENTED;
106     }
107 
108     /**
109      * @brief seek to pos by time
110      * @return Execution status return
111      */
SeekToTimeOHOS::Media::Plugin::SourcePlugin112     virtual Status SeekToTime(int64_t offset)
113     {
114         return Status::ERROR_UNIMPLEMENTED;
115     }
116 
117     /**
118      * @brief Get duration from current source
119      * @return Execution status return
120      */
GetDurationOHOS::Media::Plugin::SourcePlugin121     virtual Status GetDuration(int64_t& duration)
122     {
123         return Status::ERROR_UNIMPLEMENTED;
124     }
125 
126     /**
127      * @brief Get bitrates that current source supports
128      * @return Execution status return
129     */
GetBitRatesOHOS::Media::Plugin::SourcePlugin130     virtual Status GetBitRates(std::vector<uint32_t>& bitRates)
131     {
132         return Status::ERROR_UNIMPLEMENTED;
133     }
134 
135     /**
136      * @brief Select bitrate for current source
137      * @param bitRate user selects a bitrate
138      * @return Execution status return
139     */
SelectBitRateOHOS::Media::Plugin::SourcePlugin140     virtual Status SelectBitRate(uint32_t bitRate)
141     {
142         return Status::ERROR_UNIMPLEMENTED;
143     }
144 };
145 
146 /// Source plugin api major number.
147 #define SOURCE_API_VERSION_MAJOR (1)
148 
149 /// Source plugin api minor number
150 #define SOURCE_API_VERSION_MINOR (0)
151 
152 /// Source plugin version
153 #define SOURCE_API_VERSION MAKE_VERSION(SOURCE_API_VERSION_MAJOR, SOURCE_API_VERSION_MINOR)
154 
155 /**
156  * @brief Describes the source plugin information.
157  *
158  * @since 1.0
159  * @version 1.0
160  */
161 struct SourcePluginDef : public PluginDefBase {
162     std::vector<ProtocolType> protocol;      ///< Protocols supported by playback source
163     SrcInputType inputType;                   ///< Input type supported by record source
164     CapabilitySet outCaps;                   ///< Plug-in output capability, For details, @see Capability.
165     PluginCreatorFunc<SourcePlugin> creator {nullptr}; ///< Source plugin create function.
SourcePluginDefOHOS::Media::Plugin::SourcePluginDef166     SourcePluginDef()
167     {
168         apiVersion = SOURCE_API_VERSION; ///< Source plugin version.
169         pluginType = PluginType::SOURCE; ///< Plugin type, MUST be SOURCE.
170     }
171 };
172 } // namespace Plugin
173 } // namespace Media
174 } // namespace OHOS
175 #endif // HISTREAMER_PLUGIN_INTF_SOURCE_PLUGIN_H
176