Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2017 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_PLATFORM_SUPPORT_H_
     18 #define STAGEFRIGHT_CODEC2_PLATFORM_SUPPORT_H_
     19 
     20 #include <C2Component.h>
     21 #include <C2ComponentFactory.h>
     22 
     23 #include <memory>
     24 
     25 namespace android {
     26 
     27 /**
     28  * Returns the platform allocator store.
     29  * \retval nullptr if the platform allocator store could not be obtained
     30  */
     31 std::shared_ptr<C2AllocatorStore> GetCodec2PlatformAllocatorStore();
     32 
     33 /**
     34  * Platform allocator store IDs
     35  */
     36 class C2PlatformAllocatorStore : public C2AllocatorStore {
     37 public:
     38     enum : id_t {
     39         /**
     40          * ID of the ion backed platform allocator.
     41          *
     42          * C2Handle consists of:
     43          *   fd  shared ion buffer handle
     44          *   int size (lo 32 bits)
     45          *   int size (hi 32 bits)
     46          *   int magic '\xc2io\x00'
     47          */
     48         ION = PLATFORM_START,
     49 
     50         /**
     51          * ID of the gralloc backed platform allocator.
     52          *
     53          * C2Handle layout is not public. Use C2AllocatorGralloc::UnwrapNativeCodec2GrallocHandle
     54          * to get the underlying gralloc handle from a C2Handle, and WrapNativeCodec2GrallocHandle
     55          * to create a C2Handle from a gralloc handle - for C2Allocator::priorAllocation.
     56          */
     57         GRALLOC,
     58 
     59         /**
     60          * ID of the bufferqueue backed platform allocator.
     61          *
     62          * C2Handle layout is not public. Use C2AllocatorGralloc::UnwrapNativeCodec2GrallocHandle
     63          * to get the underlying handle from a C2Handle, and WrapNativeCodec2GrallocHandle
     64          * to create a C2Handle from a handle - for C2Allocator::priorAllocation.
     65          */
     66         BUFFERQUEUE,
     67 
     68         /**
     69          * ID of indicating the end of platform allocator definition.
     70          *
     71          * \note always put this macro in the last place.
     72          *
     73          * Extended platform store plugin should use this macro as the start ID of its own allocator
     74          * types.
     75          */
     76         PLATFORM_END,
     77     };
     78 };
     79 
     80 /**
     81  * Retrieves a block pool for a component.
     82  *
     83  * \param id        the local ID of the block pool
     84  * \param component the component using the block pool (must be non-null)
     85  * \param pool      pointer to where the obtained block pool shall be stored on success. nullptr
     86  *                  will be stored here on failure
     87  *
     88  * \retval C2_OK        the operation was successful
     89  * \retval C2_BAD_VALUE the component is null
     90  * \retval C2_NOT_FOUND if the block pool does not exist
     91  * \retval C2_NO_MEMORY not enough memory to fetch the block pool (this return value is only
     92  *                      possible for basic pools)
     93  * \retval C2_TIMED_OUT the operation timed out (this return value is only possible for basic pools)
     94  * \retval C2_REFUSED   no permission to complete any required allocation (this return value is only
     95  *                      possible for basic pools)
     96  * \retval C2_CORRUPTED some unknown, unrecoverable error occured during operation (unexpected,
     97  *                      this return value is only possible for basic pools)
     98  */
     99 c2_status_t GetCodec2BlockPool(
    100         C2BlockPool::local_id_t id, std::shared_ptr<const C2Component> component,
    101         std::shared_ptr<C2BlockPool> *pool);
    102 
    103 /**
    104  * Creates a block pool.
    105  * \param allocatorId  the allocator ID which is used to allocate blocks
    106  * \param component     the component using the block pool (must be non-null)
    107  * \param pool          pointer to where the created block pool shall be store on success.
    108  *                      nullptr will be stored here on failure
    109  *
    110  * \retval C2_OK        the operation was successful
    111  * \retval C2_BAD_VALUE the component is null
    112  * \retval C2_NOT_FOUND if the allocator does not exist
    113  * \retval C2_NO_MEMORY not enough memory to create a block pool
    114  */
    115 c2_status_t CreateCodec2BlockPool(
    116         C2PlatformAllocatorStore::id_t allocatorId,
    117         std::shared_ptr<const C2Component> component,
    118         std::shared_ptr<C2BlockPool> *pool);
    119 
    120 /**
    121  * Returns the platform component store.
    122  * \retval nullptr if the platform component store could not be obtained
    123  */
    124 std::shared_ptr<C2ComponentStore> GetCodec2PlatformComponentStore();
    125 
    126 /**
    127  * Sets the preferred component store in this process for the sole purpose of accessing its
    128  * interface. If this is not called, the default IComponentStore HAL (if exists) is the preferred
    129  * store for this purpose. If the default IComponentStore HAL is not present, the platform
    130  * component store is used.
    131  */
    132 void SetPreferredCodec2ComponentStore(std::shared_ptr<C2ComponentStore> store);
    133 
    134 } // namespace android
    135 
    136 #endif // STAGEFRIGHT_CODEC2_PLATFORM_SUPPORT_H_
    137