xref: /aosp_15_r20/frameworks/av/media/codec2/fuzzer/C2Fuzzer.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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