• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }