/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 | } |