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 ¶ms) = 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