1 /*
2 * Copyright (C) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <arpa/inet.h>
16 #include <sys/time.h>
17 #include <utility>
18 #include "iconsumer_surface.h"
19 #include "native_buffer_inner.h"
20 #include "videoenc_api11_sample.h"
21 using namespace OHOS;
22 using namespace OHOS::Media;
23 using namespace std;
24 namespace {
25 constexpr int64_t NANOS_IN_SECOND = 1000000000L;
26 constexpr int64_t NANOS_IN_MICRO = 1000L;
27 constexpr uint32_t FRAME_INTERVAL = 16666;
28 constexpr uint32_t MAX_PIXEL_FMT = 5;
29 constexpr uint32_t DEFAULT_BITRATE = 10000000;
30 constexpr uint32_t DOUBLE = 2;
31 constexpr uint32_t THREE = 3;
32 sptr<Surface> cs = nullptr;
33 sptr<Surface> ps = nullptr;
34 VEncAPI11FuzzSample *g_vEncSample = nullptr;
35
clearIntqueue(std::queue<uint32_t> & q)36 void clearIntqueue(std::queue<uint32_t> &q)
37 {
38 std::queue<uint32_t> empty;
39 swap(empty, q);
40 }
41 } // namespace
42
~VEncAPI11FuzzSample()43 VEncAPI11FuzzSample::~VEncAPI11FuzzSample()
44 {
45 if (surfInput && nativeWindow) {
46 OH_NativeWindow_DestroyNativeWindow(nativeWindow);
47 nativeWindow = nullptr;
48 }
49 Release();
50 }
51
VencError(OH_AVCodec * codec,int32_t errorCode,void * userData)52 static void VencError(OH_AVCodec *codec, int32_t errorCode, void *userData)
53 {
54 cout << "Error errorCode=" << errorCode << endl;
55 g_vEncSample->isRunning_.store(false);
56 g_vEncSample->signal_->inCond_.notify_all();
57 }
58
VencFormatChanged(OH_AVCodec * codec,OH_AVFormat * format,void * userData)59 static void VencFormatChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData)
60 {
61 cout << "Format Changed" << endl;
62 }
63
onEncInputBufferAvailable(OH_AVCodec * codec,uint32_t index,OH_AVBuffer * buffer,void * userData)64 static void onEncInputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *buffer, void *userData)
65 {
66 VEncSignal *signal = static_cast<VEncSignal *>(userData);
67 unique_lock<mutex> lock(signal->inMutex_);
68 signal->inIdxQueue_.push(index);
69 signal->inBufferQueue_.push(buffer);
70 signal->inCond_.notify_all();
71 }
72
onEncOutputBufferAvailable(OH_AVCodec * codec,uint32_t index,OH_AVBuffer * buffer,void * userData)73 static void onEncOutputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *buffer, void *userData)
74 {
75 OH_VideoEncoder_FreeOutputBuffer(codec, index);
76 }
77
onEncInputParam(OH_AVCodec * codec,uint32_t index,OH_AVFormat * parameter,void * userData)78 static void onEncInputParam(OH_AVCodec *codec, uint32_t index, OH_AVFormat *parameter, void *userData)
79 {
80 OH_AVFormat_SetIntValue(parameter, OH_MD_KEY_BITRATE, DEFAULT_BITRATE);
81 OH_VideoEncoder_PushInputParameter(codec, index);
82 return;
83 }
84
GetSystemTimeUs()85 int64_t VEncAPI11FuzzSample::GetSystemTimeUs()
86 {
87 struct timespec now;
88 (void)clock_gettime(CLOCK_BOOTTIME, &now);
89 int64_t nanoTime = reinterpret_cast<int64_t>(now.tv_sec) * NANOS_IN_SECOND + now.tv_nsec;
90
91 return nanoTime / NANOS_IN_MICRO;
92 }
93
ConfigureVideoEncoderFuzz(int32_t data)94 int32_t VEncAPI11FuzzSample::ConfigureVideoEncoderFuzz(int32_t data)
95 {
96 OH_AVFormat *format = OH_AVFormat_Create();
97 if (format == nullptr) {
98 cout << "Fatal: Failed to create format" << endl;
99 return AV_ERR_UNKNOWN;
100 }
101 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, data);
102 defaultWidth = data;
103 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, data);
104 defaultHeight = data;
105 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, data % MAX_PIXEL_FMT);
106 double frameRate = data;
107 (void)OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, frameRate);
108
109 OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, HEVC_PROFILE_MAIN);
110 OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, defaultRangeFlag);
111 OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, defaultColorPrimaries);
112 OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, defaultTransferCharacteristics);
113 OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, defaultMatarixCoefficients);
114 OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, defaultKeyFrameInterval);
115 OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, defaultBitrateMode);
116 OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, defaultBitRate);
117 OH_AVFormat_SetIntValue(format, OH_MD_KEY_QUALITY, defaultQuality);
118 if (enableRepeat) {
119 OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER, defaultFrameAfter);
120 if (setMaxCount) {
121 OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, defaultMaxCount);
122 }
123 }
124
125 int ret = OH_VideoEncoder_Configure(venc_, format);
126 OH_AVFormat_Destroy(format);
127 return ret;
128 }
129
ConfigureVideoEncoder()130 int32_t VEncAPI11FuzzSample::ConfigureVideoEncoder()
131 {
132 OH_AVFormat *format = OH_AVFormat_Create();
133 if (format == nullptr) {
134 return AV_ERR_UNKNOWN;
135 }
136 OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, HEVC_PROFILE_MAIN);
137 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, defaultWidth);
138 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, defaultHeight);
139 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, defaultPixFmt);
140 (void)OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, defaultFrameRate);
141 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, defaultKeyFrameInterval);
142 if (defaultBitRate == CQ) {
143 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_QUALITY, defaultQuality);
144 } else {
145 (void)OH_AVFormat_SetLongValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, defaultBitRate);
146 }
147 (void)OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, defaultBitrateMode);
148 if (enableRepeat) {
149 OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODER_REPEAT_PREVIOUS_FRAME_AFTER, 1);
150 if (setMaxCount) {
151 OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODER_REPEAT_PREVIOUS_MAX_COUNT, 1);
152 }
153 }
154 int ret = OH_VideoEncoder_Configure(venc_, format);
155 OH_AVFormat_Destroy(format);
156 return ret;
157 }
SetVideoEncoderCallback()158 int32_t VEncAPI11FuzzSample::SetVideoEncoderCallback()
159 {
160 signal_ = new VEncSignal();
161 if (signal_ == nullptr) {
162 cout << "Failed to new VEncSignal" << endl;
163 return AV_ERR_UNKNOWN;
164 }
165 if (surfInput) {
166 int32_t ret = OH_VideoEncoder_RegisterParameterCallback(venc_, onEncInputParam, static_cast<void *>(this));
167 if (ret != AV_ERR_OK) {
168 return ret;
169 }
170 }
171 cb_.onError = VencError;
172 cb_.onStreamChanged = VencFormatChanged;
173 cb_.onNeedInputBuffer = onEncInputBufferAvailable;
174 cb_.onNewOutputBuffer = onEncOutputBufferAvailable;
175 return OH_VideoEncoder_RegisterCallback(venc_, cb_, static_cast<void *>(signal_));
176 }
177
StopInloop()178 void VEncAPI11FuzzSample::StopInloop()
179 {
180 if (inputLoop_ != nullptr && inputLoop_->joinable()) {
181 unique_lock<mutex> lock(signal_->inMutex_);
182 clearIntqueue(signal_->inIdxQueue_);
183 isRunning_.store(false);
184 signal_->inCond_.notify_all();
185 lock.unlock();
186
187 inputLoop_->join();
188 inputLoop_ = nullptr;
189 }
190 }
191
ReleaseInFile()192 void VEncAPI11FuzzSample::ReleaseInFile()
193 {
194 if (inFile_ != nullptr) {
195 if (inFile_->is_open()) {
196 inFile_->close();
197 }
198 inFile_.reset();
199 inFile_ = nullptr;
200 }
201 }
202
CreateSurface()203 int32_t VEncAPI11FuzzSample::CreateSurface()
204 {
205 int32_t ret = 0;
206 ret = OH_VideoEncoder_GetSurface(venc_, &nativeWindow);
207 if (ret != AV_ERR_OK) {
208 cout << "OH_VideoEncoder_GetSurface fail" << endl;
209 return ret;
210 }
211 ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_FORMAT, GRAPHIC_PIXEL_FMT_YCBCR_420_SP);
212 if (ret != AV_ERR_OK) {
213 cout << "NativeWindowHandleOpt SET_FORMAT fail" << endl;
214 return ret;
215 }
216 ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, defaultWidth, defaultHeight);
217 if (ret != AV_ERR_OK) {
218 cout << "NativeWindowHandleOpt SET_BUFFER_GEOMETRY fail" << endl;
219 return ret;
220 }
221 return AV_ERR_OK;
222 }
223
OpenFile()224 int32_t VEncAPI11FuzzSample::OpenFile()
225 {
226 if (fuzzMode) {
227 return AV_ERR_OK;
228 }
229 int32_t ret = AV_ERR_OK;
230 inFile_ = make_unique<ifstream>();
231 if (inFile_ == nullptr) {
232 isRunning_.store(false);
233 (void)OH_VideoEncoder_Stop(venc_);
234 return AV_ERR_UNKNOWN;
235 }
236 inFile_->open(inpDir, ios::in | ios::binary);
237 if (!inFile_->is_open()) {
238 cout << "file open fail" << endl;
239 isRunning_.store(false);
240 (void)OH_VideoEncoder_Stop(venc_);
241 inFile_->close();
242 inFile_.reset();
243 inFile_ = nullptr;
244 return AV_ERR_UNKNOWN;
245 }
246 return ret;
247 }
248
GetStride()249 void VEncAPI11FuzzSample::GetStride()
250 {
251 OH_AVFormat *format = OH_VideoEncoder_GetInputDescription(venc_);
252 int32_t inputStride = 0;
253 OH_AVFormat_GetIntValue(format, "stride", &inputStride);
254 stride_ = inputStride;
255 OH_AVFormat_Destroy(format);
256 }
257
StartVideoEncoder()258 int32_t VEncAPI11FuzzSample::StartVideoEncoder()
259 {
260 isRunning_.store(true);
261 int32_t ret = 0;
262 if (surfInput) {
263 ret = CreateSurface();
264 if (ret != AV_ERR_OK) {
265 return ret;
266 }
267 }
268 if (OpenFile() != AV_ERR_OK) {
269 return AV_ERR_UNKNOWN;
270 }
271 ret = OH_VideoEncoder_Start(venc_);
272 GetStride();
273 if (ret != AV_ERR_OK) {
274 isRunning_.store(false);
275 signal_->inCond_.notify_all();
276 return ret;
277 }
278 if (surfInput) {
279 inputLoop_ = make_unique<thread>(&VEncAPI11FuzzSample::InputFuncSurface, this);
280 } else {
281 inputLoop_ = make_unique<thread>(&VEncAPI11FuzzSample::InputFunc, this);
282 }
283 if (inputLoop_ == nullptr) {
284 isRunning_.store(false);
285 (void)OH_VideoEncoder_Stop(venc_);
286 return AV_ERR_UNKNOWN;
287 }
288 return AV_ERR_OK;
289 }
290
CreateVideoEncoder()291 int32_t VEncAPI11FuzzSample::CreateVideoEncoder()
292 {
293 venc_ = OH_VideoEncoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_HEVC);
294 g_vEncSample = this;
295 return venc_ == nullptr ? AV_ERR_UNKNOWN : AV_ERR_OK;
296 }
297
WaitForEOS()298 void VEncAPI11FuzzSample::WaitForEOS()
299 {
300 if (inputLoop_)
301 inputLoop_->join();
302 inputLoop_ = nullptr;
303 }
304
PushData(OH_AVBuffer * buffer,uint32_t index,int32_t & result)305 int32_t VEncAPI11FuzzSample::PushData(OH_AVBuffer *buffer, uint32_t index, int32_t &result)
306 {
307 int32_t res = -2;
308 OH_AVCodecBufferAttr attr;
309 uint8_t *fileBuffer = OH_AVBuffer_GetAddr(buffer);
310 if (fileBuffer == nullptr) {
311 cout << "Fatal: no memory" << endl;
312 return -1;
313 }
314 int32_t size = OH_AVBuffer_GetCapacity(buffer);
315 if (size < (defaultWidth * stride_ + (defaultWidth * stride_ / DOUBLE))) {
316 return -1;
317 }
318 attr.size = ReadOneFrameYUV420SP(fileBuffer);
319 if (inFile_->eof()) {
320 SetEOS(index, buffer);
321 return 0;
322 }
323 attr.pts = GetSystemTimeUs();
324 attr.offset = 0;
325 attr.flags = AVCODEC_BUFFER_FLAGS_NONE;
326 OH_AVBuffer_SetBufferAttr(buffer, &attr);
327 result = OH_VideoEncoder_PushInputBuffer(venc_, index);
328 frameCount++;
329 unique_lock<mutex> lock(signal_->inMutex_);
330 signal_->inIdxQueue_.pop();
331 signal_->inBufferQueue_.pop();
332 return res;
333 }
334
ReadOneFrameYUV420SP(uint8_t * dst)335 uint32_t VEncAPI11FuzzSample::ReadOneFrameYUV420SP(uint8_t *dst)
336 {
337 uint8_t *start = dst;
338 // copy Y
339 for (uint32_t i = 0; i < defaultWidth; i++) {
340 inFile_->read(reinterpret_cast<char *>(dst), defaultWidth);
341 if (!ReturnZeroIfEOS(defaultWidth)) {
342 return 0;
343 }
344 dst += stride_;
345 }
346 // copy UV
347 for (uint32_t i = 0; i < defaultWidth / DOUBLE; i++) {
348 inFile_->read(reinterpret_cast<char *>(dst), defaultWidth);
349 if (!ReturnZeroIfEOS(defaultWidth)) {
350 return 0;
351 }
352 dst += stride_;
353 }
354 return dst - start;
355 }
356
ReturnZeroIfEOS(uint32_t expectedSize)357 uint32_t VEncAPI11FuzzSample::ReturnZeroIfEOS(uint32_t expectedSize)
358 {
359 if (inFile_->gcount() != (expectedSize)) {
360 cout << "no more data" << endl;
361 return 0;
362 }
363 return 1;
364 }
365
FlushSurf(OHNativeWindowBuffer * ohNativeWindowBuffer,OH_NativeBuffer * nativeBuffer)366 uint32_t VEncAPI11FuzzSample::FlushSurf(OHNativeWindowBuffer *ohNativeWindowBuffer, OH_NativeBuffer *nativeBuffer)
367 {
368 struct Region region;
369 struct Region::Rect *rect = new Region::Rect();
370 rect->x = 0;
371 rect->y = 0;
372 rect->w = defaultWidth;
373 rect->h = defaultHeight;
374 region.rects = rect;
375 NativeWindowHandleOpt(nativeWindow, SET_UI_TIMESTAMP, GetSystemTimeUs());
376 int32_t err = OH_NativeBuffer_Unmap(nativeBuffer);
377 if (err != 0) {
378 return 1;
379 }
380 err = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, ohNativeWindowBuffer, -1, region);
381 delete rect;
382 if (err != 0) {
383 return 1;
384 }
385 return 0;
386 }
387
InputFuncSurface()388 void VEncAPI11FuzzSample::InputFuncSurface()
389 {
390 while (isRunning_.load()) {
391 OHNativeWindowBuffer *ohNativeWindowBuffer;
392 int fenceFd = -1;
393 if (nativeWindow == nullptr) {
394 cout << "nativeWindow == nullptr" << endl;
395 isRunning_.store(false);
396 break;
397 }
398 int32_t err = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &ohNativeWindowBuffer, &fenceFd);
399 if (err != 0) {
400 cout << "RequestBuffer failed, GSError=" << err << endl;
401 isRunning_.store(false);
402 break;
403 }
404 if (fenceFd > 0) {
405 close(fenceFd);
406 }
407 OH_NativeBuffer *nativeBuffer = OH_NativeBufferFromNativeWindowBuffer(ohNativeWindowBuffer);
408 void *virAddr = nullptr;
409 OH_NativeBuffer_Config config;
410 OH_NativeBuffer_GetConfig (nativeBuffer, &config);
411 err = OH_NativeBuffer_Map(nativeBuffer, &virAddr);
412 if (err != 0) {
413 cout << "OH_NativeBuffer_Map failed, GSError=" << err << endl;
414 isRunning_.store(false);
415 break;
416 }
417 uint8_t *dst = (uint8_t *)virAddr;
418 if (dst == nullptr) {
419 break;
420 }
421 if (memcpy_s(dst, (config.stride * config.height * THREE) / DOUBLE, fuzzData, fuzzSize) != EOK) {
422 break;
423 }
424 if (frameCount == maxFrameInput) {
425 err = OH_VideoEncoder_NotifyEndOfStream(venc_);
426 if (err != 0) {
427 cout << "OH_VideoEncoder_NotifyEndOfStream failed" << endl;
428 isRunning_.store(false);
429 }
430 break;
431 }
432 if (FlushSurf(ohNativeWindowBuffer, nativeBuffer)) {
433 break;
434 }
435 usleep(FRAME_INTERVAL);
436 frameCount++;
437 }
438 }
439
SetEOS(uint32_t index,OH_AVBuffer * buffer)440 void VEncAPI11FuzzSample::SetEOS(uint32_t index, OH_AVBuffer *buffer)
441 {
442 OH_AVCodecBufferAttr attr;
443 attr.pts = 0;
444 attr.size = 0;
445 attr.offset = 0;
446 attr.flags = AVCODEC_BUFFER_FLAGS_EOS;
447 OH_AVBuffer_SetBufferAttr(buffer, &attr);
448 int32_t res = OH_VideoEncoder_PushInputBuffer(venc_, index);
449 cout << "OH_VideoEncoder_PushInputBuffer EOS res: " << res << endl;
450 unique_lock<mutex> lock(signal_->inMutex_);
451 }
452
InputFunc()453 void VEncAPI11FuzzSample::InputFunc()
454 {
455 errCount = 0;
456 while (isRunning_.load()) {
457 unique_lock<mutex> lock(signal_->inMutex_);
458 signal_->inCond_.wait(lock, [this]() {
459 if (!isRunning_.load()) {
460 return true;
461 }
462 return signal_->inIdxQueue_.size() > 0;
463 });
464 if (!isRunning_.load()) {
465 break;
466 }
467 uint32_t index = signal_->inIdxQueue_.front();
468 auto buffer = signal_->inBufferQueue_.front();
469 signal_->inIdxQueue_.pop();
470 signal_->inBufferQueue_.pop();
471
472 lock.unlock();
473 OH_AVCodecBufferAttr attr;
474 int32_t bufferSize = OH_AVBuffer_GetCapacity(buffer);
475 uint8_t *fileBuffer = OH_AVBuffer_GetAddr(buffer);
476 if (fileBuffer == nullptr) {
477 break;
478 }
479 if (memcpy_s(fileBuffer, bufferSize, fuzzData, fuzzSize) != EOK) {
480 cout << "Fatal: memcpy fail" << endl;
481 break;
482 }
483 attr.size = fuzzSize;
484 if (frameCount == maxFrameInput) {
485 SetEOS(index, buffer);
486 break;
487 }
488 attr.pts = GetSystemTimeUs();
489 attr.offset = 0;
490 attr.flags = AVCODEC_BUFFER_FLAGS_NONE;
491 OH_AVBuffer_SetBufferAttr(buffer, &attr);
492 OH_VideoEncoder_PushInputBuffer(venc_, index);
493 frameCount++;
494
495 if (sleepOnFPS) {
496 usleep(FRAME_INTERVAL);
497 }
498 }
499 }
500
CheckAttrFlag(OH_AVCodecBufferAttr attr)501 int32_t VEncAPI11FuzzSample::CheckAttrFlag(OH_AVCodecBufferAttr attr)
502 {
503 if (attr.flags & AVCODEC_BUFFER_FLAGS_EOS) {
504 cout << "attr.flags == AVCODEC_BUFFER_FLAGS_EOS" << endl;
505 unique_lock<mutex> inLock(signal_->inMutex_);
506 isRunning_.store(false);
507 signal_->inCond_.notify_all();
508 inLock.unlock();
509 return -1;
510 }
511 if (attr.flags == AVCODEC_BUFFER_FLAGS_CODEC_DATA) {
512 cout << "enc AVCODEC_BUFFER_FLAGS_CODEC_DATA" << attr.pts << endl;
513 }
514 return 0;
515 }
516
Flush()517 int32_t VEncAPI11FuzzSample::Flush()
518 {
519 unique_lock<mutex> inLock(signal_->inMutex_);
520 clearIntqueue(signal_->inIdxQueue_);
521 signal_->inCond_.notify_all();
522 inLock.unlock();
523 return OH_VideoEncoder_Flush(venc_);
524 }
525
Reset()526 int32_t VEncAPI11FuzzSample::Reset()
527 {
528 isRunning_.store(false);
529 StopInloop();
530 return OH_VideoEncoder_Reset(venc_);
531 }
532
Release()533 int32_t VEncAPI11FuzzSample::Release()
534 {
535 int ret = OH_VideoEncoder_Destroy(venc_);
536 venc_ = nullptr;
537 if (signal_ != nullptr) {
538 delete signal_;
539 signal_ = nullptr;
540 }
541 return ret;
542 }
543
Stop()544 int32_t VEncAPI11FuzzSample::Stop()
545 {
546 StopInloop();
547 return OH_VideoEncoder_Stop(venc_);
548 }
549
Start()550 int32_t VEncAPI11FuzzSample::Start()
551 {
552 return OH_VideoEncoder_Start(venc_);
553 }
554
SetParameter(int32_t data)555 int32_t VEncAPI11FuzzSample::SetParameter(int32_t data)
556 {
557 if (venc_) {
558 OH_AVFormat *format = OH_AVFormat_Create();
559 if (format == nullptr) {
560 return AV_ERR_UNKNOWN;
561 }
562 double frameRate = data;
563 (void)OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, frameRate);
564 OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, data);
565 int ret = OH_VideoEncoder_SetParameter(venc_, format);
566 OH_AVFormat_Destroy(format);
567 return ret;
568 }
569 return AV_ERR_UNKNOWN;
570 }