1 /* 2 * Copyright 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <fuzzer/FuzzedDataProvider.h> 20 21 #include <media/stagefright/MediaBuffer.h> 22 #include <media/stagefright/MediaDefs.h> 23 #include <media/stagefright/MediaWriter.h> 24 25 namespace android { 26 class FuzzSource : public MediaSource { 27 public: FuzzSource(sp<MetaData> meta,FuzzedDataProvider * fdp)28 FuzzSource(sp<MetaData> meta, FuzzedDataProvider* fdp) : mMetaData(meta), mFdp(fdp) {} 29 start(MetaData *)30 status_t start(MetaData*) { return OK; } 31 stop()32 virtual status_t stop() { return OK; } 33 read(MediaBufferBase ** buffer,const ReadOptions *)34 status_t read(MediaBufferBase** buffer, const ReadOptions*) { 35 // Ensuring that mBuffer has at least two bytes to avoid check failure 36 // in MPEG2TSWriter::SourceInfo::onMessageReceived(). 37 if (mFdp->remaining_bytes() > 2) { 38 auto size = mFdp->ConsumeIntegralInRange<uint8_t>(2, INT8_MAX); 39 mBuffer = mFdp->ConsumeBytes<uint8_t>(size); 40 MediaBufferBase* mbb = new MediaBuffer(mBuffer.data(), mBuffer.size()); 41 42 size_t length = mFdp->ConsumeIntegralInRange<size_t>(2, mbb->size()); 43 size_t offset = mFdp->ConsumeIntegralInRange<size_t>(0, mbb->size() - length); 44 mbb->set_range(offset, length); 45 46 mbb->meta_data().setInt32(kKeyIsEndOfStream, mFdp->ConsumeBool()); 47 mbb->meta_data().setInt64(kKeyTime, mFdp->ConsumeIntegral<uint32_t>() / 2); 48 *buffer = mbb; 49 50 return OK; 51 } 52 53 return ERROR_END_OF_STREAM; 54 } 55 getFormat()56 sp<MetaData> getFormat() { return mMetaData; } 57 58 private: 59 sp<MetaData> mMetaData = nullptr; 60 FuzzedDataProvider* mFdp = nullptr; 61 std::vector<uint8_t> mBuffer; 62 }; 63 64 enum StandardWriters { 65 OGG, 66 AAC, 67 AAC_ADTS, 68 WEBM, 69 MPEG4, 70 AMR_NB, 71 AMR_WB, 72 MPEG2TS, 73 // Allows FuzzedDataProvider to find the end of this enum. 74 kMaxValue = MPEG2TS, 75 }; 76 77 static const uint32_t kSampleRateTable[] = { 78 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 79 }; 80 static const std::string kMpeg4MimeTypes[] = { 81 MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC, MEDIA_MIMETYPE_IMAGE_AVIF, 82 83 MEDIA_MIMETYPE_VIDEO_AV1, MEDIA_MIMETYPE_VIDEO_AVC, 84 MEDIA_MIMETYPE_VIDEO_HEVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 85 MEDIA_MIMETYPE_VIDEO_H263, MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, 86 87 MEDIA_MIMETYPE_AUDIO_AMR_NB, MEDIA_MIMETYPE_AUDIO_AMR_WB, 88 MEDIA_MIMETYPE_AUDIO_AAC, 89 }; 90 91 sp<MediaWriter> createWriter(int32_t fd, StandardWriters writerType, sp<MetaData> writerMeta, 92 FuzzedDataProvider* fdp); 93 94 sp<FuzzSource> createSource(StandardWriters writerType, FuzzedDataProvider* fdp); 95 } // namespace android 96