1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci 16da853ecaSopenharmony_ci#ifndef VIDEOENC_SAMPLE_H 17da853ecaSopenharmony_ci#define VIDEOENC_SAMPLE_H 18da853ecaSopenharmony_ci 19da853ecaSopenharmony_ci#include <iostream> 20da853ecaSopenharmony_ci#include <cstdio> 21da853ecaSopenharmony_ci#include <unistd.h> 22da853ecaSopenharmony_ci#include <atomic> 23da853ecaSopenharmony_ci#include <fstream> 24da853ecaSopenharmony_ci#include <thread> 25da853ecaSopenharmony_ci#include <mutex> 26da853ecaSopenharmony_ci#include <queue> 27da853ecaSopenharmony_ci#include <string> 28da853ecaSopenharmony_ci#include <unordered_map> 29da853ecaSopenharmony_ci#include "securec.h" 30da853ecaSopenharmony_ci#include "native_avcodec_videoencoder.h" 31da853ecaSopenharmony_ci#include "nocopyable.h" 32da853ecaSopenharmony_ci#include "native_avmemory.h" 33da853ecaSopenharmony_ci#include "native_avformat.h" 34da853ecaSopenharmony_ci#include "native_averrors.h" 35da853ecaSopenharmony_ci#include "media_description.h" 36da853ecaSopenharmony_ci#include "av_common.h" 37da853ecaSopenharmony_ci 38da853ecaSopenharmony_cinamespace OHOS { 39da853ecaSopenharmony_cinamespace Media { 40da853ecaSopenharmony_ciclass VEncSignal { 41da853ecaSopenharmony_cipublic: 42da853ecaSopenharmony_ci std::mutex inMutex_; 43da853ecaSopenharmony_ci std::mutex outMutex_; 44da853ecaSopenharmony_ci std::condition_variable inCond_; 45da853ecaSopenharmony_ci std::condition_variable outCond_; 46da853ecaSopenharmony_ci std::queue<uint32_t> inIdxQueue_; 47da853ecaSopenharmony_ci std::queue<uint32_t> outIdxQueue_; 48da853ecaSopenharmony_ci std::queue<OH_AVCodecBufferAttr> attrQueue_; 49da853ecaSopenharmony_ci std::queue<OH_AVMemory *> inBufferQueue_; 50da853ecaSopenharmony_ci std::queue<OH_AVMemory *> outBufferQueue_; 51da853ecaSopenharmony_ci}; 52da853ecaSopenharmony_ci 53da853ecaSopenharmony_ciclass VEncFuzzSample : public NoCopyable { 54da853ecaSopenharmony_cipublic: 55da853ecaSopenharmony_ci VEncFuzzSample() = default; 56da853ecaSopenharmony_ci ~VEncFuzzSample(); 57da853ecaSopenharmony_ci const char *inpDir = "/data/test/media/1280_720_nv.yuv"; 58da853ecaSopenharmony_ci const char *outDir = "/data/test/media/VEncTest.h264"; 59da853ecaSopenharmony_ci uint32_t defaultWidth = 1280; 60da853ecaSopenharmony_ci uint32_t defaultHeight = 720; 61da853ecaSopenharmony_ci uint32_t defaultBitrate = 5000000; 62da853ecaSopenharmony_ci uint32_t defaultQuality = 30; 63da853ecaSopenharmony_ci double defaultFrameRate = 30.0; 64da853ecaSopenharmony_ci uint32_t defaultFuzzTime = 30; 65da853ecaSopenharmony_ci uint32_t defaultBitrateMode = CBR; 66da853ecaSopenharmony_ci OH_AVPixelFormat defaultPixFmt = AV_PIXEL_FORMAT_NV12; 67da853ecaSopenharmony_ci uint32_t defaultKeyFrameInterval = 1000; 68da853ecaSopenharmony_ci int32_t CreateVideoEncoder(const char *codecName); 69da853ecaSopenharmony_ci int32_t ConfigureVideoEncoder(); 70da853ecaSopenharmony_ci int32_t ConfigureVideoEncoderFuzz(int32_t data); 71da853ecaSopenharmony_ci int32_t SetVideoEncoderCallback(); 72da853ecaSopenharmony_ci int32_t StartVideoEncoder(); 73da853ecaSopenharmony_ci int32_t SetParameter(OH_AVFormat *format); 74da853ecaSopenharmony_ci void SetForceIDR(); 75da853ecaSopenharmony_ci void GetStride(); 76da853ecaSopenharmony_ci void WaitForEOS(); 77da853ecaSopenharmony_ci int32_t OpenFile(); 78da853ecaSopenharmony_ci uint32_t ReturnZeroIfEOS(uint32_t expectedSize); 79da853ecaSopenharmony_ci int64_t GetSystemTimeUs(); 80da853ecaSopenharmony_ci int32_t Start(); 81da853ecaSopenharmony_ci int32_t Flush(); 82da853ecaSopenharmony_ci int32_t Reset(); 83da853ecaSopenharmony_ci int32_t Stop(); 84da853ecaSopenharmony_ci int32_t Release(); 85da853ecaSopenharmony_ci bool RandomEOS(uint32_t index); 86da853ecaSopenharmony_ci void SetEOS(uint32_t index); 87da853ecaSopenharmony_ci int32_t PushData(OH_AVMemory *buffer, uint32_t index, int32_t &result); 88da853ecaSopenharmony_ci void InputDataFuzz(bool &runningFlag, uint32_t index); 89da853ecaSopenharmony_ci int32_t CheckResult(bool isRandomEosSuccess, int32_t pushResult); 90da853ecaSopenharmony_ci void InputFunc(); 91da853ecaSopenharmony_ci uint32_t ReadOneFrameYUV420SP(uint8_t *dst); 92da853ecaSopenharmony_ci void ReadOneFrameRGBA8888(uint8_t *dst); 93da853ecaSopenharmony_ci int32_t CheckAttrFlag(OH_AVCodecBufferAttr attr); 94da853ecaSopenharmony_ci void OutputFuncFail(); 95da853ecaSopenharmony_ci void OutputFunc(); 96da853ecaSopenharmony_ci void ReleaseSignal(); 97da853ecaSopenharmony_ci void ReleaseInFile(); 98da853ecaSopenharmony_ci void StopInloop(); 99da853ecaSopenharmony_ci void StopOutloop(); 100da853ecaSopenharmony_ci 101da853ecaSopenharmony_ci VEncSignal *signal_; 102da853ecaSopenharmony_ci uint32_t errCount = 0; 103da853ecaSopenharmony_ci bool enableForceIDR = false; 104da853ecaSopenharmony_ci uint32_t outCount = 0; 105da853ecaSopenharmony_ci uint32_t frameCount = 0; 106da853ecaSopenharmony_ci uint32_t switchParamsTimeSec = 3; 107da853ecaSopenharmony_ci bool sleepOnFPS = false; 108da853ecaSopenharmony_ci bool enableAutoSwitchParam = false; 109da853ecaSopenharmony_ci bool needResetBitrate = false; 110da853ecaSopenharmony_ci bool needResetFrameRate = false; 111da853ecaSopenharmony_ci bool needResetQP = false; 112da853ecaSopenharmony_ci bool repeatRun = false; 113da853ecaSopenharmony_ci bool showLog = false; 114da853ecaSopenharmony_ci bool fuzzMode = false; 115da853ecaSopenharmony_ci 116da853ecaSopenharmony_ciprivate: 117da853ecaSopenharmony_ci std::atomic<bool> isRunning_ { false }; 118da853ecaSopenharmony_ci std::unique_ptr<std::ifstream> inFile_; 119da853ecaSopenharmony_ci std::unique_ptr<std::thread> inputLoop_; 120da853ecaSopenharmony_ci std::unique_ptr<std::thread> outputLoop_; 121da853ecaSopenharmony_ci std::unordered_map<uint32_t, OH_AVMemory *> inBufferMap_; 122da853ecaSopenharmony_ci std::unordered_map<uint32_t, OH_AVMemory *> outBufferMap_; 123da853ecaSopenharmony_ci OH_AVCodec *venc_; 124da853ecaSopenharmony_ci OH_AVCodecAsyncCallback cb_; 125da853ecaSopenharmony_ci int64_t timeStamp_ { 0 }; 126da853ecaSopenharmony_ci int64_t lastRenderedTimeUs_ { 0 }; 127da853ecaSopenharmony_ci bool isFirstFrame_ = true; 128da853ecaSopenharmony_ci OHNativeWindow *nativeWindow; 129da853ecaSopenharmony_ci int stride_; 130da853ecaSopenharmony_ci static constexpr uint32_t sampleRatio = 2; 131da853ecaSopenharmony_ci}; 132da853ecaSopenharmony_ci} // namespace Media 133da853ecaSopenharmony_ci} // namespace OHOS 134da853ecaSopenharmony_ci 135da853ecaSopenharmony_ci#endif // VIDEODEC_SAMPLE_H 136