xref: /aosp_15_r20/external/libavc/fuzzer/svc_enc_fuzzer.cpp (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker #include <cmath>
21*495ae853SAndroid Build Coastguard Worker #include <cstdlib>
22*495ae853SAndroid Build Coastguard Worker #include <cstring>
23*495ae853SAndroid Build Coastguard Worker #include <memory>
24*495ae853SAndroid Build Coastguard Worker #include <numeric>
25*495ae853SAndroid Build Coastguard Worker #include <utility>
26*495ae853SAndroid Build Coastguard Worker #include <vector>
27*495ae853SAndroid Build Coastguard Worker 
28*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
29*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
30*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
31*495ae853SAndroid Build Coastguard Worker #include "isvce.h"
32*495ae853SAndroid Build Coastguard Worker 
33*495ae853SAndroid Build Coastguard Worker constexpr WORD32 kMeSpeedPreset[] = {100};
34*495ae853SAndroid Build Coastguard Worker constexpr WORD32 kDeblkLevel[] = {0, 2, 3, 4};
35*495ae853SAndroid Build Coastguard Worker constexpr IVE_AIR_MODE_T kAirMode[] = {IVE_AIR_MODE_NONE};
36*495ae853SAndroid Build Coastguard Worker constexpr IVE_SPEED_CONFIG kEncSpeed[] = {IVE_CONFIG, IVE_SLOWEST,    IVE_NORMAL,
37*495ae853SAndroid Build Coastguard Worker                                           IVE_FAST,   IVE_HIGH_SPEED, IVE_FASTEST};
38*495ae853SAndroid Build Coastguard Worker constexpr IV_PROFILE_T kProfile[] = {IV_PROFILE_BASE, IV_PROFILE_MAIN};
39*495ae853SAndroid Build Coastguard Worker constexpr IVE_RC_MODE_T kRCMode[] = {IVE_RC_NONE, IVE_RC_STORAGE, IVE_RC_CBR_NON_LOW_DELAY,
40*495ae853SAndroid Build Coastguard Worker                                      IVE_RC_CBR_LOW_DELAY};
41*495ae853SAndroid Build Coastguard Worker constexpr IV_COLOR_FORMAT_T kSupportedColorFormats[] = {IV_YUV_420P, IV_YUV_420SP_UV};
42*495ae853SAndroid Build Coastguard Worker constexpr WORD32 kSupportedLevels[] = {10, 9,  11, 12, 13, 20, 21, 22,
43*495ae853SAndroid Build Coastguard Worker                                        30, 31, 32, 40, 41, 42, 50, 51};
44*495ae853SAndroid Build Coastguard Worker constexpr IVE_SLICE_MODE_T kSliceMode[] = {IVE_SLICE_MODE_NONE};
45*495ae853SAndroid Build Coastguard Worker constexpr IV_ARCH_T kArchs[] = {
46*495ae853SAndroid Build Coastguard Worker     ARCH_ARM_NONEON, ARCH_ARM_A9Q, ARCH_ARM_A9A,      ARCH_ARM_A9,      ARCH_ARM_A7,
47*495ae853SAndroid Build Coastguard Worker     ARCH_ARM_A5,     ARCH_ARM_A15, ARCH_ARM_NEONINTR, ARCH_X86_GENERIC, ARCH_X86_SSSE3,
48*495ae853SAndroid Build Coastguard Worker     ARCH_X86_SSE42,  ARCH_ARM_A53, ARCH_ARM_A57,      ARCH_ARM_V8_NEON};
49*495ae853SAndroid Build Coastguard Worker constexpr DOUBLE kSpatialResRatio[] = {1.5, 2};
50*495ae853SAndroid Build Coastguard Worker constexpr UWORD8 kSpatialLayers[] = {1, 2, 3};
51*495ae853SAndroid Build Coastguard Worker constexpr UWORD8 kTemporalLayers[] = {1, 2, 3};
52*495ae853SAndroid Build Coastguard Worker constexpr size_t kAirModeNum = std::size(kAirMode);
53*495ae853SAndroid Build Coastguard Worker constexpr size_t kEncSpeedNum = std::size(kEncSpeed);
54*495ae853SAndroid Build Coastguard Worker constexpr size_t kMeSpeedPresetNum = std::size(kMeSpeedPreset);
55*495ae853SAndroid Build Coastguard Worker constexpr size_t kDeblkLevelNum = std::size(kDeblkLevel);
56*495ae853SAndroid Build Coastguard Worker constexpr size_t kProfileNum = std::size(kProfile);
57*495ae853SAndroid Build Coastguard Worker constexpr size_t kRCModeNum = std::size(kRCMode);
58*495ae853SAndroid Build Coastguard Worker constexpr size_t kSupportedColorFormatsNum = std::size(kSupportedColorFormats);
59*495ae853SAndroid Build Coastguard Worker constexpr size_t kSupportedLevelsNum = std::size(kSupportedLevels);
60*495ae853SAndroid Build Coastguard Worker constexpr size_t kSliceModeNum = std::size(kSliceMode);
61*495ae853SAndroid Build Coastguard Worker constexpr size_t kSpatialResRatioNum = std::size(kSpatialResRatio);
62*495ae853SAndroid Build Coastguard Worker constexpr size_t kSpatialLayersNum = std::size(kSpatialLayers);
63*495ae853SAndroid Build Coastguard Worker constexpr size_t kTemporalLayersNum = std::size(kTemporalLayers);
64*495ae853SAndroid Build Coastguard Worker constexpr size_t kMinQP = 0;
65*495ae853SAndroid Build Coastguard Worker constexpr size_t kMaxQP = 51;
66*495ae853SAndroid Build Coastguard Worker constexpr size_t kMaxWidth = 2560;
67*495ae853SAndroid Build Coastguard Worker constexpr size_t kMaxHeight = 2560;
68*495ae853SAndroid Build Coastguard Worker constexpr size_t kMaxBitrate = 500000000;
69*495ae853SAndroid Build Coastguard Worker constexpr UWORD8 kNumSeiMdcvPrimaries = 3;
70*495ae853SAndroid Build Coastguard Worker constexpr UWORD8 kNumSeiCcvPrimaries = 3;
71*495ae853SAndroid Build Coastguard Worker constexpr double kSvcCompliantDimProb = 0.75;
72*495ae853SAndroid Build Coastguard Worker constexpr size_t kMaxEncodeCalls = 100;
73*495ae853SAndroid Build Coastguard Worker 
74*495ae853SAndroid Build Coastguard Worker typedef enum ARG_INDICES_T
75*495ae853SAndroid Build Coastguard Worker {
76*495ae853SAndroid Build Coastguard Worker     IDX_WD_BYTE_1,
77*495ae853SAndroid Build Coastguard Worker     IDX_WD_BYTE_2,
78*495ae853SAndroid Build Coastguard Worker     IDX_HT_BYTE_1,
79*495ae853SAndroid Build Coastguard Worker     IDX_HT_BYTE_2,
80*495ae853SAndroid Build Coastguard Worker     IDX_COLOR_FORMAT,
81*495ae853SAndroid Build Coastguard Worker     IDX_ARCH_TYPE,
82*495ae853SAndroid Build Coastguard Worker     IDX_RC_MODE,
83*495ae853SAndroid Build Coastguard Worker     IDX_NUM_CORES,
84*495ae853SAndroid Build Coastguard Worker     IDX_NUM_ARCH,
85*495ae853SAndroid Build Coastguard Worker     IDX_NUM_B_FRAMES,
86*495ae853SAndroid Build Coastguard Worker     IDX_ENC_SPEED,
87*495ae853SAndroid Build Coastguard Worker     IDX_CONSTRAINED_INTRA_FLAG,
88*495ae853SAndroid Build Coastguard Worker     IDX_INTRA_4x4,
89*495ae853SAndroid Build Coastguard Worker     IDX_I_FRAME_QP,
90*495ae853SAndroid Build Coastguard Worker     IDX_P_FRAME_QP,
91*495ae853SAndroid Build Coastguard Worker     IDX_B_FRAME_QP,
92*495ae853SAndroid Build Coastguard Worker     IDX_BITRATE_BYTE_1,
93*495ae853SAndroid Build Coastguard Worker     IDX_BITRATE_BYTE_2,
94*495ae853SAndroid Build Coastguard Worker     IDX_FRAME_RATE,
95*495ae853SAndroid Build Coastguard Worker     IDX_INTRA_REFRESH,
96*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_HALF_PEL,
97*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_Q_PEL,
98*495ae853SAndroid Build Coastguard Worker     IDX_ME_SPEED_PRESET,
99*495ae853SAndroid Build Coastguard Worker     IDX_AIR_MODE,
100*495ae853SAndroid Build Coastguard Worker     IDX_DISABLE_DEBLOCK_LEVEL,
101*495ae853SAndroid Build Coastguard Worker     IDX_SEARCH_RANGE_X,
102*495ae853SAndroid Build Coastguard Worker     IDX_SEARCH_RANGE_Y,
103*495ae853SAndroid Build Coastguard Worker     IDX_I_INTERVAL,
104*495ae853SAndroid Build Coastguard Worker     IDX_IDR_INTERVAL,
105*495ae853SAndroid Build Coastguard Worker     IDX_SEI_MDCV_FLAG,
106*495ae853SAndroid Build Coastguard Worker     IDX_SEI_CLL_FLAG,
107*495ae853SAndroid Build Coastguard Worker     IDX_SEI_AVE_FLAG,
108*495ae853SAndroid Build Coastguard Worker     IDX_SEI_CCV_FLAG,
109*495ae853SAndroid Build Coastguard Worker     IDX_PROFILE,
110*495ae853SAndroid Build Coastguard Worker     IDX_ASPECT_RATIO_FLAG,
111*495ae853SAndroid Build Coastguard Worker     IDX_NAL_HRD_FLAG,
112*495ae853SAndroid Build Coastguard Worker     IDX_VCL_HRD_FLAG,
113*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_FORCE_IDR,
114*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_DYNAMIC_BITRATE,
115*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_DYNAMIC_FRAME_RATE,
116*495ae853SAndroid Build Coastguard Worker     IDX_FORCE_IDR_INTERVAL,
117*495ae853SAndroid Build Coastguard Worker     IDX_DYNAMIC_BITRATE_INTERVAL,
118*495ae853SAndroid Build Coastguard Worker     IDX_DYNAMIC_FRAME_RATE_INTERVAL,
119*495ae853SAndroid Build Coastguard Worker     IDX_ENC_LEVEL,
120*495ae853SAndroid Build Coastguard Worker     IDX_RECON_FMT,
121*495ae853SAndroid Build Coastguard Worker     IDX_SLICE_MODE,
122*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_FAST_SAD,
123*495ae853SAndroid Build Coastguard Worker     IDX_NUM_SPATIAL_LAYERS,
124*495ae853SAndroid Build Coastguard Worker     IDX_NUM_TEMPORAL_LAYERS,
125*495ae853SAndroid Build Coastguard Worker     IDX_SPATIAL_RES_RATIO,
126*495ae853SAndroid Build Coastguard Worker     IDX_SVC_COMPLIANT_DIMS,
127*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_RECON,
128*495ae853SAndroid Build Coastguard Worker     IDX_ENABLE_NALU_INFO_EXPORT,
129*495ae853SAndroid Build Coastguard Worker     IDX_LAST
130*495ae853SAndroid Build Coastguard Worker } ARG_INDICES_T;
131*495ae853SAndroid Build Coastguard Worker 
132*495ae853SAndroid Build Coastguard Worker class Codec
133*495ae853SAndroid Build Coastguard Worker {
134*495ae853SAndroid Build Coastguard Worker    public:
135*495ae853SAndroid Build Coastguard Worker     struct FrameDims
136*495ae853SAndroid Build Coastguard Worker     {
137*495ae853SAndroid Build Coastguard Worker         size_t mWidth;
138*495ae853SAndroid Build Coastguard Worker         size_t mHeight;
139*495ae853SAndroid Build Coastguard Worker 
FrameDimsCodec::FrameDims140*495ae853SAndroid Build Coastguard Worker         FrameDims(size_t w, size_t h) : mWidth(w), mHeight(h) {}
FrameDimsCodec::FrameDims141*495ae853SAndroid Build Coastguard Worker         FrameDims(const std::pair<size_t, size_t> &dimPair)
142*495ae853SAndroid Build Coastguard Worker             : FrameDims(dimPair.first, dimPair.second)
143*495ae853SAndroid Build Coastguard Worker         {
144*495ae853SAndroid Build Coastguard Worker         }
FrameDimsCodec::FrameDims145*495ae853SAndroid Build Coastguard Worker         FrameDims(const FrameDims &other) : FrameDims(other.mWidth, other.mHeight) {}
146*495ae853SAndroid Build Coastguard Worker 
operator =Codec::FrameDims147*495ae853SAndroid Build Coastguard Worker         void operator=(const FrameDims &other)
148*495ae853SAndroid Build Coastguard Worker         {
149*495ae853SAndroid Build Coastguard Worker             mWidth = other.mWidth;
150*495ae853SAndroid Build Coastguard Worker             mHeight = other.mHeight;
151*495ae853SAndroid Build Coastguard Worker         }
152*495ae853SAndroid Build Coastguard Worker 
getFrameSizeCodec::FrameDims153*495ae853SAndroid Build Coastguard Worker         size_t getFrameSize() const { return (mWidth * mHeight * 3) / 2; };
154*495ae853SAndroid Build Coastguard Worker     };
155*495ae853SAndroid Build Coastguard Worker 
156*495ae853SAndroid Build Coastguard Worker     struct EncBufs
157*495ae853SAndroid Build Coastguard Worker     {
158*495ae853SAndroid Build Coastguard Worker         std::vector<UWORD8> mInputBuf;
159*495ae853SAndroid Build Coastguard Worker         std::vector<UWORD8> mOutputBuf;
160*495ae853SAndroid Build Coastguard Worker         std::vector<UWORD8> mReconBuf;
161*495ae853SAndroid Build Coastguard Worker         std::vector<isvce_nalu_info_buf_t> mNaluInfoStructBuf;
162*495ae853SAndroid Build Coastguard Worker         std::vector<std::vector<UWORD8>> mNaluInfoDataBuf;
163*495ae853SAndroid Build Coastguard Worker     };
164*495ae853SAndroid Build Coastguard Worker 
Codec()165*495ae853SAndroid Build Coastguard Worker     Codec()
166*495ae853SAndroid Build Coastguard Worker         : mCodecCtx(nullptr),
167*495ae853SAndroid Build Coastguard Worker           mMemRecords(),
168*495ae853SAndroid Build Coastguard Worker           mMemRecBufs(),
169*495ae853SAndroid Build Coastguard Worker           mEncBufs(),
170*495ae853SAndroid Build Coastguard Worker           mAirMode(IVE_AIR_MODE_NONE),
171*495ae853SAndroid Build Coastguard Worker           mEncSpeed(IVE_NORMAL),
172*495ae853SAndroid Build Coastguard Worker           mRCMode(IVE_RC_NONE),
173*495ae853SAndroid Build Coastguard Worker           mArch(ARCH_NA),
174*495ae853SAndroid Build Coastguard Worker           mSliceMode(IVE_SLICE_MODE_NONE),
175*495ae853SAndroid Build Coastguard Worker           mIvVideoColorFormat(IV_YUV_420P),
176*495ae853SAndroid Build Coastguard Worker           mProfile(IV_PROFILE_BASE),
177*495ae853SAndroid Build Coastguard Worker           mSvcCompDims{kMaxWidth, kMaxHeight},
178*495ae853SAndroid Build Coastguard Worker           mInputDims{kMaxWidth, kMaxHeight},
179*495ae853SAndroid Build Coastguard Worker           mHalfPelEnable(1),
180*495ae853SAndroid Build Coastguard Worker           mQPelEnable(1),
181*495ae853SAndroid Build Coastguard Worker           mIntra4x4(0),
182*495ae853SAndroid Build Coastguard Worker           mEnableFastSad(0),
183*495ae853SAndroid Build Coastguard Worker           mEnableAltRef(0),
184*495ae853SAndroid Build Coastguard Worker           mConstrainedIntraFlag(0),
185*495ae853SAndroid Build Coastguard Worker           mSeiCllFlag(1),
186*495ae853SAndroid Build Coastguard Worker           mSeiAveFlag(1),
187*495ae853SAndroid Build Coastguard Worker           mSeiCcvFlag(1),
188*495ae853SAndroid Build Coastguard Worker           mSeiMdcvFlag(1),
189*495ae853SAndroid Build Coastguard Worker           mAspectRatioFlag(0),
190*495ae853SAndroid Build Coastguard Worker           mNalHrdFlag(0),
191*495ae853SAndroid Build Coastguard Worker           mVclHrdFlag(0),
192*495ae853SAndroid Build Coastguard Worker           mIsForceIdrEnabled(false),
193*495ae853SAndroid Build Coastguard Worker           mIsDynamicBitRateChangeEnabled(false),
194*495ae853SAndroid Build Coastguard Worker           mIsDynamicFrameRateChangeEnabled(false),
195*495ae853SAndroid Build Coastguard Worker           mEnableRecon(false),
196*495ae853SAndroid Build Coastguard Worker           mEnableNaluInfoExport(false),
197*495ae853SAndroid Build Coastguard Worker           mAvcEncLevel(41),
198*495ae853SAndroid Build Coastguard Worker           mNumMemRecords(0),
199*495ae853SAndroid Build Coastguard Worker           mNumCores(1),
200*495ae853SAndroid Build Coastguard Worker           mBframes(0),
201*495ae853SAndroid Build Coastguard Worker           mSliceParam(256),
202*495ae853SAndroid Build Coastguard Worker           mMeSpeedPreset(100),
203*495ae853SAndroid Build Coastguard Worker           mIInterval(60),
204*495ae853SAndroid Build Coastguard Worker           mIDRInterval(60),
205*495ae853SAndroid Build Coastguard Worker           mDisableDeblockLevel(0),
206*495ae853SAndroid Build Coastguard Worker           m_I_QP(22),
207*495ae853SAndroid Build Coastguard Worker           m_P_QP(28),
208*495ae853SAndroid Build Coastguard Worker           m_B_QP(22),
209*495ae853SAndroid Build Coastguard Worker           mIntraRefresh(30),
210*495ae853SAndroid Build Coastguard Worker           mSearchRangeX(64),
211*495ae853SAndroid Build Coastguard Worker           mSearchRangeY(48),
212*495ae853SAndroid Build Coastguard Worker           mForceIdrInterval(0),
213*495ae853SAndroid Build Coastguard Worker           mDynamicBitRateInterval(0),
214*495ae853SAndroid Build Coastguard Worker           mDynamicFrameRateInterval(0),
215*495ae853SAndroid Build Coastguard Worker           mBitrate(6000000),
216*495ae853SAndroid Build Coastguard Worker           mFrameRate(30),
217*495ae853SAndroid Build Coastguard Worker           mNumSpatialLayers(1),
218*495ae853SAndroid Build Coastguard Worker           mNumTemporalLayers(1),
219*495ae853SAndroid Build Coastguard Worker           mSpatialResRatio(2)
220*495ae853SAndroid Build Coastguard Worker     {
221*495ae853SAndroid Build Coastguard Worker     }
222*495ae853SAndroid Build Coastguard Worker 
~Codec()223*495ae853SAndroid Build Coastguard Worker     ~Codec() { delMemRecs(); };
224*495ae853SAndroid Build Coastguard Worker 
225*495ae853SAndroid Build Coastguard Worker     bool initEncoder(const UWORD8 *data);
226*495ae853SAndroid Build Coastguard Worker     bool encodeFrames(const UWORD8 *data, size_t size);
227*495ae853SAndroid Build Coastguard Worker 
228*495ae853SAndroid Build Coastguard Worker    private:
229*495ae853SAndroid Build Coastguard Worker     void setEncParams(iv_raw_buf_t *psInpRawBuf, std::vector<UWORD8> &buf, const FrameDims &dims,
230*495ae853SAndroid Build Coastguard Worker                       IV_COLOR_FORMAT_T colorFormat = IV_YUV_420P);
231*495ae853SAndroid Build Coastguard Worker     void setFrameType(IV_PICTURE_CODING_TYPE_T eFrameType);
232*495ae853SAndroid Build Coastguard Worker     void setQp();
233*495ae853SAndroid Build Coastguard Worker     void setEncMode(IVE_ENC_MODE_T eEncMode);
234*495ae853SAndroid Build Coastguard Worker     void setDimensions();
235*495ae853SAndroid Build Coastguard Worker     void setNumCores();
236*495ae853SAndroid Build Coastguard Worker     void setFrameRate();
237*495ae853SAndroid Build Coastguard Worker     void setIpeParams();
238*495ae853SAndroid Build Coastguard Worker     void setBitRate();
239*495ae853SAndroid Build Coastguard Worker     void setAirParams();
240*495ae853SAndroid Build Coastguard Worker     void setMeParams();
241*495ae853SAndroid Build Coastguard Worker     void setGopParams();
242*495ae853SAndroid Build Coastguard Worker     void setProfileParams();
243*495ae853SAndroid Build Coastguard Worker     void setDeblockParams();
244*495ae853SAndroid Build Coastguard Worker     void setVbvParams();
245*495ae853SAndroid Build Coastguard Worker     void setDefault();
246*495ae853SAndroid Build Coastguard Worker     void setVuiParams();
247*495ae853SAndroid Build Coastguard Worker     void getBufInfo();
248*495ae853SAndroid Build Coastguard Worker     void setSeiMdcvParams();
249*495ae853SAndroid Build Coastguard Worker     void setSeiCllParams();
250*495ae853SAndroid Build Coastguard Worker     void setSeiAveParams();
251*495ae853SAndroid Build Coastguard Worker     void setSeiCcvParams();
252*495ae853SAndroid Build Coastguard Worker     void logVersion();
253*495ae853SAndroid Build Coastguard Worker     void initEncBufs();
254*495ae853SAndroid Build Coastguard Worker     bool initMemRecs();
255*495ae853SAndroid Build Coastguard Worker     void delMemRecs();
256*495ae853SAndroid Build Coastguard Worker 
257*495ae853SAndroid Build Coastguard Worker     iv_obj_t *mCodecCtx;
258*495ae853SAndroid Build Coastguard Worker     std::vector<iv_mem_rec_t> mMemRecords;
259*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD8 *> mMemRecBufs;
260*495ae853SAndroid Build Coastguard Worker     EncBufs mEncBufs;
261*495ae853SAndroid Build Coastguard Worker 
262*495ae853SAndroid Build Coastguard Worker     IVE_AIR_MODE_T mAirMode;
263*495ae853SAndroid Build Coastguard Worker     IVE_SPEED_CONFIG mEncSpeed;
264*495ae853SAndroid Build Coastguard Worker     IVE_RC_MODE_T mRCMode;
265*495ae853SAndroid Build Coastguard Worker     IV_ARCH_T mArch;
266*495ae853SAndroid Build Coastguard Worker     IVE_SLICE_MODE_T mSliceMode;
267*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T mIvVideoColorFormat;
268*495ae853SAndroid Build Coastguard Worker     IV_PROFILE_T mProfile;
269*495ae853SAndroid Build Coastguard Worker     FrameDims mSvcCompDims;
270*495ae853SAndroid Build Coastguard Worker     FrameDims mInputDims;
271*495ae853SAndroid Build Coastguard Worker 
272*495ae853SAndroid Build Coastguard Worker     bool mHalfPelEnable;
273*495ae853SAndroid Build Coastguard Worker     bool mQPelEnable;
274*495ae853SAndroid Build Coastguard Worker     bool mIntra4x4;
275*495ae853SAndroid Build Coastguard Worker     bool mEnableFastSad;
276*495ae853SAndroid Build Coastguard Worker     bool mEnableAltRef;
277*495ae853SAndroid Build Coastguard Worker     bool mConstrainedIntraFlag;
278*495ae853SAndroid Build Coastguard Worker     bool mSeiCllFlag;
279*495ae853SAndroid Build Coastguard Worker     bool mSeiAveFlag;
280*495ae853SAndroid Build Coastguard Worker     bool mSeiCcvFlag;
281*495ae853SAndroid Build Coastguard Worker     bool mSeiMdcvFlag;
282*495ae853SAndroid Build Coastguard Worker     bool mAspectRatioFlag;
283*495ae853SAndroid Build Coastguard Worker     bool mNalHrdFlag;
284*495ae853SAndroid Build Coastguard Worker     bool mVclHrdFlag;
285*495ae853SAndroid Build Coastguard Worker     bool mIsForceIdrEnabled;
286*495ae853SAndroid Build Coastguard Worker     bool mIsDynamicBitRateChangeEnabled;
287*495ae853SAndroid Build Coastguard Worker     bool mIsDynamicFrameRateChangeEnabled;
288*495ae853SAndroid Build Coastguard Worker     bool mEnableRecon;
289*495ae853SAndroid Build Coastguard Worker     bool mEnableNaluInfoExport;
290*495ae853SAndroid Build Coastguard Worker     UWORD32 mAvcEncLevel;
291*495ae853SAndroid Build Coastguard Worker     UWORD32 mNumMemRecords;
292*495ae853SAndroid Build Coastguard Worker     UWORD32 mNumCores;
293*495ae853SAndroid Build Coastguard Worker     UWORD32 mBframes;
294*495ae853SAndroid Build Coastguard Worker     UWORD32 mSliceParam;
295*495ae853SAndroid Build Coastguard Worker     UWORD32 mMeSpeedPreset;
296*495ae853SAndroid Build Coastguard Worker     UWORD32 mIInterval;
297*495ae853SAndroid Build Coastguard Worker     UWORD32 mIDRInterval;
298*495ae853SAndroid Build Coastguard Worker     UWORD32 mDisableDeblockLevel;
299*495ae853SAndroid Build Coastguard Worker     UWORD32 m_I_QP;
300*495ae853SAndroid Build Coastguard Worker     UWORD32 m_P_QP;
301*495ae853SAndroid Build Coastguard Worker     UWORD32 m_B_QP;
302*495ae853SAndroid Build Coastguard Worker     UWORD32 mIntraRefresh;
303*495ae853SAndroid Build Coastguard Worker     UWORD32 mSearchRangeX;
304*495ae853SAndroid Build Coastguard Worker     UWORD32 mSearchRangeY;
305*495ae853SAndroid Build Coastguard Worker     /* Units - number of frames */
306*495ae853SAndroid Build Coastguard Worker     UWORD32 mForceIdrInterval;
307*495ae853SAndroid Build Coastguard Worker     /* Units - number of frames */
308*495ae853SAndroid Build Coastguard Worker     UWORD32 mDynamicBitRateInterval;
309*495ae853SAndroid Build Coastguard Worker     /* Units - number of frames */
310*495ae853SAndroid Build Coastguard Worker     UWORD32 mDynamicFrameRateInterval;
311*495ae853SAndroid Build Coastguard Worker     UWORD64 mBitrate;
312*495ae853SAndroid Build Coastguard Worker     DOUBLE mFrameRate;
313*495ae853SAndroid Build Coastguard Worker     UWORD8 mNumSpatialLayers;
314*495ae853SAndroid Build Coastguard Worker     UWORD8 mNumTemporalLayers;
315*495ae853SAndroid Build Coastguard Worker     DOUBLE mSpatialResRatio;
316*495ae853SAndroid Build Coastguard Worker };
317*495ae853SAndroid Build Coastguard Worker 
initEncBufs()318*495ae853SAndroid Build Coastguard Worker void Codec::initEncBufs()
319*495ae853SAndroid Build Coastguard Worker {
320*495ae853SAndroid Build Coastguard Worker     size_t frameSize = mInputDims.getFrameSize();
321*495ae853SAndroid Build Coastguard Worker     constexpr size_t minOutBufSize = 0x800;
322*495ae853SAndroid Build Coastguard Worker     size_t outBufSize = std::max(minOutBufSize, frameSize * mNumSpatialLayers);
323*495ae853SAndroid Build Coastguard Worker     size_t naluInfoBufSize = 460 * mNumSpatialLayers;
324*495ae853SAndroid Build Coastguard Worker 
325*495ae853SAndroid Build Coastguard Worker     mEncBufs.mInputBuf.resize(frameSize);
326*495ae853SAndroid Build Coastguard Worker     mEncBufs.mOutputBuf.resize(outBufSize);
327*495ae853SAndroid Build Coastguard Worker 
328*495ae853SAndroid Build Coastguard Worker     if(mEnableRecon)
329*495ae853SAndroid Build Coastguard Worker     {
330*495ae853SAndroid Build Coastguard Worker         mEncBufs.mReconBuf.resize(frameSize);
331*495ae853SAndroid Build Coastguard Worker     }
332*495ae853SAndroid Build Coastguard Worker 
333*495ae853SAndroid Build Coastguard Worker     if(mEnableNaluInfoExport)
334*495ae853SAndroid Build Coastguard Worker     {
335*495ae853SAndroid Build Coastguard Worker         mEncBufs.mNaluInfoStructBuf.resize(mNumSpatialLayers * 2);
336*495ae853SAndroid Build Coastguard Worker         mEncBufs.mNaluInfoDataBuf.resize(mNumSpatialLayers);
337*495ae853SAndroid Build Coastguard Worker 
338*495ae853SAndroid Build Coastguard Worker         for(auto i = 0; i < mNumSpatialLayers; i++)
339*495ae853SAndroid Build Coastguard Worker         {
340*495ae853SAndroid Build Coastguard Worker             mEncBufs.mNaluInfoDataBuf[i].resize(naluInfoBufSize);
341*495ae853SAndroid Build Coastguard Worker         }
342*495ae853SAndroid Build Coastguard Worker     }
343*495ae853SAndroid Build Coastguard Worker }
344*495ae853SAndroid Build Coastguard Worker 
initMemRecs()345*495ae853SAndroid Build Coastguard Worker bool Codec::initMemRecs()
346*495ae853SAndroid Build Coastguard Worker {
347*495ae853SAndroid Build Coastguard Worker     std::fill(mMemRecBufs.begin(), mMemRecBufs.end(), nullptr);
348*495ae853SAndroid Build Coastguard Worker 
349*495ae853SAndroid Build Coastguard Worker     for(auto i = 0u; i < mNumMemRecords; i++)
350*495ae853SAndroid Build Coastguard Worker     {
351*495ae853SAndroid Build Coastguard Worker         mMemRecBufs[i] = reinterpret_cast<UWORD8 *>(
352*495ae853SAndroid Build Coastguard Worker             aligned_alloc(mMemRecords[i].u4_mem_alignment, mMemRecords[i].u4_mem_size));
353*495ae853SAndroid Build Coastguard Worker         mMemRecords[i].pv_base = mMemRecBufs[i];
354*495ae853SAndroid Build Coastguard Worker 
355*495ae853SAndroid Build Coastguard Worker         if(nullptr == mMemRecBufs[i])
356*495ae853SAndroid Build Coastguard Worker         {
357*495ae853SAndroid Build Coastguard Worker             for(auto j = 0u; j < i; j++)
358*495ae853SAndroid Build Coastguard Worker             {
359*495ae853SAndroid Build Coastguard Worker                 free(mMemRecBufs[j]);
360*495ae853SAndroid Build Coastguard Worker             }
361*495ae853SAndroid Build Coastguard Worker 
362*495ae853SAndroid Build Coastguard Worker             return false;
363*495ae853SAndroid Build Coastguard Worker         }
364*495ae853SAndroid Build Coastguard Worker     }
365*495ae853SAndroid Build Coastguard Worker 
366*495ae853SAndroid Build Coastguard Worker     return true;
367*495ae853SAndroid Build Coastguard Worker }
368*495ae853SAndroid Build Coastguard Worker 
delMemRecs()369*495ae853SAndroid Build Coastguard Worker void Codec::delMemRecs()
370*495ae853SAndroid Build Coastguard Worker {
371*495ae853SAndroid Build Coastguard Worker     for(auto i = 0u; i < mNumMemRecords; i++)
372*495ae853SAndroid Build Coastguard Worker     {
373*495ae853SAndroid Build Coastguard Worker         if(mMemRecBufs[i])
374*495ae853SAndroid Build Coastguard Worker         {
375*495ae853SAndroid Build Coastguard Worker             free(mMemRecBufs[i]);
376*495ae853SAndroid Build Coastguard Worker         }
377*495ae853SAndroid Build Coastguard Worker     }
378*495ae853SAndroid Build Coastguard Worker 
379*495ae853SAndroid Build Coastguard Worker     std::fill(mMemRecBufs.begin(), mMemRecBufs.end(), nullptr);
380*495ae853SAndroid Build Coastguard Worker }
381*495ae853SAndroid Build Coastguard Worker 
initEncoder(const UWORD8 * data)382*495ae853SAndroid Build Coastguard Worker bool Codec::initEncoder(const UWORD8 *data)
383*495ae853SAndroid Build Coastguard Worker {
384*495ae853SAndroid Build Coastguard Worker     mInputDims = FrameDims{((data[IDX_WD_BYTE_1] << 8) | data[IDX_WD_BYTE_2]) % kMaxWidth,
385*495ae853SAndroid Build Coastguard Worker                            ((data[IDX_HT_BYTE_1] << 8) | data[IDX_HT_BYTE_2]) % kMaxHeight};
386*495ae853SAndroid Build Coastguard Worker 
387*495ae853SAndroid Build Coastguard Worker     mNumSpatialLayers = kSpatialLayers[data[IDX_NUM_SPATIAL_LAYERS] % kSpatialLayersNum];
388*495ae853SAndroid Build Coastguard Worker     mNumTemporalLayers = kTemporalLayers[data[IDX_NUM_TEMPORAL_LAYERS] % kTemporalLayersNum];
389*495ae853SAndroid Build Coastguard Worker     mSpatialResRatio = kSpatialResRatio[data[IDX_SPATIAL_RES_RATIO] % kSpatialResRatioNum];
390*495ae853SAndroid Build Coastguard Worker     bool useSvcCompliantDims =
391*495ae853SAndroid Build Coastguard Worker         data[IDX_SVC_COMPLIANT_DIMS] <
392*495ae853SAndroid Build Coastguard Worker         static_cast<UWORD8>(std::numeric_limits<UWORD8>::max() * kSvcCompliantDimProb);
393*495ae853SAndroid Build Coastguard Worker 
394*495ae853SAndroid Build Coastguard Worker     if(useSvcCompliantDims)
395*495ae853SAndroid Build Coastguard Worker     {
396*495ae853SAndroid Build Coastguard Worker         auto getSvcCompliantDims = [&]() -> FrameDims
397*495ae853SAndroid Build Coastguard Worker         {
398*495ae853SAndroid Build Coastguard Worker             auto maxResRatio = pow(mSpatialResRatio, mNumSpatialLayers - 1);
399*495ae853SAndroid Build Coastguard Worker             UWORD32 dimPadding = 0;
400*495ae853SAndroid Build Coastguard Worker             UWORD32 numDecimalDigits = mNumSpatialLayers;
401*495ae853SAndroid Build Coastguard Worker             constexpr auto minDimGcd = 16;
402*495ae853SAndroid Build Coastguard Worker             UWORD32 decPtDelMultiplier = static_cast<UWORD32>(std::pow(10, numDecimalDigits));
403*495ae853SAndroid Build Coastguard Worker             FrameDims dims{mInputDims};
404*495ae853SAndroid Build Coastguard Worker 
405*495ae853SAndroid Build Coastguard Worker             if(std::fmod(minDimGcd, maxResRatio))
406*495ae853SAndroid Build Coastguard Worker             {
407*495ae853SAndroid Build Coastguard Worker                 dimPadding = std::lcm(minDimGcd * decPtDelMultiplier,
408*495ae853SAndroid Build Coastguard Worker                                       static_cast<UWORD32>(maxResRatio * decPtDelMultiplier)) /
409*495ae853SAndroid Build Coastguard Worker                              decPtDelMultiplier;
410*495ae853SAndroid Build Coastguard Worker             }
411*495ae853SAndroid Build Coastguard Worker             else
412*495ae853SAndroid Build Coastguard Worker             {
413*495ae853SAndroid Build Coastguard Worker                 dimPadding = static_cast<UWORD32>(minDimGcd * maxResRatio);
414*495ae853SAndroid Build Coastguard Worker             }
415*495ae853SAndroid Build Coastguard Worker 
416*495ae853SAndroid Build Coastguard Worker             if(mInputDims.mWidth % dimPadding)
417*495ae853SAndroid Build Coastguard Worker             {
418*495ae853SAndroid Build Coastguard Worker                 dims.mWidth = mInputDims.mWidth - ((mInputDims.mWidth) % dimPadding) + dimPadding;
419*495ae853SAndroid Build Coastguard Worker             }
420*495ae853SAndroid Build Coastguard Worker 
421*495ae853SAndroid Build Coastguard Worker             if(mInputDims.mHeight % dimPadding)
422*495ae853SAndroid Build Coastguard Worker             {
423*495ae853SAndroid Build Coastguard Worker                 dims.mHeight =
424*495ae853SAndroid Build Coastguard Worker                     mInputDims.mHeight - ((mInputDims.mHeight) % dimPadding) + dimPadding;
425*495ae853SAndroid Build Coastguard Worker             }
426*495ae853SAndroid Build Coastguard Worker 
427*495ae853SAndroid Build Coastguard Worker             return dims;
428*495ae853SAndroid Build Coastguard Worker         };
429*495ae853SAndroid Build Coastguard Worker 
430*495ae853SAndroid Build Coastguard Worker         mSvcCompDims = getSvcCompliantDims();
431*495ae853SAndroid Build Coastguard Worker         mInputDims = mSvcCompDims;
432*495ae853SAndroid Build Coastguard Worker     }
433*495ae853SAndroid Build Coastguard Worker 
434*495ae853SAndroid Build Coastguard Worker     mIvVideoColorFormat =
435*495ae853SAndroid Build Coastguard Worker         kSupportedColorFormats[data[IDX_COLOR_FORMAT] % kSupportedColorFormatsNum];
436*495ae853SAndroid Build Coastguard Worker     mArch = kArchs[data[IDX_ARCH_TYPE] % std::size(kArchs)];
437*495ae853SAndroid Build Coastguard Worker     mRCMode = kRCMode[data[IDX_RC_MODE] % kRCModeNum];
438*495ae853SAndroid Build Coastguard Worker     mNumCores = (data[IDX_NUM_CORES] & 0x07) + 1;
439*495ae853SAndroid Build Coastguard Worker     mBframes = 0;
440*495ae853SAndroid Build Coastguard Worker 
441*495ae853SAndroid Build Coastguard Worker     mEncSpeed = kEncSpeed[data[IDX_ENC_SPEED] % kEncSpeedNum];
442*495ae853SAndroid Build Coastguard Worker     mConstrainedIntraFlag = data[IDX_CONSTRAINED_INTRA_FLAG] & 0x01;
443*495ae853SAndroid Build Coastguard Worker     mIntra4x4 = data[IDX_INTRA_4x4] & 0x01;
444*495ae853SAndroid Build Coastguard Worker     m_I_QP = data[IDX_I_FRAME_QP];
445*495ae853SAndroid Build Coastguard Worker     m_P_QP = data[IDX_P_FRAME_QP];
446*495ae853SAndroid Build Coastguard Worker     m_B_QP = data[IDX_B_FRAME_QP];
447*495ae853SAndroid Build Coastguard Worker     mBitrate = (((data[IDX_BITRATE_BYTE_1] << 8) | data[IDX_BITRATE_BYTE_2]) * 1000) % kMaxBitrate;
448*495ae853SAndroid Build Coastguard Worker     mFrameRate = data[IDX_FRAME_RATE] % 120;
449*495ae853SAndroid Build Coastguard Worker     mIntraRefresh = data[IDX_INTRA_REFRESH] + 1;
450*495ae853SAndroid Build Coastguard Worker     mHalfPelEnable = data[IDX_ENABLE_HALF_PEL] & 0x01;
451*495ae853SAndroid Build Coastguard Worker     mQPelEnable = data[IDX_ENABLE_Q_PEL] & 0x01;
452*495ae853SAndroid Build Coastguard Worker     mMeSpeedPreset = kMeSpeedPreset[data[IDX_ME_SPEED_PRESET] % kMeSpeedPresetNum];
453*495ae853SAndroid Build Coastguard Worker     mAirMode = kAirMode[data[IDX_AIR_MODE] % kAirModeNum];
454*495ae853SAndroid Build Coastguard Worker     mDisableDeblockLevel = kDeblkLevel[data[IDX_DISABLE_DEBLOCK_LEVEL] % kDeblkLevelNum];
455*495ae853SAndroid Build Coastguard Worker     mSearchRangeX = data[IDX_SEARCH_RANGE_X];
456*495ae853SAndroid Build Coastguard Worker     mSearchRangeY = data[IDX_SEARCH_RANGE_Y];
457*495ae853SAndroid Build Coastguard Worker     mIInterval = data[IDX_I_INTERVAL] + 1;
458*495ae853SAndroid Build Coastguard Worker     mIDRInterval = data[IDX_IDR_INTERVAL] + 1;
459*495ae853SAndroid Build Coastguard Worker     mSeiMdcvFlag = data[IDX_SEI_MDCV_FLAG] & 0x01;
460*495ae853SAndroid Build Coastguard Worker     mSeiCllFlag = data[IDX_SEI_CLL_FLAG] & 0x01;
461*495ae853SAndroid Build Coastguard Worker     mSeiAveFlag = data[IDX_SEI_AVE_FLAG] & 0x01;
462*495ae853SAndroid Build Coastguard Worker     mSeiCcvFlag = data[IDX_SEI_CCV_FLAG] & 0x01;
463*495ae853SAndroid Build Coastguard Worker     mProfile = kProfile[data[IDX_PROFILE] % kProfileNum];
464*495ae853SAndroid Build Coastguard Worker     mAspectRatioFlag = data[IDX_ASPECT_RATIO_FLAG] & 0x01;
465*495ae853SAndroid Build Coastguard Worker     mNalHrdFlag = data[IDX_NAL_HRD_FLAG] & 0x01;
466*495ae853SAndroid Build Coastguard Worker     mVclHrdFlag = data[IDX_VCL_HRD_FLAG] & 0x01;
467*495ae853SAndroid Build Coastguard Worker     mIsForceIdrEnabled = data[IDX_ENABLE_FORCE_IDR] & 0x01;
468*495ae853SAndroid Build Coastguard Worker     mIsDynamicBitRateChangeEnabled = data[IDX_ENABLE_DYNAMIC_BITRATE] & 0x01;
469*495ae853SAndroid Build Coastguard Worker     mIsDynamicFrameRateChangeEnabled = data[IDX_ENABLE_DYNAMIC_FRAME_RATE] & 0x01;
470*495ae853SAndroid Build Coastguard Worker     mForceIdrInterval = data[IDX_FORCE_IDR_INTERVAL] & 0x07;
471*495ae853SAndroid Build Coastguard Worker     mDynamicBitRateInterval = data[IDX_DYNAMIC_BITRATE_INTERVAL] & 0x07;
472*495ae853SAndroid Build Coastguard Worker     mDynamicFrameRateInterval = data[IDX_DYNAMIC_FRAME_RATE_INTERVAL] & 0x07;
473*495ae853SAndroid Build Coastguard Worker 
474*495ae853SAndroid Build Coastguard Worker     mSliceParam = std::min(256u, static_cast<UWORD32>(mInputDims.mHeight >> 4));
475*495ae853SAndroid Build Coastguard Worker     mAvcEncLevel = kSupportedLevels[data[IDX_ENC_LEVEL] % kSupportedLevelsNum];
476*495ae853SAndroid Build Coastguard Worker     mSliceMode = kSliceMode[data[IDX_SLICE_MODE] % kSliceModeNum];
477*495ae853SAndroid Build Coastguard Worker     mEnableFastSad = data[IDX_ENABLE_FAST_SAD] & 0x01;
478*495ae853SAndroid Build Coastguard Worker 
479*495ae853SAndroid Build Coastguard Worker     mEnableRecon = !!(data[IDX_ENABLE_RECON] & 1);
480*495ae853SAndroid Build Coastguard Worker     mEnableNaluInfoExport = !!(data[IDX_ENABLE_NALU_INFO_EXPORT] & 1);
481*495ae853SAndroid Build Coastguard Worker 
482*495ae853SAndroid Build Coastguard Worker     isvce_num_mem_rec_ip_t s_num_mem_rec_ip{};
483*495ae853SAndroid Build Coastguard Worker     isvce_num_mem_rec_op_t s_num_mem_rec_op{};
484*495ae853SAndroid Build Coastguard Worker 
485*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_GET_NUM_MEM_REC, ISVCE_CMD_CT_NA};
486*495ae853SAndroid Build Coastguard Worker 
487*495ae853SAndroid Build Coastguard Worker     /* Getting Number of MemRecords */
488*495ae853SAndroid Build Coastguard Worker     s_num_mem_rec_ip.s_ive_ip.u4_size = sizeof(isvce_num_mem_rec_ip_t);
489*495ae853SAndroid Build Coastguard Worker     s_num_mem_rec_op.s_ive_op.u4_size = sizeof(isvce_num_mem_rec_op_t);
490*495ae853SAndroid Build Coastguard Worker 
491*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != isvce_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op, &s_api_cmds))
492*495ae853SAndroid Build Coastguard Worker     {
493*495ae853SAndroid Build Coastguard Worker         return false;
494*495ae853SAndroid Build Coastguard Worker     }
495*495ae853SAndroid Build Coastguard Worker 
496*495ae853SAndroid Build Coastguard Worker     mNumMemRecords = s_num_mem_rec_op.s_ive_op.u4_num_mem_rec;
497*495ae853SAndroid Build Coastguard Worker     mMemRecords.resize(mNumMemRecords);
498*495ae853SAndroid Build Coastguard Worker     mMemRecBufs.resize(mNumMemRecords);
499*495ae853SAndroid Build Coastguard Worker 
500*495ae853SAndroid Build Coastguard Worker     for(auto i = 0u; i < mNumMemRecords; i++)
501*495ae853SAndroid Build Coastguard Worker     {
502*495ae853SAndroid Build Coastguard Worker         mMemRecords[i].u4_size = sizeof(iv_mem_rec_t);
503*495ae853SAndroid Build Coastguard Worker         mMemRecords[i].pv_base = nullptr;
504*495ae853SAndroid Build Coastguard Worker         mMemRecords[i].u4_mem_size = 0;
505*495ae853SAndroid Build Coastguard Worker         mMemRecords[i].u4_mem_alignment = 0;
506*495ae853SAndroid Build Coastguard Worker         mMemRecords[i].e_mem_type = IV_NA_MEM_TYPE;
507*495ae853SAndroid Build Coastguard Worker     }
508*495ae853SAndroid Build Coastguard Worker 
509*495ae853SAndroid Build Coastguard Worker     isvce_fill_mem_rec_ip_t sFillMemRecIp{};
510*495ae853SAndroid Build Coastguard Worker     isvce_fill_mem_rec_op_t sFillMemRecOp{};
511*495ae853SAndroid Build Coastguard Worker 
512*495ae853SAndroid Build Coastguard Worker     s_api_cmds = {ISVCE_CMD_FILL_NUM_MEM_REC, ISVCE_CMD_CT_NA};
513*495ae853SAndroid Build Coastguard Worker 
514*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_size = sizeof(isvce_fill_mem_rec_ip_t);
515*495ae853SAndroid Build Coastguard Worker     sFillMemRecOp.s_ive_op.u4_size = sizeof(isvce_fill_mem_rec_op_t);
516*495ae853SAndroid Build Coastguard Worker 
517*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.ps_mem_rec = mMemRecords.data();
518*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_num_mem_rec = mNumMemRecords;
519*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_wd = mInputDims.mWidth;
520*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_ht = mInputDims.mHeight;
521*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.u4_wd = mInputDims.mWidth;
522*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.u4_ht = mInputDims.mHeight;
523*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_level = mAvcEncLevel;
524*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.e_color_format = mIvVideoColorFormat;
525*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_ref_cnt = 2;
526*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_reorder_cnt = 0;
527*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_srch_rng_x = 256;
528*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_ive_ip.u4_max_srch_rng_y = 256;
529*495ae853SAndroid Build Coastguard Worker 
530*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_svc_inp_params.u1_num_temporal_layers = mNumTemporalLayers;
531*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_svc_inp_params.u1_num_spatial_layers = mNumSpatialLayers;
532*495ae853SAndroid Build Coastguard Worker     sFillMemRecIp.s_svc_inp_params.d_spatial_res_ratio = mSpatialResRatio;
533*495ae853SAndroid Build Coastguard Worker 
534*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != isvce_api_function(0, &sFillMemRecIp, &sFillMemRecOp, &s_api_cmds))
535*495ae853SAndroid Build Coastguard Worker     {
536*495ae853SAndroid Build Coastguard Worker         return false;
537*495ae853SAndroid Build Coastguard Worker     }
538*495ae853SAndroid Build Coastguard Worker 
539*495ae853SAndroid Build Coastguard Worker     if(!initMemRecs())
540*495ae853SAndroid Build Coastguard Worker     {
541*495ae853SAndroid Build Coastguard Worker         return false;
542*495ae853SAndroid Build Coastguard Worker     }
543*495ae853SAndroid Build Coastguard Worker 
544*495ae853SAndroid Build Coastguard Worker     /* Codec Instance Creation */
545*495ae853SAndroid Build Coastguard Worker     isvce_init_ip_t sInitIp{};
546*495ae853SAndroid Build Coastguard Worker     isvce_init_op_t sInitOp{};
547*495ae853SAndroid Build Coastguard Worker 
548*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD32> sMaxBitrates(mNumSpatialLayers, 240000000);
549*495ae853SAndroid Build Coastguard Worker 
550*495ae853SAndroid Build Coastguard Worker     mCodecCtx = reinterpret_cast<iv_obj_t *>(mMemRecords[0].pv_base);
551*495ae853SAndroid Build Coastguard Worker     mCodecCtx->u4_size = sizeof(iv_obj_t);
552*495ae853SAndroid Build Coastguard Worker     mCodecCtx->pv_fxns = reinterpret_cast<void *>(isvce_api_function);
553*495ae853SAndroid Build Coastguard Worker 
554*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_size = sizeof(isvce_init_ip_t);
555*495ae853SAndroid Build Coastguard Worker     sInitOp.s_ive_op.u4_size = sizeof(isvce_init_op_t);
556*495ae853SAndroid Build Coastguard Worker 
557*495ae853SAndroid Build Coastguard Worker     s_api_cmds = {ISVCE_CMD_INIT, ISVCE_CMD_CT_NA};
558*495ae853SAndroid Build Coastguard Worker 
559*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_num_mem_rec = mNumMemRecords;
560*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.ps_mem_rec = mMemRecords.data();
561*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_wd = mInputDims.mWidth;
562*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_ht = mInputDims.mHeight;
563*495ae853SAndroid Build Coastguard Worker     sInitIp.u4_wd = mInputDims.mWidth;
564*495ae853SAndroid Build Coastguard Worker     sInitIp.u4_ht = mInputDims.mHeight;
565*495ae853SAndroid Build Coastguard Worker 
566*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_ref_cnt = 2;
567*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_reorder_cnt = 0;
568*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_level = mAvcEncLevel;
569*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_inp_color_fmt = mIvVideoColorFormat;
570*495ae853SAndroid Build Coastguard Worker 
571*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_enable_recon = mEnableRecon;
572*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_recon_color_fmt = IV_YUV_420P;
573*495ae853SAndroid Build Coastguard Worker     sInitIp.b_nalu_info_export_enable = mEnableNaluInfoExport;
574*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_rc_mode = mRCMode;
575*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_framerate = 120000;
576*495ae853SAndroid Build Coastguard Worker     sInitIp.pu4_max_bitrate = sMaxBitrates.data();
577*495ae853SAndroid Build Coastguard Worker     sInitIp.s_svc_inp_params.u1_num_temporal_layers = mNumTemporalLayers;
578*495ae853SAndroid Build Coastguard Worker     sInitIp.s_svc_inp_params.u1_num_spatial_layers = mNumSpatialLayers;
579*495ae853SAndroid Build Coastguard Worker     sInitIp.s_svc_inp_params.d_spatial_res_ratio = mSpatialResRatio;
580*495ae853SAndroid Build Coastguard Worker 
581*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_num_bframes = mBframes;
582*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_content_type = IV_PROGRESSIVE;
583*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_srch_rng_x = 256;
584*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_max_srch_rng_y = 256;
585*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_slice_mode = mSliceMode;
586*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.u4_slice_param = mSliceParam;
587*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_arch = mArch;
588*495ae853SAndroid Build Coastguard Worker     sInitIp.s_ive_ip.e_soc = SOC_GENERIC;
589*495ae853SAndroid Build Coastguard Worker     sInitIp.b_use_default_vui = true;
590*495ae853SAndroid Build Coastguard Worker 
591*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != isvce_api_function(mCodecCtx, &sInitIp, &sInitOp, &s_api_cmds))
592*495ae853SAndroid Build Coastguard Worker     {
593*495ae853SAndroid Build Coastguard Worker         delMemRecs();
594*495ae853SAndroid Build Coastguard Worker 
595*495ae853SAndroid Build Coastguard Worker         return false;
596*495ae853SAndroid Build Coastguard Worker     }
597*495ae853SAndroid Build Coastguard Worker 
598*495ae853SAndroid Build Coastguard Worker     setDefault();
599*495ae853SAndroid Build Coastguard Worker     setNumCores();
600*495ae853SAndroid Build Coastguard Worker     logVersion();
601*495ae853SAndroid Build Coastguard Worker     getBufInfo();
602*495ae853SAndroid Build Coastguard Worker     setDimensions();
603*495ae853SAndroid Build Coastguard Worker     setFrameRate();
604*495ae853SAndroid Build Coastguard Worker     setIpeParams();
605*495ae853SAndroid Build Coastguard Worker     setBitRate();
606*495ae853SAndroid Build Coastguard Worker     setQp();
607*495ae853SAndroid Build Coastguard Worker     setAirParams();
608*495ae853SAndroid Build Coastguard Worker     setVbvParams();
609*495ae853SAndroid Build Coastguard Worker     setMeParams();
610*495ae853SAndroid Build Coastguard Worker     setGopParams();
611*495ae853SAndroid Build Coastguard Worker     setDeblockParams();
612*495ae853SAndroid Build Coastguard Worker     setProfileParams();
613*495ae853SAndroid Build Coastguard Worker     setEncMode(IVE_ENC_MODE_HEADER);
614*495ae853SAndroid Build Coastguard Worker     setVuiParams();
615*495ae853SAndroid Build Coastguard Worker     setSeiMdcvParams();
616*495ae853SAndroid Build Coastguard Worker     setSeiCllParams();
617*495ae853SAndroid Build Coastguard Worker     setSeiAveParams();
618*495ae853SAndroid Build Coastguard Worker     setSeiCcvParams();
619*495ae853SAndroid Build Coastguard Worker 
620*495ae853SAndroid Build Coastguard Worker     initEncBufs();
621*495ae853SAndroid Build Coastguard Worker 
622*495ae853SAndroid Build Coastguard Worker     return true;
623*495ae853SAndroid Build Coastguard Worker }
624*495ae853SAndroid Build Coastguard Worker 
setDimensions()625*495ae853SAndroid Build Coastguard Worker void Codec::setDimensions()
626*495ae853SAndroid Build Coastguard Worker {
627*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_dimensions_ip_t s_frame_dimensions_ip{};
628*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_dimensions_op_t s_frame_dimensions_op{};
629*495ae853SAndroid Build Coastguard Worker 
630*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_DIMENSIONS};
631*495ae853SAndroid Build Coastguard Worker 
632*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_ht = mInputDims.mHeight;
633*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_wd = mInputDims.mWidth;
634*495ae853SAndroid Build Coastguard Worker 
635*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_timestamp_high = 0;
636*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_timestamp_low = 0;
637*495ae853SAndroid Build Coastguard Worker 
638*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_size = sizeof(isvce_ctl_set_dimensions_ip_t);
639*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_op.s_ive_op.u4_size = sizeof(isvce_ctl_set_dimensions_op_t);
640*495ae853SAndroid Build Coastguard Worker 
641*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &s_frame_dimensions_ip, &s_frame_dimensions_op, &s_api_cmds);
642*495ae853SAndroid Build Coastguard Worker }
643*495ae853SAndroid Build Coastguard Worker 
setNumCores()644*495ae853SAndroid Build Coastguard Worker void Codec::setNumCores()
645*495ae853SAndroid Build Coastguard Worker {
646*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_num_cores_ip_t sNumCoresIp{};
647*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_num_cores_op_t sNumCoresOp{};
648*495ae853SAndroid Build Coastguard Worker 
649*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_NUM_CORES};
650*495ae853SAndroid Build Coastguard Worker 
651*495ae853SAndroid Build Coastguard Worker     sNumCoresIp.s_ive_ip.u4_num_cores = mNumCores;
652*495ae853SAndroid Build Coastguard Worker 
653*495ae853SAndroid Build Coastguard Worker     sNumCoresIp.s_ive_ip.u4_timestamp_high = 0;
654*495ae853SAndroid Build Coastguard Worker     sNumCoresIp.s_ive_ip.u4_timestamp_low = 0;
655*495ae853SAndroid Build Coastguard Worker 
656*495ae853SAndroid Build Coastguard Worker     sNumCoresIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_num_cores_ip_t);
657*495ae853SAndroid Build Coastguard Worker     sNumCoresOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_num_cores_op_t);
658*495ae853SAndroid Build Coastguard Worker 
659*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, (void *) &sNumCoresIp, (void *) &sNumCoresOp, &s_api_cmds);
660*495ae853SAndroid Build Coastguard Worker }
661*495ae853SAndroid Build Coastguard Worker 
setDefault()662*495ae853SAndroid Build Coastguard Worker void Codec::setDefault()
663*495ae853SAndroid Build Coastguard Worker {
664*495ae853SAndroid Build Coastguard Worker     isvce_ctl_setdefault_ip_t sDefaultIp{};
665*495ae853SAndroid Build Coastguard Worker     isvce_ctl_setdefault_op_t sDefaultOp{};
666*495ae853SAndroid Build Coastguard Worker 
667*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SETDEFAULT};
668*495ae853SAndroid Build Coastguard Worker 
669*495ae853SAndroid Build Coastguard Worker     sDefaultIp.s_ive_ip.u4_timestamp_high = 0;
670*495ae853SAndroid Build Coastguard Worker     sDefaultIp.s_ive_ip.u4_timestamp_low = 0;
671*495ae853SAndroid Build Coastguard Worker 
672*495ae853SAndroid Build Coastguard Worker     sDefaultIp.s_ive_ip.u4_size = sizeof(isvce_ctl_setdefault_ip_t);
673*495ae853SAndroid Build Coastguard Worker     sDefaultOp.s_ive_op.u4_size = sizeof(isvce_ctl_setdefault_op_t);
674*495ae853SAndroid Build Coastguard Worker 
675*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sDefaultIp, &sDefaultOp, &s_api_cmds);
676*495ae853SAndroid Build Coastguard Worker }
677*495ae853SAndroid Build Coastguard Worker 
getBufInfo()678*495ae853SAndroid Build Coastguard Worker void Codec::getBufInfo()
679*495ae853SAndroid Build Coastguard Worker {
680*495ae853SAndroid Build Coastguard Worker     isvce_ctl_getbufinfo_ip_t s_get_buf_info_ip{};
681*495ae853SAndroid Build Coastguard Worker     isvce_ctl_getbufinfo_op_t s_get_buf_info_op{};
682*495ae853SAndroid Build Coastguard Worker 
683*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_GETBUFINFO};
684*495ae853SAndroid Build Coastguard Worker 
685*495ae853SAndroid Build Coastguard Worker     s_get_buf_info_ip.s_ive_ip.u4_size = sizeof(isvce_ctl_getbufinfo_ip_t);
686*495ae853SAndroid Build Coastguard Worker     s_get_buf_info_op.s_ive_op.u4_size = sizeof(isvce_ctl_getbufinfo_op_t);
687*495ae853SAndroid Build Coastguard Worker 
688*495ae853SAndroid Build Coastguard Worker     s_get_buf_info_ip.s_ive_ip.u4_max_ht = mInputDims.mHeight;
689*495ae853SAndroid Build Coastguard Worker     s_get_buf_info_ip.s_ive_ip.u4_max_wd = mInputDims.mWidth;
690*495ae853SAndroid Build Coastguard Worker     s_get_buf_info_ip.s_ive_ip.e_inp_color_fmt = mIvVideoColorFormat;
691*495ae853SAndroid Build Coastguard Worker 
692*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &s_get_buf_info_ip, &s_get_buf_info_op, &s_api_cmds);
693*495ae853SAndroid Build Coastguard Worker }
694*495ae853SAndroid Build Coastguard Worker 
setFrameRate()695*495ae853SAndroid Build Coastguard Worker void Codec::setFrameRate()
696*495ae853SAndroid Build Coastguard Worker {
697*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_frame_rate_ip_t sFrameRateIp{};
698*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_frame_rate_op_t sFrameRateOp{};
699*495ae853SAndroid Build Coastguard Worker 
700*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_FRAMERATE};
701*495ae853SAndroid Build Coastguard Worker 
702*495ae853SAndroid Build Coastguard Worker     sFrameRateIp.s_ive_ip.u4_src_frame_rate = (UWORD32) mFrameRate;
703*495ae853SAndroid Build Coastguard Worker     sFrameRateIp.s_ive_ip.u4_tgt_frame_rate = (UWORD32) mFrameRate;
704*495ae853SAndroid Build Coastguard Worker 
705*495ae853SAndroid Build Coastguard Worker     sFrameRateIp.s_ive_ip.u4_timestamp_high = 0;
706*495ae853SAndroid Build Coastguard Worker     sFrameRateIp.s_ive_ip.u4_timestamp_low = 0;
707*495ae853SAndroid Build Coastguard Worker 
708*495ae853SAndroid Build Coastguard Worker     sFrameRateIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_frame_rate_ip_t);
709*495ae853SAndroid Build Coastguard Worker     sFrameRateOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_frame_rate_op_t);
710*495ae853SAndroid Build Coastguard Worker 
711*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sFrameRateIp, &sFrameRateOp, &s_api_cmds);
712*495ae853SAndroid Build Coastguard Worker }
713*495ae853SAndroid Build Coastguard Worker 
setIpeParams()714*495ae853SAndroid Build Coastguard Worker void Codec::setIpeParams()
715*495ae853SAndroid Build Coastguard Worker {
716*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_ipe_params_ip_t sIpeParamsIp{};
717*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_ipe_params_op_t sIpeParamsOp{};
718*495ae853SAndroid Build Coastguard Worker 
719*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_IPE_PARAMS};
720*495ae853SAndroid Build Coastguard Worker 
721*495ae853SAndroid Build Coastguard Worker     sIpeParamsIp.s_ive_ip.u4_enable_intra_4x4 = mIntra4x4;
722*495ae853SAndroid Build Coastguard Worker     sIpeParamsIp.s_ive_ip.u4_enc_speed_preset = mEncSpeed;
723*495ae853SAndroid Build Coastguard Worker 
724*495ae853SAndroid Build Coastguard Worker     sIpeParamsIp.s_ive_ip.u4_timestamp_high = 0;
725*495ae853SAndroid Build Coastguard Worker     sIpeParamsIp.s_ive_ip.u4_timestamp_low = 0;
726*495ae853SAndroid Build Coastguard Worker 
727*495ae853SAndroid Build Coastguard Worker     sIpeParamsIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_ipe_params_ip_t);
728*495ae853SAndroid Build Coastguard Worker     sIpeParamsOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_ipe_params_op_t);
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sIpeParamsIp, &sIpeParamsOp, &s_api_cmds);
731*495ae853SAndroid Build Coastguard Worker }
732*495ae853SAndroid Build Coastguard Worker 
setBitRate()733*495ae853SAndroid Build Coastguard Worker void Codec::setBitRate()
734*495ae853SAndroid Build Coastguard Worker {
735*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_bitrate_ip_t sBitrateIp{};
736*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_bitrate_op_t sBitrateOp{};
737*495ae853SAndroid Build Coastguard Worker 
738*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_BITRATE};
739*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD32> sTargetBitrates(mNumSpatialLayers, mBitrate);
740*495ae853SAndroid Build Coastguard Worker 
741*495ae853SAndroid Build Coastguard Worker     sBitrateIp.pu4_target_bitrate = sTargetBitrates.data();
742*495ae853SAndroid Build Coastguard Worker 
743*495ae853SAndroid Build Coastguard Worker     sBitrateIp.s_ive_ip.u4_timestamp_high = 0;
744*495ae853SAndroid Build Coastguard Worker     sBitrateIp.s_ive_ip.u4_timestamp_low = 0;
745*495ae853SAndroid Build Coastguard Worker 
746*495ae853SAndroid Build Coastguard Worker     sBitrateIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_bitrate_ip_t);
747*495ae853SAndroid Build Coastguard Worker     sBitrateOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_bitrate_op_t);
748*495ae853SAndroid Build Coastguard Worker 
749*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sBitrateIp, &sBitrateOp, &s_api_cmds);
750*495ae853SAndroid Build Coastguard Worker }
751*495ae853SAndroid Build Coastguard Worker 
setFrameType(IV_PICTURE_CODING_TYPE_T eFrameType)752*495ae853SAndroid Build Coastguard Worker void Codec::setFrameType(IV_PICTURE_CODING_TYPE_T eFrameType)
753*495ae853SAndroid Build Coastguard Worker {
754*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_frame_type_ip_t sFrameTypeIp{};
755*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_frame_type_op_t sFrameTypeOp{};
756*495ae853SAndroid Build Coastguard Worker 
757*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_FRAMETYPE};
758*495ae853SAndroid Build Coastguard Worker 
759*495ae853SAndroid Build Coastguard Worker     sFrameTypeIp.s_ive_ip.e_frame_type = eFrameType;
760*495ae853SAndroid Build Coastguard Worker 
761*495ae853SAndroid Build Coastguard Worker     sFrameTypeIp.s_ive_ip.u4_timestamp_high = 0;
762*495ae853SAndroid Build Coastguard Worker     sFrameTypeIp.s_ive_ip.u4_timestamp_low = 0;
763*495ae853SAndroid Build Coastguard Worker 
764*495ae853SAndroid Build Coastguard Worker     sFrameTypeIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_frame_type_ip_t);
765*495ae853SAndroid Build Coastguard Worker     sFrameTypeOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_frame_type_op_t);
766*495ae853SAndroid Build Coastguard Worker 
767*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sFrameTypeIp, &sFrameTypeOp, &s_api_cmds);
768*495ae853SAndroid Build Coastguard Worker }
769*495ae853SAndroid Build Coastguard Worker 
setQp()770*495ae853SAndroid Build Coastguard Worker void Codec::setQp()
771*495ae853SAndroid Build Coastguard Worker {
772*495ae853SAndroid Build Coastguard Worker     constexpr UWORD8 u1NumSliceTypes = 3;
773*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_qp_ip_t s_QpIp{};
774*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_qp_op_t s_QpOp{};
775*495ae853SAndroid Build Coastguard Worker 
776*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_QP};
777*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD32> sQps(u1NumSliceTypes * mNumSpatialLayers);
778*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD32> sMinQps(u1NumSliceTypes * mNumSpatialLayers);
779*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD32> sMaxQps(u1NumSliceTypes * mNumSpatialLayers);
780*495ae853SAndroid Build Coastguard Worker 
781*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_i_qp = sQps.data();
782*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_i_qp_min = sMinQps.data();
783*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_i_qp_max = sMaxQps.data();
784*495ae853SAndroid Build Coastguard Worker 
785*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_p_qp = sQps.data() + mNumSpatialLayers;
786*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_p_qp_min = sMinQps.data() + mNumSpatialLayers;
787*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_p_qp_max = sMaxQps.data() + mNumSpatialLayers;
788*495ae853SAndroid Build Coastguard Worker 
789*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_b_qp = sQps.data() + mNumSpatialLayers * 2;
790*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_b_qp_min = sMinQps.data() + mNumSpatialLayers * 2;
791*495ae853SAndroid Build Coastguard Worker     s_QpIp.pu4_b_qp_max = sMaxQps.data() + mNumSpatialLayers * 2;
792*495ae853SAndroid Build Coastguard Worker 
793*495ae853SAndroid Build Coastguard Worker     for(auto i = 0; i < mNumSpatialLayers; i++)
794*495ae853SAndroid Build Coastguard Worker     {
795*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_i_qp[i] = m_I_QP;
796*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_i_qp_max[i] = kMaxQP;
797*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_i_qp_min[i] = kMinQP;
798*495ae853SAndroid Build Coastguard Worker 
799*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_p_qp[i] = m_P_QP;
800*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_p_qp_max[i] = kMaxQP;
801*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_p_qp_min[i] = kMinQP;
802*495ae853SAndroid Build Coastguard Worker 
803*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_b_qp[i] = m_B_QP;
804*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_b_qp_max[i] = kMaxQP;
805*495ae853SAndroid Build Coastguard Worker         s_QpIp.pu4_b_qp_min[i] = kMinQP;
806*495ae853SAndroid Build Coastguard Worker     }
807*495ae853SAndroid Build Coastguard Worker 
808*495ae853SAndroid Build Coastguard Worker     s_QpIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_qp_ip_t);
809*495ae853SAndroid Build Coastguard Worker     s_QpOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_qp_op_t);
810*495ae853SAndroid Build Coastguard Worker 
811*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &s_QpIp, &s_QpOp, &s_api_cmds);
812*495ae853SAndroid Build Coastguard Worker }
813*495ae853SAndroid Build Coastguard Worker 
setEncMode(IVE_ENC_MODE_T eEncMode)814*495ae853SAndroid Build Coastguard Worker void Codec::setEncMode(IVE_ENC_MODE_T eEncMode)
815*495ae853SAndroid Build Coastguard Worker {
816*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_enc_mode_ip_t sEncModeIp{};
817*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_enc_mode_op_t sEncModeOp{};
818*495ae853SAndroid Build Coastguard Worker 
819*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_ENC_MODE};
820*495ae853SAndroid Build Coastguard Worker 
821*495ae853SAndroid Build Coastguard Worker     sEncModeIp.s_ive_ip.e_enc_mode = eEncMode;
822*495ae853SAndroid Build Coastguard Worker 
823*495ae853SAndroid Build Coastguard Worker     sEncModeIp.s_ive_ip.u4_timestamp_high = 0;
824*495ae853SAndroid Build Coastguard Worker     sEncModeIp.s_ive_ip.u4_timestamp_low = 0;
825*495ae853SAndroid Build Coastguard Worker 
826*495ae853SAndroid Build Coastguard Worker     sEncModeIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_enc_mode_ip_t);
827*495ae853SAndroid Build Coastguard Worker     sEncModeOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_enc_mode_op_t);
828*495ae853SAndroid Build Coastguard Worker 
829*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sEncModeIp, &sEncModeOp, &s_api_cmds);
830*495ae853SAndroid Build Coastguard Worker }
831*495ae853SAndroid Build Coastguard Worker 
setVbvParams()832*495ae853SAndroid Build Coastguard Worker void Codec::setVbvParams()
833*495ae853SAndroid Build Coastguard Worker {
834*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_vbv_params_ip_t sVbvIp{};
835*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_vbv_params_op_t sVbvOp{};
836*495ae853SAndroid Build Coastguard Worker 
837*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_VBV_PARAMS};
838*495ae853SAndroid Build Coastguard Worker     std::vector<UWORD32> sBufferDelays(mNumSpatialLayers, 1000);
839*495ae853SAndroid Build Coastguard Worker 
840*495ae853SAndroid Build Coastguard Worker     sVbvIp.pu4_vbv_buffer_delay = sBufferDelays.data();
841*495ae853SAndroid Build Coastguard Worker 
842*495ae853SAndroid Build Coastguard Worker     sVbvIp.s_ive_ip.u4_timestamp_high = 0;
843*495ae853SAndroid Build Coastguard Worker     sVbvIp.s_ive_ip.u4_timestamp_low = 0;
844*495ae853SAndroid Build Coastguard Worker 
845*495ae853SAndroid Build Coastguard Worker     sVbvIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_vbv_params_ip_t);
846*495ae853SAndroid Build Coastguard Worker     sVbvOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_vbv_params_op_t);
847*495ae853SAndroid Build Coastguard Worker 
848*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sVbvIp, &sVbvOp, &s_api_cmds);
849*495ae853SAndroid Build Coastguard Worker }
850*495ae853SAndroid Build Coastguard Worker 
setAirParams()851*495ae853SAndroid Build Coastguard Worker void Codec::setAirParams()
852*495ae853SAndroid Build Coastguard Worker {
853*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_air_params_ip_t sAirIp{};
854*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_air_params_op_t sAirOp{};
855*495ae853SAndroid Build Coastguard Worker 
856*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_AIR_PARAMS};
857*495ae853SAndroid Build Coastguard Worker 
858*495ae853SAndroid Build Coastguard Worker     sAirIp.s_ive_ip.e_air_mode = mAirMode;
859*495ae853SAndroid Build Coastguard Worker     sAirIp.s_ive_ip.u4_air_refresh_period = mIntraRefresh;
860*495ae853SAndroid Build Coastguard Worker 
861*495ae853SAndroid Build Coastguard Worker     sAirIp.s_ive_ip.u4_timestamp_high = 0;
862*495ae853SAndroid Build Coastguard Worker     sAirIp.s_ive_ip.u4_timestamp_low = 0;
863*495ae853SAndroid Build Coastguard Worker 
864*495ae853SAndroid Build Coastguard Worker     sAirIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_air_params_ip_t);
865*495ae853SAndroid Build Coastguard Worker     sAirOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_air_params_op_t);
866*495ae853SAndroid Build Coastguard Worker 
867*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sAirIp, &sAirOp, &s_api_cmds);
868*495ae853SAndroid Build Coastguard Worker }
869*495ae853SAndroid Build Coastguard Worker 
setMeParams()870*495ae853SAndroid Build Coastguard Worker void Codec::setMeParams()
871*495ae853SAndroid Build Coastguard Worker {
872*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_me_params_ip_t sMeParamsIp{};
873*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_me_params_op_t sMeParamsOp{};
874*495ae853SAndroid Build Coastguard Worker 
875*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_ME_PARAMS};
876*495ae853SAndroid Build Coastguard Worker 
877*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_enable_fast_sad = mEnableFastSad;
878*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_enable_alt_ref = mEnableAltRef;
879*495ae853SAndroid Build Coastguard Worker 
880*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_enable_hpel = mHalfPelEnable;
881*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_enable_qpel = mQPelEnable;
882*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_me_speed_preset = mMeSpeedPreset;
883*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_srch_rng_x = mSearchRangeX;
884*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_srch_rng_y = mSearchRangeY;
885*495ae853SAndroid Build Coastguard Worker 
886*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_timestamp_high = 0;
887*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_timestamp_low = 0;
888*495ae853SAndroid Build Coastguard Worker 
889*495ae853SAndroid Build Coastguard Worker     sMeParamsIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_me_params_ip_t);
890*495ae853SAndroid Build Coastguard Worker     sMeParamsOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_me_params_op_t);
891*495ae853SAndroid Build Coastguard Worker 
892*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sMeParamsIp, &sMeParamsOp, &s_api_cmds);
893*495ae853SAndroid Build Coastguard Worker }
894*495ae853SAndroid Build Coastguard Worker 
setGopParams()895*495ae853SAndroid Build Coastguard Worker void Codec::setGopParams()
896*495ae853SAndroid Build Coastguard Worker {
897*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_gop_params_ip_t sGopParamsIp{};
898*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_gop_params_op_t sGopParamsOp{};
899*495ae853SAndroid Build Coastguard Worker 
900*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_GOP_PARAMS};
901*495ae853SAndroid Build Coastguard Worker 
902*495ae853SAndroid Build Coastguard Worker     sGopParamsIp.s_ive_ip.u4_i_frm_interval = mIInterval;
903*495ae853SAndroid Build Coastguard Worker     sGopParamsIp.s_ive_ip.u4_idr_frm_interval = mIDRInterval;
904*495ae853SAndroid Build Coastguard Worker 
905*495ae853SAndroid Build Coastguard Worker     sGopParamsIp.s_ive_ip.u4_timestamp_high = 0;
906*495ae853SAndroid Build Coastguard Worker     sGopParamsIp.s_ive_ip.u4_timestamp_low = 0;
907*495ae853SAndroid Build Coastguard Worker 
908*495ae853SAndroid Build Coastguard Worker     sGopParamsIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_gop_params_ip_t);
909*495ae853SAndroid Build Coastguard Worker     sGopParamsOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_gop_params_op_t);
910*495ae853SAndroid Build Coastguard Worker 
911*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sGopParamsIp, &sGopParamsOp, &s_api_cmds);
912*495ae853SAndroid Build Coastguard Worker }
913*495ae853SAndroid Build Coastguard Worker 
setProfileParams()914*495ae853SAndroid Build Coastguard Worker void Codec::setProfileParams()
915*495ae853SAndroid Build Coastguard Worker {
916*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_profile_params_ip_t sProfileParamsIp{};
917*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_profile_params_op_t sProfileParamsOp{};
918*495ae853SAndroid Build Coastguard Worker 
919*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_PROFILE_PARAMS};
920*495ae853SAndroid Build Coastguard Worker 
921*495ae853SAndroid Build Coastguard Worker     sProfileParamsIp.s_ive_ip.e_profile = mProfile;
922*495ae853SAndroid Build Coastguard Worker     if(sProfileParamsIp.s_ive_ip.e_profile == IV_PROFILE_BASE)
923*495ae853SAndroid Build Coastguard Worker     {
924*495ae853SAndroid Build Coastguard Worker         sProfileParamsIp.s_ive_ip.u4_entropy_coding_mode = 0;
925*495ae853SAndroid Build Coastguard Worker     }
926*495ae853SAndroid Build Coastguard Worker     else
927*495ae853SAndroid Build Coastguard Worker     {
928*495ae853SAndroid Build Coastguard Worker         sProfileParamsIp.s_ive_ip.u4_entropy_coding_mode = 1;
929*495ae853SAndroid Build Coastguard Worker     }
930*495ae853SAndroid Build Coastguard Worker 
931*495ae853SAndroid Build Coastguard Worker     sProfileParamsIp.s_ive_ip.u4_timestamp_high = 0;
932*495ae853SAndroid Build Coastguard Worker     sProfileParamsIp.s_ive_ip.u4_timestamp_low = 0;
933*495ae853SAndroid Build Coastguard Worker 
934*495ae853SAndroid Build Coastguard Worker     sProfileParamsIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_profile_params_ip_t);
935*495ae853SAndroid Build Coastguard Worker     sProfileParamsOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_profile_params_op_t);
936*495ae853SAndroid Build Coastguard Worker 
937*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sProfileParamsIp, &sProfileParamsOp, &s_api_cmds);
938*495ae853SAndroid Build Coastguard Worker }
939*495ae853SAndroid Build Coastguard Worker 
setDeblockParams()940*495ae853SAndroid Build Coastguard Worker void Codec::setDeblockParams()
941*495ae853SAndroid Build Coastguard Worker {
942*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_deblock_params_ip_t sDeblockParamsIp{};
943*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_deblock_params_op_t sDeblockParamsOp{};
944*495ae853SAndroid Build Coastguard Worker 
945*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_DEBLOCK_PARAMS};
946*495ae853SAndroid Build Coastguard Worker 
947*495ae853SAndroid Build Coastguard Worker     sDeblockParamsIp.s_ive_ip.u4_disable_deblock_level = mDisableDeblockLevel;
948*495ae853SAndroid Build Coastguard Worker 
949*495ae853SAndroid Build Coastguard Worker     sDeblockParamsIp.s_ive_ip.u4_timestamp_high = 0;
950*495ae853SAndroid Build Coastguard Worker     sDeblockParamsIp.s_ive_ip.u4_timestamp_low = 0;
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker     sDeblockParamsIp.s_ive_ip.u4_size = sizeof(isvce_ctl_set_deblock_params_ip_t);
953*495ae853SAndroid Build Coastguard Worker     sDeblockParamsOp.s_ive_op.u4_size = sizeof(isvce_ctl_set_deblock_params_op_t);
954*495ae853SAndroid Build Coastguard Worker 
955*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sDeblockParamsIp, &sDeblockParamsOp, &s_api_cmds);
956*495ae853SAndroid Build Coastguard Worker }
957*495ae853SAndroid Build Coastguard Worker 
setVuiParams()958*495ae853SAndroid Build Coastguard Worker void Codec::setVuiParams()
959*495ae853SAndroid Build Coastguard Worker {
960*495ae853SAndroid Build Coastguard Worker     isvce_vui_ip_t sVuiParamsIp{};
961*495ae853SAndroid Build Coastguard Worker     isvce_vui_op_t sVuiParamsOp{};
962*495ae853SAndroid Build Coastguard Worker 
963*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_VUI_PARAMS};
964*495ae853SAndroid Build Coastguard Worker 
965*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_aspect_ratio_info_present_flag = mAspectRatioFlag;
966*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_aspect_ratio_idc = 0;
967*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u2_sar_width = 0;
968*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u2_sar_height = 0;
969*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_overscan_info_present_flag = 0;
970*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_overscan_appropriate_flag = 0;
971*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_video_signal_type_present_flag = 1;
972*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_video_format = 0;
973*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_video_full_range_flag = 0;
974*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_colour_description_present_flag = 0;
975*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_colour_primaries = 0;
976*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_transfer_characteristics = 0;
977*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_matrix_coefficients = 0;
978*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_chroma_loc_info_present_flag = 0;
979*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_chroma_sample_loc_type_top_field = 0;
980*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_chroma_sample_loc_type_bottom_field = 0;
981*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_vui_timing_info_present_flag = 0;
982*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u4_vui_num_units_in_tick = 0;
983*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u4_vui_time_scale = 0;
984*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_fixed_frame_rate_flag = 0;
985*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_nal_hrd_parameters_present_flag = mNalHrdFlag;
986*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_vcl_hrd_parameters_present_flag = mVclHrdFlag;
987*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_low_delay_hrd_flag = 0;
988*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_pic_struct_present_flag = 0;
989*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_bitstream_restriction_flag = 0;
990*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_motion_vectors_over_pic_boundaries_flag = 0;
991*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_max_bytes_per_pic_denom = 0;
992*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_max_bits_per_mb_denom = 0;
993*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_log2_max_mv_length_horizontal = 0;
994*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_log2_max_mv_length_vertical = 0;
995*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_num_reorder_frames = 0;
996*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u1_max_dec_frame_buffering = 0;
997*495ae853SAndroid Build Coastguard Worker 
998*495ae853SAndroid Build Coastguard Worker     sVuiParamsIp.u4_size = sizeof(isvce_vui_ip_t);
999*495ae853SAndroid Build Coastguard Worker     sVuiParamsOp.u4_size = sizeof(isvce_vui_op_t);
1000*495ae853SAndroid Build Coastguard Worker 
1001*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sVuiParamsIp, &sVuiParamsOp, &s_api_cmds);
1002*495ae853SAndroid Build Coastguard Worker }
1003*495ae853SAndroid Build Coastguard Worker 
setSeiMdcvParams()1004*495ae853SAndroid Build Coastguard Worker void Codec::setSeiMdcvParams()
1005*495ae853SAndroid Build Coastguard Worker {
1006*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_mdcv_params_ip_t sSeiMdcvParamsIp{};
1007*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_mdcv_params_op_t sSeiMdcvParamsOp{};
1008*495ae853SAndroid Build Coastguard Worker 
1009*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_SEI_MDCV_PARAMS};
1010*495ae853SAndroid Build Coastguard Worker 
1011*495ae853SAndroid Build Coastguard Worker     sSeiMdcvParamsIp.u1_sei_mdcv_params_present_flag = mSeiMdcvFlag;
1012*495ae853SAndroid Build Coastguard Worker     if(mSeiMdcvFlag)
1013*495ae853SAndroid Build Coastguard Worker     {
1014*495ae853SAndroid Build Coastguard Worker         for(int i4_count = 0; i4_count < kNumSeiMdcvPrimaries; ++i4_count)
1015*495ae853SAndroid Build Coastguard Worker         {
1016*495ae853SAndroid Build Coastguard Worker             sSeiMdcvParamsIp.au2_display_primaries_x[i4_count] = 30000;
1017*495ae853SAndroid Build Coastguard Worker             sSeiMdcvParamsIp.au2_display_primaries_y[i4_count] = 35000;
1018*495ae853SAndroid Build Coastguard Worker         }
1019*495ae853SAndroid Build Coastguard Worker         sSeiMdcvParamsIp.u2_white_point_x = 30000;
1020*495ae853SAndroid Build Coastguard Worker         sSeiMdcvParamsIp.u2_white_point_y = 35000;
1021*495ae853SAndroid Build Coastguard Worker         sSeiMdcvParamsIp.u4_max_display_mastering_luminance = 100000000;
1022*495ae853SAndroid Build Coastguard Worker         sSeiMdcvParamsIp.u4_min_display_mastering_luminance = 50000;
1023*495ae853SAndroid Build Coastguard Worker     }
1024*495ae853SAndroid Build Coastguard Worker 
1025*495ae853SAndroid Build Coastguard Worker     sSeiMdcvParamsIp.u4_timestamp_high = 0;
1026*495ae853SAndroid Build Coastguard Worker     sSeiMdcvParamsIp.u4_timestamp_low = 0;
1027*495ae853SAndroid Build Coastguard Worker 
1028*495ae853SAndroid Build Coastguard Worker     sSeiMdcvParamsIp.u4_size = sizeof(isvce_ctl_set_sei_mdcv_params_ip_t);
1029*495ae853SAndroid Build Coastguard Worker     sSeiMdcvParamsOp.u4_size = sizeof(isvce_ctl_set_sei_mdcv_params_op_t);
1030*495ae853SAndroid Build Coastguard Worker 
1031*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sSeiMdcvParamsIp, &sSeiMdcvParamsOp, &s_api_cmds);
1032*495ae853SAndroid Build Coastguard Worker }
1033*495ae853SAndroid Build Coastguard Worker 
setSeiCllParams()1034*495ae853SAndroid Build Coastguard Worker void Codec::setSeiCllParams()
1035*495ae853SAndroid Build Coastguard Worker {
1036*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_cll_params_ip_t sSeiCllParamsIp{};
1037*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_cll_params_op_t sSeiCllParamsOp{};
1038*495ae853SAndroid Build Coastguard Worker 
1039*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_SEI_CLL_PARAMS};
1040*495ae853SAndroid Build Coastguard Worker 
1041*495ae853SAndroid Build Coastguard Worker     sSeiCllParamsIp.u1_sei_cll_params_present_flag = mSeiCllFlag;
1042*495ae853SAndroid Build Coastguard Worker 
1043*495ae853SAndroid Build Coastguard Worker     if(mSeiCllFlag)
1044*495ae853SAndroid Build Coastguard Worker     {
1045*495ae853SAndroid Build Coastguard Worker         sSeiCllParamsIp.u2_max_content_light_level = 0;
1046*495ae853SAndroid Build Coastguard Worker         sSeiCllParamsIp.u2_max_pic_average_light_level = 0;
1047*495ae853SAndroid Build Coastguard Worker     }
1048*495ae853SAndroid Build Coastguard Worker 
1049*495ae853SAndroid Build Coastguard Worker     sSeiCllParamsIp.u4_timestamp_high = 0;
1050*495ae853SAndroid Build Coastguard Worker     sSeiCllParamsIp.u4_timestamp_low = 0;
1051*495ae853SAndroid Build Coastguard Worker 
1052*495ae853SAndroid Build Coastguard Worker     sSeiCllParamsIp.u4_size = sizeof(isvce_ctl_set_sei_cll_params_ip_t);
1053*495ae853SAndroid Build Coastguard Worker     sSeiCllParamsOp.u4_size = sizeof(isvce_ctl_set_sei_cll_params_op_t);
1054*495ae853SAndroid Build Coastguard Worker 
1055*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sSeiCllParamsIp, &sSeiCllParamsOp, &s_api_cmds);
1056*495ae853SAndroid Build Coastguard Worker }
1057*495ae853SAndroid Build Coastguard Worker 
setSeiAveParams()1058*495ae853SAndroid Build Coastguard Worker void Codec::setSeiAveParams()
1059*495ae853SAndroid Build Coastguard Worker {
1060*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_ave_params_ip_t sSeiAveParamsIp{};
1061*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_ave_params_op_t sSeiAveParamsOp{};
1062*495ae853SAndroid Build Coastguard Worker 
1063*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_SEI_AVE_PARAMS};
1064*495ae853SAndroid Build Coastguard Worker 
1065*495ae853SAndroid Build Coastguard Worker     sSeiAveParamsIp.u1_sei_ave_params_present_flag = mSeiAveFlag;
1066*495ae853SAndroid Build Coastguard Worker 
1067*495ae853SAndroid Build Coastguard Worker     if(mSeiAveFlag)
1068*495ae853SAndroid Build Coastguard Worker     {
1069*495ae853SAndroid Build Coastguard Worker         sSeiAveParamsIp.u4_ambient_illuminance = 1;
1070*495ae853SAndroid Build Coastguard Worker         sSeiAveParamsIp.u2_ambient_light_x = 0;
1071*495ae853SAndroid Build Coastguard Worker         sSeiAveParamsIp.u2_ambient_light_y = 0;
1072*495ae853SAndroid Build Coastguard Worker     }
1073*495ae853SAndroid Build Coastguard Worker 
1074*495ae853SAndroid Build Coastguard Worker     sSeiAveParamsIp.u4_timestamp_high = 0;
1075*495ae853SAndroid Build Coastguard Worker     sSeiAveParamsIp.u4_timestamp_low = 0;
1076*495ae853SAndroid Build Coastguard Worker 
1077*495ae853SAndroid Build Coastguard Worker     sSeiAveParamsIp.u4_size = sizeof(isvce_ctl_set_sei_ave_params_ip_t);
1078*495ae853SAndroid Build Coastguard Worker     sSeiAveParamsOp.u4_size = sizeof(isvce_ctl_set_sei_ave_params_op_t);
1079*495ae853SAndroid Build Coastguard Worker 
1080*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sSeiAveParamsIp, &sSeiAveParamsOp, &s_api_cmds);
1081*495ae853SAndroid Build Coastguard Worker }
1082*495ae853SAndroid Build Coastguard Worker 
setSeiCcvParams()1083*495ae853SAndroid Build Coastguard Worker void Codec::setSeiCcvParams()
1084*495ae853SAndroid Build Coastguard Worker {
1085*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_ccv_params_ip_t sSeiCcvParamsIp{};
1086*495ae853SAndroid Build Coastguard Worker     isvce_ctl_set_sei_ccv_params_op_t sSeiCcvParamsOp{};
1087*495ae853SAndroid Build Coastguard Worker 
1088*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_SET_SEI_CCV_PARAMS};
1089*495ae853SAndroid Build Coastguard Worker 
1090*495ae853SAndroid Build Coastguard Worker     sSeiCcvParamsIp.u1_sei_ccv_params_present_flag = mSeiCcvFlag;
1091*495ae853SAndroid Build Coastguard Worker 
1092*495ae853SAndroid Build Coastguard Worker     if(mSeiCcvFlag)
1093*495ae853SAndroid Build Coastguard Worker     {
1094*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_cancel_flag = 0;
1095*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_persistence_flag = 1;
1096*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_primaries_present_flag = 1;
1097*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_min_luminance_value_present_flag = 1;
1098*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_max_luminance_value_present_flag = 1;
1099*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_avg_luminance_value_present_flag = 1;
1100*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u1_ccv_reserved_zero_2bits = 0;
1101*495ae853SAndroid Build Coastguard Worker         for(int i4_count = 0; i4_count < kNumSeiCcvPrimaries; ++i4_count)
1102*495ae853SAndroid Build Coastguard Worker         {
1103*495ae853SAndroid Build Coastguard Worker             sSeiCcvParamsIp.ai4_ccv_primaries_x[i4_count] = 1;
1104*495ae853SAndroid Build Coastguard Worker             sSeiCcvParamsIp.ai4_ccv_primaries_y[i4_count] = 1;
1105*495ae853SAndroid Build Coastguard Worker         }
1106*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u4_ccv_min_luminance_value = 1;
1107*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u4_ccv_max_luminance_value = 1;
1108*495ae853SAndroid Build Coastguard Worker         sSeiCcvParamsIp.u4_ccv_avg_luminance_value = 1;
1109*495ae853SAndroid Build Coastguard Worker     }
1110*495ae853SAndroid Build Coastguard Worker 
1111*495ae853SAndroid Build Coastguard Worker     sSeiCcvParamsIp.u4_timestamp_high = 0;
1112*495ae853SAndroid Build Coastguard Worker     sSeiCcvParamsIp.u4_timestamp_low = 0;
1113*495ae853SAndroid Build Coastguard Worker 
1114*495ae853SAndroid Build Coastguard Worker     sSeiCcvParamsIp.u4_size = sizeof(isvce_ctl_set_sei_ccv_params_ip_t);
1115*495ae853SAndroid Build Coastguard Worker     sSeiCcvParamsOp.u4_size = sizeof(isvce_ctl_set_sei_ccv_params_op_t);
1116*495ae853SAndroid Build Coastguard Worker 
1117*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sSeiCcvParamsIp, &sSeiCcvParamsOp, &s_api_cmds);
1118*495ae853SAndroid Build Coastguard Worker }
1119*495ae853SAndroid Build Coastguard Worker 
logVersion()1120*495ae853SAndroid Build Coastguard Worker void Codec::logVersion()
1121*495ae853SAndroid Build Coastguard Worker {
1122*495ae853SAndroid Build Coastguard Worker     isvce_ctl_getversioninfo_ip_t s_ctl_set_getversioninfo_ip{};
1123*495ae853SAndroid Build Coastguard Worker     isvce_ctl_getversioninfo_op_t s_ctl_set_getversioninfo_op{};
1124*495ae853SAndroid Build Coastguard Worker 
1125*495ae853SAndroid Build Coastguard Worker     CHAR ac_version_string[512];
1126*495ae853SAndroid Build Coastguard Worker 
1127*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_CTL, ISVCE_CMD_CTL_GETVERSION};
1128*495ae853SAndroid Build Coastguard Worker 
1129*495ae853SAndroid Build Coastguard Worker     s_ctl_set_getversioninfo_ip.s_ive_ip.pu1_version = (UWORD8 *) ac_version_string;
1130*495ae853SAndroid Build Coastguard Worker     s_ctl_set_getversioninfo_ip.s_ive_ip.u4_version_bufsize = sizeof(ac_version_string);
1131*495ae853SAndroid Build Coastguard Worker     s_ctl_set_getversioninfo_ip.s_ive_ip.u4_size = sizeof(isvce_ctl_getversioninfo_ip_t);
1132*495ae853SAndroid Build Coastguard Worker     s_ctl_set_getversioninfo_op.s_ive_op.u4_size = sizeof(isvce_ctl_getversioninfo_op_t);
1133*495ae853SAndroid Build Coastguard Worker 
1134*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, (void *) &s_ctl_set_getversioninfo_ip,
1135*495ae853SAndroid Build Coastguard Worker                        (void *) &s_ctl_set_getversioninfo_op, &s_api_cmds);
1136*495ae853SAndroid Build Coastguard Worker }
1137*495ae853SAndroid Build Coastguard Worker 
encodeFrames(const UWORD8 * data,size_t size)1138*495ae853SAndroid Build Coastguard Worker bool Codec::encodeFrames(const UWORD8 *data, size_t size)
1139*495ae853SAndroid Build Coastguard Worker {
1140*495ae853SAndroid Build Coastguard Worker     isvce_video_encode_ip_t sEncodeIp{};
1141*495ae853SAndroid Build Coastguard Worker     isvce_video_encode_op_t sEncodeOp{};
1142*495ae853SAndroid Build Coastguard Worker 
1143*495ae853SAndroid Build Coastguard Worker     isvce_api_cmds_t s_api_cmds{ISVCE_CMD_VIDEO_ENCODE, ISVCE_CMD_CT_NA};
1144*495ae853SAndroid Build Coastguard Worker     iv_raw_buf_t *psInpRawBuf = &sEncodeIp.s_ive_ip.s_inp_buf;
1145*495ae853SAndroid Build Coastguard Worker     iv_raw_buf_t *psRecRawBuf = &sEncodeIp.s_ive_ip.s_recon_buf;
1146*495ae853SAndroid Build Coastguard Worker 
1147*495ae853SAndroid Build Coastguard Worker     size_t frameSize = mInputDims.getFrameSize();
1148*495ae853SAndroid Build Coastguard Worker     auto bytesLeft = std::min(size, frameSize);
1149*495ae853SAndroid Build Coastguard Worker     auto bytesConsumed = 0;
1150*495ae853SAndroid Build Coastguard Worker     UWORD32 numFrames = 0;
1151*495ae853SAndroid Build Coastguard Worker 
1152*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.s_out_buf.pv_buf = mEncBufs.mOutputBuf.data();
1153*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.s_out_buf.u4_bytes = 0;
1154*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.s_out_buf.u4_bufsize = static_cast<UWORD32>(mEncBufs.mOutputBuf.size());
1155*495ae853SAndroid Build Coastguard Worker     sEncodeOp.s_ive_op.s_out_buf.pv_buf = nullptr;
1156*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.pv_bufs = nullptr;
1157*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.pv_mb_info = nullptr;
1158*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.pv_pic_info = nullptr;
1159*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.u4_mb_info_type = 0;
1160*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.u4_pic_info_type = 0;
1161*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.u4_is_last = 0;
1162*495ae853SAndroid Build Coastguard Worker 
1163*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.u4_timestamp_high = 0;
1164*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.u4_timestamp_low = 0;
1165*495ae853SAndroid Build Coastguard Worker 
1166*495ae853SAndroid Build Coastguard Worker     memset(psInpRawBuf, 0, sizeof(iv_raw_buf_t));
1167*495ae853SAndroid Build Coastguard Worker     psInpRawBuf->u4_size = sizeof(iv_raw_buf_t);
1168*495ae853SAndroid Build Coastguard Worker     psInpRawBuf->e_color_fmt = mIvVideoColorFormat;
1169*495ae853SAndroid Build Coastguard Worker 
1170*495ae853SAndroid Build Coastguard Worker     sEncodeIp.s_ive_ip.u4_size = sizeof(isvce_video_encode_ip_t);
1171*495ae853SAndroid Build Coastguard Worker     sEncodeOp.s_ive_op.u4_size = sizeof(isvce_video_encode_op_t);
1172*495ae853SAndroid Build Coastguard Worker 
1173*495ae853SAndroid Build Coastguard Worker     isvce_api_function(mCodecCtx, &sEncodeIp, &sEncodeOp, &s_api_cmds);
1174*495ae853SAndroid Build Coastguard Worker 
1175*495ae853SAndroid Build Coastguard Worker     if(mEnableNaluInfoExport)
1176*495ae853SAndroid Build Coastguard Worker     {
1177*495ae853SAndroid Build Coastguard Worker         sEncodeIp.ps_nalu_info_buf = mEncBufs.mNaluInfoStructBuf.data();
1178*495ae853SAndroid Build Coastguard Worker         sEncodeOp.ps_nalu_info_buf = mEncBufs.mNaluInfoStructBuf.data() + mNumSpatialLayers;
1179*495ae853SAndroid Build Coastguard Worker     }
1180*495ae853SAndroid Build Coastguard Worker 
1181*495ae853SAndroid Build Coastguard Worker     while(!sEncodeOp.s_ive_op.u4_is_last && (kMaxEncodeCalls > (mNumSpatialLayers * numFrames)))
1182*495ae853SAndroid Build Coastguard Worker     {
1183*495ae853SAndroid Build Coastguard Worker         if(mEnableRecon)
1184*495ae853SAndroid Build Coastguard Worker         {
1185*495ae853SAndroid Build Coastguard Worker             setEncParams(psRecRawBuf, mEncBufs.mReconBuf, mInputDims);
1186*495ae853SAndroid Build Coastguard Worker         }
1187*495ae853SAndroid Build Coastguard Worker 
1188*495ae853SAndroid Build Coastguard Worker         if(mEnableNaluInfoExport)
1189*495ae853SAndroid Build Coastguard Worker         {
1190*495ae853SAndroid Build Coastguard Worker             for(auto i = 0; i < mNumSpatialLayers; i++)
1191*495ae853SAndroid Build Coastguard Worker             {
1192*495ae853SAndroid Build Coastguard Worker                 sEncodeIp.ps_nalu_info_buf[i].pu1_buf = mEncBufs.mNaluInfoDataBuf[i].data();
1193*495ae853SAndroid Build Coastguard Worker                 sEncodeIp.ps_nalu_info_buf[i].u4_num_bytes = 0;
1194*495ae853SAndroid Build Coastguard Worker                 sEncodeIp.ps_nalu_info_buf[i].u4_buf_size =
1195*495ae853SAndroid Build Coastguard Worker                     static_cast<UWORD32>(mEncBufs.mNaluInfoDataBuf[i].size());
1196*495ae853SAndroid Build Coastguard Worker             }
1197*495ae853SAndroid Build Coastguard Worker         }
1198*495ae853SAndroid Build Coastguard Worker 
1199*495ae853SAndroid Build Coastguard Worker         if(size > 0)
1200*495ae853SAndroid Build Coastguard Worker         {
1201*495ae853SAndroid Build Coastguard Worker             bytesLeft = std::min(size, frameSize);
1202*495ae853SAndroid Build Coastguard Worker             std::copy(data, data + bytesLeft, mEncBufs.mInputBuf.begin());
1203*495ae853SAndroid Build Coastguard Worker             std::fill(std::next(mEncBufs.mInputBuf.begin(), bytesLeft), mEncBufs.mInputBuf.end(),
1204*495ae853SAndroid Build Coastguard Worker                       data[0]);
1205*495ae853SAndroid Build Coastguard Worker             setEncParams(psInpRawBuf, mEncBufs.mInputBuf, mInputDims, mIvVideoColorFormat);
1206*495ae853SAndroid Build Coastguard Worker 
1207*495ae853SAndroid Build Coastguard Worker             bytesConsumed = bytesLeft;
1208*495ae853SAndroid Build Coastguard Worker         }
1209*495ae853SAndroid Build Coastguard Worker         else
1210*495ae853SAndroid Build Coastguard Worker         {
1211*495ae853SAndroid Build Coastguard Worker             sEncodeIp.s_ive_ip.u4_is_last = 1;
1212*495ae853SAndroid Build Coastguard Worker 
1213*495ae853SAndroid Build Coastguard Worker             for(auto i = 0; i < 3; i++)
1214*495ae853SAndroid Build Coastguard Worker             {
1215*495ae853SAndroid Build Coastguard Worker                 psInpRawBuf->apv_bufs[i] = nullptr;
1216*495ae853SAndroid Build Coastguard Worker             }
1217*495ae853SAndroid Build Coastguard Worker 
1218*495ae853SAndroid Build Coastguard Worker             bytesConsumed = 0;
1219*495ae853SAndroid Build Coastguard Worker         }
1220*495ae853SAndroid Build Coastguard Worker 
1221*495ae853SAndroid Build Coastguard Worker         if(mIsForceIdrEnabled && !sEncodeIp.s_ive_ip.u4_is_last)
1222*495ae853SAndroid Build Coastguard Worker         {
1223*495ae853SAndroid Build Coastguard Worker             if(numFrames == mForceIdrInterval)
1224*495ae853SAndroid Build Coastguard Worker             {
1225*495ae853SAndroid Build Coastguard Worker                 setFrameType(IV_IDR_FRAME);
1226*495ae853SAndroid Build Coastguard Worker             }
1227*495ae853SAndroid Build Coastguard Worker         }
1228*495ae853SAndroid Build Coastguard Worker 
1229*495ae853SAndroid Build Coastguard Worker         if(mIsDynamicBitRateChangeEnabled && !sEncodeIp.s_ive_ip.u4_is_last)
1230*495ae853SAndroid Build Coastguard Worker         {
1231*495ae853SAndroid Build Coastguard Worker             if(numFrames == mDynamicBitRateInterval)
1232*495ae853SAndroid Build Coastguard Worker             {
1233*495ae853SAndroid Build Coastguard Worker                 if(data[0] & 0x01)
1234*495ae853SAndroid Build Coastguard Worker                 {
1235*495ae853SAndroid Build Coastguard Worker                     mBitrate *= 2;
1236*495ae853SAndroid Build Coastguard Worker                 }
1237*495ae853SAndroid Build Coastguard Worker                 else
1238*495ae853SAndroid Build Coastguard Worker                 {
1239*495ae853SAndroid Build Coastguard Worker                     mBitrate /= 2;
1240*495ae853SAndroid Build Coastguard Worker                 }
1241*495ae853SAndroid Build Coastguard Worker 
1242*495ae853SAndroid Build Coastguard Worker                 setBitRate();
1243*495ae853SAndroid Build Coastguard Worker             }
1244*495ae853SAndroid Build Coastguard Worker         }
1245*495ae853SAndroid Build Coastguard Worker 
1246*495ae853SAndroid Build Coastguard Worker         if(mIsDynamicFrameRateChangeEnabled && !sEncodeIp.s_ive_ip.u4_is_last)
1247*495ae853SAndroid Build Coastguard Worker         {
1248*495ae853SAndroid Build Coastguard Worker             if(numFrames == mDynamicFrameRateInterval)
1249*495ae853SAndroid Build Coastguard Worker             {
1250*495ae853SAndroid Build Coastguard Worker                 if(size > 1 && data[1] & 0x01)
1251*495ae853SAndroid Build Coastguard Worker                 {
1252*495ae853SAndroid Build Coastguard Worker                     mFrameRate *= 2;
1253*495ae853SAndroid Build Coastguard Worker                 }
1254*495ae853SAndroid Build Coastguard Worker                 else
1255*495ae853SAndroid Build Coastguard Worker                 {
1256*495ae853SAndroid Build Coastguard Worker                     mFrameRate /= 2;
1257*495ae853SAndroid Build Coastguard Worker                 }
1258*495ae853SAndroid Build Coastguard Worker 
1259*495ae853SAndroid Build Coastguard Worker                 setFrameRate();
1260*495ae853SAndroid Build Coastguard Worker             }
1261*495ae853SAndroid Build Coastguard Worker         }
1262*495ae853SAndroid Build Coastguard Worker 
1263*495ae853SAndroid Build Coastguard Worker         isvce_api_function(mCodecCtx, &sEncodeIp, &sEncodeOp, &s_api_cmds);
1264*495ae853SAndroid Build Coastguard Worker 
1265*495ae853SAndroid Build Coastguard Worker         if(!sEncodeOp.s_ive_op.u4_is_last)
1266*495ae853SAndroid Build Coastguard Worker         {
1267*495ae853SAndroid Build Coastguard Worker             numFrames++;
1268*495ae853SAndroid Build Coastguard Worker             data += bytesConsumed;
1269*495ae853SAndroid Build Coastguard Worker             size -= bytesConsumed;
1270*495ae853SAndroid Build Coastguard Worker         }
1271*495ae853SAndroid Build Coastguard Worker     }
1272*495ae853SAndroid Build Coastguard Worker 
1273*495ae853SAndroid Build Coastguard Worker     return true;
1274*495ae853SAndroid Build Coastguard Worker }
1275*495ae853SAndroid Build Coastguard Worker 
setEncParams(iv_raw_buf_t * psInpRawBuf,std::vector<UWORD8> & buf,const FrameDims & dims,IV_COLOR_FORMAT_T colorFormat)1276*495ae853SAndroid Build Coastguard Worker void Codec::setEncParams(iv_raw_buf_t *psInpRawBuf, std::vector<UWORD8> &buf, const FrameDims &dims,
1277*495ae853SAndroid Build Coastguard Worker                          IV_COLOR_FORMAT_T colorFormat)
1278*495ae853SAndroid Build Coastguard Worker {
1279*495ae853SAndroid Build Coastguard Worker     switch(colorFormat)
1280*495ae853SAndroid Build Coastguard Worker     {
1281*495ae853SAndroid Build Coastguard Worker         case IV_YUV_420SP_UV:
1282*495ae853SAndroid Build Coastguard Worker         case IV_YUV_420SP_VU:
1283*495ae853SAndroid Build Coastguard Worker         {
1284*495ae853SAndroid Build Coastguard Worker             WORD32 yStride = dims.mWidth;
1285*495ae853SAndroid Build Coastguard Worker             WORD32 uStride = dims.mWidth / 2;
1286*495ae853SAndroid Build Coastguard Worker 
1287*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->apv_bufs[0] = buf.data();
1288*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->apv_bufs[1] = buf.data() + dims.mWidth * dims.mHeight;
1289*495ae853SAndroid Build Coastguard Worker 
1290*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_wd[0] = dims.mWidth;
1291*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_wd[1] = dims.mWidth;
1292*495ae853SAndroid Build Coastguard Worker 
1293*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_ht[0] = dims.mHeight;
1294*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_ht[1] = dims.mHeight / 2;
1295*495ae853SAndroid Build Coastguard Worker 
1296*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_strd[0] = yStride;
1297*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_strd[1] = uStride;
1298*495ae853SAndroid Build Coastguard Worker 
1299*495ae853SAndroid Build Coastguard Worker             break;
1300*495ae853SAndroid Build Coastguard Worker         }
1301*495ae853SAndroid Build Coastguard Worker         default:
1302*495ae853SAndroid Build Coastguard Worker         {
1303*495ae853SAndroid Build Coastguard Worker             WORD32 yStride = dims.mWidth;
1304*495ae853SAndroid Build Coastguard Worker             WORD32 uStride = dims.mWidth / 2;
1305*495ae853SAndroid Build Coastguard Worker             WORD32 vStride = dims.mWidth / 2;
1306*495ae853SAndroid Build Coastguard Worker 
1307*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->apv_bufs[0] = buf.data();
1308*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->apv_bufs[1] = buf.data() + dims.mWidth * dims.mHeight;
1309*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->apv_bufs[2] = buf.data() + (dims.mWidth * dims.mHeight * 5) / 4;
1310*495ae853SAndroid Build Coastguard Worker 
1311*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_wd[0] = dims.mWidth;
1312*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_wd[1] = dims.mWidth / 2;
1313*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_wd[2] = dims.mWidth / 2;
1314*495ae853SAndroid Build Coastguard Worker 
1315*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_ht[0] = dims.mHeight;
1316*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_ht[1] = dims.mHeight / 2;
1317*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_ht[2] = dims.mHeight / 2;
1318*495ae853SAndroid Build Coastguard Worker 
1319*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_strd[0] = yStride;
1320*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_strd[1] = uStride;
1321*495ae853SAndroid Build Coastguard Worker             psInpRawBuf->au4_strd[2] = vStride;
1322*495ae853SAndroid Build Coastguard Worker 
1323*495ae853SAndroid Build Coastguard Worker             break;
1324*495ae853SAndroid Build Coastguard Worker         }
1325*495ae853SAndroid Build Coastguard Worker     }
1326*495ae853SAndroid Build Coastguard Worker }
1327*495ae853SAndroid Build Coastguard Worker 
LLVMFuzzerTestOneInput(const UWORD8 * data,size_t size)1328*495ae853SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const UWORD8 *data, size_t size)
1329*495ae853SAndroid Build Coastguard Worker {
1330*495ae853SAndroid Build Coastguard Worker     if(size < IDX_LAST)
1331*495ae853SAndroid Build Coastguard Worker     {
1332*495ae853SAndroid Build Coastguard Worker         return 0;
1333*495ae853SAndroid Build Coastguard Worker     }
1334*495ae853SAndroid Build Coastguard Worker 
1335*495ae853SAndroid Build Coastguard Worker     std::unique_ptr<Codec> codec = std::make_unique<Codec>();
1336*495ae853SAndroid Build Coastguard Worker 
1337*495ae853SAndroid Build Coastguard Worker     if(codec->initEncoder(data))
1338*495ae853SAndroid Build Coastguard Worker     {
1339*495ae853SAndroid Build Coastguard Worker         codec->encodeFrames(data, size);
1340*495ae853SAndroid Build Coastguard Worker     }
1341*495ae853SAndroid Build Coastguard Worker 
1342*495ae853SAndroid Build Coastguard Worker     return 0;
1343*495ae853SAndroid Build Coastguard Worker }
1344