Coverage Report

Created: 2025-11-29 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/fuzzer/avc_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 <malloc.h>
21
#include <algorithm>
22
#include <string.h>
23
#include <tuple>
24
#include <vector>
25
26
#include "ih264_defs.h"
27
#include "ih264_typedefs.h"
28
#include "ih264e.h"
29
#include "ih264e_error.h"
30
135k
#define ive_api_function ih264e_api_function
31
typedef std::tuple<uint8_t *, uint8_t *, uint8_t *> bufferPtrs;
32
33
constexpr static int kMaxNumEncodeCalls = 100;
34
constexpr uint32_t kHeaderLength = 0x800;
35
constexpr int16_t kCompressionRatio = 1;
36
37
constexpr int kMeSpeedPreset[] = {0, 50, 75, 100};
38
constexpr IVE_AIR_MODE_T kAirMode[] = {IVE_AIR_MODE_NONE, IVE_AIR_MODE_CYCLIC, IVE_AIR_MODE_RANDOM};
39
constexpr IVE_SPEED_CONFIG kEncSpeed[] = {IVE_CONFIG, IVE_SLOWEST,    IVE_NORMAL,
40
                                          IVE_FAST,   IVE_HIGH_SPEED, IVE_FASTEST};
41
constexpr IV_PROFILE_T kProfle[] = {IV_PROFILE_BASE, IV_PROFILE_MAIN};
42
constexpr IVE_RC_MODE_T kRCMode[] = {IVE_RC_NONE, IVE_RC_STORAGE, IVE_RC_CBR_NON_LOW_DELAY,
43
                                     IVE_RC_CBR_LOW_DELAY};
44
constexpr IV_COLOR_FORMAT_T kSupportedColorFormats[] = {IV_YUV_420P, IV_YUV_420SP_UV, IV_YUV_422ILE,
45
                                                        IV_YUV_420SP_VU};
46
47
constexpr size_t kAirModeNum = std::size(kAirMode);
48
constexpr size_t kEncSpeedNum = std::size(kEncSpeed);
49
constexpr size_t kMeSpeedPresetNum = std::size(kMeSpeedPreset);
50
constexpr size_t kProfleNum = std::size(kProfle);
51
constexpr size_t kRCModeNum = std::size(kRCMode);
52
constexpr size_t kSupportedColorFormatsNum = std::size(kSupportedColorFormats);
53
constexpr size_t kMinQP = 4;
54
constexpr size_t kMaxWidth = 10240;
55
constexpr size_t kMaxHeight = 10240;
56
constexpr size_t kMaxBitrate = 500000000;
57
58
enum {
59
    IDX_WD_BYTE_1,
60
    IDX_WD_BYTE_2,
61
    IDX_HT_BYTE_1,
62
    IDX_HT_BYTE_2,
63
    IDX_COLOR_FORMAT,
64
    IDX_ARCH_TYPE,
65
    IDX_RC_MODE,
66
    IDX_NUM_CORES,
67
    IDX_NUM_B_FRAMES,
68
    IDX_ENC_SPEED,
69
    IDX_CONSTRAINED_INTRA_FLAG,
70
    IDX_INTRA_4x4,
71
    IDX_I_FRAME_QP,
72
    IDX_P_FRAME_QP,
73
    IDX_B_FRAME_QP,
74
    IDX_BITRATE_BYTE_1,
75
    IDX_BITRATE_BYTE_2,
76
    IDX_FRAME_RATE,
77
    IDX_INTRA_REFRESH,
78
    IDX_ENABLE_HALF_PEL,
79
    IDX_ENABLE_Q_PEL,
80
    IDX_ME_SPEED_PRESET,
81
    IDX_AIR_MODE,
82
    IDX_DISABLE_DEBLOCK_LEVEL,
83
    IDX_SEARCH_RANGE_X,
84
    IDX_SEARCH_RANGE_Y,
85
    IDX_I_INTERVAL,
86
    IDX_IDR_INTERVAL,
87
    IDX_SEI_MDCV_FLAG,
88
    IDX_SEI_CLL_FLAG,
89
    IDX_SEI_AVE_FLAG,
90
    IDX_SEI_CCV_FLAG,
91
    IDX_SEI_SII_FLAG,
92
    IDX_PROFILE,
93
    IDX_ASPECT_RATIO_FLAG,
94
    IDX_NAL_HRD_FLAG,
95
    IDX_VCL_HRD_FLAG,
96
    IDX_ENABLE_FORCE_IDR,
97
    IDX_ENABLE_DYNAMIC_BITRATE,
98
    IDX_ENABLE_DYNAMIC_FRAME_RATE,
99
    IDX_FORCE_IDR_INTERVAL,
100
    IDX_DYNAMIC_BITRATE_INTERVAL,
101
    IDX_DYNAMIC_FRAME_RATE_INTERVAL,
102
    IDX_SEND_EOS_WITH_LAST_FRAME,
103
    IDX_LAST
104
};
105
106
class Codec {
107
   public:
108
8.56k
    Codec() = default;
109
53.9k
    ~Codec() { deInitEncoder(); }
110
    bool initEncoder(const uint8_t **pdata, size_t *psize);
111
    void encodeFrames(const uint8_t *data, size_t size);
112
    void deInitEncoder();
113
114
   private:
115
    bufferPtrs setEncParams(iv_raw_buf_t *psInpRawBuf, const uint8_t *data, size_t frameSize);
116
    void setFrameType(IV_PICTURE_CODING_TYPE_T eFrameType);
117
    void setQp();
118
    void setEncMode(IVE_ENC_MODE_T eEncMode);
119
    void setDimensions();
120
    void setNumCores();
121
    void setFrameRate();
122
    void setIpeParams();
123
    void setBitRate();
124
    void setAirParams();
125
    void setMeParams();
126
    void setGopParams();
127
    void setProfileParams();
128
    void setDeblockParams();
129
    void setVbvParams();
130
    void setDefault();
131
    void setVuiParams();
132
    void getBufInfo();
133
    void setSeiMdcvParams();
134
    void setSeiCllParams();
135
    void setSeiAveParams();
136
    void setSeiCcvParams();
137
    void setSeiSiiParams();
138
    void logVersion();
139
    void retrieveMemRecords();
140
    bool mHalfPelEnable = 1;
141
    bool mQPelEnable = 1;
142
    bool mIntra4x4 = 0;
143
    bool mEnableFastSad = 0;
144
    bool mEnableAltRef = 0;
145
    bool mConstrainedIntraFlag = 0;
146
    bool mSeiCllFlag = 1;
147
    bool mSeiAveFlag = 1;
148
    bool mSeiCcvFlag = 1;
149
    bool mSeiMdcvFlag = 1;
150
    bool mSeiSiiFlag = 1;
151
    bool mAspectRatioFlag = 0;
152
    bool mNalHrdFlag = 0;
153
    bool mVclHrdFlag = 0;
154
    bool mIsForceIdrEnabled = false;
155
    bool mIsDynamicBitRateChangeEnabled = false;
156
    bool mIsDynamicFrameRateChangeEnabled = false;
157
    bool mSendEosWithLastFrame = false;
158
    uint32_t mWidth = 2560;
159
    uint32_t mHeight = 2560;
160
    uint32_t mAvcEncLevel = 41;
161
    uint32_t mNumMemRecords = 0;
162
    uint32_t mNumCores = 1;
163
    uint32_t mBframes = 0;
164
    uint32_t mSliceParam = 256;
165
    uint32_t mMeSpeedPreset = 100;
166
    uint32_t mIInterval = 60;
167
    uint32_t mIDRInterval = 60;
168
    uint32_t mDisableDeblockLevel = 0;
169
    uint32_t m_I_QP = 22;
170
    uint32_t m_P_QP = 28;
171
    uint32_t m_B_QP = 22;
172
    uint32_t mIntraRefresh = 30;
173
    uint32_t mSearchRangeX = 64;
174
    uint32_t mSearchRangeY = 48;
175
    uint32_t mForceIdrInterval = 0;          // in number of frames
176
    uint32_t mDynamicBitRateInterval = 0;    // in number of frames
177
    uint32_t mDynamicFrameRateInterval = 0;  // in number of frames
178
    uint32_t mKeepThreadsActive;
179
    uint64_t mBitrate = 6000000;
180
    float mFrameRate = 30;
181
    iv_obj_t *mCodecCtx = nullptr;
182
    iv_mem_rec_t *mMemRecords = nullptr;
183
    IVE_AIR_MODE_T mAirMode = IVE_AIR_MODE_NONE;
184
    IVE_SPEED_CONFIG mEncSpeed = IVE_NORMAL;
185
    IVE_RC_MODE_T mRCMode = IVE_RC_STORAGE;
186
    IV_ARCH_T mArch = ARCH_NA;
187
    IVE_SLICE_MODE_T mSliceMode = IVE_SLICE_MODE_NONE;
188
    IV_COLOR_FORMAT_T mIvVideoColorFormat = IV_YUV_420P;
189
    IV_COLOR_FORMAT_T mReconFormat = IV_YUV_420P;
190
    IV_PROFILE_T mProfile = IV_PROFILE_BASE;
191
};
192
193
3.50k
bool Codec::initEncoder(const uint8_t **pdata, size_t *psize) {
194
3.50k
    uint8_t *data = const_cast<uint8_t *>(*pdata);
195
3.50k
    mWidth = ((data[IDX_WD_BYTE_1] << 8) | data[IDX_WD_BYTE_2]) % kMaxWidth;
196
3.50k
    mHeight = ((data[IDX_HT_BYTE_1] << 8) | data[IDX_HT_BYTE_2]) % kMaxHeight;
197
198
3.50k
    mIvVideoColorFormat =
199
3.50k
        kSupportedColorFormats[data[IDX_COLOR_FORMAT] % kSupportedColorFormatsNum];
200
3.50k
    mArch = ((data[IDX_ARCH_TYPE] & 0x03) == 0x00) ? ARCH_ARM_NONEON : ARCH_NA;
201
3.50k
    mRCMode = kRCMode[data[IDX_RC_MODE] % kRCModeNum];
202
3.50k
    mNumCores = (data[IDX_NUM_CORES] & 0x07) + 1;
203
3.50k
    mBframes = data[IDX_NUM_B_FRAMES] & 0x07;
204
3.50k
    mEncSpeed = kEncSpeed[data[IDX_ENC_SPEED] % kEncSpeedNum];
205
3.50k
    mConstrainedIntraFlag = data[IDX_CONSTRAINED_INTRA_FLAG] & 0x01;
206
3.50k
    mIntra4x4 = data[IDX_INTRA_4x4] & 0x01;
207
3.50k
    m_I_QP = (data[IDX_I_FRAME_QP] % (MAX_H264_QP - kMinQP)) + kMinQP;
208
3.50k
    m_P_QP = (data[IDX_P_FRAME_QP] % (MAX_H264_QP - kMinQP)) + kMinQP;
209
3.50k
    m_B_QP = (data[IDX_B_FRAME_QP] % (MAX_H264_QP - kMinQP)) + kMinQP;
210
3.50k
    mBitrate = (((data[IDX_BITRATE_BYTE_1] << 8) | data[IDX_BITRATE_BYTE_2]) * 1000) % kMaxBitrate;
211
3.50k
    mFrameRate = data[IDX_FRAME_RATE];
212
3.50k
    mIntraRefresh = data[IDX_INTRA_REFRESH] + 1;
213
3.50k
    mHalfPelEnable = data[IDX_ENABLE_HALF_PEL] & 0x01;
214
3.50k
    mQPelEnable = data[IDX_ENABLE_Q_PEL] & 0x01;
215
3.50k
    mMeSpeedPreset = kMeSpeedPreset[data[IDX_ME_SPEED_PRESET] % kMeSpeedPresetNum];
216
3.50k
    mAirMode = kAirMode[data[IDX_AIR_MODE] % kAirModeNum];
217
3.50k
    mDisableDeblockLevel = data[IDX_DISABLE_DEBLOCK_LEVEL] & 0x03;
218
3.50k
    mSearchRangeX = data[IDX_SEARCH_RANGE_X];
219
3.50k
    mSearchRangeY = data[IDX_SEARCH_RANGE_Y];
220
3.50k
    mIInterval = data[IDX_I_INTERVAL] + 1;
221
3.50k
    mIDRInterval = data[IDX_IDR_INTERVAL] + 1;
222
3.50k
    mSeiMdcvFlag = data[IDX_SEI_MDCV_FLAG] & 0x01;
223
3.50k
    mSeiCllFlag = data[IDX_SEI_CLL_FLAG] & 0x01;
224
3.50k
    mSeiAveFlag = data[IDX_SEI_AVE_FLAG] & 0x01;
225
3.50k
    mSeiCcvFlag = data[IDX_SEI_CCV_FLAG] & 0x01;
226
3.50k
    mSeiSiiFlag = data[IDX_SEI_SII_FLAG] & 0x01;
227
3.50k
    mProfile = kProfle[data[IDX_PROFILE] % kProfleNum];
228
3.50k
    mAspectRatioFlag = data[IDX_ASPECT_RATIO_FLAG] & 0x01;
229
3.50k
    mNalHrdFlag = data[IDX_NAL_HRD_FLAG] & 0x01;
230
3.50k
    mVclHrdFlag = data[IDX_VCL_HRD_FLAG] & 0x01;
231
3.50k
    mIsForceIdrEnabled = data[IDX_ENABLE_FORCE_IDR] & 0x01;
232
3.50k
    mIsDynamicBitRateChangeEnabled = data[IDX_ENABLE_DYNAMIC_BITRATE] & 0x01;
233
3.50k
    mIsDynamicFrameRateChangeEnabled = data[IDX_ENABLE_DYNAMIC_FRAME_RATE] & 0x01;
234
3.50k
    mSendEosWithLastFrame = data[IDX_SEND_EOS_WITH_LAST_FRAME] & 0x01;
235
3.50k
    mForceIdrInterval = data[IDX_FORCE_IDR_INTERVAL] & 0x07;
236
3.50k
    mDynamicBitRateInterval = data[IDX_DYNAMIC_BITRATE_INTERVAL] & 0x07;
237
3.50k
    mDynamicFrameRateInterval = data[IDX_DYNAMIC_FRAME_RATE_INTERVAL] & 0x07;
238
3.50k
    mKeepThreadsActive = 1;
239
240
    /* Getting Number of MemRecords */
241
3.50k
    iv_num_mem_rec_ip_t sNumMemRecIp{};
242
3.50k
    iv_num_mem_rec_op_t sNumMemRecOp{};
243
244
3.50k
    sNumMemRecIp.u4_size = sizeof(iv_num_mem_rec_ip_t);
245
3.50k
    sNumMemRecOp.u4_size = sizeof(iv_num_mem_rec_op_t);
246
3.50k
    sNumMemRecIp.e_cmd = IV_CMD_GET_NUM_MEM_REC;
247
248
3.50k
    if (IV_SUCCESS != ive_api_function(nullptr, &sNumMemRecIp, &sNumMemRecOp)) {
249
0
        return false;
250
0
    }
251
3.50k
    mNumMemRecords = sNumMemRecOp.u4_num_mem_rec;
252
3.50k
    mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t));
253
3.50k
    if (!mMemRecords) {
254
0
        return false;
255
0
    }
256
3.50k
    iv_mem_rec_t *psMemRec;
257
3.50k
    psMemRec = mMemRecords;
258
182k
    for (size_t i = 0; i < mNumMemRecords; ++i) {
259
178k
        psMemRec->u4_size = sizeof(iv_mem_rec_t);
260
178k
        psMemRec->pv_base = nullptr;
261
178k
        psMemRec->u4_mem_size = 0;
262
178k
        psMemRec->u4_mem_alignment = 0;
263
178k
        psMemRec->e_mem_type = IV_NA_MEM_TYPE;
264
178k
        ++psMemRec;
265
178k
    }
266
267
    /* Getting MemRecords Attributes */
268
3.50k
    iv_fill_mem_rec_ip_t sFillMemRecIp{};
269
3.50k
    iv_fill_mem_rec_op_t sFillMemRecOp{};
270
271
3.50k
    sFillMemRecIp.u4_size = sizeof(iv_fill_mem_rec_ip_t);
272
3.50k
    sFillMemRecOp.u4_size = sizeof(iv_fill_mem_rec_op_t);
273
274
3.50k
    sFillMemRecIp.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
275
3.50k
    sFillMemRecIp.ps_mem_rec = mMemRecords;
276
3.50k
    sFillMemRecIp.u4_num_mem_rec = mNumMemRecords;
277
3.50k
    sFillMemRecIp.u4_max_wd = mWidth;
278
3.50k
    sFillMemRecIp.u4_max_ht = mHeight;
279
3.50k
    sFillMemRecIp.u4_max_level = mAvcEncLevel;
280
3.50k
    sFillMemRecIp.e_color_format = IV_YUV_420SP_VU;
281
3.50k
    sFillMemRecIp.u4_max_ref_cnt = 2;
282
3.50k
    sFillMemRecIp.u4_max_reorder_cnt = 0;
283
3.50k
    sFillMemRecIp.u4_max_srch_rng_x = 256;
284
3.50k
    sFillMemRecIp.u4_max_srch_rng_y = 256;
285
3.50k
    sFillMemRecIp.u4_keep_threads_active = mKeepThreadsActive;
286
287
3.50k
    if (IV_SUCCESS != ive_api_function(nullptr, &sFillMemRecIp, &sFillMemRecOp)) {
288
7
        return false;
289
7
    }
290
    /* Allocating Memory for Mem Records */
291
3.49k
    psMemRec = mMemRecords;
292
181k
    for (size_t i = 0; i < mNumMemRecords; ++i) {
293
178k
        posix_memalign(&psMemRec->pv_base, psMemRec->u4_mem_alignment, psMemRec->u4_mem_size);
294
178k
        if (!psMemRec->pv_base) {
295
0
            return false;
296
0
        }
297
178k
        ++psMemRec;
298
178k
    }
299
300
    /* Codec Instance Creation */
301
3.49k
    ive_init_ip_t sInitIp{};
302
3.49k
    ive_init_op_t sInitOp{};
303
304
3.49k
    mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base;
305
3.49k
    mCodecCtx->u4_size = sizeof(iv_obj_t);
306
3.49k
    mCodecCtx->pv_fxns = (void *)ive_api_function;
307
308
3.49k
    sInitIp.u4_size = sizeof(ive_init_ip_t);
309
3.49k
    sInitOp.u4_size = sizeof(ive_init_op_t);
310
311
3.49k
    sInitIp.e_cmd = IV_CMD_INIT;
312
3.49k
    sInitIp.u4_num_mem_rec = mNumMemRecords;
313
3.49k
    sInitIp.ps_mem_rec = mMemRecords;
314
3.49k
    sInitIp.u4_max_wd = mWidth;
315
3.49k
    sInitIp.u4_max_ht = mHeight;
316
3.49k
    sInitIp.u4_max_ref_cnt = 2;
317
3.49k
    sInitIp.u4_max_reorder_cnt = 0;
318
3.49k
    sInitIp.u4_max_level = mAvcEncLevel;
319
3.49k
    sInitIp.e_inp_color_fmt = mIvVideoColorFormat;
320
3.49k
    sInitIp.u4_enable_recon = 0;
321
3.49k
    sInitIp.e_recon_color_fmt = mReconFormat;
322
3.49k
    sInitIp.e_rc_mode = mRCMode;
323
3.49k
    sInitIp.u4_max_framerate = 120000;
324
3.49k
    sInitIp.u4_max_bitrate = 240000000;
325
3.49k
    sInitIp.u4_num_bframes = mBframes;
326
3.49k
    sInitIp.e_content_type = IV_PROGRESSIVE;
327
3.49k
    sInitIp.u4_max_srch_rng_x = 256;
328
3.49k
    sInitIp.u4_max_srch_rng_y = 256;
329
3.49k
    sInitIp.e_slice_mode = mSliceMode;
330
3.49k
    sInitIp.u4_slice_param = mSliceParam;
331
3.49k
    sInitIp.e_arch = mArch;
332
3.49k
    sInitIp.e_soc = SOC_GENERIC;
333
3.49k
    sInitIp.u4_keep_threads_active = mKeepThreadsActive;
334
335
3.49k
    if (IV_SUCCESS != ive_api_function(mCodecCtx, &sInitIp, &sInitOp)) {
336
11
        return false;
337
11
    }
338
339
3.48k
    logVersion();
340
3.48k
    setDefault();
341
3.48k
    getBufInfo();
342
3.48k
    setNumCores();
343
3.48k
    setDimensions();
344
3.48k
    setFrameRate();
345
3.48k
    setIpeParams();
346
3.48k
    setBitRate();
347
3.48k
    setQp();
348
3.48k
    setAirParams();
349
3.48k
    setVbvParams();
350
3.48k
    setMeParams();
351
3.48k
    setGopParams();
352
3.48k
    setDeblockParams();
353
3.48k
    setVuiParams();
354
3.48k
    setSeiMdcvParams();
355
3.48k
    setSeiCllParams();
356
3.48k
    setSeiAveParams();
357
3.48k
    setSeiCcvParams();
358
3.48k
    setSeiSiiParams();
359
3.48k
    setProfileParams();
360
3.48k
    setEncMode(IVE_ENC_MODE_HEADER);
361
362
3.48k
    *pdata += IDX_LAST;
363
3.48k
    *psize -= IDX_LAST;
364
3.48k
    return true;
365
3.49k
}
366
367
3.48k
void Codec::setDimensions() {
368
3.48k
    ive_ctl_set_dimensions_ip_t sDimensionsIp{};
369
3.48k
    ive_ctl_set_dimensions_op_t sDimensionsOp{};
370
371
3.48k
    sDimensionsIp.e_cmd = IVE_CMD_VIDEO_CTL;
372
3.48k
    sDimensionsIp.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS;
373
3.48k
    sDimensionsIp.u4_ht = mHeight;
374
3.48k
    sDimensionsIp.u4_wd = mWidth;
375
376
3.48k
    sDimensionsIp.u4_timestamp_high = -1;
377
3.48k
    sDimensionsIp.u4_timestamp_low = -1;
378
379
3.48k
    sDimensionsIp.u4_size = sizeof(ive_ctl_set_dimensions_ip_t);
380
3.48k
    sDimensionsOp.u4_size = sizeof(ive_ctl_set_dimensions_op_t);
381
382
3.48k
    ive_api_function(mCodecCtx, &sDimensionsIp, &sDimensionsOp);
383
3.48k
    return;
384
3.48k
}
385
386
3.48k
void Codec::setNumCores() {
387
3.48k
    ive_ctl_set_num_cores_ip_t sNumCoresIp{};
388
3.48k
    ive_ctl_set_num_cores_op_t sNumCoresOp{};
389
390
3.48k
    sNumCoresIp.e_cmd = IVE_CMD_VIDEO_CTL;
391
3.48k
    sNumCoresIp.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES;
392
3.48k
    sNumCoresIp.u4_num_cores = mNumCores;
393
394
3.48k
    sNumCoresIp.u4_timestamp_high = -1;
395
3.48k
    sNumCoresIp.u4_timestamp_low = -1;
396
397
3.48k
    sNumCoresIp.u4_size = sizeof(ive_ctl_set_num_cores_ip_t);
398
3.48k
    sNumCoresOp.u4_size = sizeof(ive_ctl_set_num_cores_op_t);
399
400
3.48k
    ive_api_function(mCodecCtx, (void *)&sNumCoresIp, (void *)&sNumCoresOp);
401
3.48k
    return;
402
3.48k
}
403
404
3.48k
void Codec::setDefault() {
405
3.48k
    ive_ctl_setdefault_ip_t sDefaultIp{};
406
3.48k
    ive_ctl_setdefault_op_t sDefaultOp{};
407
408
3.48k
    sDefaultIp.e_cmd = IVE_CMD_VIDEO_CTL;
409
3.48k
    sDefaultIp.e_sub_cmd = IVE_CMD_CTL_SETDEFAULT;
410
411
3.48k
    sDefaultIp.u4_timestamp_high = -1;
412
3.48k
    sDefaultIp.u4_timestamp_low = -1;
413
414
3.48k
    sDefaultIp.u4_size = sizeof(ive_ctl_setdefault_ip_t);
415
3.48k
    sDefaultOp.u4_size = sizeof(ive_ctl_setdefault_op_t);
416
417
3.48k
    ive_api_function(mCodecCtx, &sDefaultIp, &sDefaultOp);
418
3.48k
    return;
419
3.48k
}
420
421
3.48k
void Codec::getBufInfo() {
422
3.48k
    ih264e_ctl_getbufinfo_ip_t sGetBufInfoIp{};
423
3.48k
    ih264e_ctl_getbufinfo_op_t sGetBufInfoOp{};
424
425
3.48k
    sGetBufInfoIp.s_ive_ip.u4_size = sizeof(ih264e_ctl_getbufinfo_ip_t);
426
3.48k
    sGetBufInfoOp.s_ive_op.u4_size = sizeof(ih264e_ctl_getbufinfo_op_t);
427
428
3.48k
    sGetBufInfoIp.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
429
3.48k
    sGetBufInfoIp.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_GETBUFINFO;
430
3.48k
    sGetBufInfoIp.s_ive_ip.u4_max_ht = mHeight;
431
3.48k
    sGetBufInfoIp.s_ive_ip.u4_max_wd = mWidth;
432
3.48k
    sGetBufInfoIp.s_ive_ip.e_inp_color_fmt = mIvVideoColorFormat;
433
434
3.48k
    ih264e_api_function(mCodecCtx, &sGetBufInfoIp, &sGetBufInfoOp);
435
3.48k
    return;
436
3.48k
}
437
438
4.20k
void Codec::setFrameRate() {
439
4.20k
    ive_ctl_set_frame_rate_ip_t sFrameRateIp{};
440
4.20k
    ive_ctl_set_frame_rate_op_t sFrameRateOp{};
441
442
4.20k
    sFrameRateIp.e_cmd = IVE_CMD_VIDEO_CTL;
443
4.20k
    sFrameRateIp.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE;
444
4.20k
    sFrameRateIp.u4_src_frame_rate = mFrameRate;
445
4.20k
    sFrameRateIp.u4_tgt_frame_rate = mFrameRate;
446
447
4.20k
    sFrameRateIp.u4_timestamp_high = -1;
448
4.20k
    sFrameRateIp.u4_timestamp_low = -1;
449
450
4.20k
    sFrameRateIp.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t);
451
4.20k
    sFrameRateOp.u4_size = sizeof(ive_ctl_set_frame_rate_op_t);
452
453
4.20k
    ive_api_function(mCodecCtx, &sFrameRateIp, &sFrameRateOp);
454
4.20k
    return;
455
4.20k
}
456
457
3.48k
void Codec::setIpeParams() {
458
3.48k
    ive_ctl_set_ipe_params_ip_t sIpeParamsIp{};
459
3.48k
    ive_ctl_set_ipe_params_op_t sIpeParamsOp{};
460
461
3.48k
    sIpeParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
462
3.48k
    sIpeParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS;
463
3.48k
    sIpeParamsIp.u4_enable_intra_4x4 = mIntra4x4;
464
3.48k
    sIpeParamsIp.u4_enc_speed_preset = mEncSpeed;
465
3.48k
    sIpeParamsIp.u4_constrained_intra_pred = mConstrainedIntraFlag;
466
467
3.48k
    sIpeParamsIp.u4_timestamp_high = -1;
468
3.48k
    sIpeParamsIp.u4_timestamp_low = -1;
469
470
3.48k
    sIpeParamsIp.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t);
471
3.48k
    sIpeParamsOp.u4_size = sizeof(ive_ctl_set_ipe_params_op_t);
472
473
3.48k
    ive_api_function(mCodecCtx, &sIpeParamsIp, &sIpeParamsOp);
474
3.48k
    return;
475
3.48k
}
476
477
4.29k
void Codec::setBitRate() {
478
4.29k
    ive_ctl_set_bitrate_ip_t sBitrateIp{};
479
4.29k
    ive_ctl_set_bitrate_op_t sBitrateOp{};
480
481
4.29k
    sBitrateIp.e_cmd = IVE_CMD_VIDEO_CTL;
482
4.29k
    sBitrateIp.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE;
483
4.29k
    sBitrateIp.u4_target_bitrate = mBitrate;
484
485
4.29k
    sBitrateIp.u4_timestamp_high = -1;
486
4.29k
    sBitrateIp.u4_timestamp_low = -1;
487
488
4.29k
    sBitrateIp.u4_size = sizeof(ive_ctl_set_bitrate_ip_t);
489
4.29k
    sBitrateOp.u4_size = sizeof(ive_ctl_set_bitrate_op_t);
490
491
4.29k
    ive_api_function(mCodecCtx, &sBitrateIp, &sBitrateOp);
492
4.29k
    return;
493
4.29k
}
494
495
795
void Codec::setFrameType(IV_PICTURE_CODING_TYPE_T eFrameType) {
496
795
    ive_ctl_set_frame_type_ip_t sFrameTypeIp{};
497
795
    ive_ctl_set_frame_type_op_t sFrameTypeOp{};
498
499
795
    sFrameTypeIp.e_cmd = IVE_CMD_VIDEO_CTL;
500
795
    sFrameTypeIp.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE;
501
795
    sFrameTypeIp.e_frame_type = eFrameType;
502
503
795
    sFrameTypeIp.u4_timestamp_high = -1;
504
795
    sFrameTypeIp.u4_timestamp_low = -1;
505
506
795
    sFrameTypeIp.u4_size = sizeof(ive_ctl_set_frame_type_ip_t);
507
795
    sFrameTypeOp.u4_size = sizeof(ive_ctl_set_frame_type_op_t);
508
509
795
    ive_api_function(mCodecCtx, &sFrameTypeIp, &sFrameTypeOp);
510
795
    return;
511
795
}
512
513
3.48k
void Codec::setQp() {
514
3.48k
    ive_ctl_set_qp_ip_t s_QpIp{};
515
3.48k
    ive_ctl_set_qp_op_t s_QpOp{};
516
517
3.48k
    s_QpIp.e_cmd = IVE_CMD_VIDEO_CTL;
518
3.48k
    s_QpIp.e_sub_cmd = IVE_CMD_CTL_SET_QP;
519
520
3.48k
    s_QpIp.u4_i_qp = m_I_QP;
521
3.48k
    s_QpIp.u4_i_qp_max = MAX_H264_QP;
522
3.48k
    s_QpIp.u4_i_qp_min = kMinQP;
523
524
3.48k
    s_QpIp.u4_p_qp = m_P_QP;
525
3.48k
    s_QpIp.u4_p_qp_max = MAX_H264_QP;
526
3.48k
    s_QpIp.u4_p_qp_min = kMinQP;
527
528
3.48k
    s_QpIp.u4_b_qp = m_B_QP;
529
3.48k
    s_QpIp.u4_b_qp_max = MAX_H264_QP;
530
3.48k
    s_QpIp.u4_b_qp_min = kMinQP;
531
532
3.48k
    s_QpIp.u4_timestamp_high = -1;
533
3.48k
    s_QpIp.u4_timestamp_low = -1;
534
535
3.48k
    s_QpIp.u4_size = sizeof(ive_ctl_set_qp_ip_t);
536
3.48k
    s_QpOp.u4_size = sizeof(ive_ctl_set_qp_op_t);
537
538
3.48k
    ive_api_function(mCodecCtx, &s_QpIp, &s_QpOp);
539
3.48k
    return;
540
3.48k
}
541
542
3.48k
void Codec::setEncMode(IVE_ENC_MODE_T eEncMode) {
543
3.48k
    ive_ctl_set_enc_mode_ip_t sEncModeIp{};
544
3.48k
    ive_ctl_set_enc_mode_op_t sEncModeOp{};
545
546
3.48k
    sEncModeIp.e_cmd = IVE_CMD_VIDEO_CTL;
547
3.48k
    sEncModeIp.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE;
548
3.48k
    sEncModeIp.e_enc_mode = eEncMode;
549
550
3.48k
    sEncModeIp.u4_timestamp_high = -1;
551
3.48k
    sEncModeIp.u4_timestamp_low = -1;
552
553
3.48k
    sEncModeIp.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t);
554
3.48k
    sEncModeOp.u4_size = sizeof(ive_ctl_set_enc_mode_op_t);
555
556
3.48k
    ive_api_function(mCodecCtx, &sEncModeIp, &sEncModeOp);
557
3.48k
    return;
558
3.48k
}
559
560
3.48k
void Codec::setVbvParams() {
561
3.48k
    ive_ctl_set_vbv_params_ip_t sVbvIp{};
562
3.48k
    ive_ctl_set_vbv_params_op_t sVbvOp{};
563
564
3.48k
    sVbvIp.e_cmd = IVE_CMD_VIDEO_CTL;
565
3.48k
    sVbvIp.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS;
566
3.48k
    sVbvIp.u4_vbv_buf_size = 0;
567
3.48k
    sVbvIp.u4_vbv_buffer_delay = 1000;
568
569
3.48k
    sVbvIp.u4_timestamp_high = -1;
570
3.48k
    sVbvIp.u4_timestamp_low = -1;
571
572
3.48k
    sVbvIp.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t);
573
3.48k
    sVbvOp.u4_size = sizeof(ive_ctl_set_vbv_params_op_t);
574
575
3.48k
    ive_api_function(mCodecCtx, &sVbvIp, &sVbvOp);
576
3.48k
    return;
577
3.48k
}
578
579
3.48k
void Codec::setAirParams() {
580
3.48k
    ive_ctl_set_air_params_ip_t sAirIp{};
581
3.48k
    ive_ctl_set_air_params_op_t sAirOp{};
582
583
3.48k
    sAirIp.e_cmd = IVE_CMD_VIDEO_CTL;
584
3.48k
    sAirIp.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS;
585
3.48k
    sAirIp.e_air_mode = mAirMode;
586
3.48k
    sAirIp.u4_air_refresh_period = mIntraRefresh;
587
588
3.48k
    sAirIp.u4_timestamp_high = -1;
589
3.48k
    sAirIp.u4_timestamp_low = -1;
590
591
3.48k
    sAirIp.u4_size = sizeof(ive_ctl_set_air_params_ip_t);
592
3.48k
    sAirOp.u4_size = sizeof(ive_ctl_set_air_params_op_t);
593
594
3.48k
    ive_api_function(mCodecCtx, &sAirIp, &sAirOp);
595
3.48k
    return;
596
3.48k
}
597
598
3.48k
void Codec::setMeParams() {
599
3.48k
    ive_ctl_set_me_params_ip_t sMeParamsIp{};
600
3.48k
    ive_ctl_set_me_params_op_t sMeParamsOp{};
601
602
3.48k
    sMeParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
603
3.48k
    sMeParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS;
604
3.48k
    sMeParamsIp.u4_enable_fast_sad = mEnableFastSad;
605
3.48k
    sMeParamsIp.u4_enable_alt_ref = mEnableAltRef;
606
607
3.48k
    sMeParamsIp.u4_enable_hpel = mHalfPelEnable;
608
3.48k
    sMeParamsIp.u4_enable_qpel = mQPelEnable;
609
3.48k
    sMeParamsIp.u4_me_speed_preset = mMeSpeedPreset;
610
3.48k
    sMeParamsIp.u4_srch_rng_x = mSearchRangeX;
611
3.48k
    sMeParamsIp.u4_srch_rng_y = mSearchRangeY;
612
613
3.48k
    sMeParamsIp.u4_timestamp_high = -1;
614
3.48k
    sMeParamsIp.u4_timestamp_low = -1;
615
616
3.48k
    sMeParamsIp.u4_size = sizeof(ive_ctl_set_me_params_ip_t);
617
3.48k
    sMeParamsOp.u4_size = sizeof(ive_ctl_set_me_params_op_t);
618
619
3.48k
    ive_api_function(mCodecCtx, &sMeParamsIp, &sMeParamsOp);
620
3.48k
    return;
621
3.48k
}
622
623
3.48k
void Codec::setGopParams() {
624
3.48k
    ive_ctl_set_gop_params_ip_t sGopParamsIp{};
625
3.48k
    ive_ctl_set_gop_params_op_t sGopParamsOp{};
626
627
3.48k
    sGopParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
628
3.48k
    sGopParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS;
629
630
3.48k
    sGopParamsIp.u4_i_frm_interval = mIInterval;
631
3.48k
    sGopParamsIp.u4_idr_frm_interval = mIDRInterval;
632
633
3.48k
    sGopParamsIp.u4_timestamp_high = -1;
634
3.48k
    sGopParamsIp.u4_timestamp_low = -1;
635
636
3.48k
    sGopParamsIp.u4_size = sizeof(ive_ctl_set_gop_params_ip_t);
637
3.48k
    sGopParamsOp.u4_size = sizeof(ive_ctl_set_gop_params_op_t);
638
639
3.48k
    ive_api_function(mCodecCtx, &sGopParamsIp, &sGopParamsOp);
640
3.48k
    return;
641
3.48k
}
642
643
3.48k
void Codec::setProfileParams() {
644
3.48k
    ive_ctl_set_profile_params_ip_t sProfileParamsIp{};
645
3.48k
    ive_ctl_set_profile_params_op_t sProfileParamsOp{};
646
647
3.48k
    sProfileParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
648
3.48k
    sProfileParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS;
649
650
3.48k
    sProfileParamsIp.e_profile = mProfile;
651
3.48k
    if (sProfileParamsIp.e_profile == IV_PROFILE_BASE) {
652
2.12k
        sProfileParamsIp.u4_entropy_coding_mode = 0;
653
2.12k
    } else {
654
1.36k
        sProfileParamsIp.u4_entropy_coding_mode = 1;
655
1.36k
    }
656
3.48k
    sProfileParamsIp.u4_timestamp_high = -1;
657
3.48k
    sProfileParamsIp.u4_timestamp_low = -1;
658
659
3.48k
    sProfileParamsIp.u4_size = sizeof(ive_ctl_set_profile_params_ip_t);
660
3.48k
    sProfileParamsOp.u4_size = sizeof(ive_ctl_set_profile_params_op_t);
661
662
3.48k
    ive_api_function(mCodecCtx, &sProfileParamsIp, &sProfileParamsOp);
663
3.48k
    return;
664
3.48k
}
665
666
3.48k
void Codec::setDeblockParams() {
667
3.48k
    ive_ctl_set_deblock_params_ip_t sDeblockParamsIp{};
668
3.48k
    ive_ctl_set_deblock_params_op_t sDeblockParamsOp{};
669
670
3.48k
    sDeblockParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
671
3.48k
    sDeblockParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS;
672
673
3.48k
    sDeblockParamsIp.u4_disable_deblock_level = mDisableDeblockLevel;
674
675
3.48k
    sDeblockParamsIp.u4_timestamp_high = -1;
676
3.48k
    sDeblockParamsIp.u4_timestamp_low = -1;
677
678
3.48k
    sDeblockParamsIp.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t);
679
3.48k
    sDeblockParamsOp.u4_size = sizeof(ive_ctl_set_deblock_params_op_t);
680
681
3.48k
    ive_api_function(mCodecCtx, &sDeblockParamsIp, &sDeblockParamsOp);
682
3.48k
    return;
683
3.48k
}
684
685
3.48k
void Codec::setVuiParams() {
686
3.48k
    ih264e_vui_ip_t sVuiParamsIp{};
687
3.48k
    ih264e_vui_op_t sVuiParamsOp{};
688
689
3.48k
    sVuiParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
690
3.48k
    sVuiParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_VUI_PARAMS;
691
692
3.48k
    sVuiParamsIp.u1_aspect_ratio_info_present_flag = mAspectRatioFlag;
693
3.48k
    sVuiParamsIp.u1_aspect_ratio_idc = 0;
694
3.48k
    sVuiParamsIp.u2_sar_width = 0;
695
3.48k
    sVuiParamsIp.u2_sar_height = 0;
696
3.48k
    sVuiParamsIp.u1_overscan_info_present_flag = 0;
697
3.48k
    sVuiParamsIp.u1_overscan_appropriate_flag = 0;
698
3.48k
    sVuiParamsIp.u1_video_signal_type_present_flag = 1;
699
3.48k
    sVuiParamsIp.u1_video_format = 0;
700
3.48k
    sVuiParamsIp.u1_video_full_range_flag = 0;
701
3.48k
    sVuiParamsIp.u1_colour_description_present_flag = 1;
702
3.48k
    sVuiParamsIp.u1_colour_primaries = 0;
703
3.48k
    sVuiParamsIp.u1_transfer_characteristics = 0;
704
3.48k
    sVuiParamsIp.u1_matrix_coefficients = 0;
705
3.48k
    sVuiParamsIp.u1_chroma_loc_info_present_flag = 0;
706
3.48k
    sVuiParamsIp.u1_chroma_sample_loc_type_top_field = 0;
707
3.48k
    sVuiParamsIp.u1_chroma_sample_loc_type_bottom_field = 0;
708
3.48k
    sVuiParamsIp.u1_vui_timing_info_present_flag = 0;
709
3.48k
    sVuiParamsIp.u4_vui_num_units_in_tick = 0;
710
3.48k
    sVuiParamsIp.u4_vui_time_scale = 0;
711
3.48k
    sVuiParamsIp.u1_fixed_frame_rate_flag = 0;
712
3.48k
    sVuiParamsIp.u1_nal_hrd_parameters_present_flag = mNalHrdFlag;
713
3.48k
    sVuiParamsIp.u1_vcl_hrd_parameters_present_flag = mVclHrdFlag;
714
3.48k
    sVuiParamsIp.u1_low_delay_hrd_flag = 0;
715
3.48k
    sVuiParamsIp.u1_pic_struct_present_flag = 0;
716
3.48k
    sVuiParamsIp.u1_bitstream_restriction_flag = 0;
717
3.48k
    sVuiParamsIp.u1_motion_vectors_over_pic_boundaries_flag = 0;
718
3.48k
    sVuiParamsIp.u1_max_bytes_per_pic_denom = 0;
719
3.48k
    sVuiParamsIp.u1_max_bits_per_mb_denom = 0;
720
3.48k
    sVuiParamsIp.u1_log2_max_mv_length_horizontal = 0;
721
3.48k
    sVuiParamsIp.u1_log2_max_mv_length_vertical = 0;
722
3.48k
    sVuiParamsIp.u1_num_reorder_frames = 0;
723
3.48k
    sVuiParamsIp.u1_max_dec_frame_buffering = 0;
724
725
3.48k
    sVuiParamsIp.u4_size = sizeof(ih264e_vui_ip_t);
726
3.48k
    sVuiParamsOp.u4_size = sizeof(ih264e_vui_op_t);
727
728
3.48k
    ive_api_function(mCodecCtx, &sVuiParamsIp, &sVuiParamsOp);
729
3.48k
    return;
730
3.48k
}
731
732
3.48k
void Codec::setSeiMdcvParams() {
733
3.48k
    ih264e_ctl_set_sei_mdcv_params_ip_t sSeiMdcvParamsIp{};
734
3.48k
    ih264e_ctl_set_sei_mdcv_params_op_t sSeiMdcvParamsOp{};
735
736
3.48k
    sSeiMdcvParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
737
3.48k
    sSeiMdcvParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_SEI_MDCV_PARAMS;
738
3.48k
    sSeiMdcvParamsIp.u1_sei_mdcv_params_present_flag = mSeiMdcvFlag;
739
3.48k
    if (mSeiMdcvFlag) {
740
6.30k
        for (int i4_count = 0; i4_count < NUM_SEI_MDCV_PRIMARIES; ++i4_count) {
741
4.73k
            sSeiMdcvParamsIp.au2_display_primaries_x[i4_count] = 30000;
742
4.73k
            sSeiMdcvParamsIp.au2_display_primaries_y[i4_count] = 35000;
743
4.73k
        }
744
1.57k
        sSeiMdcvParamsIp.u2_white_point_x = 30000;
745
1.57k
        sSeiMdcvParamsIp.u2_white_point_y = 35000;
746
1.57k
        sSeiMdcvParamsIp.u4_max_display_mastering_luminance = 100000000;
747
1.57k
        sSeiMdcvParamsIp.u4_min_display_mastering_luminance = 50000;
748
1.57k
    }
749
750
3.48k
    sSeiMdcvParamsIp.u4_timestamp_high = -1;
751
3.48k
    sSeiMdcvParamsIp.u4_timestamp_low = -1;
752
753
3.48k
    sSeiMdcvParamsIp.u4_size = sizeof(ih264e_ctl_set_sei_mdcv_params_ip_t);
754
3.48k
    sSeiMdcvParamsOp.u4_size = sizeof(ih264e_ctl_set_sei_mdcv_params_op_t);
755
3.48k
    ih264e_api_function(mCodecCtx, &sSeiMdcvParamsIp, &sSeiMdcvParamsOp);
756
3.48k
    return;
757
3.48k
}
758
759
3.48k
void Codec::setSeiCllParams() {
760
3.48k
    ih264e_ctl_set_sei_cll_params_ip_t sSeiCllParamsIp{};
761
3.48k
    ih264e_ctl_set_sei_cll_params_op_t sSeiCllParamsOp{};
762
763
3.48k
    sSeiCllParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
764
3.48k
    sSeiCllParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_SEI_CLL_PARAMS;
765
3.48k
    sSeiCllParamsIp.u1_sei_cll_params_present_flag = mSeiCllFlag;
766
3.48k
    if (mSeiCllFlag) {
767
1.39k
        sSeiCllParamsIp.u2_max_content_light_level = 0;
768
1.39k
        sSeiCllParamsIp.u2_max_pic_average_light_level = 0;
769
1.39k
    }
770
771
3.48k
    sSeiCllParamsIp.u4_timestamp_high = -1;
772
3.48k
    sSeiCllParamsIp.u4_timestamp_low = -1;
773
774
3.48k
    sSeiCllParamsIp.u4_size = sizeof(ih264e_ctl_set_sei_cll_params_ip_t);
775
3.48k
    sSeiCllParamsOp.u4_size = sizeof(ih264e_ctl_set_sei_cll_params_op_t);
776
777
3.48k
    ih264e_api_function(mCodecCtx, &sSeiCllParamsIp, &sSeiCllParamsOp);
778
3.48k
    return;
779
3.48k
}
780
781
3.48k
void Codec::setSeiAveParams() {
782
3.48k
    ih264e_ctl_set_sei_ave_params_ip_t sSeiAveParamsIp{};
783
3.48k
    ih264e_ctl_set_sei_ave_params_op_t sSeiAveParamsOp{};
784
785
3.48k
    sSeiAveParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
786
3.48k
    sSeiAveParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_SEI_AVE_PARAMS;
787
3.48k
    sSeiAveParamsIp.u1_sei_ave_params_present_flag = mSeiAveFlag;
788
3.48k
    if (mSeiAveFlag) {
789
1.40k
        sSeiAveParamsIp.u4_ambient_illuminance = 1;
790
1.40k
        sSeiAveParamsIp.u2_ambient_light_x = 0;
791
1.40k
        sSeiAveParamsIp.u2_ambient_light_y = 0;
792
1.40k
    }
793
794
3.48k
    sSeiAveParamsIp.u4_timestamp_high = -1;
795
3.48k
    sSeiAveParamsIp.u4_timestamp_low = -1;
796
797
3.48k
    sSeiAveParamsIp.u4_size = sizeof(ih264e_ctl_set_sei_ave_params_ip_t);
798
3.48k
    sSeiAveParamsOp.u4_size = sizeof(ih264e_ctl_set_sei_ave_params_op_t);
799
800
3.48k
    ih264e_api_function(mCodecCtx, &sSeiAveParamsIp, &sSeiAveParamsOp);
801
3.48k
    return;
802
3.48k
}
803
804
3.48k
void Codec::setSeiCcvParams() {
805
3.48k
    ih264e_ctl_set_sei_ccv_params_ip_t sSeiCcvParamsIp{};
806
3.48k
    ih264e_ctl_set_sei_ccv_params_op_t sSeiCcvParamsOp{};
807
808
3.48k
    sSeiCcvParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
809
3.48k
    sSeiCcvParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_SEI_CCV_PARAMS;
810
3.48k
    sSeiCcvParamsIp.u1_sei_ccv_params_present_flag = mSeiCcvFlag;
811
3.48k
    if (mSeiCcvFlag) {
812
1.10k
        sSeiCcvParamsIp.u1_ccv_cancel_flag = 0;
813
1.10k
        sSeiCcvParamsIp.u1_ccv_persistence_flag = 1;
814
1.10k
        sSeiCcvParamsIp.u1_ccv_primaries_present_flag = 1;
815
1.10k
        sSeiCcvParamsIp.u1_ccv_min_luminance_value_present_flag = 1;
816
1.10k
        sSeiCcvParamsIp.u1_ccv_max_luminance_value_present_flag = 1;
817
1.10k
        sSeiCcvParamsIp.u1_ccv_avg_luminance_value_present_flag = 1;
818
1.10k
        sSeiCcvParamsIp.u1_ccv_reserved_zero_2bits = 0;
819
4.41k
        for (int i4_count = 0; i4_count < NUM_SEI_CCV_PRIMARIES; ++i4_count) {
820
3.31k
            sSeiCcvParamsIp.ai4_ccv_primaries_x[i4_count] = 1;
821
3.31k
            sSeiCcvParamsIp.ai4_ccv_primaries_y[i4_count] = 1;
822
3.31k
        }
823
1.10k
        sSeiCcvParamsIp.u4_ccv_min_luminance_value = 1;
824
1.10k
        sSeiCcvParamsIp.u4_ccv_max_luminance_value = 1;
825
1.10k
        sSeiCcvParamsIp.u4_ccv_avg_luminance_value = 1;
826
1.10k
    }
827
828
3.48k
    sSeiCcvParamsIp.u4_timestamp_high = -1;
829
3.48k
    sSeiCcvParamsIp.u4_timestamp_low = -1;
830
831
3.48k
    sSeiCcvParamsIp.u4_size = sizeof(ih264e_ctl_set_sei_ccv_params_ip_t);
832
3.48k
    sSeiCcvParamsOp.u4_size = sizeof(ih264e_ctl_set_sei_ccv_params_op_t);
833
834
3.48k
    ih264e_api_function(mCodecCtx, &sSeiCcvParamsIp, &sSeiCcvParamsOp);
835
3.48k
    return;
836
3.48k
}
837
838
3.48k
void Codec::setSeiSiiParams() {
839
3.48k
    ih264e_ctl_set_sei_sii_params_ip_t sSeiSiiParamsIp{};
840
3.48k
    ih264e_ctl_set_sei_sii_params_op_t sSeiSiiParamsOp{};
841
842
3.48k
    sSeiSiiParamsIp.e_cmd = IVE_CMD_VIDEO_CTL;
843
3.48k
    sSeiSiiParamsIp.e_sub_cmd = IVE_CMD_CTL_SET_SEI_SII_PARAMS;
844
3.48k
    sSeiSiiParamsIp.u1_shutter_interval_info_present_flag = mSeiSiiFlag;
845
3.48k
    if(mSeiSiiFlag) {
846
1.31k
        sSeiSiiParamsIp.u4_sii_sub_layer_idx = 0;
847
1.31k
        sSeiSiiParamsIp.u1_shutter_interval_info_present_flag = 1;
848
1.31k
        sSeiSiiParamsIp.u4_sii_time_scale = 24000000;
849
1.31k
        sSeiSiiParamsIp.u1_fixed_shutter_interval_within_cvs_flag = 0;
850
1.31k
        sSeiSiiParamsIp.u4_sii_num_units_in_shutter_interval = 480000;
851
1.31k
        sSeiSiiParamsIp.u1_sii_max_sub_layers_minus1 = 7;
852
11.7k
        for(int count = 0; count <= sSeiSiiParamsIp.u1_sii_max_sub_layers_minus1; ++count) {
853
10.4k
            sSeiSiiParamsIp.au4_sub_layer_num_units_in_shutter_interval[count] = 480000;
854
10.4k
        }
855
1.31k
        sSeiSiiParamsIp.au4_sub_layer_num_units_in_shutter_interval
856
1.31k
            [sSeiSiiParamsIp.u1_sii_max_sub_layers_minus1] = 240000;
857
1.31k
    }
858
859
3.48k
    sSeiSiiParamsIp.u4_timestamp_high = -1;
860
3.48k
    sSeiSiiParamsIp.u4_timestamp_low = -1;
861
862
3.48k
    sSeiSiiParamsIp.u4_size = sizeof(ih264e_ctl_set_sei_sii_params_ip_t);
863
3.48k
    sSeiSiiParamsOp.u4_size = sizeof(ih264e_ctl_set_sei_sii_params_op_t);
864
865
3.48k
    ih264e_api_function(mCodecCtx, &sSeiSiiParamsIp, &sSeiSiiParamsOp);
866
3.48k
    return;
867
3.48k
}
868
869
3.48k
void Codec::logVersion() {
870
3.48k
    ive_ctl_getversioninfo_ip_t sCtlIp{};
871
3.48k
    ive_ctl_getversioninfo_op_t sCtlOp{};
872
3.48k
    UWORD8 au1Buf[512];
873
874
3.48k
    sCtlIp.e_cmd = IVE_CMD_VIDEO_CTL;
875
3.48k
    sCtlIp.e_sub_cmd = IVE_CMD_CTL_GETVERSION;
876
877
3.48k
    sCtlIp.u4_size = sizeof(ive_ctl_getversioninfo_ip_t);
878
3.48k
    sCtlOp.u4_size = sizeof(ive_ctl_getversioninfo_op_t);
879
3.48k
    sCtlIp.pu1_version = au1Buf;
880
3.48k
    sCtlIp.u4_version_bufsize = sizeof(au1Buf);
881
882
3.48k
    ive_api_function(mCodecCtx, (void *)&sCtlIp, (void *)&sCtlOp);
883
3.48k
    return;
884
3.48k
}
885
886
void Codec::retrieveMemRecords()
887
3.48k
{
888
3.48k
    iv_retrieve_mem_rec_ip_t s_retrieve_ip{};
889
3.48k
    iv_retrieve_mem_rec_op_t s_retrieve_op{};
890
891
3.48k
    s_retrieve_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
892
3.48k
    s_retrieve_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
893
3.48k
    s_retrieve_ip.ps_mem_rec = mMemRecords;
894
895
3.48k
    s_retrieve_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
896
897
3.48k
    ive_api_function(mCodecCtx, &s_retrieve_ip, &s_retrieve_op);
898
3.48k
    return;
899
3.48k
}
900
901
3.48k
void Codec::encodeFrames(const uint8_t *data, size_t size) {
902
3.48k
    size_t frameSize = (mIvVideoColorFormat == IV_YUV_422ILE) ? (mWidth * mHeight * 2)
903
3.48k
                                                              : ((mWidth * mHeight * 3) / 2);
904
3.48k
    ive_video_encode_ip_t sEncodeIp{};
905
3.48k
    ive_video_encode_op_t sEncodeOp{};
906
3.48k
    uint8_t header[kHeaderLength];
907
3.48k
    int32_t numEncodeCalls = 0;
908
3.48k
    iv_raw_buf_t *psInpRawBuf = &sEncodeIp.s_inp_buf;
909
3.48k
    sEncodeIp.s_out_buf.pv_buf = header;
910
3.48k
    sEncodeIp.s_out_buf.u4_bytes = 0;
911
3.48k
    sEncodeIp.s_out_buf.u4_bufsize = kHeaderLength;
912
3.48k
    sEncodeIp.u4_size = sizeof(ive_video_encode_ip_t);
913
3.48k
    sEncodeOp.u4_size = sizeof(ive_video_encode_op_t);
914
915
3.48k
    sEncodeIp.e_cmd = IVE_CMD_VIDEO_ENCODE;
916
3.48k
    sEncodeIp.pv_bufs = nullptr;
917
3.48k
    sEncodeIp.pv_mb_info = nullptr;
918
3.48k
    sEncodeIp.pv_pic_info = nullptr;
919
3.48k
    sEncodeIp.u4_mb_info_type = 0;
920
3.48k
    sEncodeIp.u4_pic_info_type = 0;
921
3.48k
    sEncodeOp.s_out_buf.pv_buf = nullptr;
922
923
    /* Initialize color formats */
924
3.48k
    memset(psInpRawBuf, 0, sizeof(iv_raw_buf_t));
925
3.48k
    psInpRawBuf->u4_size = sizeof(iv_raw_buf_t);
926
3.48k
    psInpRawBuf->e_color_fmt = mIvVideoColorFormat;
927
928
3.48k
    ive_api_function(mCodecCtx, &sEncodeIp, &sEncodeOp);
929
3.48k
    size_t numFrame = 0;
930
3.48k
    std::vector<bufferPtrs> inBuffers;
931
3.48k
    uint64_t outputBufferSize = (frameSize / kCompressionRatio);
932
60.0k
    while (!sEncodeOp.u4_is_last && numEncodeCalls < kMaxNumEncodeCalls) {
933
56.6k
        uint8_t *outputBuffer = (uint8_t *)malloc(outputBufferSize);
934
56.6k
        sEncodeIp.s_out_buf.pv_buf = outputBuffer;
935
56.6k
        sEncodeIp.s_out_buf.u4_bufsize = outputBufferSize;
936
56.6k
        if (size > 0) {
937
41.0k
            uint8_t *tmpData = (uint8_t *)malloc(frameSize);
938
41.0k
            size_t bytesConsumed = std::min(size, frameSize);
939
41.0k
            if (bytesConsumed < frameSize) {
940
3.31k
                memset(&tmpData[bytesConsumed], data[0], frameSize - bytesConsumed);
941
3.31k
            }
942
41.0k
            memcpy(tmpData, data, bytesConsumed);
943
41.0k
            bufferPtrs inBuffer = setEncParams(psInpRawBuf, tmpData, frameSize);
944
41.0k
            inBuffers.push_back(inBuffer);
945
41.0k
            free(tmpData);
946
41.0k
            sEncodeIp.u4_is_last = 0;
947
41.0k
            if (mSendEosWithLastFrame && size == bytesConsumed) {
948
788
                sEncodeIp.u4_is_last = 1;
949
788
            }
950
41.0k
            if (mIsForceIdrEnabled) {
951
15.3k
                if (numFrame == mForceIdrInterval) {
952
795
                    setFrameType(IV_IDR_FRAME);
953
795
                }
954
15.3k
            }
955
41.0k
            if (mIsDynamicBitRateChangeEnabled) {
956
16.8k
                if (numFrame == mDynamicBitRateInterval) {
957
812
                    if (data[0] & 0x01) {
958
265
                        mBitrate *= 2;
959
547
                    } else {
960
547
                        mBitrate /= 2;
961
547
                    }
962
812
                    setBitRate();
963
812
                }
964
16.8k
            }
965
41.0k
            if (mIsDynamicFrameRateChangeEnabled) {
966
14.0k
                if (numFrame == mDynamicFrameRateInterval) {
967
717
                    if (size > 1 && data[1] & 0x01) {
968
183
                        mFrameRate *= 2;
969
534
                    } else {
970
534
                        mFrameRate /= 2;
971
534
                    }
972
717
                    setFrameRate();
973
717
                }
974
14.0k
            }
975
41.0k
            ++numFrame;
976
41.0k
            data += bytesConsumed;
977
41.0k
            size -= bytesConsumed;
978
41.0k
        } else {
979
15.5k
            sEncodeIp.u4_is_last = 1;
980
15.5k
            psInpRawBuf->apv_bufs[0] = nullptr;
981
15.5k
            psInpRawBuf->apv_bufs[1] = nullptr;
982
15.5k
            psInpRawBuf->apv_bufs[2] = nullptr;
983
15.5k
        }
984
56.6k
        ive_api_function(mCodecCtx, &sEncodeIp, &sEncodeOp);
985
56.6k
        if (sEncodeOp.s_inp_buf.apv_bufs[0]) {
986
38.9k
            std::vector<bufferPtrs>::iterator iter;
987
38.9k
            uint8_t *inputbuf = (uint8_t *)sEncodeOp.s_inp_buf.apv_bufs[0];
988
38.9k
            iter = std::find_if(
989
38.9k
                inBuffers.begin(), inBuffers.end(),
990
71.0k
                [=, &inputbuf](const bufferPtrs &buf) { return std::get<0>(buf) == inputbuf; });
991
38.9k
            if (iter != inBuffers.end()) {
992
38.9k
                inBuffers.erase(iter);
993
38.9k
                free(sEncodeOp.s_inp_buf.apv_bufs[0]);
994
38.9k
                if (sEncodeOp.s_inp_buf.apv_bufs[1]) {
995
38.0k
                    free(sEncodeOp.s_inp_buf.apv_bufs[1]);
996
38.0k
                }
997
38.9k
                if (sEncodeOp.s_inp_buf.apv_bufs[2]) {
998
17.8k
                    free(sEncodeOp.s_inp_buf.apv_bufs[2]);
999
17.8k
                }
1000
38.9k
            }
1001
38.9k
        }
1002
56.6k
        ++numEncodeCalls;
1003
56.6k
        free(outputBuffer);
1004
56.6k
    }
1005
3.48k
    retrieveMemRecords();
1006
3.48k
    for (const auto &buffer : inBuffers) {
1007
2.09k
        free(std::get<0>(buffer));
1008
2.09k
        if (std::get<1>(buffer)) {
1009
1.97k
            free(std::get<1>(buffer));
1010
1.97k
        }
1011
2.09k
        if (std::get<2>(buffer)) {
1012
1.11k
            free(std::get<2>(buffer));
1013
1.11k
        }
1014
2.09k
    }
1015
3.48k
    inBuffers.clear();
1016
3.48k
}
1017
1018
41.0k
bufferPtrs Codec::setEncParams(iv_raw_buf_t *psInpRawBuf, const uint8_t *data, size_t frameSize) {
1019
41.0k
    bufferPtrs inBuffer;
1020
41.0k
    switch (mIvVideoColorFormat) {
1021
7.76k
        case IV_YUV_420SP_UV:
1022
7.76k
            [[fallthrough]];
1023
21.0k
        case IV_YUV_420SP_VU: {
1024
21.0k
            uint8_t *yPlane = (uint8_t *)malloc(mWidth * mHeight);
1025
21.0k
            uint8_t *uPlane = (uint8_t *)malloc(frameSize - (mWidth * mHeight));
1026
21.0k
            memcpy(yPlane, data, mWidth * mHeight);
1027
21.0k
            memcpy(uPlane, data + (mWidth * mHeight), frameSize - (mWidth * mHeight));
1028
21.0k
            int32_t yStride = mWidth;
1029
21.0k
            int32_t uStride = mWidth / 2;
1030
21.0k
            psInpRawBuf->apv_bufs[0] = yPlane;
1031
21.0k
            psInpRawBuf->apv_bufs[1] = uPlane;
1032
1033
21.0k
            psInpRawBuf->au4_wd[0] = mWidth;
1034
21.0k
            psInpRawBuf->au4_wd[1] = mWidth;
1035
1036
21.0k
            psInpRawBuf->au4_ht[0] = mHeight;
1037
21.0k
            psInpRawBuf->au4_ht[1] = mHeight / 2;
1038
1039
21.0k
            psInpRawBuf->au4_strd[0] = yStride;
1040
21.0k
            psInpRawBuf->au4_strd[1] = uStride;
1041
21.0k
            inBuffer = std::make_tuple(yPlane, uPlane, nullptr);
1042
21.0k
            break;
1043
7.76k
        }
1044
1.00k
        case IV_YUV_422ILE: {
1045
1.00k
            uint8_t *yPlane = (uint8_t *)malloc(frameSize);
1046
1.00k
            memcpy(yPlane, data, frameSize);
1047
1.00k
            psInpRawBuf->apv_bufs[0] = yPlane;
1048
1049
1.00k
            psInpRawBuf->au4_wd[0] = mWidth * 2;
1050
1051
1.00k
            psInpRawBuf->au4_ht[0] = mHeight;
1052
1053
1.00k
            psInpRawBuf->au4_strd[0] = mWidth * 2;
1054
1.00k
            inBuffer = std::make_tuple(yPlane, nullptr, nullptr);
1055
1.00k
            break;
1056
7.76k
        }
1057
18.9k
        case IV_YUV_420P:
1058
18.9k
            [[fallthrough]];
1059
18.9k
        default: {
1060
18.9k
            uint8_t *yPlane = (uint8_t *)malloc(mWidth * mHeight);
1061
18.9k
            uint8_t *uPlane = (uint8_t *)malloc((mWidth * mHeight) / 4);
1062
18.9k
            uint8_t *vPlane = (uint8_t *)malloc(frameSize - ((mWidth * mHeight) * 5) / 4);
1063
18.9k
            memcpy(yPlane, data, mWidth * mHeight);
1064
18.9k
            memcpy(uPlane, data + (mWidth * mHeight), (mWidth * mHeight) / 4);
1065
18.9k
            memcpy(vPlane, data + ((mWidth * mHeight) * 5) / 4,
1066
18.9k
                   frameSize - ((mWidth * mHeight) * 5) / 4);
1067
18.9k
            int32_t yStride = mWidth;
1068
18.9k
            int32_t uStride = mWidth / 2;
1069
18.9k
            int32_t vStride = mWidth / 2;
1070
1071
18.9k
            psInpRawBuf->apv_bufs[0] = yPlane;
1072
18.9k
            psInpRawBuf->apv_bufs[1] = uPlane;
1073
18.9k
            psInpRawBuf->apv_bufs[2] = vPlane;
1074
1075
18.9k
            psInpRawBuf->au4_wd[0] = mWidth;
1076
18.9k
            psInpRawBuf->au4_wd[1] = mWidth / 2;
1077
18.9k
            psInpRawBuf->au4_wd[2] = mWidth / 2;
1078
1079
18.9k
            psInpRawBuf->au4_ht[0] = mHeight;
1080
18.9k
            psInpRawBuf->au4_ht[1] = mHeight / 2;
1081
18.9k
            psInpRawBuf->au4_ht[2] = mHeight / 2;
1082
1083
18.9k
            psInpRawBuf->au4_strd[0] = yStride;
1084
18.9k
            psInpRawBuf->au4_strd[1] = uStride;
1085
18.9k
            psInpRawBuf->au4_strd[2] = vStride;
1086
18.9k
            inBuffer = std::make_tuple(yPlane, uPlane, vPlane);
1087
18.9k
            break;
1088
18.9k
        }
1089
41.0k
    }
1090
41.0k
    return inBuffer;
1091
41.0k
}
1092
1093
3.50k
void Codec::deInitEncoder() {
1094
3.50k
    iv_mem_rec_t *ps_mem_rec = mMemRecords;
1095
182k
    for (size_t i = 0; i < mNumMemRecords; ++i) {
1096
178k
        if (ps_mem_rec) {
1097
178k
            free(ps_mem_rec->pv_base);
1098
178k
        }
1099
178k
        ++ps_mem_rec;
1100
178k
    }
1101
3.50k
    if (mMemRecords) {
1102
3.50k
        free(mMemRecords);
1103
3.50k
    }
1104
3.50k
    mCodecCtx = nullptr;
1105
3.50k
    return;
1106
3.50k
}
1107
1108
8.58k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
1109
8.58k
    if (size < IDX_LAST) {
1110
20
        return 0;
1111
20
    }
1112
8.56k
    Codec *codec = new Codec();
1113
8.56k
    if (codec->initEncoder(&data, &size)) {
1114
8.50k
        codec->encodeFrames(data, size);
1115
8.50k
    }
1116
8.56k
    delete codec;
1117
8.56k
    return 0;
1118
8.58k
}