1/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef STAGEFRIGHT_CODEC2_COMPONENT_FACTORY_H_
18#define STAGEFRIGHT_CODEC2_COMPONENT_FACTORY_H_
19
20#include <C2Component.h>
21
22#include <functional>
23#include <memory>
24
25/**
26 * Component factory object that enables to create a component and/or interface from a dynamically
27 * linked library. This is needed because the component/interfaces are managed objects, but we
28 * cannot safely create a managed object and pass it in C.
29 *
30 * Components/interfaces typically inherit from std::enable_shared_from_this, but C requires
31 * passing simple pointer, and shared_ptr constructor needs to know the class to be constructed
32 * derives from enable_shared_from_this.
33 *
34 */
35class C2ComponentFactory {
36public:
37    typedef std::function<void(::C2Component*)> ComponentDeleter;
38    typedef std::function<void(::C2ComponentInterface*)> InterfaceDeleter;
39
40    /**
41     * Creates a component.
42     *
43     * This method SHALL return within 100ms.
44     *
45     * \param id        component ID for the created component
46     * \param component shared pointer where the created component is stored. Cleared on
47     *                  failure and updated on success.
48     *
49     * \retval C2_OK        the component was created successfully
50     * \retval C2_TIMED_OUT could not create the component within the time limit (unexpected)
51     * \retval C2_CORRUPTED some unknown error prevented the creation of the component (unexpected)
52     *
53     * \retval C2_NO_MEMORY not enough memory to create the component
54     */
55    virtual c2_status_t createComponent(
56            c2_node_id_t id, std::shared_ptr<C2Component>* const component,
57            ComponentDeleter deleter = std::default_delete<C2Component>()) = 0;
58
59    /**
60     * Creates a component interface.
61     *
62     * This method SHALL return within 100ms.
63     *
64     * \param id        component interface ID for the created interface
65     * \param interface shared pointer where the created interface is stored. Cleared on
66     *                  failure and updated on success.
67     *
68     * \retval C2_OK        the component interface was created successfully
69     * \retval C2_TIMED_OUT could not create the component interface within the time limit
70     *                      (unexpected)
71     * \retval C2_CORRUPTED some unknown error prevented the creation of the component interface
72     *                      (unexpected)
73     *
74     * \retval C2_NO_MEMORY not enough memory to create the component interface
75     */
76    virtual c2_status_t createInterface(
77            c2_node_id_t id, std::shared_ptr<C2ComponentInterface>* const interface,
78            InterfaceDeleter deleter = std::default_delete<C2ComponentInterface>()) = 0;
79
80    virtual ~C2ComponentFactory() = default;
81
82    typedef ::C2ComponentFactory* (*CreateCodec2FactoryFunc)(void);
83    typedef void (*DestroyCodec2FactoryFunc)(::C2ComponentFactory*);
84};
85
86
87#endif // STAGEFRIGHT_CODEC2_COMPONENT_FACTORY_H_
88