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