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 VIDEODEC_SAMPLE_H 17da853ecaSopenharmony_ci#define VIDEODEC_SAMPLE_H 18da853ecaSopenharmony_ci 19da853ecaSopenharmony_ci#include <atomic> 20da853ecaSopenharmony_ci#include <cstdio> 21da853ecaSopenharmony_ci#include <fstream> 22da853ecaSopenharmony_ci#include <iostream> 23da853ecaSopenharmony_ci#include <mutex> 24da853ecaSopenharmony_ci#include <queue> 25da853ecaSopenharmony_ci#include <string> 26da853ecaSopenharmony_ci#include <thread> 27da853ecaSopenharmony_ci#include <unistd.h> 28da853ecaSopenharmony_ci#include <unordered_map> 29da853ecaSopenharmony_ci#include "native_avcodec_videodecoder.h" 30da853ecaSopenharmony_ci#include "native_averrors.h" 31da853ecaSopenharmony_ci#include "native_avformat.h" 32da853ecaSopenharmony_ci#include "native_avmemory.h" 33da853ecaSopenharmony_ci#include "nocopyable.h" 34da853ecaSopenharmony_ci#include "securec.h" 35da853ecaSopenharmony_ci#include "surface/window.h" 36da853ecaSopenharmony_ci#include "iconsumer_surface.h" 37da853ecaSopenharmony_cinamespace OHOS { 38da853ecaSopenharmony_cinamespace Media { 39da853ecaSopenharmony_ciclass VDecSignal { 40da853ecaSopenharmony_cipublic: 41da853ecaSopenharmony_ci std::mutex inMutex_; 42da853ecaSopenharmony_ci std::mutex outMutex_; 43da853ecaSopenharmony_ci std::condition_variable inCond_; 44da853ecaSopenharmony_ci std::condition_variable outCond_; 45da853ecaSopenharmony_ci std::queue<uint32_t> inIdxQueue_; 46da853ecaSopenharmony_ci std::queue<uint32_t> outIdxQueue_; 47da853ecaSopenharmony_ci std::queue<OH_AVCodecBufferAttr> attrQueue_; 48da853ecaSopenharmony_ci std::queue<OH_AVMemory *> inBufferQueue_; 49da853ecaSopenharmony_ci std::queue<OH_AVMemory *> outBufferQueue_; 50da853ecaSopenharmony_ci}; 51da853ecaSopenharmony_ci 52da853ecaSopenharmony_ciclass VDecFuzzSample : public NoCopyable { 53da853ecaSopenharmony_cipublic: 54da853ecaSopenharmony_ci VDecFuzzSample() = default; 55da853ecaSopenharmony_ci ~VDecFuzzSample(); 56da853ecaSopenharmony_ci int32_t RunVideoDec(std::string codeName = ""); 57da853ecaSopenharmony_ci const char *inpDir = "/data/test/media/1920_1080_10_30Mb.h264"; 58da853ecaSopenharmony_ci const char *outDir = "/data/test/media/VDecTest.yuv"; 59da853ecaSopenharmony_ci uint32_t defaultWidth = 1920; 60da853ecaSopenharmony_ci uint32_t defaultHeight = 1080; 61da853ecaSopenharmony_ci uint32_t defaultFrameRate = 30; 62da853ecaSopenharmony_ci uint32_t defaultRotation = 0; 63da853ecaSopenharmony_ci 64da853ecaSopenharmony_ci uint32_t defaultPixelFormat = 1; 65da853ecaSopenharmony_ci uint32_t frameCount_ = 0; 66da853ecaSopenharmony_ci const char *fileSourcesha256[64] = {"27", "6D", "A2", "D4", "18", "21", "A5", "CD", "50", "F6", "DD", "CA", "46", 67da853ecaSopenharmony_ci "32", "C3", "FE", "58", "FC", "BC", "51", "FD", "70", "C7", "D4", "E7", "4D", 68da853ecaSopenharmony_ci "5C", "76", "E7", "71", "8A", "B3", "C0", "51", "84", "0A", "FA", "AF", "FA", 69da853ecaSopenharmony_ci "DC", "7B", "C5", "26", "D1", "9A", "CA", "00", "DE", "FC", "C8", "4E", "34", 70da853ecaSopenharmony_ci "C5", "9A", "43", "59", "85", "DC", "AC", "97", "A3", "FB", "23", "51"}; 71da853ecaSopenharmony_ci 72da853ecaSopenharmony_ci int32_t Start(); 73da853ecaSopenharmony_ci int32_t Stop(); 74da853ecaSopenharmony_ci int32_t Flush(); 75da853ecaSopenharmony_ci int32_t Reset(); 76da853ecaSopenharmony_ci void SetEOS(uint32_t index); 77da853ecaSopenharmony_ci uint32_t SendData(uint32_t bufferSize, uint32_t index, OH_AVMemory *buffer); 78da853ecaSopenharmony_ci void CopyStartCode(uint8_t *frameBuffer, uint32_t bufferSize, OH_AVCodecBufferAttr &attr); 79da853ecaSopenharmony_ci int32_t ReadData(uint32_t index, OH_AVMemory *buffer); 80da853ecaSopenharmony_ci void WaitForEOS(); 81da853ecaSopenharmony_ci int32_t ConfigureVideoDecoder(); 82da853ecaSopenharmony_ci int32_t StartVideoDecoder(); 83da853ecaSopenharmony_ci int64_t GetSystemTimeUs(); 84da853ecaSopenharmony_ci int32_t CreateVideoDecoder(std::string codeName); 85da853ecaSopenharmony_ci int32_t SetVideoDecoderCallback(); 86da853ecaSopenharmony_ci int32_t Release(); 87da853ecaSopenharmony_ci int32_t SetParameter(OH_AVFormat *format); 88da853ecaSopenharmony_ci void OutputFunc(); 89da853ecaSopenharmony_ci void WriteOutputFrame(uint32_t index, OH_AVMemory *buffer, OH_AVCodecBufferAttr attr, FILE *outFile); 90da853ecaSopenharmony_ci void InputFuncAVCC(); 91da853ecaSopenharmony_ci OH_AVErrCode InputFuncFUZZ(const uint8_t *data, size_t size); 92da853ecaSopenharmony_ci void ReleaseSignal(); 93da853ecaSopenharmony_ci void ReleaseInFile(); 94da853ecaSopenharmony_ci void StopInloop(); 95da853ecaSopenharmony_ci VDecSignal *signal_; 96da853ecaSopenharmony_ci uint32_t errCount = 0; 97da853ecaSopenharmony_ci uint32_t outCount = 0; 98da853ecaSopenharmony_ci int64_t outTimeArray[2000] = {}; 99da853ecaSopenharmony_ci bool sleepOnFPS = false; 100da853ecaSopenharmony_ci bool repeatRun = false; 101da853ecaSopenharmony_ci bool isSurfMode = false; 102da853ecaSopenharmony_ci bool setParameters = false; 103da853ecaSopenharmony_ci OH_AVCodec *vdec_; 104da853ecaSopenharmony_ci OHNativeWindow *nativeWindow = nullptr; 105da853ecaSopenharmony_ci sptr<Surface> cs = nullptr; 106da853ecaSopenharmony_ci sptr<Surface> ps = nullptr; 107da853ecaSopenharmony_ciprivate: 108da853ecaSopenharmony_ci std::atomic<bool> isRunning_ { false }; 109da853ecaSopenharmony_ci std::unique_ptr<std::ifstream> inFile_; 110da853ecaSopenharmony_ci std::unique_ptr<std::thread> inputLoop_; 111da853ecaSopenharmony_ci std::unordered_map<uint32_t, OH_AVMemory *> inBufferMap_; 112da853ecaSopenharmony_ci std::unordered_map<uint32_t, OH_AVMemory *> outBufferMap_; 113da853ecaSopenharmony_ci OH_AVCodecAsyncCallback cb_; 114da853ecaSopenharmony_ci int64_t timeStamp_ { 0 }; 115da853ecaSopenharmony_ci int64_t lastRenderedTimeUs_ { 0 }; 116da853ecaSopenharmony_ci bool isFirstFrame_ = true; 117da853ecaSopenharmony_ci}; 118da853ecaSopenharmony_ci} // namespace Media 119da853ecaSopenharmony_ci} // namespace OHOS 120da853ecaSopenharmony_ci 121da853ecaSopenharmony_civoid VdecError(OH_AVCodec *codec, int32_t errorCode, void *userData); 122da853ecaSopenharmony_civoid VdecFormatChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData); 123da853ecaSopenharmony_civoid VdecInputDataReady(OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, void *userData); 124da853ecaSopenharmony_civoid VdecOutputDataReady(OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, OH_AVCodecBufferAttr *attr, 125da853ecaSopenharmony_ci void *userData); 126da853ecaSopenharmony_ci#endif // VIDEODEC_SAMPLE_H 127