xref: /aosp_15_r20/frameworks/av/media/libstagefright/tests/fuzzers/FuzzerMediaUtility.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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