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