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_INTF_CODEC_PLUGIN_H
17fa7767c5Sopenharmony_ci#define HISTREAMER_PLUGIN_INTF_CODEC_PLUGIN_H
18fa7767c5Sopenharmony_ci
19fa7767c5Sopenharmony_ci#include <vector>
20fa7767c5Sopenharmony_ci#include "plugin/common/plugin_caps.h"
21fa7767c5Sopenharmony_ci#include "plugin/interface/plugin_base.h"
22fa7767c5Sopenharmony_ci#include "plugin/interface/plugin_definition.h"
23fa7767c5Sopenharmony_ci
24fa7767c5Sopenharmony_cinamespace OHOS {
25fa7767c5Sopenharmony_cinamespace Media {
26fa7767c5Sopenharmony_cinamespace Plugin {
27fa7767c5Sopenharmony_ci/**
28fa7767c5Sopenharmony_ci * @brief Plugin data callback interface.
29fa7767c5Sopenharmony_ci *
30fa7767c5Sopenharmony_ci * @since 1.0
31fa7767c5Sopenharmony_ci * @version 1.0
32fa7767c5Sopenharmony_ci */
33fa7767c5Sopenharmony_cistruct DataCallback {
34fa7767c5Sopenharmony_ci    virtual ~DataCallback() = default;
35fa7767c5Sopenharmony_ci
36fa7767c5Sopenharmony_ci    /**
37fa7767c5Sopenharmony_ci     * @brief When the input buffer has been consumed inside the plugin.
38fa7767c5Sopenharmony_ci     *
39fa7767c5Sopenharmony_ci     * This function works with QueueInputBuffer to implement input data transmission.
40fa7767c5Sopenharmony_ci     *
41fa7767c5Sopenharmony_ci     * @param input Indicates the pointer to the input data.
42fa7767c5Sopenharmony_ci     */
43fa7767c5Sopenharmony_ci    virtual void OnInputBufferDone(const std::shared_ptr<Buffer>& input) = 0;
44fa7767c5Sopenharmony_ci
45fa7767c5Sopenharmony_ci    /**
46fa7767c5Sopenharmony_ci     * @brief When the out buffer has been produced inside the plugin.
47fa7767c5Sopenharmony_ci     *
48fa7767c5Sopenharmony_ci     * This function works with QueueOutputBuffer to implement out data transmission.
49fa7767c5Sopenharmony_ci     *
50fa7767c5Sopenharmony_ci     * @param output Indicates the pointer to the output data.
51fa7767c5Sopenharmony_ci     */
52fa7767c5Sopenharmony_ci    virtual void OnOutputBufferDone(const std::shared_ptr<Buffer>& output) = 0;
53fa7767c5Sopenharmony_ci};
54fa7767c5Sopenharmony_ci
55fa7767c5Sopenharmony_ci/**
56fa7767c5Sopenharmony_ci * @brief Codec Plugin Interface.
57fa7767c5Sopenharmony_ci *
58fa7767c5Sopenharmony_ci * Used for audio and video encoding and decoding.
59fa7767c5Sopenharmony_ci *
60fa7767c5Sopenharmony_ci * @since 1.0
61fa7767c5Sopenharmony_ci * @version 1.0
62fa7767c5Sopenharmony_ci */
63fa7767c5Sopenharmony_cistruct CodecPlugin : public PluginBase {
64fa7767c5Sopenharmony_ci    /// constructor
65fa7767c5Sopenharmony_ci    explicit CodecPlugin(std::string name): PluginBase(std::move(name)) {}
66fa7767c5Sopenharmony_ci
67fa7767c5Sopenharmony_ci    /**
68fa7767c5Sopenharmony_ci     * @brief Queues input data
69fa7767c5Sopenharmony_ci     *
70fa7767c5Sopenharmony_ci     * This function works with DataCallback::OnInputBufferDone to implement input data transmission.
71fa7767c5Sopenharmony_ci     *
72fa7767c5Sopenharmony_ci     * The function is valid only in the RUNNING state.
73fa7767c5Sopenharmony_ci     *
74fa7767c5Sopenharmony_ci     * @param inputBuffer  Indicates the pointer to the input data.
75fa7767c5Sopenharmony_ci     * @param timeoutMs    Indicates the timeout duration.
76fa7767c5Sopenharmony_ci     * @return  Execution status return
77fa7767c5Sopenharmony_ci     *  @retval OK: Plugin QueueInputBuffer succeeded.
78fa7767c5Sopenharmony_ci     *  @retval ERROR_INVALID_DATA: The input buffer is invalid.
79fa7767c5Sopenharmony_ci     *  @retval ERROR_TIMED_OUT: Operation timeout.
80fa7767c5Sopenharmony_ci     */
81fa7767c5Sopenharmony_ci    virtual Status QueueInputBuffer(const std::shared_ptr<Buffer>& inputBuffer, int32_t timeoutMs) = 0;
82fa7767c5Sopenharmony_ci
83fa7767c5Sopenharmony_ci    /**
84fa7767c5Sopenharmony_ci     * @brief Queues output data
85fa7767c5Sopenharmony_ci     *
86fa7767c5Sopenharmony_ci     * This function works with DataCallback::OnOutputBufferDone to implement output data transmission.
87fa7767c5Sopenharmony_ci     *
88fa7767c5Sopenharmony_ci     * The function is valid only in the RUNNING state.
89fa7767c5Sopenharmony_ci     *
90fa7767c5Sopenharmony_ci     * @param outputBuffers Indicates the pointer to the output data.
91fa7767c5Sopenharmony_ci     * @param timeoutMs     Indicates the timeout duration.
92fa7767c5Sopenharmony_ci     * @return  Execution status return
93fa7767c5Sopenharmony_ci     *  @retval OK: Plugin QueueOutputBuffer succeeded.
94fa7767c5Sopenharmony_ci     *  @retval ERROR_INVALID_DATA: The output buffer is invalid.
95fa7767c5Sopenharmony_ci     *  @retval ERROR_TIMED_OUT: Operation timeout.
96fa7767c5Sopenharmony_ci     */
97fa7767c5Sopenharmony_ci    virtual Status QueueOutputBuffer(const std::shared_ptr<Buffer>& outputBuffers, int32_t timeoutMs) = 0;
98fa7767c5Sopenharmony_ci
99fa7767c5Sopenharmony_ci    /**
100fa7767c5Sopenharmony_ci     * @brief Flushes data in the audio buffer.
101fa7767c5Sopenharmony_ci     *
102fa7767c5Sopenharmony_ci     * The function is valid only in after RUNNING state.
103fa7767c5Sopenharmony_ci     *
104fa7767c5Sopenharmony_ci     * @return  Execution status return
105fa7767c5Sopenharmony_ci     *  @retval OK: Plugin Flush succeeded.
106fa7767c5Sopenharmony_ci     */
107fa7767c5Sopenharmony_ci    virtual Status Flush() = 0;
108fa7767c5Sopenharmony_ci
109fa7767c5Sopenharmony_ci    /**
110fa7767c5Sopenharmony_ci     * @brief Sets the plugin callback data to notify the plugin user.
111fa7767c5Sopenharmony_ci     *
112fa7767c5Sopenharmony_ci     * This function can be called in any state except DESTROYED and INVALID.
113fa7767c5Sopenharmony_ci     *
114fa7767c5Sopenharmony_ci     * @param cb   Data callback, NULL callback listening is canceled.
115fa7767c5Sopenharmony_ci     * @return Execution status return
116fa7767c5Sopenharmony_ci     * @retval OK: Plugin SetDataCallback succeeded.
117fa7767c5Sopenharmony_ci     */
118fa7767c5Sopenharmony_ci    virtual Status SetDataCallback(DataCallback* dataCallback) = 0;
119fa7767c5Sopenharmony_ci};
120fa7767c5Sopenharmony_ci
121fa7767c5Sopenharmony_ci/// Codec plugin api major number.
122fa7767c5Sopenharmony_ci#define CODEC_API_VERSION_MAJOR (1)
123fa7767c5Sopenharmony_ci
124fa7767c5Sopenharmony_ci/// Codec plugin api minor number
125fa7767c5Sopenharmony_ci#define CODEC_API_VERSION_MINOR (0)
126fa7767c5Sopenharmony_ci
127fa7767c5Sopenharmony_ci/// Codec plugin version
128fa7767c5Sopenharmony_ci#define CODEC_API_VERSION MAKE_VERSION(CODEC_API_VERSION_MAJOR, CODEC_API_VERSION_MINOR)
129fa7767c5Sopenharmony_ci
130fa7767c5Sopenharmony_ci/**
131fa7767c5Sopenharmony_ci * @brief Describes the codec plugin information.
132fa7767c5Sopenharmony_ci *
133fa7767c5Sopenharmony_ci * @since 1.0
134fa7767c5Sopenharmony_ci * @version 1.0
135fa7767c5Sopenharmony_ci */
136fa7767c5Sopenharmony_cistruct CodecPluginDef : public PluginDefBase {
137fa7767c5Sopenharmony_ci    CodecMode codecMode {CodecMode::SOFTWARE};
138fa7767c5Sopenharmony_ci    CapabilitySet inCaps {};                   ///< Plug-in input capability, For details, @see Capability.
139fa7767c5Sopenharmony_ci    CapabilitySet outCaps {};                  ///< Plug-in output capability, For details, @see Capability.
140fa7767c5Sopenharmony_ci    PluginCreatorFunc<CodecPlugin> creator {nullptr}; ///< Codec plugin create function.
141fa7767c5Sopenharmony_ci    CodecPluginDef()
142fa7767c5Sopenharmony_ci    {
143fa7767c5Sopenharmony_ci        apiVersion = CODEC_API_VERSION; ///< Codec plugin version
144fa7767c5Sopenharmony_ci    }
145fa7767c5Sopenharmony_ci};
146fa7767c5Sopenharmony_ci} // namespace Plugin
147fa7767c5Sopenharmony_ci} // namespace Media
148fa7767c5Sopenharmony_ci} // namespace OHOS
149fa7767c5Sopenharmony_ci#endif // HISTREAMER_PLUGIN_INTF_CODEC_PLUGIN_H
150