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