blob: 4218d2d7d551d526b414fee17c9571ea8ee2b9a7 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <FrameDecoder.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <media/IMediaSource.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/foundation/AString.h>
#include "FrameDecoderHelpers.h"
#include "IMediaSourceFuzzImpl.h"
namespace android {
#define MAX_MEDIA_BUFFER_SIZE 2048
// Fuzzer entry point.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
// Init our wrapper
FuzzedDataProvider fdp(data, size);
std::string name = fdp.ConsumeRandomLengthString(fdp.remaining_bytes());
AString componentName(name.c_str());
sp<MetaData> trackMeta = generateMetaData(&fdp);
sp<IMediaSource> source = new IMediaSourceFuzzImpl(&fdp, MAX_MEDIA_BUFFER_SIZE);
// Image or video Decoder?
sp<FrameDecoder> decoder;
bool isVideoDecoder = fdp.ConsumeBool();
if (isVideoDecoder) {
decoder = new VideoFrameDecoder(componentName, trackMeta, source);
} else {
decoder = new MediaImageDecoder(componentName, trackMeta, source);
}
while (fdp.remaining_bytes()) {
uint8_t switchCase = fdp.ConsumeIntegralInRange<uint8_t>(0, 3);
switch (switchCase) {
case 0: {
int64_t frameTimeUs = fdp.ConsumeIntegral<int64_t>();
int option = fdp.ConsumeIntegral<int>();
int colorFormat = fdp.ConsumeIntegral<int>();
decoder->init(frameTimeUs, option, colorFormat);
break;
}
case 1:
decoder->extractFrame();
break;
case 2: {
FrameRect rect;
rect.left = fdp.ConsumeIntegral<int32_t>();
rect.top = fdp.ConsumeIntegral<int32_t>();
rect.right = fdp.ConsumeIntegral<int32_t>();
rect.bottom = fdp.ConsumeIntegral<int32_t>();
decoder->extractFrame(&rect);
break;
}
case 3: {
sp<MetaData> trackMeta = generateMetaData(&fdp);
decoder->getMetadataOnly(trackMeta,
/*colorFormat*/ fdp.ConsumeIntegral<int>(),
/*thumbnail*/ fdp.ConsumeBool());
break;
}
}
}
generated_mime_types.clear();
return 0;
}
} // namespace android