Coverage Report

Created: 2025-07-09 06:41

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