1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker #pragma once 17*ec779b8eSAndroid Build Coastguard Worker #include <android/native_window.h> 18*ec779b8eSAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h> 19*ec779b8eSAndroid Build Coastguard Worker #include <media/NdkMediaCodec.h> 20*ec779b8eSAndroid Build Coastguard Worker #include <media/NdkMediaCodecPlatform.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <media/NdkMediaFormat.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaCodecConstants.h> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMinBytes = 1; 25*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxBytes = 256; 26*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMinIntKeyValue = 0; 27*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxIntKeyValue = 6000000; 28*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMinFloatKeyValue = 1.0f; 29*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxFloatKeyValue = 500.f; 30*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMinTimeOutUs = 0; 31*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxTimeOutUs = 5000; 32*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMinAPICase = 0; 33*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxCodecFormatAPIs = 2; 34*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxCryptoKey = 16; 35*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMinIterations = 10; 36*ec779b8eSAndroid Build Coastguard Worker constexpr int32_t kMaxIterations = 100; 37*ec779b8eSAndroid Build Coastguard Worker constexpr size_t kMinBufferIndex = 1; 38*ec779b8eSAndroid Build Coastguard Worker constexpr size_t kMaxBufferIndex = 128; 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker class NdkMediaCodecFuzzerBase { 41*ec779b8eSAndroid Build Coastguard Worker public: NdkMediaCodecFuzzerBase()42*ec779b8eSAndroid Build Coastguard Worker NdkMediaCodecFuzzerBase() { mFormat = AMediaFormat_new(); } 43*ec779b8eSAndroid Build Coastguard Worker void invokeCodecFormatAPI(AMediaCodec* codec); 44*ec779b8eSAndroid Build Coastguard Worker void invokeInputBufferOperationAPI(AMediaCodec* codec); 45*ec779b8eSAndroid Build Coastguard Worker void invokeOutputBufferOperationAPI(AMediaCodec* codec); 46*ec779b8eSAndroid Build Coastguard Worker AMediaCodecCryptoInfo* getAMediaCodecCryptoInfo(); 47*ec779b8eSAndroid Build Coastguard Worker AMediaCodec* createCodec(bool isEncoder, bool isCodecForClient); getCodecFormat()48*ec779b8eSAndroid Build Coastguard Worker AMediaFormat* getCodecFormat() { return mFormat; }; setFdp(FuzzedDataProvider * fdp)49*ec779b8eSAndroid Build Coastguard Worker void setFdp(FuzzedDataProvider* fdp) { mFdp = fdp; } ~NdkMediaCodecFuzzerBase()50*ec779b8eSAndroid Build Coastguard Worker ~NdkMediaCodecFuzzerBase() { 51*ec779b8eSAndroid Build Coastguard Worker if (mFormat) { 52*ec779b8eSAndroid Build Coastguard Worker AMediaFormat_delete(mFormat); 53*ec779b8eSAndroid Build Coastguard Worker } 54*ec779b8eSAndroid Build Coastguard Worker } 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker private: 57*ec779b8eSAndroid Build Coastguard Worker AMediaCodec* createAMediaCodecByname(bool isEncoder, bool isCodecForClient); 58*ec779b8eSAndroid Build Coastguard Worker AMediaCodec* createAMediaCodecByType(bool isEncoder, bool isCodecForClient); 59*ec779b8eSAndroid Build Coastguard Worker AMediaFormat* getSampleAudioFormat(); 60*ec779b8eSAndroid Build Coastguard Worker AMediaFormat* getSampleVideoFormat(); 61*ec779b8eSAndroid Build Coastguard Worker void setCodecFormat(); 62*ec779b8eSAndroid Build Coastguard Worker AMediaFormat* mFormat = nullptr; 63*ec779b8eSAndroid Build Coastguard Worker FuzzedDataProvider* mFdp = nullptr; 64*ec779b8eSAndroid Build Coastguard Worker }; 65