/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //#define LOG_NDEBUG 0 #define LOG_TAG "SimpleC2Interface" #include <utils/Log.h> // use MediaDefs here vs. MediaCodecConstants as this is not MediaCodec specific/dependent #include <media/stagefright/foundation/MediaDefs.h> #include <SimpleC2Interface.h> namespace android { /* SimpleInterface */ SimpleInterface<void>::BaseParams::BaseParams( const std::shared_ptr<C2ReflectorHelper> &reflector, C2String name, C2Component::kind_t kind, C2Component::domain_t domain, C2String mediaType, std::vector<C2String> aliases) : C2InterfaceHelper(reflector) { setDerivedInstance(this); addParameter( DefineParam(mName, C2_PARAMKEY_COMPONENT_NAME) .withConstValue(AllocSharedString<C2ComponentNameSetting>(name.c_str())) .build()); if (aliases.size()) { C2String joined; for (const C2String &alias : aliases) { if (joined.length()) { joined += ","; } joined += alias; } addParameter( DefineParam(mAliases, C2_PARAMKEY_COMPONENT_ALIASES) .withConstValue(AllocSharedString<C2ComponentAliasesSetting>(joined.c_str())) .build()); } addParameter( DefineParam(mKind, C2_PARAMKEY_COMPONENT_KIND) .withConstValue(new C2ComponentKindSetting(kind)) .build()); addParameter( DefineParam(mDomain, C2_PARAMKEY_COMPONENT_DOMAIN) .withConstValue(new C2ComponentDomainSetting(domain)) .build()); // simple interfaces have single streams addParameter( DefineParam(mInputStreamCount, C2_PARAMKEY_INPUT_STREAM_COUNT) .withConstValue(new C2PortStreamCountTuning::input(1)) .build()); addParameter( DefineParam(mOutputStreamCount, C2_PARAMKEY_OUTPUT_STREAM_COUNT) .withConstValue(new C2PortStreamCountTuning::output(1)) .build()); // set up buffer formats and allocators // default to linear buffers and no media type C2BufferData::type_t rawBufferType = C2BufferData::LINEAR; C2String rawMediaType; C2Allocator::id_t rawAllocator = C2AllocatorStore::DEFAULT_LINEAR; C2BlockPool::local_id_t rawPoolId = C2BlockPool::BASIC_LINEAR; C2BufferData::type_t codedBufferType = C2BufferData::LINEAR; C2Allocator::id_t codedAllocator = C2AllocatorStore::DEFAULT_LINEAR; C2BlockPool::local_id_t codedPoolId = C2BlockPool::BASIC_LINEAR; switch (domain) { case C2Component::DOMAIN_IMAGE: case C2Component::DOMAIN_VIDEO: // TODO: should we define raw image? The only difference is timestamp handling rawBufferType = C2BufferData::GRAPHIC; rawMediaType = MEDIA_MIMETYPE_VIDEO_RAW; rawAllocator = C2AllocatorStore::DEFAULT_GRAPHIC; rawPoolId = C2BlockPool::BASIC_GRAPHIC; break; case C2Component::DOMAIN_AUDIO: rawBufferType = C2BufferData::LINEAR; rawMediaType = MEDIA_MIMETYPE_AUDIO_RAW; rawAllocator = C2AllocatorStore::DEFAULT_LINEAR; rawPoolId = C2BlockPool::BASIC_LINEAR; break; default: break; } bool isEncoder = kind == C2Component::KIND_ENCODER; // handle raw decoders if (mediaType == rawMediaType) { codedBufferType = rawBufferType; codedAllocator = rawAllocator; codedPoolId = rawPoolId; } addParameter( DefineParam(mInputFormat, C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE) .withConstValue(new C2StreamBufferTypeSetting::input( 0u, isEncoder ? rawBufferType : codedBufferType)) .build()); addParameter( DefineParam(mInputMediaType, C2_PARAMKEY_INPUT_MEDIA_TYPE) .withConstValue(AllocSharedString<C2PortMediaTypeSetting::input>( isEncoder ? rawMediaType : mediaType)) .build()); addParameter( DefineParam(mOutputFormat, C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE) .withConstValue(new C2StreamBufferTypeSetting::output( 0u, isEncoder ? codedBufferType : rawBufferType)) .build()); addParameter( DefineParam(mOutputMediaType, C2_PARAMKEY_OUTPUT_MEDIA_TYPE) .withConstValue(AllocSharedString<C2PortMediaTypeSetting::output>( isEncoder ? mediaType : rawMediaType)) .build()); C2Allocator::id_t inputAllocators[1] = { isEncoder ? rawAllocator : codedAllocator }; C2Allocator::id_t outputAllocators[1] = { isEncoder ? codedAllocator : rawAllocator }; C2BlockPool::local_id_t outputPoolIds[1] = { isEncoder ? codedPoolId : rawPoolId }; addParameter( DefineParam(mInputAllocators, C2_PARAMKEY_INPUT_ALLOCATORS) .withDefault(C2PortAllocatorsTuning::input::AllocShared(inputAllocators)) .withFields({ C2F(mInputAllocators, m.values[0]).any(), C2F(mInputAllocators, m.values).inRange(0, 1) }) .withSetter(Setter<C2PortAllocatorsTuning::input>::NonStrictValuesWithNoDeps) .build()); addParameter( DefineParam(mOutputAllocators, C2_PARAMKEY_OUTPUT_ALLOCATORS) .withDefault(C2PortAllocatorsTuning::output::AllocShared(outputAllocators)) .withFields({ C2F(mOutputAllocators, m.values[0]).any(), C2F(mOutputAllocators, m.values).inRange(0, 1) }) .withSetter(Setter<C2PortAllocatorsTuning::output>::NonStrictValuesWithNoDeps) .build()); addParameter( DefineParam(mOutputPoolIds, C2_PARAMKEY_OUTPUT_BLOCK_POOLS) .withDefault(C2PortBlockPoolsTuning::output::AllocShared(outputPoolIds)) .withFields({ C2F(mOutputPoolIds, m.values[0]).any(), C2F(mOutputPoolIds, m.values).inRange(0, 1) }) .withSetter(Setter<C2PortBlockPoolsTuning::output>::NonStrictValuesWithNoDeps) .build()); // add stateless params addParameter( DefineParam(mSubscribedParamIndices, C2_PARAMKEY_SUBSCRIBED_PARAM_INDICES) .withDefault(C2SubscribedParamIndicesTuning::AllocShared(0u)) .withFields({ C2F(mSubscribedParamIndices, m.values[0]).any(), C2F(mSubscribedParamIndices, m.values).any() }) .withSetter(Setter<C2SubscribedParamIndicesTuning>::NonStrictValuesWithNoDeps) .build()); /* TODO addParameter( DefineParam(mCurrentWorkOrdinal, C2_PARAMKEY_CURRENT_WORK) .withDefault(new C2CurrentWorkTuning()) .withFields({ C2F(mCurrentWorkOrdinal, m.timeStamp).any(), C2F(mCurrentWorkOrdinal, m.frameIndex).any(), C2F(mCurrentWorkOrdinal, m.customOrdinal).any() }) .withSetter(Setter<C2CurrentWorkTuning>::NonStrictValuesWithNoDeps) .build()); addParameter( DefineParam(mLastInputQueuedWorkOrdinal, C2_PARAMKEY_LAST_INPUT_QUEUED) .withDefault(new C2LastWorkQueuedTuning::input()) .withFields({ C2F(mLastInputQueuedWorkOrdinal, m.timeStamp).any(), C2F(mLastInputQueuedWorkOrdinal, m.frameIndex).any(), C2F(mLastInputQueuedWorkOrdinal, m.customOrdinal).any() }) .withSetter(Setter<C2LastWorkQueuedTuning::input>::NonStrictValuesWithNoDeps) .build()); addParameter( DefineParam(mLastOutputQueuedWorkOrdinal, C2_PARAMKEY_LAST_OUTPUT_QUEUED) .withDefault(new C2LastWorkQueuedTuning::output()) .withFields({ C2F(mLastOutputQueuedWorkOrdinal, m.timeStamp).any(), C2F(mLastOutputQueuedWorkOrdinal, m.frameIndex).any(), C2F(mLastOutputQueuedWorkOrdinal, m.customOrdinal).any() }) .withSetter(Setter<C2LastWorkQueuedTuning::output>::NonStrictValuesWithNoDeps) .build()); std::shared_ptr<C2OutOfMemoryTuning> mOutOfMemory; std::shared_ptr<C2PortConfigCounterTuning::input> mInputConfigCounter; std::shared_ptr<C2PortConfigCounterTuning::output> mOutputConfigCounter; std::shared_ptr<C2ConfigCounterTuning> mDirectConfigCounter; */ } void SimpleInterface<void>::BaseParams::noInputLatency() { addParameter( DefineParam(mRequestedInputDelay, C2_PARAMKEY_INPUT_DELAY_REQUEST) .withConstValue(new C2PortRequestedDelayTuning::input(0u)) .build()); addParameter( DefineParam(mActualInputDelay, C2_PARAMKEY_INPUT_DELAY) .withConstValue(new C2PortActualDelayTuning::input(0u)) .build()); } void SimpleInterface<void>::BaseParams::noOutputLatency() { addParameter( DefineParam(mRequestedOutputDelay, C2_PARAMKEY_OUTPUT_DELAY_REQUEST) .withConstValue(new C2PortRequestedDelayTuning::output(0u)) .build()); addParameter( DefineParam(mActualOutputDelay, C2_PARAMKEY_OUTPUT_DELAY) .withConstValue(new C2PortActualDelayTuning::output(0u)) .build()); } void SimpleInterface<void>::BaseParams::noPipelineLatency() { addParameter( DefineParam(mRequestedPipelineDelay, C2_PARAMKEY_PIPELINE_DELAY_REQUEST) .withConstValue(new C2RequestedPipelineDelayTuning(0u)) .build()); addParameter( DefineParam(mActualPipelineDelay, C2_PARAMKEY_PIPELINE_DELAY) .withConstValue(new C2ActualPipelineDelayTuning(0u)) .build()); } void SimpleInterface<void>::BaseParams::noPrivateBuffers() { addParameter( DefineParam(mPrivateAllocators, C2_PARAMKEY_PRIVATE_ALLOCATORS) .withConstValue(C2PrivateAllocatorsTuning::AllocShared(0u)) .build()); addParameter( DefineParam(mMaxPrivateBufferCount, C2_PARAMKEY_MAX_PRIVATE_BUFFER_COUNT) .withConstValue(C2MaxPrivateBufferCountTuning::AllocShared(0u)) .build()); addParameter( DefineParam(mPrivatePoolIds, C2_PARAMKEY_PRIVATE_BLOCK_POOLS) .withConstValue(C2PrivateBlockPoolsTuning::AllocShared(0u)) .build()); } void SimpleInterface<void>::BaseParams::noInputReferences() { addParameter( DefineParam(mMaxInputReferenceAge, C2_PARAMKEY_INPUT_MAX_REFERENCE_AGE) .withConstValue(new C2StreamMaxReferenceAgeTuning::input(0u)) .build()); addParameter( DefineParam(mMaxInputReferenceCount, C2_PARAMKEY_INPUT_MAX_REFERENCE_COUNT) .withConstValue(new C2StreamMaxReferenceCountTuning::input(0u)) .build()); } void SimpleInterface<void>::BaseParams::noOutputReferences() { addParameter( DefineParam(mMaxOutputReferenceAge, C2_PARAMKEY_OUTPUT_MAX_REFERENCE_AGE) .withConstValue(new C2StreamMaxReferenceAgeTuning::output(0u)) .build()); addParameter( DefineParam(mMaxOutputReferenceCount, C2_PARAMKEY_OUTPUT_MAX_REFERENCE_COUNT) .withConstValue(new C2StreamMaxReferenceCountTuning::output(0u)) .build()); } void SimpleInterface<void>::BaseParams::noTimeStretch() { addParameter( DefineParam(mTimeStretch, C2_PARAMKEY_TIME_STRETCH) .withConstValue(new C2ComponentTimeStretchTuning(1.f)) .build()); } /* Clients need to handle the following base params due to custom dependency. std::shared_ptr<C2ApiLevelSetting> mApiLevel; std::shared_ptr<C2ApiFeaturesSetting> mApiFeatures; std::shared_ptr<C2ComponentAttributesSetting> mAttrib; std::shared_ptr<C2PortSuggestedBufferCountTuning::input> mSuggestedInputBufferCount; std::shared_ptr<C2PortSuggestedBufferCountTuning::output> mSuggestedOutputBufferCount; std::shared_ptr<C2TrippedTuning> mTripped; */ } // namespace android