Home | History | Annotate | Download | only in base
      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 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "SimpleC2Interface"
     19 #include <utils/Log.h>
     20 
     21 // use MediaDefs here vs. MediaCodecConstants as this is not MediaCodec specific/dependent
     22 #include <media/stagefright/foundation/MediaDefs.h>
     23 
     24 #include <SimpleC2Interface.h>
     25 
     26 namespace android {
     27 
     28 /* SimpleInterface */
     29 
     30 SimpleInterface<void>::BaseParams::BaseParams(
     31         const std::shared_ptr<C2ReflectorHelper> &reflector,
     32         C2String name,
     33         C2Component::kind_t kind,
     34         C2Component::domain_t domain,
     35         C2String mediaType,
     36         std::vector<C2String> aliases)
     37     : C2InterfaceHelper(reflector) {
     38     setDerivedInstance(this);
     39 
     40     addParameter(
     41             DefineParam(mName, C2_PARAMKEY_COMPONENT_NAME)
     42             .withConstValue(AllocSharedString<C2ComponentNameSetting>(name.c_str()))
     43             .build());
     44 
     45     if (aliases.size()) {
     46         C2String joined;
     47         for (const C2String &alias : aliases) {
     48             if (joined.length()) {
     49                 joined += ",";
     50             }
     51             joined += alias;
     52         }
     53         addParameter(
     54                 DefineParam(mAliases, C2_PARAMKEY_COMPONENT_ALIASES)
     55                 .withConstValue(AllocSharedString<C2ComponentAliasesSetting>(joined.c_str()))
     56                 .build());
     57     }
     58 
     59     addParameter(
     60             DefineParam(mKind, C2_PARAMKEY_COMPONENT_KIND)
     61             .withConstValue(new C2ComponentKindSetting(kind))
     62             .build());
     63 
     64     addParameter(
     65             DefineParam(mDomain, C2_PARAMKEY_COMPONENT_DOMAIN)
     66             .withConstValue(new C2ComponentDomainSetting(domain))
     67             .build());
     68 
     69     // simple interfaces have single streams
     70     addParameter(
     71             DefineParam(mInputStreamCount, C2_PARAMKEY_INPUT_STREAM_COUNT)
     72             .withConstValue(new C2PortStreamCountTuning::input(1))
     73             .build());
     74 
     75     addParameter(
     76             DefineParam(mOutputStreamCount, C2_PARAMKEY_OUTPUT_STREAM_COUNT)
     77             .withConstValue(new C2PortStreamCountTuning::output(1))
     78             .build());
     79 
     80     // set up buffer formats and allocators
     81 
     82     // default to linear buffers and no media type
     83     C2BufferData::type_t rawBufferType = C2BufferData::LINEAR;
     84     C2String rawMediaType;
     85     C2Allocator::id_t rawAllocator = C2AllocatorStore::DEFAULT_LINEAR;
     86     C2BlockPool::local_id_t rawPoolId = C2BlockPool::BASIC_LINEAR;
     87     C2BufferData::type_t codedBufferType = C2BufferData::LINEAR;
     88     C2Allocator::id_t codedAllocator = C2AllocatorStore::DEFAULT_LINEAR;
     89     C2BlockPool::local_id_t codedPoolId = C2BlockPool::BASIC_LINEAR;
     90 
     91     switch (domain) {
     92         case C2Component::DOMAIN_IMAGE:
     93         case C2Component::DOMAIN_VIDEO:
     94             // TODO: should we define raw image? The only difference is timestamp handling
     95             rawBufferType = C2BufferData::GRAPHIC;
     96             rawMediaType = MEDIA_MIMETYPE_VIDEO_RAW;
     97             rawAllocator = C2AllocatorStore::DEFAULT_GRAPHIC;
     98             rawPoolId = C2BlockPool::BASIC_GRAPHIC;
     99             break;
    100         case C2Component::DOMAIN_AUDIO:
    101             rawBufferType = C2BufferData::LINEAR;
    102             rawMediaType = MEDIA_MIMETYPE_AUDIO_RAW;
    103             rawAllocator = C2AllocatorStore::DEFAULT_LINEAR;
    104             rawPoolId = C2BlockPool::BASIC_LINEAR;
    105             break;
    106         default:
    107             break;
    108     }
    109     bool isEncoder = kind == C2Component::KIND_ENCODER;
    110 
    111     // handle raw decoders
    112     if (mediaType == rawMediaType) {
    113         codedBufferType = rawBufferType;
    114         codedAllocator = rawAllocator;
    115         codedPoolId = rawPoolId;
    116     }
    117 
    118     addParameter(
    119             DefineParam(mInputFormat, C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE)
    120             .withConstValue(new C2StreamBufferTypeSetting::input(
    121                     0u, isEncoder ? rawBufferType : codedBufferType))
    122             .build());
    123 
    124     addParameter(
    125             DefineParam(mInputMediaType, C2_PARAMKEY_INPUT_MEDIA_TYPE)
    126             .withConstValue(AllocSharedString<C2PortMediaTypeSetting::input>(
    127                     isEncoder ? rawMediaType : mediaType))
    128             .build());
    129 
    130     addParameter(
    131             DefineParam(mOutputFormat, C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE)
    132             .withConstValue(new C2StreamBufferTypeSetting::output(
    133                     0u, isEncoder ? codedBufferType : rawBufferType))
    134             .build());
    135 
    136     addParameter(
    137             DefineParam(mOutputMediaType, C2_PARAMKEY_OUTPUT_MEDIA_TYPE)
    138             .withConstValue(AllocSharedString<C2PortMediaTypeSetting::output>(
    139                     isEncoder ? mediaType : rawMediaType))
    140             .build());
    141 
    142     C2Allocator::id_t inputAllocators[1] = { isEncoder ? rawAllocator : codedAllocator };
    143     C2Allocator::id_t outputAllocators[1] = { isEncoder ? codedAllocator : rawAllocator };
    144     C2BlockPool::local_id_t outputPoolIds[1] = { isEncoder ? codedPoolId : rawPoolId };
    145 
    146     addParameter(
    147             DefineParam(mInputAllocators, C2_PARAMKEY_INPUT_ALLOCATORS)
    148             .withDefault(C2PortAllocatorsTuning::input::AllocShared(inputAllocators))
    149             .withFields({ C2F(mInputAllocators, m.values[0]).any(),
    150                           C2F(mInputAllocators, m.values).inRange(0, 1) })
    151             .withSetter(Setter<C2PortAllocatorsTuning::input>::NonStrictValuesWithNoDeps)
    152             .build());
    153 
    154     addParameter(
    155             DefineParam(mOutputAllocators, C2_PARAMKEY_OUTPUT_ALLOCATORS)
    156             .withDefault(C2PortAllocatorsTuning::output::AllocShared(outputAllocators))
    157             .withFields({ C2F(mOutputAllocators, m.values[0]).any(),
    158                           C2F(mOutputAllocators, m.values).inRange(0, 1) })
    159             .withSetter(Setter<C2PortAllocatorsTuning::output>::NonStrictValuesWithNoDeps)
    160             .build());
    161 
    162     addParameter(
    163             DefineParam(mOutputPoolIds, C2_PARAMKEY_OUTPUT_BLOCK_POOLS)
    164             .withDefault(C2PortBlockPoolsTuning::output::AllocShared(outputPoolIds))
    165             .withFields({ C2F(mOutputPoolIds, m.values[0]).any(),
    166                           C2F(mOutputPoolIds, m.values).inRange(0, 1) })
    167             .withSetter(Setter<C2PortBlockPoolsTuning::output>::NonStrictValuesWithNoDeps)
    168             .build());
    169 
    170     // add stateless params
    171     addParameter(
    172             DefineParam(mSubscribedParamIndices, C2_PARAMKEY_SUBSCRIBED_PARAM_INDICES)
    173             .withDefault(C2SubscribedParamIndicesTuning::AllocShared(0u))
    174             .withFields({ C2F(mSubscribedParamIndices, m.values[0]).any(),
    175                           C2F(mSubscribedParamIndices, m.values).any() })
    176             .withSetter(Setter<C2SubscribedParamIndicesTuning>::NonStrictValuesWithNoDeps)
    177             .build());
    178 
    179     /* TODO
    180 
    181     addParameter(
    182             DefineParam(mCurrentWorkOrdinal, C2_PARAMKEY_CURRENT_WORK)
    183             .withDefault(new C2CurrentWorkTuning())
    184             .withFields({ C2F(mCurrentWorkOrdinal, m.timeStamp).any(),
    185                           C2F(mCurrentWorkOrdinal, m.frameIndex).any(),
    186                           C2F(mCurrentWorkOrdinal, m.customOrdinal).any() })
    187             .withSetter(Setter<C2CurrentWorkTuning>::NonStrictValuesWithNoDeps)
    188             .build());
    189 
    190     addParameter(
    191             DefineParam(mLastInputQueuedWorkOrdinal, C2_PARAMKEY_LAST_INPUT_QUEUED)
    192             .withDefault(new C2LastWorkQueuedTuning::input())
    193             .withFields({ C2F(mLastInputQueuedWorkOrdinal, m.timeStamp).any(),
    194                           C2F(mLastInputQueuedWorkOrdinal, m.frameIndex).any(),
    195                           C2F(mLastInputQueuedWorkOrdinal, m.customOrdinal).any() })
    196             .withSetter(Setter<C2LastWorkQueuedTuning::input>::NonStrictValuesWithNoDeps)
    197             .build());
    198 
    199     addParameter(
    200             DefineParam(mLastOutputQueuedWorkOrdinal, C2_PARAMKEY_LAST_OUTPUT_QUEUED)
    201             .withDefault(new C2LastWorkQueuedTuning::output())
    202             .withFields({ C2F(mLastOutputQueuedWorkOrdinal, m.timeStamp).any(),
    203                           C2F(mLastOutputQueuedWorkOrdinal, m.frameIndex).any(),
    204                           C2F(mLastOutputQueuedWorkOrdinal, m.customOrdinal).any() })
    205             .withSetter(Setter<C2LastWorkQueuedTuning::output>::NonStrictValuesWithNoDeps)
    206             .build());
    207 
    208     std::shared_ptr<C2OutOfMemoryTuning> mOutOfMemory;
    209 
    210     std::shared_ptr<C2PortConfigCounterTuning::input> mInputConfigCounter;
    211     std::shared_ptr<C2PortConfigCounterTuning::output> mOutputConfigCounter;
    212     std::shared_ptr<C2ConfigCounterTuning> mDirectConfigCounter;
    213 
    214     */
    215 }
    216 
    217 void SimpleInterface<void>::BaseParams::noInputLatency() {
    218     addParameter(
    219             DefineParam(mRequestedInputDelay, C2_PARAMKEY_INPUT_DELAY_REQUEST)
    220             .withConstValue(new C2PortRequestedDelayTuning::input(0u))
    221             .build());
    222 
    223     addParameter(
    224             DefineParam(mActualInputDelay, C2_PARAMKEY_INPUT_DELAY)
    225             .withConstValue(new C2PortActualDelayTuning::input(0u))
    226             .build());
    227 }
    228 
    229 void SimpleInterface<void>::BaseParams::noOutputLatency() {
    230     addParameter(
    231             DefineParam(mRequestedOutputDelay, C2_PARAMKEY_OUTPUT_DELAY_REQUEST)
    232             .withConstValue(new C2PortRequestedDelayTuning::output(0u))
    233             .build());
    234 
    235     addParameter(
    236             DefineParam(mActualOutputDelay, C2_PARAMKEY_OUTPUT_DELAY)
    237             .withConstValue(new C2PortActualDelayTuning::output(0u))
    238             .build());
    239 }
    240 
    241 void SimpleInterface<void>::BaseParams::noPipelineLatency() {
    242     addParameter(
    243             DefineParam(mRequestedPipelineDelay, C2_PARAMKEY_PIPELINE_DELAY_REQUEST)
    244             .withConstValue(new C2RequestedPipelineDelayTuning(0u))
    245             .build());
    246 
    247     addParameter(
    248             DefineParam(mActualPipelineDelay, C2_PARAMKEY_PIPELINE_DELAY)
    249             .withConstValue(new C2ActualPipelineDelayTuning(0u))
    250             .build());
    251 }
    252 
    253 void SimpleInterface<void>::BaseParams::noPrivateBuffers() {
    254     addParameter(
    255             DefineParam(mPrivateAllocators, C2_PARAMKEY_PRIVATE_ALLOCATORS)
    256             .withConstValue(C2PrivateAllocatorsTuning::AllocShared(0u))
    257             .build());
    258 
    259     addParameter(
    260             DefineParam(mMaxPrivateBufferCount, C2_PARAMKEY_MAX_PRIVATE_BUFFER_COUNT)
    261             .withConstValue(C2MaxPrivateBufferCountTuning::AllocShared(0u))
    262             .build());
    263 
    264     addParameter(
    265             DefineParam(mPrivatePoolIds, C2_PARAMKEY_PRIVATE_BLOCK_POOLS)
    266             .withConstValue(C2PrivateBlockPoolsTuning::AllocShared(0u))
    267             .build());
    268 }
    269 
    270 void SimpleInterface<void>::BaseParams::noInputReferences() {
    271     addParameter(
    272             DefineParam(mMaxInputReferenceAge, C2_PARAMKEY_INPUT_MAX_REFERENCE_AGE)
    273             .withConstValue(new C2StreamMaxReferenceAgeTuning::input(0u))
    274             .build());
    275 
    276     addParameter(
    277             DefineParam(mMaxInputReferenceCount, C2_PARAMKEY_INPUT_MAX_REFERENCE_COUNT)
    278             .withConstValue(new C2StreamMaxReferenceCountTuning::input(0u))
    279             .build());
    280 }
    281 
    282 void SimpleInterface<void>::BaseParams::noOutputReferences() {
    283     addParameter(
    284             DefineParam(mMaxOutputReferenceAge, C2_PARAMKEY_OUTPUT_MAX_REFERENCE_AGE)
    285             .withConstValue(new C2StreamMaxReferenceAgeTuning::output(0u))
    286             .build());
    287 
    288     addParameter(
    289             DefineParam(mMaxOutputReferenceCount, C2_PARAMKEY_OUTPUT_MAX_REFERENCE_COUNT)
    290             .withConstValue(new C2StreamMaxReferenceCountTuning::output(0u))
    291             .build());
    292 }
    293 
    294 void SimpleInterface<void>::BaseParams::noTimeStretch() {
    295     addParameter(
    296             DefineParam(mTimeStretch, C2_PARAMKEY_TIME_STRETCH)
    297             .withConstValue(new C2ComponentTimeStretchTuning(1.f))
    298             .build());
    299 }
    300 
    301 /*
    302     Clients need to handle the following base params due to custom dependency.
    303 
    304     std::shared_ptr<C2ApiLevelSetting> mApiLevel;
    305     std::shared_ptr<C2ApiFeaturesSetting> mApiFeatures;
    306     std::shared_ptr<C2ComponentAttributesSetting> mAttrib;
    307 
    308     std::shared_ptr<C2PortSuggestedBufferCountTuning::input> mSuggestedInputBufferCount;
    309     std::shared_ptr<C2PortSuggestedBufferCountTuning::output> mSuggestedOutputBufferCount;
    310 
    311     std::shared_ptr<C2TrippedTuning> mTripped;
    312 
    313 */
    314 
    315 } // namespace android
    316