14344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim/*
24344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Copyright (C) 2018 The Android Open Source Project
34344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
44344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
54344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * you may not use this file except in compliance with the License.
64344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * You may obtain a copy of the License at
74344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
84344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
94344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Unless required by applicable law or agreed to in writing, software
114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * See the License for the specific language governing permissions and
144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * limitations under the License.
154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim */
164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#ifndef ANDROID_STAGEFRIGHT_C2PARAM_INTERNAL_H_
184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#define ANDROID_STAGEFRIGHT_C2PARAM_INTERNAL_H_
194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2Param.h>
214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstruct C2_HIDE _C2ParamInspector {
234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static uint32_t GetOffset(const C2FieldDescriptor &fd) {
244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return fd._mFieldId._mOffset;
254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2766f2b455c5bd1d38b5d06d39ffbad8a9d30a060aLajos Molnar    inline static void SetOffset(C2FieldDescriptor &fd, uint32_t offset) {
2866f2b455c5bd1d38b5d06d39ffbad8a9d30a060aLajos Molnar        fd._mFieldId._mOffset = offset;
2966f2b455c5bd1d38b5d06d39ffbad8a9d30a060aLajos Molnar    }
3066f2b455c5bd1d38b5d06d39ffbad8a9d30a060aLajos Molnar
3163884071081694791fb0074ad6a4b1faf3455297Lajos Molnar    inline static uint32_t GetEndOffset(const C2FieldDescriptor &fd, uint32_t paramSize = 0) {
3263884071081694791fb0074ad6a4b1faf3455297Lajos Molnar        uint32_t endOffset = fd._mFieldId._mOffset + fd._mExtent * fd._mFieldId._mSize;
3363884071081694791fb0074ad6a4b1faf3455297Lajos Molnar        /// for flex parameters return paramSize if given
3463884071081694791fb0074ad6a4b1faf3455297Lajos Molnar        return fd._mExtent ? endOffset : std::max(endOffset, paramSize);
3563884071081694791fb0074ad6a4b1faf3455297Lajos Molnar    }
3663884071081694791fb0074ad6a4b1faf3455297Lajos Molnar
374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static uint32_t GetSize(const C2FieldDescriptor &fd) {
384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return fd._mFieldId._mSize;
394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static uint32_t GetIndex(const C2ParamField &pf) {
424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return pf._mIndex;
434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static uint32_t GetOffset(const C2ParamField &pf) {
464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return pf._mFieldId._mOffset;
474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static uint32_t GetSize(const C2ParamField &pf) {
504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return pf._mFieldId._mSize;
514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5308aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    inline static uint32_t GetOffset(const _C2FieldId &f) {
5408aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar        return f._mOffset;
5508aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    }
5608aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar
5708aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    inline static uint32_t GetSize(const _C2FieldId &f) {
5808aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar        return f._mSize;
5908aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    }
6008aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar
6108aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    inline static _C2FieldId GetField(const C2FieldDescriptor &fd) {
6208aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar        return fd._mFieldId;
6308aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    }
6408aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar
654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static uint32_t GetAttrib(const C2ParamDescriptor &pd) {
664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return pd._mAttrib;
674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
6908aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    inline static _C2FieldId GetField(const C2ParamField &pf) {
7008aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar        return pf._mFieldId;
7108aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar    }
7208aa7f79d0b194faf05864645b1f81ad6964267bLajos Molnar
734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static
744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    C2ParamField CreateParamField(C2Param::Index index, uint32_t offset, uint32_t size) {
754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2ParamField(index, offset, size);
764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    inline static
794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    C2ParamField CreateParamField(C2Param::Index index, _C2FieldId field) {
804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2ParamField(index, field._mOffset, field._mSize);
814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
833bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    inline static
843bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    void TrimParam(C2Param *param, uint32_t newSize) {
853bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar        if (param && *param && param->size() > newSize && newSize >= sizeof(C2Param)) {
863bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar            param->_mSize = newSize;
873bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar        }
883bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    }
893bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
90e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    inline static void AddNamedValues(
91e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar            C2FieldDescriptor &fd, C2FieldDescriptor::NamedValuesType &&namedValues) {
92e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar        fd._mNamedValues = std::move(namedValues);
93e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    }
94e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar
95e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    inline static
96e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    C2StructDescriptor CreateStructDescriptor(C2Param::CoreIndex index,
97e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar                                        std::vector<C2FieldDescriptor> &&fields) {
98e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar        return C2StructDescriptor(index, std::move(fields));
99e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    }
100e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar
10163884071081694791fb0074ad6a4b1faf3455297Lajos Molnar    inline static
10263884071081694791fb0074ad6a4b1faf3455297Lajos Molnar    C2FieldDescriptor OffsetFieldDescriptor(const C2FieldDescriptor &fd, size_t offset) {
10363884071081694791fb0074ad6a4b1faf3455297Lajos Molnar        return C2FieldDescriptor(fd, offset);
10463884071081694791fb0074ad6a4b1faf3455297Lajos Molnar    }
10563884071081694791fb0074ad6a4b1faf3455297Lajos Molnar
1064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // expose attributes
1074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    typedef C2ParamDescriptor::attrib_t attrib_t;
1084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim};
1094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#endif // ANDROID_STAGEFRIGHT_C2PARAM_INTERNAL_H_
1114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
112