blob: 15265bffb13a6ebc13f3461e4390304c2815624f [file] [log] [blame]
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +05301/*
2 * Copyright (C) 2021 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
Onkar Shindec9f11802023-11-30 11:46:48 +053018#include <MediaExtractorService.h>
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053019#include <MediaPlayerService.h>
Onkar Shindec9f11802023-11-30 11:46:48 +053020#include <android/gui/BnSurfaceComposerClient.h>
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053021#include <camera/Camera.h>
22#include <datasource/FileSource.h>
Onkar Shindec9f11802023-11-30 11:46:48 +053023#include <fuzzbinder/random_binder.h>
24#include <gmock/gmock.h>
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053025#include <gui/Surface.h>
26#include <gui/SurfaceComposerClient.h>
27#include <media/IMediaCodecList.h>
28#include <media/IMediaHTTPService.h>
29#include <media/IMediaPlayer.h>
30#include <media/IMediaRecorder.h>
31#include <media/IRemoteDisplay.h>
32#include <media/IRemoteDisplayClient.h>
Devendra Singhi0ecebb02022-04-13 09:55:57 +053033#include <media/MediaHTTPConnection.h>
34#include <media/MediaHTTPService.h>
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053035#include <media/stagefright/RemoteDataSource.h>
36#include <media/stagefright/foundation/base64.h>
37#include <thread>
Onkar Shindec9f11802023-11-30 11:46:48 +053038#include "android-base/stringprintf.h"
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053039#include "fuzzer/FuzzedDataProvider.h"
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053040using namespace std;
41using namespace android;
42
Onkar Shindec9f11802023-11-30 11:46:48 +053043constexpr int32_t kUuidSize = 16;
44constexpr int32_t kMinSize = 0;
45constexpr int32_t kMaxSize = 100;
46constexpr int32_t kFourCCVal = android::FOURCC('m', 't', 'r', 'X');
47constexpr int32_t kFlagVal =
48 ISurfaceComposerClient::eCursorWindow | ISurfaceComposerClient::eOpaque;
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053049
Onkar Shindec9f11802023-11-30 11:46:48 +053050const char dumpFile[] = "OutputDumpFile";
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +053051
Onkar Shindec9f11802023-11-30 11:46:48 +053052enum DataSourceType { HTTP, FD, STREAM, FILETYPE, SOCKET, kMaxValue = SOCKET };
53
Onkar Shinde15816b82024-05-29 06:12:46 +000054constexpr audio_flags_mask_t kAudioFlagsMasks[] = {AUDIO_FLAG_NONE,
55 AUDIO_FLAG_AUDIBILITY_ENFORCED,
56 AUDIO_FLAG_SECURE,
57 AUDIO_FLAG_SCO,
58 AUDIO_FLAG_BEACON,
59 AUDIO_FLAG_HW_AV_SYNC,
60 AUDIO_FLAG_HW_HOTWORD,
61 AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY,
62 AUDIO_FLAG_BYPASS_MUTE,
63 AUDIO_FLAG_LOW_LATENCY,
64 AUDIO_FLAG_DEEP_BUFFER,
65 AUDIO_FLAG_NO_MEDIA_PROJECTION,
66 AUDIO_FLAG_MUTE_HAPTIC,
67 AUDIO_FLAG_NO_SYSTEM_CAPTURE,
68 AUDIO_FLAG_CAPTURE_PRIVATE,
69 AUDIO_FLAG_CONTENT_SPATIALIZED,
70 AUDIO_FLAG_NEVER_SPATIALIZE,
71 AUDIO_FLAG_CALL_REDIRECTION};
72
73constexpr audio_content_type_t kAudioContentTypes[] = {
74 AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_CONTENT_TYPE_SPEECH, AUDIO_CONTENT_TYPE_MUSIC,
75 AUDIO_CONTENT_TYPE_MOVIE, AUDIO_CONTENT_TYPE_SONIFICATION, AUDIO_CONTENT_TYPE_ULTRASOUND};
76
77constexpr audio_source_t kAudioSources[] = {AUDIO_SOURCE_INVALID,
78 AUDIO_SOURCE_DEFAULT,
79 AUDIO_SOURCE_MIC,
80 AUDIO_SOURCE_VOICE_UPLINK,
81 AUDIO_SOURCE_VOICE_DOWNLINK,
82 AUDIO_SOURCE_VOICE_CALL,
83 AUDIO_SOURCE_CAMCORDER,
84 AUDIO_SOURCE_VOICE_RECOGNITION,
85 AUDIO_SOURCE_VOICE_COMMUNICATION,
86 AUDIO_SOURCE_REMOTE_SUBMIX,
87 AUDIO_SOURCE_UNPROCESSED,
88 AUDIO_SOURCE_VOICE_PERFORMANCE,
89 AUDIO_SOURCE_ECHO_REFERENCE,
90 AUDIO_SOURCE_FM_TUNER,
91 AUDIO_SOURCE_HOTWORD,
92 AUDIO_SOURCE_ULTRASOUND};
93
94constexpr audio_usage_t kAudioUsages[] = {AUDIO_USAGE_UNKNOWN,
95 AUDIO_USAGE_MEDIA,
96 AUDIO_USAGE_VOICE_COMMUNICATION,
97 AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING,
98 AUDIO_USAGE_ALARM,
99 AUDIO_USAGE_NOTIFICATION,
100 AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
101 AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
102 AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
103 AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
104 AUDIO_USAGE_NOTIFICATION_EVENT,
105 AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY,
106 AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
107 AUDIO_USAGE_ASSISTANCE_SONIFICATION,
108 AUDIO_USAGE_GAME,
109 AUDIO_USAGE_VIRTUAL_SOURCE,
110 AUDIO_USAGE_ASSISTANT,
111 AUDIO_USAGE_CALL_ASSISTANT,
112 AUDIO_USAGE_EMERGENCY,
113 AUDIO_USAGE_SAFETY,
114 AUDIO_USAGE_VEHICLE_STATUS,
115 AUDIO_USAGE_ANNOUNCEMENT};
116
Onkar Shindec9f11802023-11-30 11:46:48 +0530117constexpr PixelFormat kPixelFormat[] = {
118 PIXEL_FORMAT_UNKNOWN, PIXEL_FORMAT_NONE, PIXEL_FORMAT_CUSTOM,
119 PIXEL_FORMAT_TRANSLUCENT, PIXEL_FORMAT_TRANSPARENT, PIXEL_FORMAT_OPAQUE,
120 PIXEL_FORMAT_RGBA_8888, PIXEL_FORMAT_RGBX_8888, PIXEL_FORMAT_RGB_888,
121 PIXEL_FORMAT_RGB_565, PIXEL_FORMAT_BGRA_8888, PIXEL_FORMAT_RGBA_5551,
122 PIXEL_FORMAT_RGBA_4444, PIXEL_FORMAT_RGBA_FP16, PIXEL_FORMAT_RGBA_1010102,
123 PIXEL_FORMAT_R_8, PIXEL_FORMAT_R_16_UINT, PIXEL_FORMAT_RG_1616_UINT,
124 PIXEL_FORMAT_RGBA_10101010,
125};
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530126
127constexpr media_parameter_keys kMediaParamKeys[] = {
128 KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS, KEY_PARAMETER_AUDIO_CHANNEL_COUNT,
129 KEY_PARAMETER_PLAYBACK_RATE_PERMILLE, KEY_PARAMETER_AUDIO_ATTRIBUTES,
130 KEY_PARAMETER_RTP_ATTRIBUTES};
131
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530132constexpr media_event_type kMediaEventTypes[] = {MEDIA_NOP,
133 MEDIA_PREPARED,
134 MEDIA_PLAYBACK_COMPLETE,
135 MEDIA_BUFFERING_UPDATE,
136 MEDIA_SEEK_COMPLETE,
137 MEDIA_SET_VIDEO_SIZE,
138 MEDIA_STARTED,
139 MEDIA_PAUSED,
140 MEDIA_STOPPED,
141 MEDIA_SKIPPED,
142 MEDIA_NOTIFY_TIME,
143 MEDIA_TIMED_TEXT,
144 MEDIA_ERROR,
145 MEDIA_INFO,
146 MEDIA_SUBTITLE_DATA,
147 MEDIA_META_DATA,
148 MEDIA_DRM_INFO,
149 MEDIA_TIME_DISCONTINUITY,
150 MEDIA_IMS_RX_NOTICE,
151 MEDIA_AUDIO_ROUTING_CHANGED};
152
153constexpr media_info_type kMediaInfoTypes[] = {
154 MEDIA_INFO_UNKNOWN, MEDIA_INFO_STARTED_AS_NEXT,
155 MEDIA_INFO_RENDERING_START, MEDIA_INFO_VIDEO_TRACK_LAGGING,
156 MEDIA_INFO_BUFFERING_START, MEDIA_INFO_BUFFERING_END,
157 MEDIA_INFO_NETWORK_BANDWIDTH, MEDIA_INFO_BAD_INTERLEAVING,
158 MEDIA_INFO_NOT_SEEKABLE, MEDIA_INFO_METADATA_UPDATE,
159 MEDIA_INFO_PLAY_AUDIO_ERROR, MEDIA_INFO_PLAY_VIDEO_ERROR,
160 MEDIA_INFO_TIMED_TEXT_ERROR};
161
162const char *kUrlPrefix[] = {"data:", "http://", "https://", "rtsp://", "content://", "test://"};
163
164struct TestStreamSource : public IStreamSource {
165 void setListener(const sp<IStreamListener> & /*listener*/) override{};
166 void setBuffers(const Vector<sp<IMemory>> & /*buffers*/) override{};
167 void onBufferAvailable(size_t /*index*/) override{};
168 IBinder *onAsBinder() { return nullptr; };
169};
170
Devendra Singhi0ecebb02022-04-13 09:55:57 +0530171struct TestMediaHTTPConnection : public MediaHTTPConnection {
172 public:
173 TestMediaHTTPConnection() {}
174 virtual ~TestMediaHTTPConnection() {}
175
176 virtual bool connect(const char* /*uri*/, const KeyedVector<String8, String8>* /*headers*/) {
177 return true;
178 }
179
180 virtual void disconnect() { return; }
181
182 virtual ssize_t readAt(off64_t /*offset*/, void* /*data*/, size_t size) { return size; }
183
184 virtual off64_t getSize() { return 0; }
185 virtual status_t getMIMEType(String8* /*mimeType*/) { return NO_ERROR; }
186 virtual status_t getUri(String8* /*uri*/) { return NO_ERROR; }
187
188 private:
189 DISALLOW_EVIL_CONSTRUCTORS(TestMediaHTTPConnection);
190};
191
192struct TestMediaHTTPService : public BnInterface<IMediaHTTPService> {
193 public:
194 TestMediaHTTPService() {}
195 ~TestMediaHTTPService(){};
196
197 virtual sp<MediaHTTPConnection> makeHTTPConnection() {
198 mMediaHTTPConnection = sp<TestMediaHTTPConnection>::make();
199 return mMediaHTTPConnection;
200 }
201
202 private:
203 sp<TestMediaHTTPConnection> mMediaHTTPConnection = nullptr;
204 DISALLOW_EVIL_CONSTRUCTORS(TestMediaHTTPService);
205};
206
Onkar Shindec9f11802023-11-30 11:46:48 +0530207class FakeBnSurfaceComposerClient : public gui::BnSurfaceComposerClient {
208 public:
209 MOCK_METHOD(binder::Status, createSurface,
210 (const std::string& name, int32_t flags, const sp<IBinder>& parent,
211 const gui::LayerMetadata& metadata, gui::CreateSurfaceResult* outResult),
212 (override));
213
214 MOCK_METHOD(binder::Status, clearLayerFrameStats, (const sp<IBinder>& handle), (override));
215
216 MOCK_METHOD(binder::Status, getLayerFrameStats,
217 (const sp<IBinder>& handle, gui::FrameStats* outStats), (override));
218
219 MOCK_METHOD(binder::Status, mirrorSurface,
220 (const sp<IBinder>& mirrorFromHandle, gui::CreateSurfaceResult* outResult),
221 (override));
222
223 MOCK_METHOD(binder::Status, mirrorDisplay,
224 (int64_t displayId, gui::CreateSurfaceResult* outResult), (override));
225
226 MOCK_METHOD(binder::Status, getSchedulingPolicy, (gui::SchedulingPolicy*), (override));
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530227};
228
229class MediaPlayerServiceFuzzer {
230 public:
231 MediaPlayerServiceFuzzer(const uint8_t *data, size_t size)
232 : mFdp(data, size), mDataSourceFd(memfd_create("InputFile", MFD_ALLOW_SEALING)){};
233 ~MediaPlayerServiceFuzzer() { close(mDataSourceFd); };
234 void process(const uint8_t *data, size_t size);
235
236 private:
Onkar Shindec9f11802023-11-30 11:46:48 +0530237 FuzzedDataProvider mFdp;
238 const int32_t mDataSourceFd;
239 sp<IMediaPlayer> mMediaPlayer = nullptr;
240 sp<IMediaPlayerClient> mMediaPlayerClient = nullptr;
241 void invokeMediaPlayer();
242 sp<SurfaceControl> makeSurfaceControl();
243 bool setDataSource(const uint8_t* data, size_t size);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530244};
245
Onkar Shindec9f11802023-11-30 11:46:48 +0530246sp<SurfaceControl> MediaPlayerServiceFuzzer::makeSurfaceControl() {
247 sp<IBinder> handle = getRandomBinder(&mFdp);
248 const sp<FakeBnSurfaceComposerClient> testClient(new FakeBnSurfaceComposerClient());
249 sp<SurfaceComposerClient> client = new SurfaceComposerClient(testClient);
250 uint32_t width = mFdp.ConsumeIntegral<uint32_t>();
251 uint32_t height = mFdp.ConsumeIntegral<uint32_t>();
252 uint32_t transformHint = mFdp.ConsumeIntegral<uint32_t>();
253 uint32_t flags = mFdp.ConsumeBool() ? kFlagVal : mFdp.ConsumeIntegral<uint32_t>();
254 int32_t format = mFdp.ConsumeBool() ? mFdp.ConsumeIntegral<uint32_t>()
255 : mFdp.PickValueInArray(kPixelFormat);
256 int32_t layerId = mFdp.ConsumeIntegral<int32_t>();
257 std::string layerName = android::base::StringPrintf("#%d", layerId);
258 return new SurfaceControl(client, handle, layerId, layerName, width, height, format,
259 transformHint, flags);
260}
261
262bool MediaPlayerServiceFuzzer::setDataSource(const uint8_t* data, size_t size) {
263 status_t status = UNKNOWN_ERROR;
264 switch (mFdp.ConsumeEnum<DataSourceType>()) {
265 case HTTP: {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530266 KeyedVector<String8, String8> headers;
267 headers.add(String8(mFdp.ConsumeRandomLengthString().c_str()),
268 String8(mFdp.ConsumeRandomLengthString().c_str()));
269
Onkar Shindec9f11802023-11-30 11:46:48 +0530270 uint32_t dataBlobSize = mFdp.ConsumeIntegralInRange<uint16_t>(kMinSize, size);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530271 vector<uint8_t> uriSuffix = mFdp.ConsumeBytes<uint8_t>(dataBlobSize);
272
273 string uri(mFdp.PickValueInArray(kUrlPrefix));
274 uri += ";base64,";
275 AString out;
276 encodeBase64(uriSuffix.data(), uriSuffix.size(), &out);
277 uri += out.c_str();
Devendra Singhi0ecebb02022-04-13 09:55:57 +0530278 sp<TestMediaHTTPService> testService = sp<TestMediaHTTPService>::make();
279 status =
280 mMediaPlayer->setDataSource(testService /*httpService*/, uri.c_str(), &headers);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530281 break;
282 }
Onkar Shindec9f11802023-11-30 11:46:48 +0530283 case FD: {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530284 write(mDataSourceFd, data, size);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530285 status = mMediaPlayer->setDataSource(mDataSourceFd, 0, size);
286 break;
287 }
Onkar Shindec9f11802023-11-30 11:46:48 +0530288 case STREAM: {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530289 sp<IStreamSource> streamSource = sp<TestStreamSource>::make();
290 status = mMediaPlayer->setDataSource(streamSource);
291 break;
292 }
Onkar Shindec9f11802023-11-30 11:46:48 +0530293 case FILETYPE: {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530294 write(mDataSourceFd, data, size);
295
296 sp<DataSource> dataSource = new FileSource(dup(mDataSourceFd), 0, size);
297 sp<IDataSource> iDataSource = RemoteDataSource::wrap(dataSource);
298 if (!iDataSource) {
299 return false;
300 }
301 status = mMediaPlayer->setDataSource(iDataSource);
302 break;
303 }
Onkar Shindec9f11802023-11-30 11:46:48 +0530304 case SOCKET: {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530305 String8 rtpParams = String8(mFdp.ConsumeRandomLengthString().c_str());
306 struct sockaddr_in endpoint;
307 endpoint.sin_family = mFdp.ConsumeIntegral<unsigned short>();
308 endpoint.sin_port = mFdp.ConsumeIntegral<uint16_t>();
309 mMediaPlayer->setRetransmitEndpoint(&endpoint);
310 status = mMediaPlayer->setDataSource(rtpParams);
311 break;
312 }
Onkar Shindec9f11802023-11-30 11:46:48 +0530313 }
314 if (status != OK) {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530315 return false;
Onkar Shindec9f11802023-11-30 11:46:48 +0530316 }
317 return true;
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530318}
319
320void MediaPlayerServiceFuzzer::invokeMediaPlayer() {
Onkar Shindec9f11802023-11-30 11:46:48 +0530321 Parcel request, reply;
322 while (mFdp.remaining_bytes()) {
323 auto invokeMediaPlayerApi = mFdp.PickValueInArray<const std::function<void()>>({
324 [&]() {
325 sp<SurfaceControl> surfaceControl = makeSurfaceControl();
326 if (surfaceControl) {
327 sp<Surface> surface = surfaceControl->getSurface();
328 mMediaPlayer->setVideoSurfaceTexture(surface->getIGraphicBufferProducer());
329 }
330 },
331 [&]() {
332 BufferingSettings buffering;
333 buffering.mInitialMarkMs = mFdp.ConsumeIntegral<int32_t>();
334 buffering.mResumePlaybackMarkMs = mFdp.ConsumeIntegral<int32_t>();
335 mMediaPlayer->setBufferingSettings(buffering);
336 },
337 [&]() {
338 BufferingSettings buffering;
339 mMediaPlayer->getBufferingSettings(&buffering);
340 },
341 [&]() {
342 mMediaPlayer->prepareAsync();
343 this_thread::sleep_for(chrono::milliseconds(100)); // Time to post message
344 },
345 [&]() {
346 mMediaPlayer->start();
347 this_thread::sleep_for(chrono::milliseconds(100)); // Time to post message
348 },
349 [&]() {
350 mMediaPlayer->pause();
351 this_thread::sleep_for(chrono::milliseconds(100)); // Time to post message
352 },
353 [&]() { mMediaPlayer->stop(); },
354 [&]() {
355 bool state;
356 mMediaPlayer->isPlaying(&state);
357 },
358 [&]() {
359 AudioPlaybackRate rate;
360 rate.mSpeed = mFdp.ConsumeFloatingPoint<float>();
361 rate.mPitch = mFdp.ConsumeFloatingPoint<float>();
362 rate.mStretchMode = mFdp.ConsumeBool() ? AUDIO_TIMESTRETCH_STRETCH_DEFAULT
363 : AUDIO_TIMESTRETCH_STRETCH_VOICE;
364 rate.mFallbackMode =
365 (audio_timestretch_fallback_mode_t)mFdp.ConsumeIntegralInRange<int32_t>(
366 AUDIO_TIMESTRETCH_FALLBACK_CUT_REPEAT,
367 AUDIO_TIMESTRETCH_FALLBACK_FAIL);
368 mMediaPlayer->setPlaybackSettings(rate);
369 mMediaPlayer->getPlaybackSettings(&rate);
370 },
371 [&]() {
372 AVSyncSettings* avSyncSettings = new AVSyncSettings();
373 float videoFpsHint = mFdp.ConsumeFloatingPoint<float>();
374 mMediaPlayer->setSyncSettings(*avSyncSettings, videoFpsHint);
375 delete avSyncSettings;
376 },
377 [&]() {
378 AVSyncSettings* avSyncSettings = new AVSyncSettings();
379 float videoFpsHint = 0;
380 mMediaPlayer->getSyncSettings(avSyncSettings, &videoFpsHint);
381 delete avSyncSettings;
382 },
383 [&]() { mMediaPlayer->seekTo(mFdp.ConsumeIntegral<int32_t>()); },
384 [&]() {
385 int32_t msec;
386 mMediaPlayer->getCurrentPosition(&msec);
387 mMediaPlayer->getDuration(&msec);
388 },
389 [&]() { mMediaPlayer->reset(); },
390 [&]() { mMediaPlayer->notifyAt(mFdp.ConsumeIntegral<uint64_t>()); },
391 [&]() {
392 mMediaPlayer->setAudioStreamType(
393 (audio_stream_type_t)mFdp.ConsumeIntegralInRange<int32_t>(
394 AUDIO_STREAM_VOICE_CALL, AUDIO_STREAM_CALL_ASSISTANT));
395 },
396 [&]() { mMediaPlayer->setLooping(mFdp.ConsumeIntegral<int32_t>()); },
397 [&]() {
398 mMediaPlayer->setVolume(mFdp.ConsumeFloatingPoint<float>() /* left */,
399 mFdp.ConsumeFloatingPoint<float>() /* right */);
400 },
401 [&]() {
402 request.writeInt32(mFdp.ConsumeIntegral<int32_t>());
403 request.setDataPosition(0);
404 mMediaPlayer->invoke(request, &reply);
405 },
406 [&]() {
407 Parcel filter;
408 filter.writeInt32(mFdp.ConsumeIntegral<int32_t>());
409 filter.setDataPosition(0);
410 mMediaPlayer->setMetadataFilter(filter);
411 },
412 [&]() {
413 mMediaPlayer->getMetadata(mFdp.ConsumeBool() /* updateOnly */,
414 mFdp.ConsumeBool() /* applyFilter */, &reply);
415 },
416 [&]() { mMediaPlayer->setAuxEffectSendLevel(mFdp.ConsumeFloatingPoint<float>()); },
417 [&]() { mMediaPlayer->attachAuxEffect(mFdp.ConsumeIntegral<int32_t>()); },
418 [&]() {
419 int32_t key = mFdp.PickValueInArray(kMediaParamKeys);
Onkar Shinde15816b82024-05-29 06:12:46 +0000420 request.writeInt32((audio_usage_t)mFdp.ConsumeIntegralInRange<int32_t>(
421 AUDIO_USAGE_UNKNOWN, AUDIO_USAGE_ANNOUNCEMENT) /* usage */);
422 request.writeInt32((audio_content_type_t)mFdp.ConsumeIntegralInRange<int32_t>(
423 AUDIO_CONTENT_TYPE_UNKNOWN,
424 AUDIO_CONTENT_TYPE_ULTRASOUND) /* content_type */);
425 request.writeInt32((audio_source_t)mFdp.ConsumeIntegralInRange<int32_t>(
426 AUDIO_SOURCE_INVALID, AUDIO_SOURCE_ULTRASOUND) /* source */);
427 request.writeInt32((audio_flags_mask_t)mFdp.ConsumeIntegralInRange<int32_t>(
428 AUDIO_FLAG_NONE, AUDIO_FLAG_CALL_REDIRECTION) /* flags */);
429 request.writeInt32(mFdp.ConsumeBool() /* hasFlattenedTag */);
430 request.writeString16(
431 String16((mFdp.ConsumeRandomLengthString()).c_str()) /* tags */);
Onkar Shindec9f11802023-11-30 11:46:48 +0530432 request.setDataPosition(0);
433 mMediaPlayer->setParameter(key, request);
434 key = mFdp.PickValueInArray(kMediaParamKeys);
435 mMediaPlayer->getParameter(key, &reply);
436 },
437 [&]() {
438 int32_t key =
439 mFdp.ConsumeBool() ? kFourCCVal : mFdp.ConsumeIntegral<uint32_t>();
440 mMediaPlayer->getParameter(key, &reply);
441 },
442 [&]() {
443 struct sockaddr_in endpoint;
444 mMediaPlayer->getRetransmitEndpoint(&endpoint);
445 },
446 [&]() {
447 AttributionSourceState attributionSource;
448 attributionSource.packageName = mFdp.ConsumeRandomLengthString().c_str();
449 attributionSource.token = sp<BBinder>::make();
450 const sp<IMediaPlayerService> mpService(
451 IMediaDeathNotifier::getMediaPlayerService());
452 audio_session_t audioSessionId =
453 (audio_session_t)mFdp.ConsumeIntegralInRange<int32_t>(
454 AUDIO_SESSION_DEVICE, AUDIO_SESSION_OUTPUT_MIX);
455 sp<IMediaPlayer> mNextMediaPlayer = mpService->create(
456 mMediaPlayerClient, audioSessionId, attributionSource);
457 mMediaPlayer->setNextPlayer(mNextMediaPlayer);
458 },
459 [&]() {
460 const sp<media::VolumeShaper::Configuration> configuration =
461 sp<media::VolumeShaper::Configuration>::make();
462 const sp<media::VolumeShaper::Operation> operation =
463 sp<media::VolumeShaper::Operation>::make();
464 mMediaPlayer->applyVolumeShaper(configuration, operation);
465 },
466 [&]() { mMediaPlayer->getVolumeShaperState(mFdp.ConsumeIntegral<int32_t>()); },
467 [&]() {
468 uint8_t uuid[kUuidSize];
469 for (int32_t index = 0; index < kUuidSize; ++index) {
470 uuid[index] = mFdp.ConsumeIntegral<uint8_t>();
471 }
472 Vector<uint8_t> drmSessionId;
473 int32_t length = mFdp.ConsumeIntegralInRange<uint32_t>(kMinSize, kMaxSize);
474 while (length--) {
475 drmSessionId.push_back(mFdp.ConsumeIntegral<uint8_t>());
476 }
477 mMediaPlayer->prepareDrm(uuid, drmSessionId);
478 },
479 [&]() { mMediaPlayer->releaseDrm(); },
480 [&]() {
481 audio_port_handle_t deviceId = mFdp.ConsumeIntegral<int32_t>();
482 mMediaPlayer->setOutputDevice(deviceId);
483 },
484 [&]() {
485 audio_port_handle_t deviceId;
486 mMediaPlayer->getRoutedDeviceId(&deviceId);
487 },
488 [&]() { mMediaPlayer->enableAudioDeviceCallback(mFdp.ConsumeBool()); },
489 [&]() {
490 sp<MediaPlayer> mediaPlayer = (MediaPlayer*)mMediaPlayer.get();
491 Parcel obj;
492 obj.writeInt32(mFdp.ConsumeIntegral<int32_t>());
493 obj.setDataPosition(0);
494 mediaPlayer->notify(mFdp.PickValueInArray(kMediaEventTypes) /* msg */,
495 mFdp.PickValueInArray(kMediaInfoTypes) /* ext1 */,
496 mFdp.ConsumeIntegral<int32_t>() /* ext2 */, &obj);
497 },
498 [&]() {
499 sp<MediaPlayer> mediaPlayer = (MediaPlayer*)mMediaPlayer.get();
500 int32_t mediaPlayerDumpFd = memfd_create(dumpFile, MFD_ALLOW_SEALING);
501 Vector<String16> args;
502 args.push_back(String16(mFdp.ConsumeRandomLengthString().c_str()));
503 mediaPlayer->dump(mediaPlayerDumpFd, args);
504 close(mediaPlayerDumpFd);
505 },
506 [&]() { mMediaPlayer->disconnect(); },
507 });
508 invokeMediaPlayerApi();
509 }
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530510}
511
Onkar Shindec9f11802023-11-30 11:46:48 +0530512void MediaPlayerServiceFuzzer::process(const uint8_t* data, size_t size) {
513 const sp<IMediaPlayerService> mpService(IMediaDeathNotifier::getMediaPlayerService());
514 if (!mpService) {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530515 return;
Onkar Shindec9f11802023-11-30 11:46:48 +0530516 }
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530517
Onkar Shindec9f11802023-11-30 11:46:48 +0530518 sp<IMediaCodecList> mediaCodecList = mpService->getCodecList();
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530519
Onkar Shindec9f11802023-11-30 11:46:48 +0530520 sp<IRemoteDisplayClient> remoteDisplayClient;
521 sp<IRemoteDisplay> remoteDisplay = mpService->listenForRemoteDisplay(
522 String16(mFdp.ConsumeRandomLengthString().c_str()) /*opPackageName*/,
523 remoteDisplayClient, String8(mFdp.ConsumeRandomLengthString().c_str()) /*iface*/);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530524
Onkar Shindec9f11802023-11-30 11:46:48 +0530525 mpService->addBatteryData(mFdp.ConsumeIntegral<uint32_t>());
526 Parcel reply;
527 mpService->pullBatteryData(&reply);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530528
Onkar Shindec9f11802023-11-30 11:46:48 +0530529 sp<MediaPlayerService> mediaPlayerService = (MediaPlayerService*)mpService.get();
530 AttributionSourceState attributionSource;
531 attributionSource.packageName = mFdp.ConsumeRandomLengthString().c_str();
532 attributionSource.token = sp<BBinder>::make();
533 mMediaPlayer =
534 mediaPlayerService->create(mMediaPlayerClient,
535 (audio_session_t)mFdp.ConsumeIntegralInRange<int32_t>(
536 AUDIO_SESSION_DEVICE, AUDIO_SESSION_OUTPUT_MIX),
537 attributionSource);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530538
Onkar Shindec9f11802023-11-30 11:46:48 +0530539 int32_t mediaPlayerServiceDumpFd = memfd_create(dumpFile, MFD_ALLOW_SEALING);
540 Vector<String16> args;
541 args.push_back(String16(mFdp.ConsumeRandomLengthString().c_str()));
542 mediaPlayerService->dump(mediaPlayerServiceDumpFd, args);
543 close(mediaPlayerServiceDumpFd);
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530544
Onkar Shindec9f11802023-11-30 11:46:48 +0530545 if (!mMediaPlayer) {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530546 return;
Onkar Shindec9f11802023-11-30 11:46:48 +0530547 }
548 if (setDataSource(data, size)) {
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530549 invokeMediaPlayer();
Onkar Shindec9f11802023-11-30 11:46:48 +0530550 }
551}
552
553extern "C" int LLVMFuzzerInitialize(int* /* argc */, char*** /* argv */) {
554 MediaPlayerService::instantiate();
555 MediaExtractorService::instantiate();
556 return 0;
Chethan Kumar R Ebb0cd952021-08-02 15:02:52 +0530557}
558
559extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
560 MediaPlayerServiceFuzzer mpsFuzzer(data, size);
561 ProcessState::self()->startThreadPool();
562 mpsFuzzer.process(data, size);
563 return 0;
564};