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