1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (c) 2021-2021 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci * 7fa7767c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci * 9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci * limitations under the License. 14fa7767c5Sopenharmony_ci */ 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#ifndef HISTREAMER_PLUGIN_COMMON_CAPS_H 17fa7767c5Sopenharmony_ci#define HISTREAMER_PLUGIN_COMMON_CAPS_H 18fa7767c5Sopenharmony_ci 19fa7767c5Sopenharmony_ci#include <utility> 20fa7767c5Sopenharmony_ci#include <vector> // NOLINT: used it 21fa7767c5Sopenharmony_ci#include "plugin_tags.h" 22fa7767c5Sopenharmony_ci 23fa7767c5Sopenharmony_cinamespace OHOS { 24fa7767c5Sopenharmony_cinamespace Media { 25fa7767c5Sopenharmony_cinamespace Plugin { 26fa7767c5Sopenharmony_ci/// Indicates that the available capability type is an fixed value. 27fa7767c5Sopenharmony_citemplate <typename T> using FixedCapability = T; 28fa7767c5Sopenharmony_ci 29fa7767c5Sopenharmony_ci/// Indicates that the available capability type is an interval value. 30fa7767c5Sopenharmony_citemplate <typename T> using IntervalCapability = std::pair<T, T>; 31fa7767c5Sopenharmony_ci 32fa7767c5Sopenharmony_ci/// Indicates that the available capability types are discrete values. 33fa7767c5Sopenharmony_citemplate <typename T> using DiscreteCapability = std::vector<T>; 34fa7767c5Sopenharmony_ci 35fa7767c5Sopenharmony_ci/** 36fa7767c5Sopenharmony_ci * @brief The Capability describes the input and output capabilities of the plugin. 37fa7767c5Sopenharmony_ci * 38fa7767c5Sopenharmony_ci * It is basically a set of tags attached to the mime-type in order to 39fa7767c5Sopenharmony_ci * describe the mime-type more closely. 40fa7767c5Sopenharmony_ci * 41fa7767c5Sopenharmony_ci * @since 1.0 42fa7767c5Sopenharmony_ci * @version 1.0 43fa7767c5Sopenharmony_ci */ 44fa7767c5Sopenharmony_cistruct Capability { 45fa7767c5Sopenharmony_ci /** 46fa7767c5Sopenharmony_ci * @enum Capability ID is used to describe plugin capabilities or support capability matching. 47fa7767c5Sopenharmony_ci * All Capability ID must come from Tag. 48fa7767c5Sopenharmony_ci * 49fa7767c5Sopenharmony_ci * For details about the definition and usage, to see enum Tag in file plugin_tags.h. 50fa7767c5Sopenharmony_ci * 51fa7767c5Sopenharmony_ci * @since 1.0 52fa7767c5Sopenharmony_ci * @version 1.0 53fa7767c5Sopenharmony_ci */ 54fa7767c5Sopenharmony_ci enum struct Key : uint32_t { 55fa7767c5Sopenharmony_ci MEDIA_BITRATE = static_cast<uint32_t>(Tag::MEDIA_BITRATE), 56fa7767c5Sopenharmony_ci AUDIO_SAMPLE_RATE = static_cast<uint32_t>(Tag::AUDIO_SAMPLE_RATE), 57fa7767c5Sopenharmony_ci AUDIO_CHANNELS = static_cast<uint32_t>(Tag::AUDIO_CHANNELS), 58fa7767c5Sopenharmony_ci AUDIO_CHANNEL_LAYOUT = static_cast<uint32_t>(Tag::AUDIO_CHANNEL_LAYOUT), 59fa7767c5Sopenharmony_ci AUDIO_SAMPLE_FORMAT = static_cast<uint32_t>(Tag::AUDIO_SAMPLE_FORMAT), 60fa7767c5Sopenharmony_ci AUDIO_MPEG_VERSION = static_cast<uint32_t>(Tag::AUDIO_MPEG_VERSION), 61fa7767c5Sopenharmony_ci AUDIO_MPEG_LAYER = static_cast<uint32_t>(Tag::AUDIO_MPEG_LAYER), 62fa7767c5Sopenharmony_ci AUDIO_AAC_PROFILE = static_cast<uint32_t>(Tag::AUDIO_AAC_PROFILE), 63fa7767c5Sopenharmony_ci AUDIO_AAC_LEVEL = static_cast<uint32_t>(Tag::AUDIO_AAC_LEVEL), 64fa7767c5Sopenharmony_ci AUDIO_AAC_STREAM_FORMAT = static_cast<uint32_t>(Tag::AUDIO_AAC_STREAM_FORMAT), 65fa7767c5Sopenharmony_ci VIDEO_PIXEL_FORMAT = static_cast<uint32_t>(Tag::VIDEO_PIXEL_FORMAT), 66fa7767c5Sopenharmony_ci VIDEO_BIT_STREAM_FORMAT = static_cast<uint32_t>(Tag::VIDEO_BIT_STREAM_FORMAT), 67fa7767c5Sopenharmony_ci }; 68fa7767c5Sopenharmony_ci 69fa7767c5Sopenharmony_ci /// Used to store the capability in the key-value format. 70fa7767c5Sopenharmony_ci using KeyMap = std::map<Key, ValueType>; 71fa7767c5Sopenharmony_ci 72fa7767c5Sopenharmony_ci /// default constructor 73fa7767c5Sopenharmony_ci Capability() = default; 74fa7767c5Sopenharmony_ci 75fa7767c5Sopenharmony_ci /** 76fa7767c5Sopenharmony_ci * @brief constructor one capability with mime of m 77fa7767c5Sopenharmony_ci * 78fa7767c5Sopenharmony_ci * @param m mime string 79fa7767c5Sopenharmony_ci */ 80fa7767c5Sopenharmony_ci explicit Capability(std::string m):mime(std::move(m)){} 81fa7767c5Sopenharmony_ci 82fa7767c5Sopenharmony_ci /** 83fa7767c5Sopenharmony_ci * @brief Append one fix key into KeyMap 84fa7767c5Sopenharmony_ci * 85fa7767c5Sopenharmony_ci * @tparam T type of value 86fa7767c5Sopenharmony_ci * @param key Capability::Key 87fa7767c5Sopenharmony_ci * @param val value 88fa7767c5Sopenharmony_ci * @return reference of object 89fa7767c5Sopenharmony_ci */ 90fa7767c5Sopenharmony_ci template<typename T> 91fa7767c5Sopenharmony_ci Capability& AppendFixedKey(Key key, const T& val) 92fa7767c5Sopenharmony_ci { 93fa7767c5Sopenharmony_ci keys[key] = val; 94fa7767c5Sopenharmony_ci return *this; 95fa7767c5Sopenharmony_ci } 96fa7767c5Sopenharmony_ci 97fa7767c5Sopenharmony_ci /** 98fa7767c5Sopenharmony_ci * @brief Append one interval key i.e. [rangeStart, rangeEnd] into KeyMap 99fa7767c5Sopenharmony_ci * 100fa7767c5Sopenharmony_ci * @tparam T type of value 101fa7767c5Sopenharmony_ci * @param key Capability::Key 102fa7767c5Sopenharmony_ci * @param rangeStart range start 103fa7767c5Sopenharmony_ci * @param rangeEnd rang end 104fa7767c5Sopenharmony_ci * @return reference of object 105fa7767c5Sopenharmony_ci */ 106fa7767c5Sopenharmony_ci template<typename T> 107fa7767c5Sopenharmony_ci Capability& AppendIntervalKey(Key key, const T& rangeStart, const T& rangeEnd) 108fa7767c5Sopenharmony_ci { 109fa7767c5Sopenharmony_ci keys[key] = std::make_pair(rangeStart, rangeEnd); 110fa7767c5Sopenharmony_ci return *this; 111fa7767c5Sopenharmony_ci } 112fa7767c5Sopenharmony_ci 113fa7767c5Sopenharmony_ci /** 114fa7767c5Sopenharmony_ci * @brief Append one discrete key i.e. {val1, val2, ....} into KeyMap 115fa7767c5Sopenharmony_ci * 116fa7767c5Sopenharmony_ci * @tparam T type of value 117fa7767c5Sopenharmony_ci * @param key Capability::Key 118fa7767c5Sopenharmony_ci * @param discreteValues values 119fa7767c5Sopenharmony_ci * @return reference of object 120fa7767c5Sopenharmony_ci */ 121fa7767c5Sopenharmony_ci template<typename T> 122fa7767c5Sopenharmony_ci Capability& AppendDiscreteKeys(Key key, DiscreteCapability<T> discreteValues) 123fa7767c5Sopenharmony_ci { 124fa7767c5Sopenharmony_ci keys[key] = std::move(discreteValues); 125fa7767c5Sopenharmony_ci return *this; 126fa7767c5Sopenharmony_ci } 127fa7767c5Sopenharmony_ci 128fa7767c5Sopenharmony_ci /** 129fa7767c5Sopenharmony_ci * @brief set mime of this capability 130fa7767c5Sopenharmony_ci * 131fa7767c5Sopenharmony_ci * @param val mime value 132fa7767c5Sopenharmony_ci * @return reference of object 133fa7767c5Sopenharmony_ci */ 134fa7767c5Sopenharmony_ci Capability& SetMime(std::string val) 135fa7767c5Sopenharmony_ci { 136fa7767c5Sopenharmony_ci mime = std::move(val); 137fa7767c5Sopenharmony_ci return *this; 138fa7767c5Sopenharmony_ci } 139fa7767c5Sopenharmony_ci 140fa7767c5Sopenharmony_ci /// mime of capability. For details, see {@link constants.h} 141fa7767c5Sopenharmony_ci std::string mime; 142fa7767c5Sopenharmony_ci 143fa7767c5Sopenharmony_ci /// Store the parameters(Capability::Key, value pairs), which should be negotiated 144fa7767c5Sopenharmony_ci KeyMap keys; 145fa7767c5Sopenharmony_ci}; 146fa7767c5Sopenharmony_ci 147fa7767c5Sopenharmony_ci/// A collection of multiple capabilities 148fa7767c5Sopenharmony_ciusing CapabilitySet = std::vector<Capability>; 149fa7767c5Sopenharmony_ci} // namespace Plugin 150fa7767c5Sopenharmony_ci} // namespace Media 151fa7767c5Sopenharmony_ci} // namespace OHOS 152fa7767c5Sopenharmony_ci#endif // HISTREAMER_PLUGIN_COMMON_CAPS_H 153