xref: /aosp_15_r20/tools/security/fuzzing/llm/frameDecoder_fuzzer2/FrameDecoderFuzzer2.cpp (revision d9ecfb0f4d734c9ce41cde8ac4d585b094fd4222)
1*d9ecfb0fSAndroid Build Coastguard Worker /*
2*d9ecfb0fSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*d9ecfb0fSAndroid Build Coastguard Worker  *
4*d9ecfb0fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d9ecfb0fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d9ecfb0fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d9ecfb0fSAndroid Build Coastguard Worker  *
8*d9ecfb0fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d9ecfb0fSAndroid Build Coastguard Worker  *
10*d9ecfb0fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d9ecfb0fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d9ecfb0fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d9ecfb0fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d9ecfb0fSAndroid Build Coastguard Worker  * limitations under the License.
15*d9ecfb0fSAndroid Build Coastguard Worker  */
16*d9ecfb0fSAndroid Build Coastguard Worker 
17*d9ecfb0fSAndroid Build Coastguard Worker #include <FrameDecoder.h>
18*d9ecfb0fSAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h>
19*d9ecfb0fSAndroid Build Coastguard Worker #include <media/IMediaSource.h>
20*d9ecfb0fSAndroid Build Coastguard Worker #include <media/stagefright/MetaData.h>
21*d9ecfb0fSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AString.h>
22*d9ecfb0fSAndroid Build Coastguard Worker #include "FrameDecoderHelpers.h"
23*d9ecfb0fSAndroid Build Coastguard Worker #include "IMediaSourceFuzzImpl.h"
24*d9ecfb0fSAndroid Build Coastguard Worker 
25*d9ecfb0fSAndroid Build Coastguard Worker namespace android {
26*d9ecfb0fSAndroid Build Coastguard Worker 
27*d9ecfb0fSAndroid Build Coastguard Worker #define MAX_MEDIA_BUFFER_SIZE 2048
28*d9ecfb0fSAndroid Build Coastguard Worker 
29*d9ecfb0fSAndroid Build Coastguard Worker // Fuzzer entry point.
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)30*d9ecfb0fSAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
31*d9ecfb0fSAndroid Build Coastguard Worker     // Init our wrapper
32*d9ecfb0fSAndroid Build Coastguard Worker     FuzzedDataProvider fdp(data, size);
33*d9ecfb0fSAndroid Build Coastguard Worker 
34*d9ecfb0fSAndroid Build Coastguard Worker     std::string name = fdp.ConsumeRandomLengthString(fdp.remaining_bytes());
35*d9ecfb0fSAndroid Build Coastguard Worker     AString componentName(name.c_str());
36*d9ecfb0fSAndroid Build Coastguard Worker     sp<MetaData> trackMeta = generateMetaData(&fdp);
37*d9ecfb0fSAndroid Build Coastguard Worker     sp<IMediaSource> source = new IMediaSourceFuzzImpl(&fdp, MAX_MEDIA_BUFFER_SIZE);
38*d9ecfb0fSAndroid Build Coastguard Worker 
39*d9ecfb0fSAndroid Build Coastguard Worker     // Image or video Decoder?
40*d9ecfb0fSAndroid Build Coastguard Worker     sp<FrameDecoder> decoder;
41*d9ecfb0fSAndroid Build Coastguard Worker     bool isVideoDecoder = fdp.ConsumeBool();
42*d9ecfb0fSAndroid Build Coastguard Worker     if (isVideoDecoder) {
43*d9ecfb0fSAndroid Build Coastguard Worker         decoder = new VideoFrameDecoder(componentName, trackMeta, source);
44*d9ecfb0fSAndroid Build Coastguard Worker     } else {
45*d9ecfb0fSAndroid Build Coastguard Worker         decoder = new MediaImageDecoder(componentName, trackMeta, source);
46*d9ecfb0fSAndroid Build Coastguard Worker     }
47*d9ecfb0fSAndroid Build Coastguard Worker 
48*d9ecfb0fSAndroid Build Coastguard Worker     while (fdp.remaining_bytes()) {
49*d9ecfb0fSAndroid Build Coastguard Worker         if (fdp.ConsumeBool()) {
50*d9ecfb0fSAndroid Build Coastguard Worker             int64_t frameTimeUs = fdp.ConsumeIntegral<int64_t>();
51*d9ecfb0fSAndroid Build Coastguard Worker             int option = fdp.ConsumeIntegral<int>();
52*d9ecfb0fSAndroid Build Coastguard Worker             int colorFormat = fdp.ConsumeIntegral<int>();
53*d9ecfb0fSAndroid Build Coastguard Worker             decoder->init(frameTimeUs, option, colorFormat);
54*d9ecfb0fSAndroid Build Coastguard Worker             decoder->extractFrame();
55*d9ecfb0fSAndroid Build Coastguard Worker         } else {
56*d9ecfb0fSAndroid Build Coastguard Worker             FrameRect rect;
57*d9ecfb0fSAndroid Build Coastguard Worker             rect.left = fdp.ConsumeIntegral<int32_t>();
58*d9ecfb0fSAndroid Build Coastguard Worker             rect.top = fdp.ConsumeIntegral<int32_t>();
59*d9ecfb0fSAndroid Build Coastguard Worker             rect.right = fdp.ConsumeIntegral<int32_t>();
60*d9ecfb0fSAndroid Build Coastguard Worker             rect.bottom = fdp.ConsumeIntegral<int32_t>();
61*d9ecfb0fSAndroid Build Coastguard Worker             int64_t frameTimeUs = fdp.ConsumeIntegral<int64_t>();
62*d9ecfb0fSAndroid Build Coastguard Worker             int option = fdp.ConsumeIntegral<int>();
63*d9ecfb0fSAndroid Build Coastguard Worker             int colorFormat = fdp.ConsumeIntegral<int>();
64*d9ecfb0fSAndroid Build Coastguard Worker             decoder->init(frameTimeUs, option, colorFormat);
65*d9ecfb0fSAndroid Build Coastguard Worker             decoder->extractFrame(&rect);
66*d9ecfb0fSAndroid Build Coastguard Worker         }
67*d9ecfb0fSAndroid Build Coastguard Worker     }
68*d9ecfb0fSAndroid Build Coastguard Worker 
69*d9ecfb0fSAndroid Build Coastguard Worker     generated_mime_types.clear();
70*d9ecfb0fSAndroid Build Coastguard Worker 
71*d9ecfb0fSAndroid Build Coastguard Worker     return 0;
72*d9ecfb0fSAndroid Build Coastguard Worker }
73*d9ecfb0fSAndroid Build Coastguard Worker }  // namespace android