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