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/**
17ba487d97Sopenharmony_ci * @addtogroup MultiMedia_MediaCommon
18ba487d97Sopenharmony_ci * @{
19ba487d97Sopenharmony_ci *
20ba487d97Sopenharmony_ci * @brief Provides data types and media formats required for recording and playing audio and videos.
21ba487d97Sopenharmony_ci *
22ba487d97Sopenharmony_ci *
23ba487d97Sopenharmony_ci * @since 1.0
24ba487d97Sopenharmony_ci * @version 1.0
25ba487d97Sopenharmony_ci */
26ba487d97Sopenharmony_ci
27ba487d97Sopenharmony_ci/**
28ba487d97Sopenharmony_ci * @file source.h
29ba487d97Sopenharmony_ci *
30ba487d97Sopenharmony_ci * @brief Declares the <b>Source</b> class, which is used to implement source-related operations.
31ba487d97Sopenharmony_ci *
32ba487d97Sopenharmony_ci *
33ba487d97Sopenharmony_ci * @since 1.0
34ba487d97Sopenharmony_ci * @version 1.0
35ba487d97Sopenharmony_ci */
36ba487d97Sopenharmony_ci
37ba487d97Sopenharmony_ci#ifndef SOURCE_H
38ba487d97Sopenharmony_ci#define SOURCE_H
39ba487d97Sopenharmony_ci#include <memory>
40ba487d97Sopenharmony_ci#include <map>
41ba487d97Sopenharmony_ci#include <string>
42ba487d97Sopenharmony_ci#include "data_stream.h"
43ba487d97Sopenharmony_ci#include "format.h"
44ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED
45ba487d97Sopenharmony_ci#include "surface.h"
46ba487d97Sopenharmony_ci#endif
47ba487d97Sopenharmony_ci
48ba487d97Sopenharmony_ciusing std::shared_ptr;
49ba487d97Sopenharmony_ci
50ba487d97Sopenharmony_cinamespace OHOS {
51ba487d97Sopenharmony_cinamespace Media {
52ba487d97Sopenharmony_ci/**
53ba487d97Sopenharmony_ci * @brief Enumerates media source types.
54ba487d97Sopenharmony_ci *
55ba487d97Sopenharmony_ci * @since 1.0
56ba487d97Sopenharmony_ci * @version 1.0
57ba487d97Sopenharmony_ci */
58ba487d97Sopenharmony_cienum class SourceType : int32_t {
59ba487d97Sopenharmony_ci    /** Local file path or network address */
60ba487d97Sopenharmony_ci    SOURCE_TYPE_URI = 0,
61ba487d97Sopenharmony_ci    /** Local file descriptor */
62ba487d97Sopenharmony_ci    SOURCE_TYPE_FD,
63ba487d97Sopenharmony_ci    /** Stream data, such as Advanced Audio Coding (AAC) stream data */
64ba487d97Sopenharmony_ci    SOURCE_TYPE_STREAM,
65ba487d97Sopenharmony_ci};
66ba487d97Sopenharmony_ci
67ba487d97Sopenharmony_ci/**
68ba487d97Sopenharmony_ci * @brief Provides functions to obtain the address of a buffer memory and write the filled buffers into the playback
69ba487d97Sopenharmony_ci * queue. You need to implement the <b>StreamCallback</b> functions in a player object.
70ba487d97Sopenharmony_ci *
71ba487d97Sopenharmony_ci * @since 1.0
72ba487d97Sopenharmony_ci * @version 1.0
73ba487d97Sopenharmony_ci */
74ba487d97Sopenharmony_cistruct StreamCallback {
75ba487d97Sopenharmony_ci    virtual ~StreamCallback()=default;
76ba487d97Sopenharmony_ci
77ba487d97Sopenharmony_ci    /**
78ba487d97Sopenharmony_ci     * @brief Enumerates buffer types of stream sources.
79ba487d97Sopenharmony_ci     *
80ba487d97Sopenharmony_ci     * @since 1.0
81ba487d97Sopenharmony_ci     * @version 1.0
82ba487d97Sopenharmony_ci     */
83ba487d97Sopenharmony_ci    enum BufferFlags : uint32_t {
84ba487d97Sopenharmony_ci        /** Synchronous frame */
85ba487d97Sopenharmony_ci        STREAM_FLAG_SYNCFRAME = 1,
86ba487d97Sopenharmony_ci        /** Codec configuration information */
87ba487d97Sopenharmony_ci        STREAM_FLAG_CODECCONFIG = 2,
88ba487d97Sopenharmony_ci        /** End of Stream (EOS) */
89ba487d97Sopenharmony_ci        STREAM_FLAG_EOS = 4,
90ba487d97Sopenharmony_ci        /** Part of a frame */
91ba487d97Sopenharmony_ci        STREAM_FLAG_PARTIAL_FRAME = 8,
92ba487d97Sopenharmony_ci        /** End of a frame. It is used in pair with <b>STREAM_FLAG_PARTIAL_FRAME</b>. */
93ba487d97Sopenharmony_ci        STREAM_FLAG_ENDOFFRAME = 16,
94ba487d97Sopenharmony_ci        /** Container file data, such as MP4 file data (not supported yet) */
95ba487d97Sopenharmony_ci        STREAM_FLAG_MUXER_DATA = 32,
96ba487d97Sopenharmony_ci    };
97ba487d97Sopenharmony_ci
98ba487d97Sopenharmony_ci    /**
99ba487d97Sopenharmony_ci     * @brief Obtains the virtual address of a buffer memory block based on its index.
100ba487d97Sopenharmony_ci     *
101ba487d97Sopenharmony_ci     * @param index Indicates the index of the buffer memory block.
102ba487d97Sopenharmony_ci     * @return Returns the pointer to the virtual address of the buffer memory block.
103ba487d97Sopenharmony_ci     * @since 1.0
104ba487d97Sopenharmony_ci     * @version 1.0
105ba487d97Sopenharmony_ci     */
106ba487d97Sopenharmony_ci    virtual uint8_t *GetBuffer(size_t index) = 0;
107ba487d97Sopenharmony_ci
108ba487d97Sopenharmony_ci    /**
109ba487d97Sopenharmony_ci     * @brief Writes the filled buffer memory block into the player memory.
110ba487d97Sopenharmony_ci     *
111ba487d97Sopenharmony_ci     * @param index Indicates the index of the buffer memory block.
112ba487d97Sopenharmony_ci     * @param offset Indicates the start offset into which the buffer memory block will be written.
113ba487d97Sopenharmony_ci     * @param size Indicates the size of the data filled in the buffer memory block.
114ba487d97Sopenharmony_ci     * @param timestampUs Indicates the timestamp of the frame filled in the buffer memory block. As data in AAC
115ba487d97Sopenharmony_ci     * streams can be filled not on a frame basis, set this parameter to <b>0</b> for AAC streams.
116ba487d97Sopenharmony_ci     * @param flags Indicates the type of the current buffer memory block. For details, see {@link BufferFlags}.
117ba487d97Sopenharmony_ci     * @since 1.0
118ba487d97Sopenharmony_ci     * @version 1.0
119ba487d97Sopenharmony_ci     */
120ba487d97Sopenharmony_ci    virtual void QueueBuffer(size_t index, size_t offset, size_t size, int64_t timestampUs, uint32_t flags) = 0;
121ba487d97Sopenharmony_ci
122ba487d97Sopenharmony_ci    /**
123ba487d97Sopenharmony_ci    * @brief Sets additional information about a stream.
124ba487d97Sopenharmony_ci    *
125ba487d97Sopenharmony_ci    * @param params Indicates the parameters for additional stream information. For details, see {@link Format}.
126ba487d97Sopenharmony_ci    * @since 1.0
127ba487d97Sopenharmony_ci    * @version 1.0
128ba487d97Sopenharmony_ci    */
129ba487d97Sopenharmony_ci    virtual void SetParameters(const Format &params) = 0;
130ba487d97Sopenharmony_ci};
131ba487d97Sopenharmony_ci
132ba487d97Sopenharmony_ci/**
133ba487d97Sopenharmony_ci * @brief Provides functions related to the stream source for upper-layer applications.
134ba487d97Sopenharmony_ci *
135ba487d97Sopenharmony_ci * After the {@link SetSource} function is called, the player invokes {@link OnBufferAvailable} to notify your
136ba487d97Sopenharmony_ci * application of the buffer memory block that can be filled with data.\n
137ba487d97Sopenharmony_ci * The player can invoke {@link SetStreamCallback} to register a callback for your application. For example,
138ba487d97Sopenharmony_ci * the {@link GetBuffer} callback obtains the address of the buffer block and sends the filled buffer memory block to
139ba487d97Sopenharmony_ci * the player. The buffer memory block is allocated and processed on the player.\n
140ba487d97Sopenharmony_ci * <b>StreamSource</b>is available only for the media source of the <b>SOURCE_TYPE_STREAM</b> type.
141ba487d97Sopenharmony_ci * For details, see {@link SourceType}.\n
142ba487d97Sopenharmony_ci *
143ba487d97Sopenharmony_ci * @since 1.0
144ba487d97Sopenharmony_ci * @version 1.0
145ba487d97Sopenharmony_ci */
146ba487d97Sopenharmony_ciclass StreamSource {
147ba487d97Sopenharmony_cipublic:
148ba487d97Sopenharmony_ci    StreamSource(void);
149ba487d97Sopenharmony_ci
150ba487d97Sopenharmony_ci    virtual ~StreamSource(void);
151ba487d97Sopenharmony_ci
152ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED
153ba487d97Sopenharmony_ci    void SetSurface(Surface* surface);
154ba487d97Sopenharmony_ci
155ba487d97Sopenharmony_ci    Surface* GetSurface(void);
156ba487d97Sopenharmony_ci#endif
157ba487d97Sopenharmony_ci
158ba487d97Sopenharmony_ci    uint8_t* GetSharedBuffer(size_t& size);
159ba487d97Sopenharmony_ci
160ba487d97Sopenharmony_ci    int QueueSharedBuffer(void* buffer, size_t size);
161ba487d97Sopenharmony_ci    /**
162ba487d97Sopenharmony_ci     * @brief Notifies your application of the information about the buffer memory block that can be filled with data.
163ba487d97Sopenharmony_ci     *
164ba487d97Sopenharmony_ci     * @param index Indicates the index of the buffer memory block.
165ba487d97Sopenharmony_ci     * @param offset Indicates the start offset into which the data will be written.
166ba487d97Sopenharmony_ci     * @param size Indicates the size of data that the buffer memory block can store.
167ba487d97Sopenharmony_ci     * @since 1.0
168ba487d97Sopenharmony_ci     * @version 1.0
169ba487d97Sopenharmony_ci     */
170ba487d97Sopenharmony_ci    virtual void OnBufferAvailable(size_t index, size_t offset, size_t size) {}
171ba487d97Sopenharmony_ci
172ba487d97Sopenharmony_ci    /**
173ba487d97Sopenharmony_ci     * @brief Sets a callback function for your application.
174ba487d97Sopenharmony_ci     *
175ba487d97Sopenharmony_ci     * @param callback Indicates the {@link StreamCallback} function to set.
176ba487d97Sopenharmony_ci     * @since 1.0
177ba487d97Sopenharmony_ci     * @version 1.0
178ba487d97Sopenharmony_ci     */
179ba487d97Sopenharmony_ci    virtual void SetStreamCallback(const std::shared_ptr<StreamCallback> &callback) {}
180ba487d97Sopenharmony_ci
181ba487d97Sopenharmony_ciprivate:
182ba487d97Sopenharmony_ci
183ba487d97Sopenharmony_ci#ifndef SURFACE_DISABLED
184ba487d97Sopenharmony_ci    Surface* surface_;
185ba487d97Sopenharmony_ci    SurfaceBuffer* curBuffer_;
186ba487d97Sopenharmony_ci#endif
187ba487d97Sopenharmony_ci};
188ba487d97Sopenharmony_ci
189ba487d97Sopenharmony_ci/**
190ba487d97Sopenharmony_ci * @brief Provides functions to implement source-related operations.
191ba487d97Sopenharmony_ci *
192ba487d97Sopenharmony_ci * @since 1.0
193ba487d97Sopenharmony_ci * @version 1.0
194ba487d97Sopenharmony_ci */
195ba487d97Sopenharmony_ciclass Source {
196ba487d97Sopenharmony_cipublic:
197ba487d97Sopenharmony_ci    /**
198ba487d97Sopenharmony_ci     * @brief A constructor used to create a {@link Source} instance based on a specified URI.
199ba487d97Sopenharmony_ci     *
200ba487d97Sopenharmony_ci     * @param uri Indicates the media source URI, which can be a network URI or local file path.
201ba487d97Sopenharmony_ci     * @since 1.0
202ba487d97Sopenharmony_ci     * @version 1.0
203ba487d97Sopenharmony_ci     */
204ba487d97Sopenharmony_ci    explicit Source(const std::string& uri);
205ba487d97Sopenharmony_ci
206ba487d97Sopenharmony_ci    /**
207ba487d97Sopenharmony_ci     * @brief A constructor used to create a {@link Source} instance based on a specified URI and header.
208ba487d97Sopenharmony_ci     *
209ba487d97Sopenharmony_ci     * If the HTTP URL header does not carry valid information for network playback, this function is equivalent to
210ba487d97Sopenharmony_ci     * {@link Source(const std::string& uri)}.
211ba487d97Sopenharmony_ci     *
212ba487d97Sopenharmony_ci     * @param uri Indicates the media source URI.
213ba487d97Sopenharmony_ci     * @param header Indicates the header.
214ba487d97Sopenharmony_ci     * @since 1.0
215ba487d97Sopenharmony_ci     * @version 1.0
216ba487d97Sopenharmony_ci     */
217ba487d97Sopenharmony_ci    Source(const std::string &uri, const std::map<std::string, std::string> &header);
218ba487d97Sopenharmony_ci
219ba487d97Sopenharmony_ci    /**
220ba487d97Sopenharmony_ci     * @brief A constructor used to create a {@link Source} instance based on the stream source and format information.
221ba487d97Sopenharmony_ci     *
222ba487d97Sopenharmony_ci     *
223ba487d97Sopenharmony_ci     *
224ba487d97Sopenharmony_ci     * @param stream Indicates the media source stream. For details, see {@link StreamSource}.
225ba487d97Sopenharmony_ci     * @param formats Indicates stream data information, which is subject to the stream type. For example, the key
226ba487d97Sopenharmony_ci     * is {@link CODEC_MIME}, and the value is {@link MIME_AUDIO_AAC}. For details, see {@link Format}. This parameter
227ba487d97Sopenharmony_ci     * can be null if no information needs to be passed.
228ba487d97Sopenharmony_ci     * @since 1.0
229ba487d97Sopenharmony_ci     * @version 1.0
230ba487d97Sopenharmony_ci     */
231ba487d97Sopenharmony_ci    Source(const std::shared_ptr<StreamSource> &stream, const Format &formats);
232ba487d97Sopenharmony_ci
233ba487d97Sopenharmony_ci    /**
234ba487d97Sopenharmony_ci     * @brief A constructor used to create a {@link Source} instance based on the data stream consumer.
235ba487d97Sopenharmony_ci     *
236ba487d97Sopenharmony_ci     * @param dataConsumer Indicates the data stream consumer. For details, see {@link DataConsumer}.
237ba487d97Sopenharmony_ci     * @since 1.0
238ba487d97Sopenharmony_ci     * @version 1.0
239ba487d97Sopenharmony_ci     */
240ba487d97Sopenharmony_ci    explicit Source(const std::shared_ptr<DataConsumer> &dataConsumer);
241ba487d97Sopenharmony_ci
242ba487d97Sopenharmony_ci    ~Source() = default;
243ba487d97Sopenharmony_ci
244ba487d97Sopenharmony_ci    /**
245ba487d97Sopenharmony_ci     * @brief Obtains the source type.
246ba487d97Sopenharmony_ci     *
247ba487d97Sopenharmony_ci     * @return Returns the source type. For details, see {@link SourceType}.
248ba487d97Sopenharmony_ci     * @since 1.0
249ba487d97Sopenharmony_ci     * @version 1.0
250ba487d97Sopenharmony_ci     */
251ba487d97Sopenharmony_ci    SourceType GetSourceType() const;
252ba487d97Sopenharmony_ci
253ba487d97Sopenharmony_ci    /**
254ba487d97Sopenharmony_ci     * @brief Obtains the media source URI.
255ba487d97Sopenharmony_ci     *
256ba487d97Sopenharmony_ci     * This function is called only when the {@link SourceType} is {@link SOURCE_TYPE_URI}.
257ba487d97Sopenharmony_ci     *
258ba487d97Sopenharmony_ci     * @return Returns the media source URI.
259ba487d97Sopenharmony_ci     * @since 1.0
260ba487d97Sopenharmony_ci     * @version 1.0
261ba487d97Sopenharmony_ci     */
262ba487d97Sopenharmony_ci    const std::string &GetSourceUri() const;
263ba487d97Sopenharmony_ci
264ba487d97Sopenharmony_ci    /**
265ba487d97Sopenharmony_ci     * @brief Obtains the HTTP header for the media source.
266ba487d97Sopenharmony_ci     *
267ba487d97Sopenharmony_ci     * This function is called only when the {@link SourceType} is {@link SOURCE_TYPE_URI}.
268ba487d97Sopenharmony_ci     *
269ba487d97Sopenharmony_ci     * @return Returns the media source header.
270ba487d97Sopenharmony_ci     * @since 1.0
271ba487d97Sopenharmony_ci     * @version 1.0
272ba487d97Sopenharmony_ci     */
273ba487d97Sopenharmony_ci    const std::map<std::string, std::string> &GetSourceHeader() const;
274ba487d97Sopenharmony_ci
275ba487d97Sopenharmony_ci    /**
276ba487d97Sopenharmony_ci     * @brief Obtains information about the media source stream.
277ba487d97Sopenharmony_ci     *
278ba487d97Sopenharmony_ci     * This function is called only when the {@link SourceType} is {@link SOURCE_TYPE_STREAM}.
279ba487d97Sopenharmony_ci     *
280ba487d97Sopenharmony_ci     * @return Returns information about the media source stream. For details, see {@link StreamSource}.
281ba487d97Sopenharmony_ci     * @since 1.0
282ba487d97Sopenharmony_ci     * @version 1.0
283ba487d97Sopenharmony_ci     */
284ba487d97Sopenharmony_ci    const std::shared_ptr<StreamSource> &GetSourceStream() const;
285ba487d97Sopenharmony_ci
286ba487d97Sopenharmony_ci    /**
287ba487d97Sopenharmony_ci     * @brief Obtains the media source stream format.
288ba487d97Sopenharmony_ci     *
289ba487d97Sopenharmony_ci     * @return Returns the media source stream format. For details, see {@link Format}.
290ba487d97Sopenharmony_ci     * @since 1.0
291ba487d97Sopenharmony_ci     * @version 1.0
292ba487d97Sopenharmony_ci     */
293ba487d97Sopenharmony_ci    const Format &GetSourceStreamFormat() const;
294ba487d97Sopenharmony_ci
295ba487d97Sopenharmony_ci    /**
296ba487d97Sopenharmony_ci     * @brief Obtains the data stream consumer interface.
297ba487d97Sopenharmony_ci     *
298ba487d97Sopenharmony_ci     * This function is called only when the {@link SourceType} is {@link SOURCE_TYPE_STREAM}.
299ba487d97Sopenharmony_ci     *
300ba487d97Sopenharmony_ci     * @return Returns the data stream consumer interface. For details, see {@link DataConsumer}.
301ba487d97Sopenharmony_ci     * @since 1.0
302ba487d97Sopenharmony_ci     * @version 1.0
303ba487d97Sopenharmony_ci     */
304ba487d97Sopenharmony_ci    const std::shared_ptr<DataConsumer> &GetDataConsumer() const;
305ba487d97Sopenharmony_ci
306ba487d97Sopenharmony_ciprivate:
307ba487d97Sopenharmony_ci    std::string uri_;
308ba487d97Sopenharmony_ci    SourceType sourceType_;
309ba487d97Sopenharmony_ci    std::map<std::string, std::string> header_;
310ba487d97Sopenharmony_ci    std::shared_ptr<StreamSource> stream_;
311ba487d97Sopenharmony_ci    Format format_;
312ba487d97Sopenharmony_ci    std::shared_ptr<DataConsumer> dataConsumer_;
313ba487d97Sopenharmony_ci};
314ba487d97Sopenharmony_ci}  // namespace Media
315ba487d97Sopenharmony_ci}  // namespace OHOS
316ba487d97Sopenharmony_ci#endif  // SOURCE_H
317