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