1/*
2 * Copyright (C) 2016 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 C2WORK_H_
18
19#define C2WORK_H_
20
21#include <stdint.h>
22#include <stdbool.h>
23#include <C2Param.h>
24#include <C2Buffer.h>
25#include <C2Config.h>
26
27#include <memory>
28#include <list>
29#include <vector>
30
31typedef int status_t;
32
33namespace android {
34
35/// \defgroup work Work and data processing
36/// @{
37
38struct C2SettingResult {
39    enum Failure {
40        READ_ONLY,  ///< parameter is read-only and cannot be set
41        MISMATCH,   ///< parameter mismatches input data
42        BAD_VALUE,  ///< parameter does not accept value
43        BAD_TYPE,   ///< parameter is not supported
44        BAD_PORT,   ///< parameter is not supported on the specific port
45        BAD_INDEX,  ///< parameter is not supported on the specific stream
46        CONFLICT,   ///< parameter is in conflict with another setting
47    };
48
49    C2ParamField field;
50    Failure failure;
51    std::unique_ptr<C2FieldSupportedValues> supportedValues; //< if different from normal (e.g. in conflict w/another param or input data)
52    std::list<C2ParamField> conflictingFields;
53};
54
55// ================================================================================================
56//  WORK
57// ================================================================================================
58
59// node_id-s
60typedef uint32_t node_id;
61
62enum flags_t : uint32_t {
63    BUFFERFLAG_CODEC_CONFIG,
64    BUFFERFLAG_DROP_FRAME,
65    BUFFERFLAG_END_OF_STREAM,
66};
67
68enum {
69    kParamIndexWorkOrdinal,
70};
71
72struct C2WorkOrdinalStruct {
73    uint64_t timestamp;
74    uint64_t frame_index;    // submission ordinal on the initial component
75    uint64_t custom_ordinal; // can be given by the component, e.g. decode order
76
77    DEFINE_AND_DESCRIBE_C2STRUCT(WorkOrdinal)
78    C2FIELD(timestamp, "timestamp")
79    C2FIELD(frame_index, "frame-index")
80    C2FIELD(custom_ordinal, "custom-ordinal")
81};
82
83struct C2BufferPack {
84//public:
85    flags_t  flags;
86    C2WorkOrdinalStruct ordinal;
87    std::vector<std::shared_ptr<C2Buffer>> buffers;
88    //< for initial work item, these may also come from the parser - if provided
89    //< for output buffers, these are the responses to requestedInfos
90    std::list<std::unique_ptr<C2Info>>       infos;
91    std::list<std::shared_ptr<C2InfoBuffer>> infoBuffers;
92};
93
94struct C2Worklet {
95//public:
96    // IN
97    node_id component;
98
99    std::list<std::unique_ptr<C2Param>> tunings; //< tunings to be applied before processing this
100                                                 // worklet
101    std::list<C2Param::Type> requestedInfos;
102    std::vector<std::shared_ptr<C2BlockAllocator>> allocators; //< This vector shall be the same size as
103                                                          //< output.buffers.
104
105    // OUT
106    C2BufferPack output;
107    std::list<std::unique_ptr<C2SettingResult>> failures;
108};
109
110/**
111 * This structure holds information about all a single work item.
112 *
113 * This structure shall be passed by the client to the component for the first worklet. As such,
114 * worklets must not be empty. The ownership of this object is passed.
115 *
116 * input:
117 *      The input data to be processed. This is provided by the client with ownership. When the work
118 *      is returned, the input buffer-pack's buffer vector shall contain nullptrs.
119 *
120 * worklets:
121 *      The chain of components and associated allocators, tunings and info requests that the data
122 *      must pass through. If this has more than a single element, the tunnels between successive
123 *      components of the worklet chain must have been (successfully) pre-registered at the time
124 *      the work is submitted. Allocating the output buffers in the worklets is the responsibility
125 *      of each component. Upon work submission, each output buffer-pack shall be an appropriately
126 *      sized vector containing nullptrs. When the work is completed/returned to the client,
127 *
128 * worklets_processed:
129 *      It shall be initialized to 0 by the client when the work is submitted.
130 *      It shall contain the number of worklets that were successfully processed when the work is
131 *      returned. If this is less then the number of worklets, result must not be success.
132 *      It must be in the range of [0, worklets.size()].
133 *
134 * result:
135 *      The final outcome of the work. If 0 when work is returned, it is assumed that all worklets
136 *      have been processed.
137 */
138struct C2Work {
139//public:
140    // pre-chain infos (for portions of a tunneling chain that happend before this work-chain for
141    // this work item - due to framework facilitated (non-tunneled) work-chaining)
142    std::list<std::pair<std::unique_ptr<C2PortMimeConfig>, std::unique_ptr<C2Info>>> preChainInfos;
143    std::list<std::pair<std::unique_ptr<C2PortMimeConfig>, std::unique_ptr<C2Buffer>>> preChainInfoBlobs;
144
145    C2BufferPack input;
146    std::list<std::unique_ptr<C2Worklet>> worklets;
147
148    uint32_t worklets_processed;
149    status_t result;
150};
151
152struct C2WorkOutline {
153//public:
154    C2WorkOrdinalStruct ordinal;
155    std::list<node_id> chain;
156};
157
158/// @}
159
160}  // namespace android
161
162#endif  // C2WORK_H_
163