129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar/* 229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * Copyright (C) 2016 The Android Open Source Project 329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * you may not use this file except in compliance with the License. 629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * You may obtain a copy of the License at 729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 1029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * Unless required by applicable law or agreed to in writing, software 1129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * See the License for the specific language governing permissions and 1429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * limitations under the License. 1529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar */ 1629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 1729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#ifndef C2WORK_H_ 1829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 1929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#define C2WORK_H_ 2029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 2129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <stdint.h> 2229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <stdbool.h> 2329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <C2Param.h> 2429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <C2Buffer.h> 2529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <C2Config.h> 2629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 2729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <memory> 2829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <list> 2929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#include <vector> 3029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 3129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnartypedef int status_t; 3229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 3329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarnamespace android { 3429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 3529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar/// \defgroup work Work and data processing 3629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar/// @{ 3729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 3829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarstruct C2SettingResult { 3929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar enum Failure { 4029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar READ_ONLY, ///< parameter is read-only and cannot be set 4129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar MISMATCH, ///< parameter mismatches input data 4229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BAD_VALUE, ///< parameter does not accept value 4329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BAD_TYPE, ///< parameter is not supported 4429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BAD_PORT, ///< parameter is not supported on the specific port 4529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BAD_INDEX, ///< parameter is not supported on the specific stream 4629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar CONFLICT, ///< parameter is in conflict with another setting 4729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar }; 4829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 4929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2ParamField field; 5029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar Failure failure; 5129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::unique_ptr<C2FieldSupportedValues> supportedValues; //< if different from normal (e.g. in conflict w/another param or input data) 5229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<C2ParamField> conflictingFields; 5329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 5429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 5529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar// ================================================================================================ 5629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar// WORK 5729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar// ================================================================================================ 5829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 5929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar// node_id-s 6029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnartypedef uint32_t node_id; 6129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 6229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarenum flags_t : uint32_t { 6329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BUFFERFLAG_CODEC_CONFIG, 6429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BUFFERFLAG_DROP_FRAME, 6529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar BUFFERFLAG_END_OF_STREAM, 6629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 6729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 6829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarenum { 6929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar kParamIndexWorkOrdinal, 7029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 7129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 7229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarstruct C2WorkOrdinalStruct { 7329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar uint64_t timestamp; 7429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar uint64_t frame_index; // submission ordinal on the initial component 7529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar uint64_t custom_ordinal; // can be given by the component, e.g. decode order 7629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 7729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar DEFINE_AND_DESCRIBE_C2STRUCT(WorkOrdinal) 7829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2FIELD(timestamp, "timestamp") 7929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2FIELD(frame_index, "frame-index") 8029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2FIELD(custom_ordinal, "custom-ordinal") 8129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 8229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 8329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarstruct C2BufferPack { 8429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar//public: 8529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar flags_t flags; 8629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2WorkOrdinalStruct ordinal; 8729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::vector<std::shared_ptr<C2Buffer>> buffers; 8829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar //< for initial work item, these may also come from the parser - if provided 8929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar //< for output buffers, these are the responses to requestedInfos 9029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::unique_ptr<C2Info>> infos; 9129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::shared_ptr<C2InfoBuffer>> infoBuffers; 9229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 9329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 9429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarstruct C2Worklet { 9529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar//public: 9629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar // IN 9729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar node_id component; 9829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 9929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::unique_ptr<C2Param>> tunings; //< tunings to be applied before processing this 10029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar // worklet 10129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<C2Param::Type> requestedInfos; 10229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::vector<std::shared_ptr<C2BlockAllocator>> allocators; //< This vector shall be the same size as 10329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar //< output.buffers. 10429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 10529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar // OUT 10629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2BufferPack output; 10729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::unique_ptr<C2SettingResult>> failures; 10829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 10929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 11029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar/** 11129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * This structure holds information about all a single work item. 11229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 11329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * This structure shall be passed by the client to the component for the first worklet. As such, 11429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * worklets must not be empty. The ownership of this object is passed. 11529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 11629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * input: 11729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * The input data to be processed. This is provided by the client with ownership. When the work 11829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * is returned, the input buffer-pack's buffer vector shall contain nullptrs. 11929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 12029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * worklets: 12129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * The chain of components and associated allocators, tunings and info requests that the data 12229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * must pass through. If this has more than a single element, the tunnels between successive 12329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * components of the worklet chain must have been (successfully) pre-registered at the time 12429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * the work is submitted. Allocating the output buffers in the worklets is the responsibility 12529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * of each component. Upon work submission, each output buffer-pack shall be an appropriately 12629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * sized vector containing nullptrs. When the work is completed/returned to the client, 12729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 12829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * worklets_processed: 12929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * It shall be initialized to 0 by the client when the work is submitted. 13029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * It shall contain the number of worklets that were successfully processed when the work is 13129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * returned. If this is less then the number of worklets, result must not be success. 13229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * It must be in the range of [0, worklets.size()]. 13329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * 13429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * result: 13529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * The final outcome of the work. If 0 when work is returned, it is assumed that all worklets 13629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar * have been processed. 13729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar */ 13829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarstruct C2Work { 13929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar//public: 14029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar // pre-chain infos (for portions of a tunneling chain that happend before this work-chain for 14129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar // this work item - due to framework facilitated (non-tunneled) work-chaining) 14229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::pair<std::unique_ptr<C2PortMimeConfig>, std::unique_ptr<C2Info>>> preChainInfos; 14329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::pair<std::unique_ptr<C2PortMimeConfig>, std::unique_ptr<C2Buffer>>> preChainInfoBlobs; 14429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 14529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2BufferPack input; 14629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<std::unique_ptr<C2Worklet>> worklets; 14729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 14829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar uint32_t worklets_processed; 14929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar status_t result; 15029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 15129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 15229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnarstruct C2WorkOutline { 15329a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar//public: 15429a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar C2WorkOrdinalStruct ordinal; 15529a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar std::list<node_id> chain; 15629a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar}; 15729a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 15829a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar/// @} 15929a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 16029a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar} // namespace android 16129a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar 16229a6ba9949e4127a9c6df2cc75033dbe97f501a9Lajos Molnar#endif // C2WORK_H_ 163