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