1*ec779b8eSAndroid Build Coastguard Worker /****************************************************************************** 2*ec779b8eSAndroid Build Coastguard Worker * 3*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker * 5*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at: 8*ec779b8eSAndroid Build Coastguard Worker * 9*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker * 11*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker * 17*ec779b8eSAndroid Build Coastguard Worker ***************************************************************************** 18*ec779b8eSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*ec779b8eSAndroid Build Coastguard Worker */ 20*ec779b8eSAndroid Build Coastguard Worker #ifndef __C2FUZZER_H__ 21*ec779b8eSAndroid Build Coastguard Worker #define __C2FUZZER_H__ 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include <C2AllocatorIon.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <C2Buffer.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <C2BufferPriv.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <C2Component.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <C2Config.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <C2PlatformSupport.h> 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker using namespace std::chrono_literals; 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker extern "C" ::C2ComponentFactory* CreateCodec2Factory(); 33*ec779b8eSAndroid Build Coastguard Worker extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory); 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker namespace android { 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker #define C2FUZZER_ALIGN(_sz, _align) (((_sz) + ((_align)-1)) & ~((_align)-1)) 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker constexpr std::chrono::milliseconds kC2FuzzerTimeOut = 5000ms; 40*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxIterations = 100; 41*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kNumberOfC2WorkItems = 8; 42*ec779b8eSAndroid Build Coastguard Worker constexpr uint32_t kWidthOfVideo = 3840; 43*ec779b8eSAndroid Build Coastguard Worker constexpr uint32_t kHeightOfVideo = 2160; 44*ec779b8eSAndroid Build Coastguard Worker constexpr uint32_t kSamplingRateOfAudio = 48000; 45*ec779b8eSAndroid Build Coastguard Worker constexpr uint32_t kChannelsOfAudio = 8; 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker typedef std::tuple<uint8_t*, size_t, uint32_t> FrameData; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker class Codec2Fuzzer { 50*ec779b8eSAndroid Build Coastguard Worker public: 51*ec779b8eSAndroid Build Coastguard Worker Codec2Fuzzer() = default; ~Codec2Fuzzer()52*ec779b8eSAndroid Build Coastguard Worker ~Codec2Fuzzer() { deInitDecoder(); } 53*ec779b8eSAndroid Build Coastguard Worker bool initDecoder(); 54*ec779b8eSAndroid Build Coastguard Worker void deInitDecoder(); 55*ec779b8eSAndroid Build Coastguard Worker void decodeFrames(const uint8_t* data, size_t size); 56*ec779b8eSAndroid Build Coastguard Worker 57*ec779b8eSAndroid Build Coastguard Worker void handleWorkDone(std::weak_ptr<C2Component> comp, 58*ec779b8eSAndroid Build Coastguard Worker std::list<std::unique_ptr<C2Work>>& workItems); 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker private: 61*ec779b8eSAndroid Build Coastguard Worker class BufferSource { 62*ec779b8eSAndroid Build Coastguard Worker public: BufferSource(const uint8_t * data,size_t size)63*ec779b8eSAndroid Build Coastguard Worker BufferSource(const uint8_t* data, size_t size) : mData(data), mSize(size) { 64*ec779b8eSAndroid Build Coastguard Worker mReadIndex = (size <= kMarkerSize) ? 0 : (size - kMarkerSize); 65*ec779b8eSAndroid Build Coastguard Worker } ~BufferSource()66*ec779b8eSAndroid Build Coastguard Worker ~BufferSource() { 67*ec779b8eSAndroid Build Coastguard Worker mData = nullptr; 68*ec779b8eSAndroid Build Coastguard Worker mSize = 0; 69*ec779b8eSAndroid Build Coastguard Worker mReadIndex = 0; 70*ec779b8eSAndroid Build Coastguard Worker mFrameList.clear(); 71*ec779b8eSAndroid Build Coastguard Worker } isEos()72*ec779b8eSAndroid Build Coastguard Worker bool isEos() { return mFrameList.empty(); } 73*ec779b8eSAndroid Build Coastguard Worker void parse(); 74*ec779b8eSAndroid Build Coastguard Worker FrameData getFrame(); 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker private: isMarker()77*ec779b8eSAndroid Build Coastguard Worker bool isMarker() { 78*ec779b8eSAndroid Build Coastguard Worker if ((kMarkerSize < mSize) && (mReadIndex < mSize - kMarkerSize)) { 79*ec779b8eSAndroid Build Coastguard Worker return (memcmp(&mData[mReadIndex], kMarker, kMarkerSize) == 0); 80*ec779b8eSAndroid Build Coastguard Worker } else { 81*ec779b8eSAndroid Build Coastguard Worker return false; 82*ec779b8eSAndroid Build Coastguard Worker } 83*ec779b8eSAndroid Build Coastguard Worker } 84*ec779b8eSAndroid Build Coastguard Worker isCSDMarker(size_t position)85*ec779b8eSAndroid Build Coastguard Worker bool isCSDMarker(size_t position) { 86*ec779b8eSAndroid Build Coastguard Worker if ((kMarkerSuffixSize < mSize) && (position < mSize - kMarkerSuffixSize)) { 87*ec779b8eSAndroid Build Coastguard Worker return (memcmp(&mData[position], kCsdMarkerSuffix, kMarkerSuffixSize) == 0); 88*ec779b8eSAndroid Build Coastguard Worker } else { 89*ec779b8eSAndroid Build Coastguard Worker return false; 90*ec779b8eSAndroid Build Coastguard Worker } 91*ec779b8eSAndroid Build Coastguard Worker } 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker bool searchForMarker(); 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker const uint8_t* mData = nullptr; 96*ec779b8eSAndroid Build Coastguard Worker size_t mSize = 0; 97*ec779b8eSAndroid Build Coastguard Worker size_t mReadIndex = 0; 98*ec779b8eSAndroid Build Coastguard Worker std::vector<FrameData> mFrameList; 99*ec779b8eSAndroid Build Coastguard Worker static constexpr uint8_t kMarker[] = "_MARK"; 100*ec779b8eSAndroid Build Coastguard Worker static constexpr uint8_t kCsdMarkerSuffix[] = "_H_"; 101*ec779b8eSAndroid Build Coastguard Worker static constexpr uint8_t kFrameMarkerSuffix[] = "_F_"; 102*ec779b8eSAndroid Build Coastguard Worker // All markers should be 5 bytes long ( sizeof '_MARK' which is 5) 103*ec779b8eSAndroid Build Coastguard Worker static constexpr size_t kMarkerSize = (sizeof(kMarker) - 1); 104*ec779b8eSAndroid Build Coastguard Worker // All marker types should be 3 bytes long ('_H_', '_F_') 105*ec779b8eSAndroid Build Coastguard Worker static constexpr size_t kMarkerSuffixSize = 3; 106*ec779b8eSAndroid Build Coastguard Worker }; 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker bool mEos = false; 109*ec779b8eSAndroid Build Coastguard Worker C2BlockPool::local_id_t mBlockPoolId; 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2BlockPool> mLinearPool; 112*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Allocator> mLinearAllocator; 113*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Component::Listener> mListener; 114*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Component> mComponent; 115*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2ComponentInterface> mInterface; 116*ec779b8eSAndroid Build Coastguard Worker std::mutex mQueueLock; 117*ec779b8eSAndroid Build Coastguard Worker std::condition_variable mQueueCondition; 118*ec779b8eSAndroid Build Coastguard Worker std::list<std::unique_ptr<C2Work>> mWorkQueue; 119*ec779b8eSAndroid Build Coastguard Worker std::mutex mDecodeCompleteMutex; 120*ec779b8eSAndroid Build Coastguard Worker std::condition_variable mConditionalVariable; 121*ec779b8eSAndroid Build Coastguard Worker }; 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker } // namespace android 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker #endif // __C2FUZZER_H__ 126