Coverage Report

Created: 2026-06-30 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}