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